Inhaltsverzeichnis
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.
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.