Anlegen einer Nextcloud Instanz auf einem Alpine Server mit Caddy
DNS-Konfiguration für die Subdomain
Um den Server über eine Domain oder Subdomain erreichbar zu machen, ist die Erstellung eines entsprechenden DNS-Records erforderlich. In diesem Fall wird die Domain erik-skopp.de
genutzt und eine Third-Level-Domain mit dem Namen nextcloud
angelegt. Daraus ergibt sich die finale Subdomain: nextcloud.erik-skopp.de
.
Anlegen der Records
Diese Subdomain dient ausschließlich zu Testzwecken. Nach Abschluss dieses Berichts werden sowohl der Webserver als auch die Nextcloud-Installation sowie die zugehörigen DNS-Einträge entfernt.
Zur Vereinfachung werden hier nur zwei Domains verwendet:
- Der
A-Record
weist die Domain der IPv4-Adresse152.53.120.57
zu. - Der
AAAA-Record
löstnextcloud.erik-skopp.de
auf IPv6 auf, nämlich auf2a0a:4cc0:c0:4540::1
.
Für dieses Projekt nutze ich einen Netcup-Server
, der einen /64-Adresspool
bereitstellt. Konkret sind dies:
Link-Local-Adresse:
fe80::a8cb:d0ff:fe50:ab47/10
(nicht von außen erreichbar)Global Unicast-Subnetz:
2a0a:4cc0:c0:4540::/64
(öffentlich routbar)
Da die Link-Local-Adresse (
fe80::…/10) nicht extern erreichbar
ist, bleibt nur die routbare Global Unicast-Adresse
.
Aus dem /64
-Adresspool habe ich die :1
als Host-Adresse gewählt – dies geschah aus rein praktischen Gründen und hat keinen Einfluss auf den weiteren Ablauf.
Testen der Records
DNS-Checker
Die Überprüfung der DNS-Einträge erfolgt auf zwei Wegen. Eine Möglichkeit bietet die externe Website DNSChecker. Dort kann die gewünschte URL eingegeben und der zu überprüfende DNS-Record ausgewählt werden. Die Ergebnisse werden übersichtlich dargestellt und zeigen, in welchen Regionen der Eintrag bereits propagiert wurde und wo er noch aussteht.
DIG
dig (Domain Information Groper) ist ein leistungsstarkes Kommandozeilen-Tool zum Abfragen von DNS-Informationen. Es wird häufig von Netzwerkadministratoren und Entwicklern […] genutzt, um DNS-Records von Domains zu analysieren. (Quelle: verschiedene)1
Wir nutzen dig um mit einem CLI Tool zu prüfen ob die DNS Einträge für die Nextcloud Domain vorhanden sind. Auf Gründen der einfachheit werde ich hier nur auf den IPv4
bzw A-Record
eingehen, da nur dieser hier relevant ist. Für den anderen Record bedarf es keine Änderung. Auf dem Server werden beide in der Caddy Config abgefangen.
1> dig nextcloud.erik-skopp.de
2
3; <<>> DiG 9.18.30-0xxx <<>> nextcloud.erik-skopp.de
4;; global options: +cmd
5;; Got answer:
6;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8998
7;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
8
9;; OPT PSEUDOSECTION:
10; EDNS: version: 0, flags:; udp: 512
11;; QUESTION SECTION:
12;nextcloud.erik-skopp.de. IN A
13
14;; ANSWER SECTION:
15nextcloud.erik-skopp.de. 182 IN A 152.53.120.57
16
17;; Query time: 49 msec
18;; SERVER: 10.255.255.254#53(10.255.255.254) (UDP)
19;; WHEN: Fri Feb 07 10:17:31 CET 2025
20;; MSG SIZE rcvd: 68
In der Antwortsektion ist zu erkennen, dass der Server den A-Record erfolgreich aufgelöst hat. Daher können wir uns nun der Serverkonfiguration widmen.
Einrichten des Servers
Grundgedanke
In den meisten Linux-Distributionen werden Websites standardmäßig im Verzeichnis /var/www
abgelegt. Daher erstellen wir dort den Ordner nextcloud
, der als Hauptverzeichnis für Nextcloud dient. Die Nutzerdaten hingegen werden in /home/data/
gespeichert. Diese Trennung ist essenziell, da sie die Verwaltung von Zugriffsrechten erleichtert und die Struktur übersichtlicher hält.
Anschließend konfigurieren wir Caddy so, dass es die Index-Dateien aus dem Verzeichnis /var/www/nextcloud
lädt. Da Nextcloud PHP erfordert, verwenden wir die aktuelle Version 8.3, die über den PHP FastCGI Socket
eingebunden wird. PHP FastCGI (Fast Common Gateway Interface) ist eine optimierte Methode zur Kommunikation zwischen einem Webserver und der PHP-Interpreter-Instanz. Im Gegensatz zum klassischen CGI, bei dem für jede Anfrage ein neuer PHP-Prozess gestartet wird, hält FastCGI persistente Prozesse bereit, die mehrere Anfragen effizient verarbeiten können. Dies reduziert den Overhead und verbessert die Leistung von PHP-Anwendungen erheblich.
Ein sock
(Socket) ist eine Datei, die als Kommunikationsschnittstelle zwischen zwei Prozessen auf demselben System dient. In diesem Fall ermöglicht ein Unix-Domain-Socket die direkte und schnelle Kommunikation zwischen dem Webserver (Caddy) und der PHP-FPM-Instanz. Der Webserver übergibt Anfragen an diesen Socket, woraufhin PHP-FPM die Anfragen verarbeitet und die Antworten zurückliefert.
Als Datenbank setzen wir MariaDB ein, um die erforderlichen Daten für Nextcloud zu verwalten.
Mit dieser Konfiguration ist die grundlegende Einrichtung abgeschlossen.
Grundlagen von Alpine
In diesem Projekt verwenden wir Alpine Linux in der Version 3.21.3
, die über die offizielle Alpine-Downloadseite verfügbar ist. Wir gehen davon aus, dass eine installierte und funktionsfähige Alpine-Version bereits vorhanden ist.
Um Alpine aktuell zu halten und um es zu aktualisieren empfiehlt es sich ein update durchzuführen.
1apk update
2apk upgrade
Ähnlich wie bei anderen Distributionen aktualisiert apk update
die Paketlisten und apk upgrade
die Packages anhand der Packetlisten.
Erstellen der Ordnerstruktur
1mkdir -p /home/data
2cd /var/www
3mkdir -p nextcloud.erik-skopp.de
4cd ~
5cd nextcloud.erik-skopp.de/
Für die Nextcloud-Installation benötigen wir lediglich zwei Verzeichnisse: 2
/home/data
– Dieses Verzeichnis dient als Speicherort für die Nutzerdaten. Durch die Trennung von Anwendungs- und Nutzerdaten wird die Verwaltung von Zugriffsrechten vereinfacht und die Datensicherheit erhöht./var/www/nextcloud.erik-skopp.de
– Hier wird die Nextcloud-Installation selbst abgelegt. Dieses Verzeichnis enthält alle erforderlichen Dateien für den Betrieb von Nextcloud.
Diese klare Trennung sorgt für eine bessere Organisation und erleichtert zukünftige Wartungsarbeiten.
Herunterladen von Nextcloud
Zunächst laden wir die Datei latest.zip
herunter und entpacken sie in das vorgesehene Verzeichnis. Alpine bietet in der Dokumentation ein nextcloud-initscript
3, das diesen Prozess automatisiert. Im Wesentlichen führt das Skript dieselben Schritte aus, mit dem Unterschied, dass es zusätzlich die erforderlichen PHP-Abhängigkeiten installiert.
Da wir das System manuell einrichten, müssen wir die benötigten PHP-Pakete selbst installieren, um sicherzustellen, dass Nextcloud reibungslos funktioniert.
1cd /var/www/nextcloud.erik-skopp.de
2wget https://download.nextcloud.com/server/releases/latest.zip
3unzip latest.zip
4mv nextcloud/* .
5rm -rf nextcloud/
6rm latest.zip
Mit wget laden wir das ZIP-Archiv von Nextcloud herunter. Es ist wichtig, die Version latest zu verwenden, da nur so die neuesten Sicherheitsupdates und Funktionen enthalten sind.
Anschließend entpacken wir das ZIP-Archiv, wodurch die Dateien in einem zusätzlichen Unterordner nextcloud abgelegt werden. Da dieser zusätzliche Ordner nicht benötigt wird, verschieben wir den Inhalt direkt in unseren Zielordner nextcloud.erik-skopp.de. Abschließend löschen wir das ursprüngliche latest.zip-Archiv sowie den nun leeren nextcloud-Ordner.
Nun sollte das ganze in etwa so aussehen:
1localhost:/var/www/nextcloud.erik-skopp.de# ls
23rdparty apps console.php index.html ocs public.php status.php
3AUTHORS composer.json core index.php ocs-provider remote.php themes
4COPYING composer.lock cron.php lib package-lock.json resources updater
5LICENSES config dist occ package.json robots.txt version.php
Installation von PHP 8.3
1apk add php83 php83-fpm php83-mysqli php83-json php83-openssl \
2 php83-curl php83-gd php83-intl php83-mbstring php83-xml \
3 php83-zip php83-bcmath php83-gmp php83-exif php83-fileinfo \
4 php83-pcntl php83-posix php83-session php83-simplexml \
5 php83-tokenizer php83-iconv php83-dom php83-xmlreader \
6 php83-xmlwriter php83-pdo php83-pdo_mysql php83-opcache
Um PHP allein nutzen zu können, reicht es aus, den Befehl apk add php83 php83-fpm
auszuführen. Nextcloud erfordert jedoch zusätzliche PHP-Erweiterungen für seine Kernfunktionen und Plugins. Um nicht jede Erweiterung einzeln zu installieren, kann man mit diesem Befehl die wichtigsten Extensions direkt hinzufügen.
Installation von Caddy
1apk add caddy
Caddy ist ein moderner, leistungsstarker Webserver und Reverse Proxy, der sich durch einfache Konfiguration, automatische HTTPS-Unterstützung und geringe Systemanforderungen auszeichnet. Er ist in Go geschrieben und wird oft als Alternative zu Nginx oder Apache verwendet.
Wie alle Webserver basiert Caddy auf Konfigurationsdateien, die nun bearbeitet werden müssen. Ein wesentlicher Unterschied zu Apache und Nginx besteht darin, dass Caddy die Verwaltung von SSL/TLS-Zertifikaten automatisch übernimmt. 4
1rc-service caddy start
In Alpine müssen alle sockets und Dienste manuell gestartet werden. Man kann das einfach mit systemctl caddy start
aus Debian 12 vergleichen. Ohne den Start ist Caddy nicht nutzbasr. Debian nutzt systemd und Alpine nutzt OpenRC.
Einrichten von Caddy
Die Konfigurationsdatei von Caddy befindet sich unter /etc/caddy/Caddyfile
und kann als normale Textdatei bearbeitet werden. Dafür eignet sich nano, alternativ kann auch vim oder ein anderer Editor verwendet werden.
1nano /etc/caddy/Caddyfile
Diese Caddyfile
definiert die Konfiguration für die Domain nextcloud.erik-skopp.de
und stellt sicher, dass Nextcloud über Caddy als Webserver korrekt betrieben wird.
1# Caddy's configuration file
2# see: https://caddyserver.com/docs/caddyfile
3
4nextcloud.erik-skopp.de {
5 root * /var/www/nextcloud.erik-skopp.de
6 file_server
7 php_fastcgi unix//run/php-fpm83/php-fpm.sock
8
9 header {
10 Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
11 Referrer-Policy "no-referrer"
12 X-Content-Type-Options "nosniff"
13 X-Frame-Options "SAMEORIGIN"
14 X-XSS-Protection "1; mode=block"
15 }
16}
Diese Caddyfile definiert die Konfiguration für die Domain nextcloud.erik-skopp.de
und stellt sicher, dass Nextcloud über Caddy als Webserver korrekt betrieben wird.
Zunächst wird die Domain nextcloud.erik-skopp.de
als Hostname festgelegt, sodass Caddy Anfragen für diese Domain verarbeitet. Danach wird das Root-Verzeichnis
für Nextcloud auf /var/www/nextcloud.erik-skopp.de
gesetzt, wodurch alle statischen Dateien und PHP-Skripte von dort geladen werden. Die Zeile file_server
aktiviert den Dateiserver von Caddy, sodass statische Inhalte wie Bilder, CSS und JavaScript direkt ausgeliefert werden können.
Für die PHP-Verarbeitung wird php_fastcgi unix//run/php-fpm83/php-fpm.sock
verwendet. Dadurch werden PHP-Anfragen an einen PHP-FPM 8.3 Socket weitergeleitet, was für die korrekte Ausführung von Nextcloud erforderlich ist.
Zusätzlich werden mehrere Sicherheits-Header
gesetzt, um die Nextcloud-Instanz besser abzusichern. Strict-Transport-Security
(HSTS) sorgt dafür, dass HTTPS für ein Jahr erzwungen wird und auch Subdomains betrifft. Referrer-Policy
verhindert, dass der Browser Referrer-Informationen an externe Seiten sendet. X-Content-Type-Options
unterbindet das MIME-Type-Sniffing und erschwert so Angriffe. X-Frame-Options
schützt vor Clickjacking, indem das Einbetten der Seite in Frames blockiert wird. Schließlich aktiviert X-XSS-Protection
den XSS-Schutz im Browser.
Diese Caddyfile
ermöglicht eine sichere und optimierte Bereitstellung von Nextcloud auf der Domain nextcloud.erik-skopp.de
. Caddy übernimmt die Verwaltung von statischen Dateien
, PHP-Verarbeitung
und Sicherheitsmechanismen
, wodurch eine stabile und geschützte Umgebung für Nextcloud gewährleistet wird.
Wenn die Config fertig ist, kann man sie formatieren. Dies sollte man tun, da sonst OpenRC sich beschwert.
1caddy fmt --overwrite /etc/caddy/Caddyfile
Anschließend muss Caddy neu gestartet werden. Dies ist wichtig, damit er die Config neu einliest.
1rc-service caddy restart
Aktivieren von PHP8.3
Das starten von PHP8.3 hat sich immer als etwas schwierig herausgestellt.
1rc-update add php-fpm83 default
2rc-service php-fpm83 restart
Jetzt geht es um die PHP config
1nano /etc/php83/php-fpm.d/www.conf
Anschließend sind einige Anpassungen in der Datei /etc/php83/php-fpm.d/www.conf
erforderlich. Ich empfehle, die Datei vollständig zu löschen, da nur wenige Konfigurationen benötigt werden. Diese werde ich nun im Detail erläutern.
1[www]
2;listen = 127.0.0.1:9000
3;user = nobody
4;#group = nobody
5;#listen.owner = nobody
6;listen.group = nobody
7;listen.mode = 0666
8;pm = dynamic
9;pm.max_children = 50
10;pm.start_servers = 5
11;pm.min_spare_servers = 5
12;pm.max_spare_servers = 35
13
14
15user = caddy
16group = caddy
17listen = /run/php-fpm83/php-fpm.sock
18listen.owner = caddy
19listen.group = caddy
20listen.mode = 0660
21pm = dynamic
22pm.max_children = 10
23pm.start_servers = 2
24pm.min_spare_servers = 1
25pm.max_spare_servers = 5
Ich habe die alte config oben als Kommentar in der Datei beibehalten. Das macht das Fehler debugging einfacher. Die Konfiguration für
PHP-FPM 8.3
setzt verschiedene Parameter für den Betrieb des PHP-Prozesses unter dem Benutzercaddy
. Die einzelnen Zeilen haben folgende Bedeutung:
user = caddy
undgroup = caddy
Diese Zeilen legen fest, dassPHP-FPM
als der Benutzercaddy
in der Gruppecaddy
ausgeführt wird. Dies ist wichtig, um eine saubere Rechteverwaltung zu gewährleisten und sicherzustellen, dassPHP
-Prozesse unter dem Webserver-Benutzer laufen.listen = /run/php-fpm83/php-fpm.sock
Diese Einstellung definiert, dassPHP-FPM
über eine Unix-Socket-Datei (/run/php-fpm83/php-fpm.sock
) statt über eine TCP-Adresse (127.0.0.1:9000
) kommuniziert.
Die Nutzung einer Unix-Socket-Verbindung hat mehrere Vorteile:- Sie ist schneller als eine
TCP
-Verbindung, da sie ohne Netzwerk-Overhead direkt auf dem Dateisystem operiert. - Sie ist sicherer, da keine Netzwerkverbindung geöffnet wird, wodurch Angriffe von außen ausgeschlossen sind.
- Sie reduziert die Ressourcennutzung, insbesondere bei lokalen Webservern wie
Caddy
oderNginx
.
- Sie ist schneller als eine
listen.owner = caddy
undlisten.group = caddy
Diese Einstellungen definieren, dass derCaddy
-Server vollen Zugriff auf diePHP-Socket
-Datei hat. Ohne diese Konfiguration könnte der WebserverPHP-FPM
möglicherweise nicht korrekt ansprechen.listen.mode = 0660
Hier wird festgelegt, dass die erstellteSocket-Datei
(php-fpm.sock
) mit den Berechtigungen 0660 versehen wird.
Das bedeutet:- Eigentümer (
caddy
): Lesen & Schreiben (6
) - Gruppe (
caddy
): Lesen & Schreiben (6
) - Andere Benutzer: Kein Zugriff (
0
)
Dadurch wird sichergestellt, dass nur derWebserver-Prozess
auf denSocket
zugreifen kann.
- Eigentümer (
pm = dynamic
Diese Einstellung konfiguriert das Prozessmanagement fürPHP-FPM
aufdynamisch
. Das bedeutet, dassPHP-FPM
je nach Last die Anzahl der Prozesse anpasst.pm.max_children = 10
Dies gibt die maximale Anzahl anPHP-Prozessen
an, diePHP-FPM
gleichzeitig starten kann. Damit wird verhindert, dass das System überlastet wird.pm.start_servers = 2
Diese Zeile gibt an, dassPHP-FPM
direkt beim Start zwei Prozesse erzeugt.pm.min_spare_servers = 1
Dies stellt sicher, dass mindestens ein Prozess im Leerlauf bleibt, um Anfragen sofort bearbeiten zu können.pm.max_spare_servers = 5
Diese Einstellung gibt an, dass maximal fünf Prozesse im Leerlauf sein dürfen, um Ressourcen zu sparen.
Standardmäßig lauscht PHP-FPM
auf 127.0.0.1:9000
, einer TCP
-Verbindung.
Die Umstellung auf eine Unix-Socket-Datei (/run/php-fpm83/php-fpm.sock
) wurde vorgenommen, weil:
- Leistungssteigerung: Eine
Unix-Socket
ist schneller alsTCP
, da kein Netzwerk-Stack verwendet wird. - Sicherheit: Eine
TCP-Verbindung
könnte theoretisch von anderen Diensten oder Benutzern im Netzwerk abgefangen werden. - Ressourcenschonung: Ein
Unix-Socket
verbraucht weniger Systemressourcen als eineTCP-Verbindung
. - Bessere Integration mit Caddy: Da
Caddy
lokal läuft, kann es direkt auf denUnix-Socket
zugreifen, ohne dass ein Netzwerkport geöffnet sein muss.
Durch diese Änderungen wird PHP-FPM
effizienter, sicherer und performanter in die Webserver-Umgebung
integriert.
Maria DB für Nextcloud
Dieser Block kann schnell abgehandelt werden, da es sehr einfach ist. Zuerst installieren wir mit apk die Packages:
1apk add nextcloud-mysql mariadb mariadb-client
Anschließend führen wir einen Neustart des MariaDB-Stacks durch:
1mysql_install_db --user=mysql --datadir=/var/lib/mysql
2service mariadb start
3rc-update add mariadb
4mysql_secure_installation
Da MySQL/MariaDB nun konfiguriert ist, können wir den Dienst starten und die Datenbanken anlegen.
1mysql -u root -p
2CREATE DATABASE nextcloud;
3GRANT ALL ON nextcloud.* TO 'mycloud'@'localhost' IDENTIFIED BY 'sicherespasswort';
4GRANT ALL ON nextcloud.* TO 'mycloud'@'localhost.localdomain' IDENTIFIED BY 'sicherespasswort';
5FLUSH PRIVILEGES;
6EXIT
Bitte ändern Sie das Passowrt
Nextcloud im Browser
Can’t write into config directory!
Der Fehler kann einfach behoben werden:
1chown -R caddy:caddy /var/www/nextcloud.erik-skopp.de
Nextcloud configurieren
Bitte geben Sie alle erforderlichen Daten ein. Nach der Eingabe erfolgt die automatische Installation von Nextcloud, und die Einrichtung ist abgeschlossen.
Fertig.
Nun können Sie Nextcloud nutzen.
Sonstiges
Titelbild
Das Titelbild stammt von Pixabay.5
Diese Trennung habe ich mir vor etlichen Jahren abgeschaut und finde sie bis heute sinnvoll. Sie sorgt für eine klare Struktur, erleichtert die Verwaltung von Zugriffsrechten und verbessert die Wartbarkeit des Systems. Während sich
/home/data
ausschließlich um die Speicherung der Nutzerdaten kümmert, bleibt/var/www/nextcloud.erik-skopp.de
auf die Anwendung selbst beschränkt. Dadurch lassen sich Backups gezielter anfertigen und Berechtigungen besser steuern. Apfelcast - Nextcloud und Nginx ↩︎