Die Tage habe ich es geschafft, meine Nextcloud Instanz komplett in einen Docker Container um zu ziehen. Als erstes komplettes Datenbank Backup gemacht
Backup der Datenbank erstellen
sudo mysqldump –uroot –p nextcloud_db.sql > backup.sql
Als nächstes habe ich da Docker–compose installiert und eingerichtet.
Docker-compose einrichte
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
Dann habe ich ein Verzeichnis eingerichtet wo die zukünftige Konfiguration der Cloud abgespeichert wird.sudo mkdir –p /docker/nextcloud && cd /docker/nextcloud
Die Datei die zuerst erstellt wird, ist eine Docker-compose.yml Datei.
Docker Konfiguration erstellen
sudo vi docker–compose.yml
Diese wird folgende Konfiguration wird rein geschrieben.
version: '2.2'
services:
db:
image: mariadb
container_name: nextcloud-pro-mariadb
networks:
- nextcloud-pro_network
volumes:
- /home/nextcloud/db:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
environment:
- MYSQL_ROOT_PASSWORD=SuperSecretPassword
- MYSQL_PASSWORD=SecretPassword
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
restart: unless-stopped
redis:
container_name: nextcloud-pro_redis
networks:
- nextcloud-pro_network
image: redis:alpine
restart: always
app:
image: nextcloud:latest
container_name: nextcloud-pro
networks:
- nextcloud-pro_network
depends_on:
- db
- redis
volumes:
- /home/nextcloud/config:/var/www/html/config
- /home/nextcloud/custom_apps:/var/www/html/custom_apps
- /home/nextcloud/data:/var/www/html/data
- /home/nextcloud/themes:/var/www/html/themes
- /etc/localtime:/etc/localtime:ro
environment:
- NEXTCLOUD_TRUSTED_DOMAINS=cloud.domain.tld
- NEXTCLOUD_ADMIN_USER=NCuser
- NEXTCLOUD_ADMIN_PASSWORD=Password
- REDIS_HOST=redis
- REDIS_HOST_PORT=6379
- MYSQL_PASSWORD=SecretPassword
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
ports:
- '8090:80'
restart: unless-stopped
elasticsearch:
build: ./elasticsearch
container_name: els_nextcloud
restart: always
environment:
- cluster.name=ncsearch
- bootstrap.memory_lock=true
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms750m -Xmx750m"
- "network.host=0.0.0.0"
ulimits:
memlock:
soft: -1
hard: -1
# location for persistent data
volumes:
- /home/nextcloud/els_data:/usr/share/elasticsearch/data
ports:
- "127.0.0.1:9200:9200"
expose: # make elasticsearch reachable in the internal docker network
- "9200" # direct elasticsearch connection
networks:
- nextcloud-pro_network
volumes:
nextcloud:
db:
networks:
nextcloud-pro_network:
Mit diesem Setup hat man eine funktionierende Cloud, mit Redis als Cache und Fulltextsearch als Suchmaschine.
Verzeichnisse erstellen
Jetzt müssen die Ordner die als Volume angegeben sind erstellt werden. In diese wird beim start der Container der Inhalt geladen der beim restart und bei einem Upate erhalten bleiben soll.
mkdir -p /home/nextcloud/db
mkdir -p /home/nextcloud/els_data
mkdir -p /home/nextcloud/data
mkdir -p /home/nextcloud/themes
mkdir -p /home/nextcloud/custom_apps
mkdir -p /home/nextcloud/config
mkdir elasticsearch
Dockerfile erstellen
Danach wird im Ordner elasticsearch ein Dockerfile erstellt.
sudo vi elasticsearch/Dockerfile
FROM nextcloud:production
RUN apt update && apt -y install lsb-release apt-transport-https ca-certificates wget
RUN wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
RUN echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php7.3.list
RUN apt-get -y install apt-utils curl cmake make gcc libc-dev g++ libopenblas-dev libx11-dev pkg-config aria2 python ruby-redis memcached coturn ffmpeg imagemagick ghostscript bash vim git
RUN curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl && chmod a+rx /usr/local/bin/youtube-dl
#RUN chmod 740 /var/www/html/custom_apps/ocdownloader/SERVER/fallback.*
ADD turnserver.conf /etc/turnserver.conf
RUN echo "TURNSERVER_ENABLED=1" >> /etc/default/coturn && service coturn restart
# DLib https://github.com/goodspb/pdlib#dependencies
RUN git clone https://github.com/davisking/dlib.git
; cd dlib/dlib
; mkdir build
; cd build
; cmake -DBUILD_SHARED_LIBS=ON ..
; make
; make DESTDIR=/dlib-install install
; make install
# https://github.com/goodspb/pdlib#installati
RUN git clone https://github.com/goodspb/pdlib.git
; cd pdlib
; phpize
; ./configure
; make
; make DESTDIR=/pdlib-install install
Update 16.04.2020
Das oben stehende Dockerfile ist von Grund auf neu strukturiert und unnötiges entfernt. Anpassungen an das Debian Image gemacht.
Danach dann den Container starten. Dauert dann eine Weile.
Turnserver.conf erstellen und anpassen
sudo vi elasticsearch/turnserver.conf
listening-port=<yourChosenPortNumber>
fingerprint
lt-cred-mech # Only on coTURN below v4.5.0.8!
use-auth-secret
static-auth-secret=<yourChosen/GeneratedSecret>
realm=your.domain.org
total-quota=100
bps-capacity=0
stale-nonce
no-loopback-peers # Only on coTURN below v4.5.1.0!
no-multicast-peers
sudo docker-compose up –d
Alles sollte nun laufen. Damit Matomo funktioniert muss noch eine Datei angepasst werden.
Nginx Konfiguration erstellen
sudo /etc/nginx/sites–available/ cloud.domain.tld
server {
server_name cloud.domain.tld;
index index.html;
location / {
proxy_pass http://localhost:8090/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
client_max_body_size 0;
access_log /var/log/nginx/nextcloud.access.log;
error_log /var/log/nginx/nextcloud.error.log;
}
location /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}
listen [::]:443 ssl http2; # managed by Certbot
listen 443 ssl http2; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/cloud.domain.tld/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/cloud.domain.tld/privkey.pem; # managed by Certbot
ssl_trusted_certificate /etc/letsencrypt/live/cloud.domain.tld/chain.pem;
}
server {
if ($host = cloud.domain.tld) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name cloud.domain.tld;
return 404; # managed by Certbot
}
Als nächstes werden die Zertifikate erstellt, die wir für die Seite genötigen
Zertifikate erstellen
sudo certbot –certonly –d cloud.domain.tld
sudo service nginx reload
Jetzt sollte alles passen und laufen.
Um nun die Datenbank wieder zurückzuspielen benutzen wir folgendes Kommando.
cat /home/backup/mysqldump/cloud.sql | docker exec -i <containerid> mysql -unextcloud –p SecretPassword nextcloud
Das zurück spielen wird je nach Größe der datenbank etwas dauern, aber dann sollte alles wieder funktionieren. Wenn nicht schreibt es in die Kommentare.
Hallo Lars,
eine beeindruckende Installation auf minimalem Weg!
Ich versuche verzweifelt Nextcloud (mit allen Funktionen) in einen Docker zu kriegen,
aber scheitere daran die Container untereinander kommunizieren zu lassen. D.h. NC kommt nicht mal zur (Maria)DB, egal ob ich die DB in der Bridge oder lokal auf dem Host installiere.
Werde deine Variante dazu mal ausprobieren!
Was ich bei deiner Installation jedoch nicht verstehe:
– Wie spreche ich NC von außen an? Über Port 8090 ?
– Wie funktioniert das dann mit dem Https ? (Geht ja schlecht über Port 80)
Kann man das Ganze auch mit Apache gestalten, oder warum nimmst du nginx ?
-> Wenn du mir jetzt noch zeigen kannst, wie ich nen Turn-Server (für Talk) sauber in den Docker bekomme (der muss aber glaube auch von außen erreichbar sein), wär ich überglücklich!
VG Daniel
Moin, danke erstmal für den Kommentar. Die verschiedenen Container haben über Networks Zugriff auf andere Container. z.B.:
networks:
– nextcloud-pro_network
Alle Container wie auch Redis, Turnserver etc. müssen in dem gleichen Netzwerk sein.
Über Ports wird die Cloud angesprochen kannst auch anstatt 8090:80 4443:443 nehmen dann geht alles über https. Ich hab allerdings 8090 und Nginx als Reverse Proxy eingerichtet.
Hab allerdings ein selber erstelltes Nextcloud Image, wo der Turnserver und Aria2c direkt mit drin sind. Will das aber noch ändern.
Ok, das mit dem Reverse-Proxy bekomme ich hin. Dann ist „proxy_pass http://localhost:8090/;“ also deine interne Weiterleitung zum NC-Container über 8090 (ohne SSL). Mir wäre es lieber die IP des Docker Containers „direkt“ anzusprechen (zB 172.17.0.2), ohne dass es im lokalen Netzwerk die Möglichkeit gibt „am Reverse-Proxy vorbei“ auf NC zuzugreifen.
Das mit den: networks: – nextcloud-pro_network …ist mir zu hoch! Ich habe mit Bridge/Host und MACVLAN experimentiert, aber Container zu Container untereinander oder auch Container zu Serverhost (auch bei MACVLAN) bekomme ich nicht hin! Das liegt wohl an der Route in den IP-Tables des Systems. Das im Server und im Docker „dauerhaft“ (nach reboot) zu ändern bekomme ich nicht hin. Warum sieht dann deine Lösung mit „Networks“ so einfach aus? (Kann das nicht nachvollziehen.)
Wie installiere ich den Turnserver, dass er von dem NC-Container, sowohl auch „extern“ erreichbar ist? (Mit einem 2. Reverse-Proxy Eintrag oder Container als „Host“ definieren?)
VG Daniel