Nextcloud in Docker-Container mit Reverse-Proxy-Container

Hi Nextcloudies,

ich möchte Nextcloud im Docker-Container hinter einem Nginx-Reverse-Proxy-Container mit Letsencrypt betreiben. ZusÀtzlich bedient der Reverse-Proxy auch einen Pihole- und einen Portainer-Container. Pihole und Portainer laufen einwandfrei und Portainer bescheinigt mir, dass alle Container laufen. Leider kann ich aber Nextcloud im Browser nicht aufrufen, ich erhalte immer eine Fehlerseite von Nginx: 500 Interner Server Fehler.
Da Pihole und Portainer funktioniern und ich sie auch aufrufen kann, sollte der Reverse-Proxy-Container korrekt funktionieren. Ich vermute den Fehler also in der docker-compose.yml fĂŒr Nextcloud.
Ich habe selbstverstĂ€ndlich schon reichlich gegoogelt und meine docker-compose.yml mit drei anderen Beispielen aus dem Internet verglichen. Aus meiner Sicht gibt es aber keine Unterschiede, die das Verhalten meiner Nextcloud-Installation erklĂ€ren wĂŒrden. Deshalb suche ich nun Hilfe im Forum.
Kann sich bitte mal jemand meine beiden docker-compose-Files (fĂŒr den Proxy und fĂŒr Nextcloud) ansehen und mir den entscheidenden Hinweis geben?
Zur ErklĂ€rung: ich verwende nicht den “normalen” Docker-Container mit Apache-Server, sondern bewusst einen Container ohne Apache, so dass ein zusĂ€tzlicher Nginx-Container gestartet werden soll.
Wahrscheinlich liegt hierbei irgendwo der Fehler in der compose-Datei, aber ich sehe ihn nicht.

Habe soeben zur Kenntnis nehmen dĂŒrfen, dass ich als Neuling keine Dateien anhĂ€ngen darf, also muss ich deren Inhalte hier posten:

docker-compose-proxy-server

version: '3.7'
networks:
  ext:
volumes:
  certs:
  vhosts:
  html:
services:
  hostproxy:
    image: jwilder/nginx-proxy
    container_name: hostproxy
    hostname: hostproxy
    labels:
      - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy
    restart:
      always
    networks:
      - ext
    ports:
      - 80:80
      - 443:443
    volumes:
      - certs:/etc/nginx/certs:ro
      - vhosts:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
    environment:
      - HTTPS_METHOD=nohttp
  nginx-letsencrypt-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt
    hostname: letsencrypt
    restart: always
    depends_on:
      - hostproxy
    networks:
      - ext
    volumes:
      - certs:/etc/nginx/certs
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - vhosts:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html

docker-compose-nextcloud:

version: '3.7'
volumes:
  mdb_data:
  nextcloud_config:
  nextcloud_html:
  nextcloud_data:
  web_conf:
services:
  db:
    image: mariadb:10.5.13
    container_name: mariadb
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - mdb_data:/var/lib/mysql
    networks:
      - default
    environment:
      MYSQL_ROOT_PASSWORD: 'Root_PASSWORD'
      MYSQL_PASSWORD: 'MYSQL_PASSWORD'
      MYSQL_DATABASE: nextcloud_db
      MYSQL_USER: db_user

  redis:
    image: redis:alpine
    container_name: redis
    restart: always
    networks:
      - default

  nextcloud:
    image: nextcloud:fpm-alpine
    container_name: nextcloud
    restart: always
    volumes:
      - nextcloud_config:/var/www/html/config
      - nextcloud_html:/var/www/html
      - nextcloud_data:/var/www/html/data
    networks:
      - hostproxy_ext
      - default
    environment:
      NEXTCLOUD_DATA_DIR: /var/www/html/data
      NEXTCLOUD_ADMIN_USER: onit
      NEXTCLOUD_ADMIN_PASSWORD: 'nextcloud_passwort'
      MYSQL_PASSWORD: 'MYSQL_PASSWORD'
      MYSQL_DATABASE: nextcloud_db
      MYSQL_USER: db_user
      MYSQL_HOST: db
      REDIS_HOST: redis
    depends_on:
      - db
      - redis

  web:
    image: nginx:latest
    restart: always
    volumes:
       - web_conf:/etc/nginx
       - nextcloud_html:/var/www/html:ro
    environment:
      VIRTUAL_HOST: nextcloud.meinedomain.de
      LETSENCRYPT_HOST: nextcloud.meinedomain.de
      LETSENCRYPT_EMAIL: user@email.com
    depends_on:
      - nextcloud
    networks:
      - hostproxy_ext
      - default

networks:
  hostproxy_ext:
    external: true
    name: hostproxy_ext

hallo @Onit willkommen im Forum :handshake:

bitte verwende beim Posten die “code” Tags ````` so dass der Code lesbar ist ( ich habe es in deinem post angepasst).

Ich bin aktuell im Urlaub, deswegen habe ich deinen Post nur ĂŒberflogen
 af den ersten Blik shee ich dass die Namen der Netzwerke nicht passen - du musst im Nextcloud compose file in etwa (ohne hostproxy_) verwenden um das Netzwerk des Reverse Proxy mit dem NC Container zu verbinden:

networks:
  ext:
    external: true

ausserdem kann natĂŒrlich die Nginx config falsch sein
 ich wĂŒrde diese auch posten


Hallo wwe,

danke fĂŒr Deine schnelle Reaktion. Leider war Deine Idee nicht richtig. Beim Neustarten des Containers bekam ich nach der Änderung des Netwerks von “hostproxy_ext” in “ext” folgende Fehlermeldung: “network ext declared as external, but could not be found”.

Es ist ja auch so, dass die Container von Pihole und von Portainer ebenfalls ĂŒber das “hostproxy_ext”-Netzwerk an den Proxy angebunden sind und diese beiden Container lassen sich im Browser aufrufen und erzeugen keinen “500 Internal Server Error”.

Gewissheit ĂŒber den richtigen Netzwerknamen bringt folgender Befehl: docker network ls, der bei mir folgenden output liefert:

NETWORK ID     NAME                DRIVER    SCOPE
89cb20852d28   bridge              bridge    local
a4f17ea0d5d9   host                host      local
3e12e9611bb3   hostproxy_ext       bridge    local
a0bc5de7bfce   nextcloud_default   bridge    local
71770b3fe5a2   none                null      local
621e13f695dc   pihole_default      bridge    local
b30152d92d2f   portainer_default   bridge    local

Im hostproxy-Container lautet der Netzwerkname “ext”, dem aber nach außen hin der Containername vorangestellt wird.

Da ich noch keine Dateien hochladen kann, hier der Inhalt der default.conf und der nginx.conf.

default.conf

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

nginx.conf:

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Ich muss ja fairerweise gestehen, dass der Grundgedanke des Dockerns fĂŒr mich der ist, dass ich mich um die Konfiguration der Container nicht kĂŒmmern muss, weil die im Docker-Hub bereitgestellten Container out-of-the-Box funktionieren sollten. An der oben geposteten Konfig habe ich also nichts geĂ€ndert, deshalb erwarte ich hier eigentlich keine Fehler


das scheint dann ein internes Netwerk zu sein. Damit ein Netzwerk zwischen 2 docker compose “instanzen” geteilt werden kann muss es ein externes Netzerk sein (manuell ausserhalb des “compose” erstellt") und in sowohl beim reverse proxy als auch NC konfiguriert


du kannst mit docker inspect <network> verifizieren welche Container mit dem Netzwerk verbunden sind


ich habe dann beim proxy und bei der Nextcloud folgendes drin (gleiches netzwerk, jeweils “external: true”):

networks:
  traefik_proxy:
      external: true

das gilt fĂŒr fĂŒr die Applicatin “an sich” schon gewissermassen. Wenn du aber externe AbhĂ€ngigkeiten hast zB im Fall des Reverse Proxy die zu hostende Applikation muss es wissen wo die Applikation erreichbar ist und welche Parameter (header, cookies, timeouts) gelten
 diese Konfiguration muss sehr wohl spezifisch sein und auch bei einer Docker Installation angepasst werden.

Hallo wwe,
ich habe wie von Dir vorgeschlagen in die docker-compose.yml das externe Netzwerk hostproxy_ext eingebaut:

version: '3.7'
volumes:
  certs:
  vhosts:
  html:
services:
  hostproxy:
    image: jwilder/nginx-proxy
    container_name: hostproxy
    hostname: hostproxy
    labels:
      - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy
    restart:
      always
    networks:
      - default
      - hostproxy_ext
    ports:
      - 80:80
      - 443:443
    volumes:
      - certs:/etc/nginx/certs:ro
      - vhosts:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
    environment:
      - HTTPS_METHOD=nohttp
  nginx-letsencrypt-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt
    hostname: letsencrypt
    restart: always
    depends_on:
      - hostproxy
    networks:
      - default
    volumes:
      - certs:/etc/nginx/certs
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - vhosts:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
networks:
  hostproxy_ext:
    external: true
    name: hostproxy_ext

Dann habe ich alle Container runtergefahren und mit docker system prune -a Tabula rasa gemacht. Anschließend mit docker network create hostproxy_ext das externe Netzwerk angelegt. Abschließend alle Container mit docker compose up -d wieder hochgefahren. Das Ergebnis ist aber exakt das selbe geblieben. Nextcloud wirft den Fehler 500 Internal Server Error und Pihole und Portainer funktionieren.
docker inspect hostproxy_ext zeigt aber, dass alle Container mit dem externen Netzwerkt verbunden sind:

root@debibox:/opt/docker/portainer# docker inspect hostproxy_ext
[
    {
        "Name": "hostproxy_ext",
        "Id": "5d2c3668215ff7d431f2b3b66f56ab80dfb1936acba1b9d5fd7b52363bffe3e5",
        "Created": "2023-04-18T20:58:47.183705506+02:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.22.0.0/16",
                    "Gateway": "172.22.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "26cc6cfc09d12562aea8bb39ff44745dc4627ec99c3f7fe6564cae9f774547a7": {
                "Name": "pihole",
                "EndpointID": "942a14853decf3a6edaf2edff690f5b3f3c3bf5677265dbc89f2c08efb07393d",
                "MacAddress": "02:42:ac:16:00:05",
                "IPv4Address": "172.22.0.5/16",
                "IPv6Address": ""
            },
            "425e413b67743c620d5e851617a5f60fe530f86a16e8de3b665b274e13b398e6": {
                "Name": "portainer-portainer-1",
                "EndpointID": "bbae4c692e155e0d0cb39acf7d5cf145369c3113a99679abee38609e9456293b",
                "MacAddress": "02:42:ac:16:00:06",
                "IPv4Address": "172.22.0.6/16",
                "IPv6Address": ""
            },
            "87a02174c540da8303577b78fb051d2b4ef570783249261ee6ad56a4de63d7c6": {
                "Name": "nextcloud-web-1",
                "EndpointID": "f6fed130bf6d41ad035157a3c5ee4c9a6190ff575ce696e4c837ca489767c4d2",
                "MacAddress": "02:42:ac:16:00:04",
                "IPv4Address": "172.22.0.4/16",
                "IPv6Address": ""
            },
            "a0d8c37cf056f0d0f95b50452decc2d30860c410612fef4e1a385e26a3fed203": {
                "Name": "nextcloud",
                "EndpointID": "94ecd16b536c13df505da63a2f5324186955ece50f97ebd8611bf4d6aa5560ba",
                "MacAddress": "02:42:ac:16:00:03",
                "IPv4Address": "172.22.0.3/16",
                "IPv6Address": ""
            },
            "a245d4abc570492ddc5cba0b1233c99bcc081dbbbc1fe5a8b44a5bc5594eae6c": {
                "Name": "hostproxy",
                "EndpointID": "72c3ac856c2078b44852897d2b27a3ebb5278b8c9158b6fb2b5573d6d111ed26",
                "MacAddress": "02:42:ac:16:00:02",
                "IPv4Address": "172.22.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

OK, sobald die Container im gleichen Netzwerk sind solltest du die Reverse proxy config angehen


wird dich nicht weit bringen
 damit hört der RP anur auf Port 80 und erwartet den Zugriff auf localhost(aus Sicht der Containers!!!)
 du musst so was wie proxy_pass http://web:80; nutzen um die Zugriffe zum container zu routen

Es gibt viele gute Anleitungen
 ich nutze kein Nginx und kann dir nicht direkt helfen
 im Forum gabe genug Diskussionen, ich denke du findest etwas starte z.B hier:

alle Quellen ohne Garantie - schaue sie dir an und konfiguriere entsprechend.

UPDATE: hier eine config die mir recht vollstÀndig erscheint: Nextcloud on docker: Reverse proxy

Hallo wwe, ich habe mir die von Dir vorheschlagenen Links angesehen und versucht, zu ĂŒbernehmen, was mir sinnvoll erschien. Es hat aber leider nichts zum Ziel gefĂŒhrt. Der einzige Unterschied ist nun, dass ich nicht mehr den internen Fehler 500 bekomme, sondern die Willkommensseite von Nginx.
Ich hatte zum Beispiel in der config.php von Nextcloud den Eintrag “trusted_proxies” ĂŒbernommen und dort die IP des Proxy-Containers “hostproxy” eingetragen, die ich mit dem Befehl “docker network inspect hostproxy_ext” ermittelt habe. Bis ich dann feststellen durfte, dass die IP-Adresse eine Zufallszahl ist, denn nach einem rechner-Neustart bekommen die Container eine neue IP-Adresse. Also wurde “trusted_proxies” wieder gelöscht.
Gibt es denn die Möglichkeit, die IP-Adressen der Container unverĂ€nderlich vergeben zu lassen? Wenn nicht, nĂŒtzen ja EintrĂ€ge auf Basis von IP-Adressen irgendwie nix


man kann die IPs der Container schon fixen aber das macht keinen Sinn. (Docker) Container sollten per Namen adressiert werden - ist sonst auch sinnvoll


Anhand deiner Fragen habe ich das GefĂŒhl dir fehl Basiswissen bei Docker
 ich wĂŒrde empfehlen einige Tutorials anzuschauen und dann nochmal von vorne zu starten.

Hallo wwe, Du hast natĂŒrlich Recht, dass mir das Basiswissen fĂŒr Docker fehlt. Obwohl, so ganz ohne Basis hĂ€tte ich den Proxy-Container mit Pihole und Portainer nicht zum Laufen gekriegt. Die drei funktionieren wunderbar! Aber im Ernst, ich habe schon einige Buch-Literatur gelesen, aber es gibt praktisch keine AnfĂ€nger-BĂŒcher fĂŒr Docker, selbst “Docker fĂŒr Dummies” ist kein AnfĂ€ngerbuch fĂŒr User. SĂ€mtliche “AnfĂ€nger”-Literatur “krankt” daran, dass sie fĂŒr Entwickler geschrieben ist, die ihre selbst programmierte Software in Container packen und in ein Repository hochladen wollen. Das ist alles nichts fĂŒr User, die diese Container runterladen und nutzen wollen, deren Sichtweise auf das Thema ist dann eine andere


Ich habe dieses Tutorial hier studiert, das das Prinzip des Proxys gut und nachvollziehbar erklĂ€rt, weshalb ich schließlich Pihole und Portainer erfolgreich an meinen Proxy hĂ€ngen konnte:

Dann habe ich diese Tutorials studiert, die ziemlich genau meine Konfiguration (siehe meine erste Posts) der Nextcloud hinter Reverse-Proxy mit Nginx gebaut haben:

Ich denke, dass meine Konfiguration diesen beiden Tutorials entspricht, aber meine lĂ€uft trotzdem nicht
 Es ist ja auch nicht so, dass ich nicht verstanden habe, was ich da gebaut habe. Insoweit habe ich die Tutorials inzwischen schon verstanden, dass ich jemandem erklĂ€ren könnte, was jede einzelne Zeile meiner Compose-Dateien da tun soll. Man kann also sagen, dass ich einfach den Wald vor lauter BĂ€umen nicht mehr sehe, denn es kann nur ein winzig kleiner “Trick” sein, der mich noch vom Erfolg trennt, den sehe ich aber nicht


Übrigens, wenn Du wĂŒsstest, wie oft ich schon von vorne angefangen habe
 :wink:

BezĂŒglich der fehlenden Docker Tutorials muss ich dir widersprechen - es gibt sie wie Sand am Meer. leider ist es schwer wirklich gute zu finden. Mag sein dass ich durch jahrelange IT Erfahrung als System Engineer nicht ganz den “AnfĂ€nger” Blick habe, ich bin trotzdem kein Entwickler und komme mit Docker wunderbar klar
 aber Fakt ist bei Allen Themen findet man deutlich mehr Beginner Tutorials/Kurse als fĂŒr Fortgeschrittene oder Profis


Ich muss dich auf jeden Fall loben - du hast bereits einiges in Recherche investiert und hast anscheinend mehr Informationsquellen als viele andere Nutzer konsultiert. Beim sitegeist Tutorial sehe ich wenig Docker-spezifisches es geht (auf den ersten Blick) eher um Nginx. Der Tutorial von Bjoern Hagedorn geht wunderbar die Einrichtung der Nextcloud durch - aber ganz im Stille eines Tutorial erklĂ€rt es nicht warum bestimmte Einsstellungen so sind wie die sind und hĂ€ufig rennt der “AnfĂ€nger” wegen einer Kleinigkeit in ein Problem das er absolut nicht einordnen kann
 hier hilft es wirklich sich in die zugrundeliegende Technologie einzuarbeiten
 beim Docker wĂŒrde ich Docker Tutorial von Heise empfehlen oder wenn du dich mit Englisch anfreunden kannst ist Nana’s Docker Tutorial for Beginners absolut empfehlenswert
 bei der Recherche ist mir noch dieses Video ins Auge gesprungen - kann aber nicht sagen ob es gut ist
 zumindest der Umfang scheint angemessen. Wenn du planst komplexere Systeme mit Docker zu betreiben investiere wirklich die Zeit diese Tutorials vollstĂ€ndig ohne “fast forward” anzuschauen und zu verstehen
 Das hilft enorm weil es dann hĂ€ufig “klick” macht und man die fertigen Rezepte auf einmal versteht statt blind Werte von A nach B zu kopieren
 wenn die Quellen dich nicht ansprechen - suche einfach weiter - es gibt wirklich enorm viele Docker Tutorials, sowohl zu Nextcloud als auch Docker “an sich”
 Mehrheit ist Englisch aber das ist in der IT die meistverwendete Sprache
 wenn du weiter als “XYZ for Dummies” möchtest kommst du nur mit Englisch weiter. ah hier fĂ€llt mit noch Apfelcast ein - viele gute Tutorials auch zu Nextcloud


Ansonsten wenn du ungeduldig bist und kurzfristig Erfolge braucht - eine Aussage “ich habe das Tutorial befolgt und es geht nicht” brigt weder dich noch uns weiter - poste Details, speziell cofigs, Logs und Fehlermeldungen - nur dann kannst du Hilfe erwarten
 und das gilt immer - jedes mal wenn du etwas verĂ€nderst musst du alle relevanten Logs einsammeln weil diese anders sein können


Vielen Dank fĂŒr Deine wertvollen Hinweise und mitfĂŒhlenden Worte. Im Nachhinein betrachtet muss ich feststellen, dass ich die richtigen AnfĂ€nger-Tutorials, die Du mir empfiehlst, nicht gefunden habe, weil ich direkt nach den Tutorials gesucht hatte, die genau den Aufbau “Nextcloud hinter Nginx-Reverseproxy mit Letsencrypt” zum Inhalt hatten. Und die, die man dann findet, beschreiben leider nicht das “warum”, wie Du richtig angemerkt hast.
Ich schlage vor, wir beenden diesen Post hier an dieser Stelle und ich arbeite mich erstmal durch Deine vorgeschlagenen Tutorials und versuche danach erneut, meinen Nextcloud-Plan in die Tat umzusetzen. Wenn ich dann Lösungen suche, komme ich mit gezielteren Fragestellungen ins Forum zurĂŒck.
Bis dahin herzlichen Dank fĂŒr Deine Anschubhilfe!

1 Like

This topic was automatically closed after 12 days. New replies are no longer allowed.