[gelöst] Nextcloud mit Docker Compose und Ubuntu 20.04 als VPS Host System

Auf welche Anleitung beziehst Du dich konkret?
Da kann ich doch evtl. aus dem Compose File *.yml den entsprechenden MariaDB Teil entnehmen?

Wenn ich andauernd neue Anleitungen nehme, komme ich zu nichts.

Wie baue ich die Variable ein?

nein. das ist ja dein fehler. du kopierst einfach das beispiel aus der mariadb anleitung auf docker hub. ohne zu beachten, dass es nur ein beispiel ist.

die dateien in meiner anleitung funktionieren genauso. wenn du was löscht, ohne zu wissen, was dann passiert, wird es nicht funktionieren.

1 Like

Ok, deine Anleitung muss ich mir übersetzen.

Da sind vier Dateien —>
Datei 1 (Link korrigiert)

https://github.com/nextcloud/docker/blob/master/.examples/docker-compose/with-nginx-proxy/mariadb/apache/docker-compose.yml#L25

dort musst du hier —>
Datei 2

https://github.com/nextcloud/docker/blob/master/.examples/docker-compose/with-nginx-proxy/mariadb/apache/docker-compose.yml

und hier —>
Datei 3

https://github.com/nextcloud/docker/blob/master/.examples/docker-compose/with-nginx-proxy/mariadb/apache/docker-compose.yml#L26)

deine Domain eintragen. hier —>
Datei 4

https://github.com/nextcloud/docker/blob/master/.examples/docker-compose/with-nginx-proxy/mariadb/apache/docker-compose.yml#L27)

Sind Probleme zu erwarten, wenn ich Anstelle der Domain eine IP-Adresse oder eine kostenfreie Subdomain verwende?

Unter dem ersten Link finde ich mehr als vier Dateien.
Oder stimmt der Link nicht? Link wurde korrigiert.

      - VIRTUAL_HOST=
      - LETSENCRYPT_HOST=
      - LETSENCRYPT_EMAIL=

Was habe ich da konkret und wie einzutragen?

Antwort:
https://github.com/nginx-proxy/acme-companion

Beispiel:

$ docker run --detach \
    --name your-proxied-app \
    --env "VIRTUAL_HOST=subdomain.yourdomain.tld" \
    --env "LETSENCRYPT_HOST=subdomain.yourdomain.tld" \
    nginx


Warum habel alle 4 Dateien die gleiche Bezeichnung “docker-compose.yml”?

Antwort: Weil es 4 verschiedene System sind?

@Reiner_Nippes
Mit deiner Anleitung, auch übersetzt komme nicht klar.

Hast Du evtl. eine docker-compose.yml Mustervorlage für mich, wo
die erforderlichen Eintragungen vorhanden und markiert sind?

Vorlage

Datei3

https://github.com/nextcloud/docker/blob/master/.examples/docker-compose/with-nginx-proxy/mariadb/apache/docker-compose.yml

docker-compose.yml

version: '3'

services:
  db:
    image: mariadb:10.5
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=geheimpasswort
    env_file:
      - db.env

  redis:
    image: redis:alpine
    restart: always

  app:
    image: nextcloud:apache
    restart: always
    volumes:
      - nextcloud:/var/www/html
    environment:
      - VIRTUAL_HOST=nc-kay.dynv6.net
      - LETSENCRYPT_HOST=nc-kay.dynv6.net
      - LETSENCRYPT_EMAIL=nc-kay@posteo.org
      - MYSQL_HOST=db
      - REDIS_HOST=redis
    env_file:
      - db.env
    depends_on:
      - db
      - redis
    networks:
      - proxy-tier
      - default

  cron:
    image: nextcloud:apache
    restart: always
    volumes:
      - nextcloud:/var/www/html
    entrypoint: /cron.sh
    depends_on:
      - db
      - redis

  proxy:
    build: ./proxy
    restart: always
    ports:
      - 80:80
      - 443:443
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
    volumes:
      - certs:/etc/nginx/certs:ro
      - vhost.d:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - proxy-tier

  letsencrypt-companion:
    image: nginxproxy/acme-companion
    restart: always
    volumes:
      - certs:/etc/nginx/certs
      - acme:/etc/acme.sh
      - vhost.d:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - proxy-tier
    depends_on:
      - proxy

# self signed
#  omgwtfssl:
#    image: paulczar/omgwtfssl
#    restart: "no"
#    volumes:
#      - certs:/certs
#    environment:
#      - SSL_SUBJECT=servhostname.local
#      - CA_SUBJECT=my@example.com
#      - SSL_KEY=/certs/servhostname.local.key
#      - SSL_CSR=/certs/servhostname.local.csr
#      - SSL_CERT=/certs/servhostname.local.crt
#    networks:
#      - proxy-tier

volumes:
  db:
  nextcloud:
  certs:
  acme:
  vhost.d:
  html:

networks:
  proxy-tier:

Fehlermeldung:

docker-compose -f /home/ubuntu/docker-compose.yml up -d
ERROR: Couldn't find env file: /home/ubuntu/db.env

Versuch neu mit:

https://github.com/nextcloud/docker/blob/master/.examples/docker-compose/with-nginx-proxy/mariadb/apache/docker-compose.yml

docker-compose.yml

version: '3'

services:
  db:
    image: mariadb:10.5
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=geheimpasswort
    env_file:
      - db.env

  redis:
    image: redis:alpine
    restart: always

  app:
    image: nextcloud:apache
    restart: always
    volumes:
      - nextcloud:/var/www/html
    environment:
      - VIRTUAL_HOST=nckay.dynv6.net
      - LETSENCRYPT_HOST=nckay.dynv6.net
      - LETSENCRYPT_EMAIL=kay@posteo.org
      - MYSQL_HOST=db
      - REDIS_HOST=redis
    env_file:
      - db.env
    depends_on:
      - db
      - redis
    networks:
      - proxy-tier
      - default

  cron:
    image: nextcloud:apache
    restart: always
    volumes:
      - nextcloud:/var/www/html
    entrypoint: /cron.sh
    depends_on:
      - db
      - redis

  proxy:
    build: ./proxy
    restart: always
    ports:
      - 80:80
      - 443:443
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
    volumes:
      - certs:/etc/nginx/certs:ro
      - vhost.d:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - proxy-tier

  letsencrypt-companion:
    image: nginxproxy/acme-companion
    restart: always
    volumes:
      - certs:/etc/nginx/certs
      - acme:/etc/acme.sh
      - vhost.d:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - proxy-tier
    depends_on:
      - proxy

# self signed
#  omgwtfssl:
#    image: paulczar/omgwtfssl
#    restart: "no"
#    volumes:
#      - certs:/certs
#    environment:
#      - SSL_SUBJECT=servhostname.local
#      - CA_SUBJECT=my@example.com
#      - SSL_KEY=/certs/servhostname.local.key
#      - SSL_CSR=/certs/servhostname.local.csr
#      - SSL_CERT=/certs/servhostname.local.crt
#    networks:
#      - proxy-tier

volumes:
  db:
  nextcloud:
  certs:
  acme:
  vhost.d:
  html:

networks:
  proxy-tier:

docker-compose -f /home/ubuntu/docker-compose.yml up -d

Gleicher Fehler

ERROR: Couldn't find env file: /home/ubuntu/db.env

Was mache ich falsch?

Diese Anleitung funktioniert:

Install Nextcloud with Docker Compose

Posted on [20/02/2022]

https://jommy.net/install-nextcloud-with-docker-compose/

version: '2'
 
services:
  db:
    image: mariadb:10.5
    restart: always
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    volumes:
      - /home/dock/nextcloud/db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=nextclouddb
      - MYSQL_PASSWORD=nextclouddb
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    restart: unless-stopped
 
  app:
    image: nextcloud
    restart: always
    ports:
      - 8081:80
    links:
      - db
    volumes:
      - /home/dock/nextcloud/nextcloud:/var/www/html
    environment:
      - MYSQL_PASSWORD=nextclouddb
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db
    restart: unless-stopped
docker-compose up -d

So sieht das System jetzt aus:

https://i.imgur.com/J154mnK.jpg

Aus der Nextcloud-GUI entnommen:

---
Nextcloud
Version:
Nextcloud Hub II (23.0.2) 
---
VPS auf Oracle Ubuntu 20.04 basierend
Betriebssystem: 	Linux 5.11.0-1028-oracle x86_64
Prozessor: 	AMD EPYC 7551 32-Core Processor (2 cores)
Speicher: 	967.00 MB
---
PHP
8.0.16
Arbeitspeicher-Grenzwert: 512 MB
Maximale Ausführungszeit: 3600
Maximale Größe zum Hochladen: 512 MB
---
Datenbank MariaDB
mysql
10.5.13
Größe: 2,1 MB
---

Expose your Nextcloud to the internet – Nginx Proxy host config:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
 
location / {
        proxy_pass http://localhost:5001;
 
        proxy_set_header X-Forwarded-Host     $host;
        proxy_set_header X-Forwarded-Server   $host;
        proxy_set_header X-Real-IP            $remote_addr;
        proxy_set_header X-Forwarded-For      $remote_addr;
        proxy_set_header X-Forwarded-Proto    $scheme;
        proxy_set_header X-Forwarded-Protocol $scheme;
        proxy_set_header X-Forwarded-Port     8081;
        proxy_set_header Forwarded "for=$remote_addr;proto=$scheme";
 
        proxy_set_header Host                 $host;
 
        proxy_redirect  off;
        proxy_buffering off;
 
        proxy_http_version 1.1;
        proxy_set_header Upgrade    $http_upgrade;
        proxy_set_header Connection "upgrade";
 
        proxy_pass_header Authorization;
        proxy_request_buffering off;
        client_max_body_size 0;
        proxy_read_timeout  36000s;
        proxy_ssl_session_reuse off;
 
        fastcgi_param HTTPS on;
        fastcgi_param REQUEST_SCHEME https;
}

Was bedeutet das?
Was habe ich damit zu tun?

Untergrundinformationen zur Anleitung zuvor "Posted on [20/02/2022]"

Basishostsystem: Ubuntu 20.04

docker -v
Docker version 20.10.12, build e91ed57

docker-compose -v
docker-compose version 1.26.0, build d4451659

#################################
#################################
#################################

Docker Container Nextcloud

cat /etc/debian_version
Debian 11.02

erstellt aus:
https://github.com/nextcloud/docker/blob/ababef74e96d028e67361ab097ca1a9e9e9919ec/23/apache/Dockerfile

Docker Container MariaDB

cat /etc/debian_version
bullseye/sid

vermutlich aus dem Dockerfile erstellt:
https://github.com/MariaDB/mariadb-docker/blob/8414e4ff9ebff49f28148a860d85131e11c049c6/10.5/Dockerfile

Warum wird in den Dockerfile auf Ubuntu Focal verwiesen, bzw. wieso ist die Info “bullseye/sid Version” abweichend?

Grundsatzfrage:
Wie finde ich “ohne” Trial and Error die passenden kompatiblen Container aus?
Die mit Alpine erstellten Image sollte man wohl meiden.
Welche Kombinationen sind von den Developern getestet bzw. werden von diesen selbst genutzt?

Beide verwendeten Docker Images basieren auf dem Ubuntu Stack (siehe Portainer Screenshot).
Wie hätte ich das ohne Portainer herausfinden können?

Edit: Die Fragen werden sich bestimmt später mit zunehmenden Wissen selbst beantworten.
Ich bedanke mich bei allen.

Der nächste Schritt wird vermutlich sein das funktionierende System mit Letsencrypt und Traefik aufzurüsten.

Dazu werde ich dann einen neuen Thread aufmachen.

Oder ich finde eine Anleitung dazu. :slight_smile:

MfG
nc-kay

da muss beim übersetzen was schiefgegangen sein.

der erste link der anleitung führt zu einem ordner auf github mit zwei dateien und einem ordner mit nochmal zwei dateien. sind vier dateien.

nein. wie du richtig erkannt hast, ist das nur eine datei. beim “übersetzen” ist dir aber ein fehler unterlaufen. zum beispiel fehlt in dem zweiten link deiner liste am ende das “#+zeilennummer”.

ja natürlich geht das nicht, weil letsencrypt keine zertifakte für ip adressen ausstellt.

die frage kann man so nicht beantworten. aber geh’ mal davon aus, dass auch das nicht funktioniert, solange die domain nicht dir gehört. gehört dir die domain, kannst du beliebige zertifikate ausstellen.

ok. hatte vergessen zu schreiben, dass du alle vier dateien in der selben ordnerstruktur runterladen musst. also die beiden dateien im ordner proxy müssen auch bei dir wieder im ordner proxy sein.

aber dir ist nicht aufgefallen, dass in dem ordner eine datei mit dem namen db.env existiert? das das die datei ist, die laut fehlermeldung nicht gefunden wird. das der letzte link in meiner anleitung genau auf diese datei zeigt und dir sagt, dass du in dieser datei in zeile 1 ein beliebiges, sicheres password eingeben sollst. eine aufforderung in einer datei etwas zu ändern bedeutet für dich nicht, dass man sie runterladen muss?

das wurde dir in dem youtube video erklärt. :wink: das sind die fundamente von docker. d.h. wenn man docker soweit verstanden hat, dass man es einsetzen kann, auch im hobby bereich, stellen sich einem solche frage nicht.

und man zieht dann auch nicht solche schlussfolgerungen.

stimmt. gern geschehen.

nein. jede menge youtube videos zum thema docker schauen.

meine anleitung funktioniert.

2 Likes

@wwe
Hallo, wie bekommst Du dein ssl Zertifikat?

docker-compose.yaml

services:
  reverse-proxy:
    image: traefik:v2.6
    container_name: traefik
    ....
      # Let's Encrypt
      - "--certificatesresolvers.letsencryptresolver.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.letsencryptresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.letsencryptresolver.acme.email=youremail@domain"
      - "--certificatesresolvers.letsencryptresolver.acme.storage=/etc/traefik/acme.json"


  nextcloud-app:
    image: nextcloud:23.0.2
    ....
    labels:
      - traefik.http.routers.<name of the container>.tls=true
      - traefik.http.routers.<name of the container>.tls.certresolver=letsencryptresolver

Dokumentation: https://doc.traefik.io/traefik/https/acme/

1 Like

FORSCHUNG

@wwe

Warum hast Du dein ssl Zerfifikat nicht mit dem Dockercontainer linuxserver/SWAG erstellt?
Welche Gründe haben dagegen gesprochen?

https://hub.docker.com/r/linuxserver/swag

SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let’s Encrypt™) sets up an Nginx webserver and reverse proxy with php support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let’s Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention.

https://hub.docker.com/_/traefik

Mit ist der Unterschied zwischen deiner Traefiklösung und SWAG nicht klar.

Was kann SWAG mehr oder besser oder warum “formerly known as letsencrypt”?

Welches coturn Docker Image nutzt Du?
Ein Verified_Publisher oder Official_Image finde ich bei hub.docker nicht gefunden.

Fragen zu Schaubild von @wwe
Du hast einen Hardwareserver auf dem ein Linux OS installiert, auf dem nutzt Du Docker Container für Treafik, Collabora, Coturn und das PI-Hole (OT fürNextcloud)?
Auf diesem Server hast Du zwei Virtuelle Maschinen für deine Nextcloud Instanzen installiert. sind auf deinen “SRV” Instanzen mariadb, redis auch Container oder sind diese Dienste nativ installiert?
Was ist dort “push”?

Ein ganz schönes Hammersystem hast Du da.

MfG
nc-kay

ich kenne SWAG nicht… ich habe damals mehrere Tutorials angeschaut und traefik sah für mich am elgantesten aus. Es gibt viele Varianten für Reverse Proxy: Apache, Nginx, traefik HAproxy usw… jede wird eingesetzt, wie immer hat ein System hier oder da Vorteile gegeüber anderen… Grundsätzlich empfehle ich “nimm was du kennst” und wenn du nichts kennst verwende das was du von der Dokumentation am besten verstehst…

das sind alle Docker Dienste - was du als “virtuelle Maschinen” bezeichnest sind getrennte docker-compose files/instanzen (man könnte alles in ein Monster docker-compose file schreben). Ich kann sie damit unabhängig managen, updaten, neu starten usw.

notify_push: files-high-performance-back-end es gibt auch ein How-To thread hier… finde ich gerade nicht.

@wwe

Welche Linux-System ist das Grundsystem für deine Docker Container?

Getting Started with Fedora CoreOS

Fedora CoreOS is an automatically-updating, minimal operating system for running containerized workloads securely and at scale. It is currently available on multiple platforms, with more coming soon.

Hast Du schon mal ein speziell für Docker gehärtetes Linuxsystem z. B. Fedora CorOS in Erwägung gezogen?

Nach einer schnellen, unkomplizierten und flexiblen Installation lässt sich Fedora CoreOS komplett wartungsfrei betreiben.

https://de.linuxteaching.com/article/top_minimal_container_operating_systems_for_running_kubernetes

Das ist bei deinem Vor-Know-How (alles Docker Container) vermutlich nur ein kleiner Schritt.

MfG
nc-kay

Schaubild - srv

/srv

Von: services (Dienste); Verzeichnisstruktur noch nicht genau spezifiziert; soll Daten der Dienste enthalten; unter Ubuntu in der Regel leer.

Edit: 17:23 Docker root vom * 25.01.22

oder auch gut

Mein System läuft auf einem normalen Debian… Ich bin nicht sicher ob speziell gehärtete OS für ein privates System notwendig sind. Ich arbeite beruflich mit M$ systemen, so bin ich manchmal froh wenn ich Tastatur und Monitor anschliessen kann und das System mit der GUI troubleshootien kann (auch wenn es nur einmal notwendig war). “härtung” oder erhöhte Sicherheit im Allgemeinen bedeutet automatisch gewisse Einschränkungen und reduzierter Komfort - ich tendiere für mich zum Komfort und bilde mir gar nicht erst ein dass ich ein Absolut sicheres System bauen kann - wenn NSA oder BND drauf wollen, dann kommen sie auch drauf… mir reicht es wenn automatisierte Angriffe und Script-Kiddies draussen bleiben…

wer so etwas behauptet ist hat entweder keine Ahnung oder ist ein Lügner. Ein System zu betreiben bedeutet immer Aufwand und sei es nur regelmässig nach dem Rechten zu sehen um sicher zu sein dass die Automatismen wie gewünscht funktionieren…