Pomoc Nginx Proxy Manager + Nextcloud

goruss

System Engineer
Q Specialist
20 Październik 2020
114
7
18
24
QNAP
null
Ethernet
null
Znalazłem świetny poradnik jak zainstalować na docekrze Nginx Proxy Manager
https://www.8px.pl/nginx-proxy-manager-jako-kontener-na-qnap-nas/ - działa wyśmienicie.
Mój obraz dockera wygląda następująco
Kod:
version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    ports:
      - '980:80'
      - '981:81'
      - '9443:443'
    volumes:
      - /share/nginx/config.json:/app/config/production.json
      - /share/nginx/data:/data
      - /share/nginx/letsencrypt:/etc/letsencrypt
    depends_on:
      - db
  db:
    image: webhippie/mariadb:latest
    restart: always
    environment:
      MARIADB_ROOT_PASSWORD: rootpass
      MARIADB_DATABASE: 'npm'
      MARIADB_USERNAME: 'npm'
      MARIADB_PASSWORD: userpass
    volumes:
      - /share/nginx/data/baza_npm/mysql:/var/lib/mysql
jest to rozwiązanie na prawdę godne polecenia dla odwrotnego proxy gdyż wszystkie ustawienia można wyklikać i co najważniejsze po restarcie wszytko działa.
Testowałem na różnych usługach typu GUI itp. i to działa ale nie działa dla najważniejszej aplikacji tj. dla Nextcloud, który jest również w kontenerze z oficjalny docker zainstalowanych przez containerstation.
Jak odpowiednio skonfiguruję domenę w nginx proxy manager to w przeglądarce pojawia się 504 Gateway Timeout
Wiem, że to wina configu nextcloud gdyż nie ma problemu z analogicznymi przekierowaniami odwrotnego proxy dla innych usług.
Czy mógłbym liczyć na pomoc?
Poniżej zamieszczam config.php z nextcloud
Kod:
<?php
$CONFIG = array (
  'htaccess.RewriteBase' => '/',
  'memcache.local' => '\\OC\\Memcache\\APCu',
  'apps_paths' => 
  array (
    0 => 
    array (
      'path' => '/var/www/html/apps',
      'url' => '/apps',
      'writable' => false,
    ),
    1 => 
    array (
      'path' => '/var/www/html/custom_apps',
      'url' => '/custom_apps',
      'writable' => true,
    ),
  ),
  'instanceid' => 'ocosaop9fsj8',
  'passwordsalt' => '1gwCz9emJ12qa29buRxwadAK/mxEbT',
  'secret' => 'i8vqYJ4nq50x0ADFV428Ochxi7IDlJYZMR3xXxTHMYKExL+W',
  'trusted_domains' => 
  array (
    0 => '192.168.10.10:1080',
    0 => 'moja.domena.net',
  ),
  'datadirectory' => '/var/www/html/data',
  'dbtype' => 'mysql',
  'version' => '20.0.1.1',
  'overwrite.cli.url' => 'http://192.168.10.10:1080',
  'dbname' => 'nextcloud',
  'dbhost' => 'localhost',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'dbuser' => 'oc_admin',
  'dbpassword' => passdb,
  'installed' => true,
);

w katalogu config znajduje się jeszcze plik reverse-proxy.config.php więc być może tu coś trzeba ustawić - poniżej jego zawartość:
Kod:
<?php
$overwriteHost = getenv('OVERWRITEHOST');
if ($overwriteHost) {
  $CONFIG['overwritehost'] = $overwriteHost;
}

$overwriteProtocol = getenv('OVERWRITEPROTOCOL');
if ($overwriteProtocol) {
  $CONFIG['overwriteprotocol'] = $overwriteProtocol;
}

$overwriteWebRoot = getenv('OVERWRITEWEBROOT');
if ($overwriteWebRoot) {
  $CONFIG['overwritewebroot'] = $overwriteWebRoot;
}

$overwriteCondAddr = getenv('OVERWRITECONDADDR');
if ($overwriteCondAddr) {
  $CONFIG['overwritecondaddr'] = $overwriteCondAddr;
}

$trustedProxies = getenv('TRUSTED_PROXIES');
if ($trustedProxies) {
  $CONFIG['trusted_proxies'] = array_filter(array_map('trim', explode(' ', $trustedProxies)));
}
Dobra, jestem już sporo dalej - nie jest to jednak wina nextcloud.
Zainstalowałem wordpress poprzez containterstation i było to samo, ale jak zmieniłem w opcjach sieci kontenera z NAT na BRIDGE to przekierowanie odwrotne proxy działa. W nextcloud to samo.
Być może chodzi tu o komunikację pomiędzy kontenerami - w dobrym kierunku myslę?
 
  • Lubię to
Reakcje: grzenio
Na ruterze określam static DHCP więc IP się nie zmienia, a ponadto w container station można określić IP "na sztywno".
Zastanawia mnie tylko dlaczego w przypadku BRIDGE przekierowanie z aplikacji nginx proxy manager działa, a w przypadku NAT i portu na aplikację coś blokuje komunikację
Kod:
502 Bad Gateway
monit z przeglądarki.
 
Wydaje się, że tak...
Aplikacja w kontenerze (dajmy na to ten nieszczęsny nextcloud) działa na porcie 9090 i w sieci lokalnej bez problemu jest dostęp natomiast przekierowanie poprzez aplikację jak w załączniku nie działa.
proxy.jpg

Natomiast jak tylko zmienię przekierowanie na port 8080 dla GUI - momentalnie jest połączenie po ssl.
Wychodzi na to, że to coś z komunikacją pomiędzy kontenerami.
 
jak poniżej
Kod:
version: '3'
volumes:
  nextcloud:
  db:

services:
  db:
    image: webhippie/mariadb:latest
    restart: always
    environment:
      MARIADB_ROOT_PASSWORD: 'rootpass'
      MARIADB_DATABASE: 'nextcloud'
      MARIADB_USERNAME: 'nextcloud'
      MARIADB_PASSWORD: 'userpass'
    volumes:
      - /share/nextcloud/mysql:/var/lib/mysql

  app:
    image: nextcloud
    ports:
      - 9090:80
    links:
      - db
    volumes:
      - /share/nextcloud:/var/www/html
    restart: always
 
wygląda dobrze

zakładając sytuację NAT (maskowanie):
1. nextcloud gada po porcie 9090 (nie jestem pewien czy ten port jest wolny na qnapie) w protokole http (patrząc na definicje jego kontenera) na adresie IP QNAPa
2. nginx-manager gada po porcie 8443 i 980 , więc trzeba się do niego dobijać za pomocą adresu IP qnapa i portu 980
3. przekierowanie powinno być na adres IP QNAPa i port WWW nextclouda w nginx

a jaki adres uzywasz do testów ? bo jak zwykle schowałeś to co potrzebne! i skąd puszczasz ten test ?
 
Moja sieć domowa to 192.168.4.0/24
Adres qnap to 192.168.4.20
Nextcloud w kontenerze NAT na porcie 9090 więc przekierowanie takie jak z obrazka teoretycznie powinno działać, a to co zamazane na obrazku to tylko subdomena.
Analogicznie testowałem na innych portach min. 1080 i było to samo.
Przed chwilą dokończyłem konfigurację testowego nextcloud w kontenerze BRIDGE z IP 192.168.4.27 ... - jeden klik w nginx proxy manager i śmiga po ssl aż miło także ewidentnie chodzi o ten NAT.
Wygląda na to, że jest jakiś problem z mapowaniem portów na qnap ponieważ nie działa odwrotne proxy z nginx na kontenerze NAT.
Jako, że bardzo mi zależy na dostępie do kilku aplikacji z zewnątrz postanowiłem darować sobie nginx proxy manager i skonfigurować odwrotne proxy za pomocą kontenera z tradycyjnym nginx.

Kod:
version: "3"
services:
  nginx:
    image: linuxserver/nginx
    container_name: nginx
    environment:
      - TZ=Europe/Warsaw
    ports:
      - 444:443
      - 82:80
    restart: unless-stopped
Porty na routerze oczywiście odpowiednio przekierowane, ale reverse proxy nie działa jak w przypadku nginx proxy manager.

Jak tylko zmienię konfigurację kontenera z nginx na bridge z własnym adresem IP przy identycznej konfiguracji nginx - reverse proxy działa.

Kod:
server {
    listen 80;
}

server {

    listen 443;
    server_name moja.domena.net;
    ssl_certificate /config/keys/certyfikat.crt;
    ssl_certificate_key /config/keys/klucz.key;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    access_log            /var/log/nginx/mylog.log;

    location / {

      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;

      # Fix the “It appears that your reverse proxy set up is broken" error.
      proxy_pass          http://192.168.4.20:9090;
      proxy_read_timeout  90;

      proxy_redirect      http://192.168.4.20:9090 https://moja.domena.net;
    }
  }

a przecież sama konfiguracja nginx jest identyczna.
Czy w przypadku kontenera NAT konfiguracja reverse proxy powinna być inna?
 
Próbowałem zainstalować na moim 131K, ale w logach info, że niekompatybilna wersja, a próbowałem kilka stąd
Qnapclub Store: Portainer
Mniejsza z tym - pozostanę przy tym co jest do docker nginx bridge, bo już jestem blisko dopracowania konfiguracji.
Nie będę już wałkował tego tematu, ale mam ostatnie pytanie w związku z tym reverse proxy...
W nginx.conf mam taki wpis
Kod:
include /config/nginx/site-confs/*;
Oczywiście we wskazanym katalogu znajduje się plik z ustawieniami reverse proxy jak powyżej, ale docelowo będę korzystał z jeszcze kilku subdomen dla innych usług.
Konfiguruję kolejne revers proxy dla kolejnej subdomeny analogicznie jak dla tej pierwszej, ale niestety przeglądarka i tak kieruje na tą samą usługę jak dla tej pierwszej subdomeny.
Czy mógłbym prosić o podpowiedź jak ustawić reverse proxy dla kilku subdomen (każda dla innej aplikacji działającej na innym porcie)?
Dodam, że sprawdziłem już nie jeden config z google, ale bez skutku.
 
Widocznie w swoich configach miałem coś nie tak - poniższe ustawienia działają dla różnych domen/subodmen z configami w różnych plikach.

Kod:
server {
listen 80;
server_name domain.tld www.domain.tld; # Edit this to your domain name
rewrite ^ https://$host$request_uri permanent;
}

###
# This is all the configuration declarations that help SSL Function.
###

server {
listen 443 ssl;

server_name domain.tld;
# Edit this to your domain name

ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;       
# If you use Lets Encrypt, you should just need to change the domain.

ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem;     
# If you use Let's Encrypt, you should just need to change the domain.

ssl_session_cache builtin:1000 shared:SSL:10m;                       
# Defining option to share SSL Connection with Passed Proxy

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;                                 
# Defining used protocol versions.

ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
# Defining ciphers to use.

ssl_prefer_server_ciphers on;                                         
# Enabling ciphers

access_log /var/log/nginx/access.log;                                 
# Log Location. Can be anywhere. Make sure the nginx user defined in /etc/nginx/nginx.conf has r/w permissions

###
# This is the juicey part of the config file, handing off relevant data to
# our back-end app running on port 3000
# Nothing should need to be changed here, unless port 3000 is not the port
# you're using.
# Furthermore, if you're using a socket to serve your app (PHP comes to
# mind), you can define a unix:.sock location here as well
###
   
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:3000;
proxy_read_timeout 90;
}
}
 
mialem dokladnie podobny problem. Rozwiazaniem okazało się użycie standardowego portu nextclouda. W przypadku gdy z kontenera nextcloud wyciagało się port inny niż 80, cloud się nie ładował - mimo tego że reverse proxy manager forwardował na ten własnie port. Nie wiem dlaczego tak jest.

Druga sprawa na przyszłosc, dla bezpieczeństwa w konfiguracji kontenera aplikacji, która ma być pod umbrellą reverse proxy używać bloku expose, zamiast ports. Wtedy gdy używasz dodatkowo certyfikatu ssl dla połączeń z domeny, nie będzie możliwości tego pominięcia (force ssl)

po trzecie, nextcloud w pliku config/config.php w sekcji trusted_domains potrzebuje zdefiniowania domen/ipków wraz z portami pod którymi będzie figurować.
 
  • Love
Reakcje: Silas Mariusz

Użytkownicy znaleźli tą stronę używając tych słów:

  1. Nextcloud
  2. mod rewrite
  3. reverse proxy
  4. nginx
  5. reverse proxy SSL