Nachdem ich zunehmend den Eindruck habe, dass der Owncloud-Fork Nextcloud 1. aktiver und 2. mehr auf Sicherheit bedacht ist als der Vorgänger Owncloud, habe ich mir Nextcloud mit Docker installiert. Das ging ziemlich einfach und „strightforward“.
Unten das docker-compose-File. Hier ein paar Anmerkungen:
- Die Mariadb wird mit einem root-Passwort aus MYSQL_ROOT_PASSWORD und einem User mit Zugriff auf eine neue DB (Username/Passwort und DB-Name aus
db.env
) eingerichtet. - Nextcloud erhält Zugriff über die gleichen Variablen in
db.env
. - Die Daten lege ich ein separates Volume
.../data
. - Backup der DB erstelle ich vollautomatisch über das Docker-Image
dsteinkopf/backup-all-mysql
. - Backup der Dateien erfolgt über ohnehin bei mir existierende Backup-Mechanismen, die das gesamte Basisverzeichnis der Docker-Volumes (bei mir
/opt/dockervolumes
) sichern. - Die Volumes
/etc/timezone
und/etc/localtime
sorgen dafür, dass der Container mit der Zeitzone des Hosts läuft. - Alles steckt in einem eigenen, gemeinsamen Netz
nextcloudnet
. - Die Erreichbarkeit von außen und die SSL-Verschlüsselung erreiche ich via separatem Reverse-Proxy (Config-File: siehe unten) mit letsencrypt-Automatik. Damit Nextcloud gut darüber arbeitet war noch Folgendes in
/opt/dockervolumes/nextcloud/var_www_html/config/config.php
nötig:trusted_domains
muss noch die außen sichtbare Domain enthalten.overwrite.cli.url
muss ebenfalls die öffentliche URL enthalten.overwriteprotocol
:https
.
- Außerdem habe ich in der genannten
config.php
noch den Mailserver konfiguriert:'mail_from_address' => 'nextcloud', 'mail_smtpmode' => 'smtp', 'mail_smtpauthtype' => 'LOGIN', 'mail_domain' => 'my.public.domain', 'mail_smtpsecure' => 'tls', 'mail_smtpauth' => 1, 'mail_smtphost' => 'my.mail.server', 'mail_smtpport' => '25',
- P.S. Es wäre sicher sinnvoll, alle Passworte aus dem Compose-File herauszuhalten, aber die Mühe habe ich mir für meine eigene „kleine“ Umgebung nicht gemacht.
Ich hoffe, ich habe an alles gedacht – das ganze läuft so inzwischen seit ein paar Wochen bei mir stabil.
Links
- Nextcloud auf Docker-Hub
- Mariadb auf Docker-Hub
- „vollautomatisches“ Mysql-Backup über das Docker-Image dsteinkopf/backup-all-mysql.
docker-compose.yml für Nextcloud
version: '2'
services:
db:
image: mariadb
restart: always
volumes:
- /opt/dockervolumes/nextcloud/mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=sehrgeheimroot
env_file:
- db.env
networks:
- nextcloudnet
backup-mysql:
image: dsteinkopf/backup-all-mysql:latest
restart: always
environment:
- BACKUP_INTERVAL=86400
- BACKUP_FIRSTDELAY=4000
- 'MYSQL_CONNECTION_PARAMS=--user=root --host=db --password=sehrgeheim123'
links:
- db
volumes:
- /opt/dockervolumes/nextcloud/mysql-backup:/var/dbdumps
networks:
- nextcloudnet
nextcloud:
image: nextcloud:apache
restart: always
ports:
- 8094:80
links:
- db
volumes:
- /opt/dockervolumes/nextcloud/var_www_html:/var/www/html
- /opt/dockervolumes/nextcloud/data:/var/www/html/data
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
environment:
- MYSQL_HOST=db
- NEXTCLOUD_ADMIN_USER=admin
- NEXTCLOUD_ADMIN_PASSWORD=sehrgeheim456
env_file:
- db.env
networks:
- nextcloudnet
networks:
nextcloudnet:
# empty
Das zugehörig db.env sieht so aus:
db.env
MYSQL_USER=nextcloud
MYSQL_PASSWORD=sehrgeheim123
MYSQL_DATABASE=nextcloud
Reverse-Proxy-Config
<IfModule mod_ssl.c>
<VirtualHost *:443>
# General setup for the virtual host
DocumentRoot "/var/www"
ServerName my-nextcloud.steinkopf.net
ServerAdmin webmaster@steinkopf.net
ErrorLog /var/log/apache2/my-nextcloud.steinkopf.net_error.log
TransferLog /var/log/apache2/my-nextcloud.steinkopf.net_access.log
Include /etc/apache2/dstk-all-sites-incl.conf
# see https://doc.owncloud.org/server/8.1/admin_manual/configuration_server/harden_server.html
Header always add Strict-Transport-Security "max-age=15768000"
# RewriteLogLevel 3
RewriteEngine On
ProxyRequests Off
ProxyPass / http://docker-prod.steinkopf.net:8094/
ProxyPassReverse / http://docker-prod.steinkopf.net:8094/
SSLCertificateFile /etc/letsencrypt/live/my-nextcloud.steinkopf.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/my-nextcloud.steinkopf.net/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
Das sieht ja schon mal super aus, allerdings sollte man vor dem Nextcloud-Backup den maintenance mode setzen…
Danke. Das stimmt natürlich… ist für eine „low traffic“-Installation wohl weniger wichtig – für den „Echtbetrieb“ schon eher. Und es gilt wohl für DB- und für Filesytem-Backup. Ich denke drüber nach…
Das ist recht einfach gemacht, per „docker in docker“ und per: ‚docker exec –user www-data nextclouddocker php occ maintenance:mode –on‘
Richtig. Bei mir sieht das konkret so aus:
docker exec --user www-data nextcloud_nextcloud_1 php occ maintenance:mode --off
Moin Moin,
Gutes Howto !
Bin gespannt auf Elasticsearch mit Docker.
Gruß
Markus
kann es sein, dass im db.env file der mysql user fehlt?
Richtig. Danke für den Hinweis. Ich hab’s korrigiert.
hallo, bin ein docker neuling….
habe eine nc.yml db.env erstellt und mit „docker-compose -f nc.yml up -d“ gestartet.
lt.docker-portainer läuft das auch.
was oder wie gehe ich mit der „Reverse-Proxy-Config“ um? wo wird die eingebaut bzw muss ich die im vserver bearbeiten/erstellen?
vg hardy
Das hängt davon ab, ob Du überhaupt einen Reverse-Proxy brauchst. Meine docker-Hosts sind nicht vom Internet aus erreichbar, daher habe ich für die Erreichbarkeit und zur SSL-Behandlung einen Reverse-Proxy. Dieser ist bei mir eine völlig separate Maschine und global erreichbar. Über die o.g. Konfig (die eher als Skizze dienen soll) werden die von außen kommenden requests an die Nextcloud-Installation im Container weiter geleitet. Mit letsencrypt bzw. certbot habe ich die SSL-Einrichtung samt Zertifikaten erreicht – aber das ist eine andere „Geschichte„.
P.S. Da Du von portainer schreibst: Es macht natürlich immer zusätzlich Sinn, mit
docker-compose logs ...
zu beobachten, was in den Container genau passiert.Hallo Dirk,
ich habe mir mit deiner Hilfe ein docker-compose.yml zusammengestellt. Leider scheitere ich schon beim „docker-compose up -d“.
Ich erhalte immer eine Fehlermeldung bei der MariaDB und nginx….
ERROR: for 5f47dfa859db_nextcloud_proxy_1 Cannot start service proxy: error while creating mount source path ‚/mnt/raid/Docker-Volumes/nextcloud/nginx-html‘: mkdir /mnt/raid: read-only file system
ERROR: for db Cannot start service db: error while creating mount source path ‚/mnt/raid/Docker-Volumes/nextcloud/mariadb‘: mkdir /mnt/raid: read-only file system
ERROR: for proxy Cannot start service proxy: error while creating mount source path ‚/mnt/raid/Docker-Volumes/nextcloud/nginx-html‘: mkdir /mnt/raid: read-only file system
Woran kann das denn liegen? Die Rechte meines Zielverzeichnisses sehen so aus:
drwxrwx–x 2 bernd root 4096 Nov 4 11:24 Docker-Volumes/
Gruß Bernd
read-only file system
klingt für mich als wäre das ganze entsprechende Filesystem als nicht schreibbar gemountet. Kann das sein? Schau mal u.a. mitmount
nach.Hallo
tolle Anleitung. Ich bin noch neu und frage mich wieso es unter Nexcloud, Volumes diese Zeile braucht:
- opt_dockervolumes_nextcloud_data:_var_www/html_data
Hätte diese Zeile nicht gereicht:
– opt_dockervolumes_nextcloud_var_www_html:_var_www_html
Ausserdem habe ich in anderen compose-files folgendes gesehen:
volumes:
“ – nextcloud:_var_www_html“
und dafür zum Schluss des Files noch Einträge wie diese:
volumes:
nextcloud:
Weisst du was es damit auf sich hat?
(sorry, ich konnte eine Backlsashs einfügen)
Gruss
Santo
Freut mich, wenn es Dir was gebracht hat 🙂
Das stimmt, eigentlich braucht es die data-Zeile nicht. Ich habe sie dennoch separat aufgeführt, damit das data-Verzeichnis in einem eigenen Volume landet und getrennt behandelt werden kann. So habe ich inzwischen das data-Verzeichnis auf einem anderen (größeren) Laufwerk abgelegt.
Damit wird im compose-File angegeben, dass das Volume außerhalb des compose-Files definiert und eingerichtet wurde und hier nur referenziert. Das geht z.B. mit
mehr hier: https://docs.docker.com/engine/reference/commandline/volume_create/
Noch ein Hinweis:
occ
rufe ich prima so auf:Hello I followed your tutorial and it worked great, I have been using it for a while but now the db won’t start. it says “ Could not open mysql.plugin table: „File ‚./mysql/plugin.MAD‘ not found“
I am trying to fix it but docker for windows won’t let me enter the container because it just restarts. How can I restore the backup? thanks!
I also know these situations where nothing can be done because a container is continuously restarting. I always try to add a
command: sleep 9999
to the compose file. This makes docker start the container but not run the real content. So you can enter the container and have a look.Hope that helps.
(Sorry for the late answer.)