Zum Inhalt springen

Nextcloud Container Docker (Teil 5)

Was ist Nextcloud eigentlich?

Nextcloud ist eine freie Software für das Speichern von Daten (z. B. Dateien, Kalender, Kontakte etc.) auf einem Server. Auf die Daten kann der Anwender sowohl über eine Weboberfläche als auch mit Client-Applikationen (Smartphone und Desktop) zugreifen.

Server und Clients können sich dabei synchronisieren. Nextcloud ermöglicht dem Anwender dadurch, auf einen zentralen und konsistenten Datenbestand von vielen Endgeräten aus zuzugreifen und diesen mit anderen Anwendern optional zu teilen.

Neben der Datenhaltung bietet Nextcloud Funktionalitäten für Videokonferenzen und verschiedene Office-Applikationen über die Weboberfläche. (Quelle Wikipedia)

Mein Nextcloud Container für Docker

Ich habe das Docker-Compose File welches ihr auf der Nextcloud Seite findet ein bisschen für meine Ansprüche angepasst und zudem um einen PostgreSQL-Admin und um eine RedisDB ergänzt.

Doch kommen wir zu den einzelnen Segmenten. Ich werde nur die Sachen erklären von denen ich weiß das sie Fragen aufwerfen können. Alle Variablen die ihr in dem Docker-Compose File findet legt ihr in dem Environment-File ( .env ) an und zwar nach dem Prinzip Name=Wert. Ein Beispiel werde ich ebenfall hier anhängen.

Volumes und Networks

Wie ihr dem Code entnehmen könnt habe ich keine Volumes für die eigentliche Nextcloud angelegt, da ich diese direkt im Service Segment für die Nextcloud anlege, warum seht ihr später.

volumes:
  # Volume für Postgre-SQL und Postgre-Admin
  pgdb:
  pgadmin:

networks:
  # Die Netzwerke erstellt vom NginX Proxy Manager
  nginx_proxy_frontend:
    # add this if the network is already existing!
    external: true
  nginx_proxy_backend:
    # add this if the network is already existing!
    external: true

Service Nextcloud Datenbank (Postgre-SQL)

Ich habe mich für eine Postgre-SQL entschieden bei Nextcloud, da mich die notwendigen Anpassungen für MySQL/MariaDB genervt haben und ich mir die DB darunter grundsätzlich egal ist.

nextcloud-db:
  container_name:  ${P_HOST}
  hostname:  ${P_HOST}
  image: postgres:alpine
  restart: always
  volumes:
    - pgdb:/var/lib/postgresql/data
    - /etc/localtime:/etc/localtime:ro
    - /etc/timezone:/etc/timezone:ro
  environment:
    # Postgre-SQL Environment
    POSTGRES_PASSWORD: ${P_PW}
    POSTGRES_DB: ${P_DB}
    POSTGRES_USER: ${P_U}
  healthcheck:
    # Healthcheck für den Datenbank Container
    test: ["CMD-SHELL", "pg_isready"]
    interval: 30s
    timeout: 5s
    retries: 5
  ports:
    - '${P_PORT}:5432'
  networks:
    - nginx_proxy_backend

Service Redis

Um Nextcloud zu beschleunigen setze ich auf eine Redis DB als in Memory Cache. Die notwendigen Einstellungen sind in den aktuellen Nextcloud Versionen automatisch aktiviert. Zumindestens musste ich nichts mehr an der config.php vornehmen.

nextcloud-redis:
  image: redis:alpine
  container_name: ${R_CONTAINER}
  hostname: ${R_HOST}
  networks:
    - nginx_proxy_backend
  restart: unless-stopped
  #Redis Passwort eingeben
  command: redis-server --requirepass ${R_PW}

Service Postgre-SQL Admin (Optional)

Wie schon im Titel geschrieben ist dieser Abschnitt optional, wer gerne eine Grafische Oberfläche für die Verwaltung der Postgre-SQL Datenbank nutzen möchte kann das hiermit tun.

# Optional
nextcloud-pgadmin:
  container_name: ${PGADMIN_CONTAINER}
  depends_on:
    - ${R_HOST}
    - ${R_CONTAINER}
  image: dpage/pgadmin4:latest
  environment:
    # PGADMIN Environment
    PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
    PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
    PGADMIN_CONFIG_SERVER_MODE: 'False'
    POSTGRES_HOST: nc-postgres
  volumes:
    - pgadmin:/var/lib/pgadmin
  ports:
    - "${PGADMIN_PORT}:80"
  networks:
    - nginx_proxy_frontend
    - nginx_proxy_backend
  restart: unless-stopped
#############

Service Nextcloud App

Die eigentlich App und damit der wichtigste Teil selbst. Hier habe ich die meisten Anpassungen vorgenommen. So habe ich die Default Phone Region direkt im docker-compose File festgelegt und auf das Overwriteprotocol auf https, zudem habe ich noch die Default Email Config mit Hilfe von Environment Variablen festgelegt. Mit ein bisschen Feinschliff lassen sich sicher auch noch die Pfade für CALDAV und CARDDAV anpassen.Doch für den Anfang sollten die vorgenommen Anpassungen die meisten Fehler schon beheben.
Fangen wir an.

Container Name und Abhängigkeiten

Die Datenbanken sollten vor der eigentlichen App gestartet sein daher hier das depends_on.

nextcloud-app:
      container_name: nc-app
      depends_on:
        - ${P_HOST}
        - ${R_CONTAINER}

Build Anpassungen für Nextcloud Image

Hier wird eine Build Datei geladen mit deren Hilfe ich das Nextcloud Image gleich um ein paar Anwendungen erweitere. Welche das genau sind beschreibe ich im Verlauf der Readme noch.

build: 
      context: .
      dockerfile: docker_nc_pgsql_app

Restart Policies und Ressourcen Limits

Restart Policie und Ressourcen Limitierung für die Nextcloud, da meine Nextcloud auf einem Raspberry Pi4 mit 4GB Ram läuft, habe ich mich für ein Hardlimit von 2GB entschieden und bisher auch keine Probleme damit gehabt.

restart: always
    deploy:
      resources:
        limits:
          memory: 2048M
        reservations:
          memory: 500M

Ports für Nextcloud

Den Port könnt ihr Frei wählen, ihr müsst ihn Euch nur merken.

ports:
      - '${NC_PORT}:80'

Volumes für die Nextcloud

Ich habe die Volumes für die Nextxloud hier auf mein LVM Raid gelegt um so weder die Daten noch die für das Web-Frontend notwendigen Daten auf USB mit dem Betriebssystem zu haben. Das lässt sich mit Sicherheit schöner lösen, mir war es aber wichtig das es funktioniert und damit habe ich gute Erfahrungen.

volumes:
      - type: bind
        source: ${NC_SOURCE}
        target: /var/www/html
      - type: bind
        source: ${NC_DATA_SOURCE}
        target: /var/www/html/data
      - type: bind
        source: ${NC_SOURCE}/custom_apps
        target: /var/www/html/custom_apps
      - type: bind
        source: ${NC_SOURCE}/config 
        target: /var/www/html/config 

Healthcheck Nextcloud

Healthcheck einfach aber er funktioniert.

    healthcheck:
      # Healthcheck Nextcloud
      test: curl --fail http://localhost || exit 1
      interval: 30s
      retries: 5
      timeout: 10s

Environment Variablen

Redis Host und Password

environment:
      REDIS_HOST: ${R_HOST}
      # Redis Passwort von oben wieder eingeben
      REDIS_HOST_PASSWORD: ${R_PW}

PostgreSQL Environment Variablen

      POSTGRES_PASSWORD: ${P_PW}
      POSTGRES_DB: ${P_DB}
      POSTGRES_USER: ${P_U}
      POSTGRES_HOST: ${P_HOST}
      POSTGRES_DB_PORT: ${P_PORT}

Nextcloud Environment Variablen

      # Set overwriteprotocol to https to fix Remote Proxy Failure
      NC_overwriteprotocol: https
      # Set default_phone_region to DE=Germany
      NC_default_phone_region: DE
      # Set Default EMail Config
      SMTP_HOST: ${S_H}
      SMTP_SECURE: SSL
      SMTP_PORT: 465
      SMTP_NAME: ${S_U}
      SMTP_PASSWORD: ${S_PW}
      MAIL_FROM_ADDRESS: ${MAIL_FROM_ADDRESS}
      MAIL_DOMAIN: ${MAIL_DOMAIN}

Network

Die Nextcloud App muss in beiden Netzwerken verbunden sein um auch mit den nur im Backend befindlichen Datenbanken zu sprechen.

    networks:
      - nginx_proxy_frontend
      - nginx_proxy_backend

Environment File

Da ich viele Variablen benutze habe ich ein entprechendes .env File angelegt. Dieses ist nicht im Repo enthalten, da darin Benutzernamen und PW gespeichert werden. Aber hier ist ein Blanko File welches alle benutzen Variablen enthält und ihr müsst sie nur noch befüllen.

P_PW=
P_DB=
P_U=
P_PORT=
P_HOST=
PGADMIN_PORT=
S_PW=
S_H=
S_U=
R_HOST=
R_CONTAINER=
R_PW=
PGADMIN_DEFAULT_EMAIL=
PGADMIN_CONTAINER=
PGADMIN_DEFAULT_PASSWORD=
NC_PORT=
NC_SOURCE=
NC_DATA_SOURCE=
MAIL_FROM_ADDRESS=
MAIL_DOMAIN=

Docker Buildfile

Ich habe neben wie unter Punkt 2 des letzten Abschnitts schon angedeutet auch am Image noch ein paar Anpassungen vorgenommen. Diese werden durch ein extra File beim Aufruf in das Image eingebaut. Ihr erzeugt also euer eigenes Image.

Inhalt des Buildfiles:

#Mit diesem Dockerfile werden zusätzliche Packete in den Nextcloud Container gepackt. 
#Dazu gehören in meinem Fall Packete wie Nano oder MC aber auch die SVG Unterstützung für IMagic
#Aufgerufen wird das ganze mit: docker-compose -f "docker-compose-file" up -d --build
#Ich habe mich für diesen Weg entschieden da ich so das Original Docker Image von Nextcloud nutzen
#kann und alles andere nachinstallieren.1

FROM nextcloud:23

ENV DEBIAN_FRONTEND noninteractive
RUN apt update -y && apt upgrade -y  && apt -y install nano mc htop libmagickcore-6.q16-6-extra && apt -y autoclean

Nano, mc und htop sind für mich Anwendungen die zu jedem Linux Container gehören. Daher sind diese in den meisten meiner eigenen Images installiert.

libmagickcore sorgt für die svg Unterstützung in Nextcloud.

Anpassungen an der NginX Proxy Manager Config

Um die Nextcloud von außen zu erreichen und 2 weitere Fehler in der Nextcloud eigenen Überprüfung sind nach dem Deployen des Nextcloud Containers noch 2 kleine Anpassungen an der NginX Proxy Manager Config zu erledigen.

Dazu ruft ihr die IP Eures Raspi mit dem Port 81 auf und meldet euch beim NginX Proxy Manager an.

Nach der Anmeldung legt ihr den Proxy Host für die Domain unter der ihr Eure NextCloud erreichen wollt fest.

Domain Namen eingeben, Scheme Wählen, IP des Raspi oder App-Name, Port den ihr euch hoffentlich gemerkt habt.
Fix für CalDav/CardDav Fehler anlegen
SSL Zertifikat auswählen. Falls ihr kein neues über Let’sEncrypt zieht, dann bitte vorher hochladen.

Abschluß

Damit wären wir am Ende der Anleitung / Tutorials. Ich hoffe ich konnte auch Neueinsteigern damit helfen.

Die komplette Anleitung und natürlich das komplette Docker-Compose File findet ihr in meinem GitHub Repository. (Anleitung in der Readme.md)

https://github.com/meehr/nextcloud_pgsql

Hier sind noch mal alle anderen Teile verlinkt:

Tutorial Docker und Raspberry Pi (Teil 1)
DietPi Docker Container: Erste Schritte und Vorbereitungen (Teil 2)
NginX Network Manager Docker Container auf dem Raspberry (Teil 3)
Portainer Container auf dem Raspberry Pi (Teil 4)

Danksagung

Mein Dank geht vor allem an Christian Lempa der mich insperiert hat vor allem im Bereich Nginx Proxy Manager. Und die vielen anderen die in den FB Gruppen oder Raspberry Gruppen meine Ungeduld und Fragen ertragen und beantwortet haben.

Published inHowToRaspberryTechnikTutorial