Kapitel 7/Tutorial.md aktualisiert

This commit is contained in:
2025-09-04 07:12:09 +00:00
parent a7255671f4
commit 4aa0243c86

View File

@@ -4,161 +4,65 @@
## Einleitung
Nextcloud ist das Herzstück deiner eigenen Cloud. Hier landen Dateien, Fotos, Kalender und Kontakte und zwar ohne Abhängigkeit von Google oder Microsoft. In diesem Kapitel bauen wir Nextcloud so auf, dass sie stabil und performant läuft. Wir setzen auf **Nginx + PHP-FPM** als Webserver, **PostgreSQL** als Datenbank und **Redis** als Cache. Die Benutzerdaten liegen auf einer separaten Festplatte unter `/mnt/hdd`. Damit ist die Cloud nicht nur schnell, sondern auch zukunftssicher.
Nextcloud ist das Herzstück deiner privaten Cloud. Hier landen Dateien, Fotos, Kalender und Kontakte ohne Google, ohne Microsoft. In diesem Kapitel installieren wir Nextcloud **in einem LXC-Container unter Proxmox**, setzen auf **PostgreSQL** als Datenbank, **Nginx + PHP-FPM** als Webserver und **Redis** als Cache. Die Benutzerdaten liegen auf einer separaten Festplatte für Performance, Übersicht und Datensicherheit.
---
## Voraussetzungen
* **Proxmox Host** mit zwei Platten (System + Datenplatte)
* **LXC (Ubuntu 24.04 LTS)** mit aktivem Nesting
* **Nginx Proxy Manager** für HTTPS
* **Proxmox Host** mit 2 Platten (System + Datenplatte)
* **LXC mit Ubuntu 24.04**, Nesting aktiviert
* **Nginx Proxy Manager** für HTTPS-Zugriff
* Eine **Domain**, die auf deinen Proxy zeigt
* Offene Ports **80/443** auf NPM
* 2 vCPU, 48 GB RAM für den Container
* Grundwissen: SSH, Proxmox-GUI, Nano-Editor
* Container-Ressourcen: mind. 2 vCPU, 4 GB RAM
* Grundwissen: Proxmox-GUI, SSH, Terminal
---
## Vorbereitung
### Container anlegen
### LXC-Container erstellen
In der Proxmox-GUI legst du einen neuen Container an, nennst ihn `nextcloud` und wählst Ubuntu 24.04 als Template. Gib ihm mindestens 2 CPUs und 4 GB RAM. Aktiviere „Nesting“. Als Root-Disk genügt die Systemplatte die Daten legen wir gleich auf die zweite Platte.
In der **Proxmox-GUI**:
Beim Anlegen des Containers kann unter dem Punkt **Disks** direkt eine zweite Festplatte hinzugefügt werden:
* CT-Name: `nextcloud`
* Template: Ubuntu 24.04 LTS
* CPU: 2+, RAM: 48GB
* **Nesting aktivieren** (unter „Optionen“)
* Mount Point ID: automatisch
* Storage: gewünschte Festplatte auswählen
* Disk Größe: z.B. `500` (für 500GB)
* Pfad: `/mnt/hdd`
* Backup-Haken entfernen, da wir später eine eigene Backup-Lösung verwenden
#### Zweite Festplatte direkt einhängen
Nach dem Start verbindest du dich per SSH:
Beim Anlegen im Abschnitt „Disks“:
* Mount Point: `/mnt/hdd`
* Größe: z.B. `500` GB
* Backup: deaktivieren
Nach dem Start:
```bash
ssh root@<IP-des-Containers>
```
Im Container prüfen:
```bash
ls -ld /mnt/hdd
```
Wenn du hier ein Verzeichnis siehst, ist die Platte korrekt eingebunden.
→ Gibt es das Verzeichnis? Dann ist alles korrekt eingebunden.
---
## Umsetzung
### System vorbereiten
Zuerst bringen wir das System auf den aktuellen Stand und installieren alle benötigten Pakete:
### System aktualisieren & Pakete installieren
```bash
apt update && apt upgrade -y
apt install -y nginx php-fpm php-gd php-imagick php-intl php-mbstring php-xml php-zip php-curl php-bz2 php-gmp php-pgsql php-redis redis-server unzip curl postgresql postgresql-contrib
apt install -y nginx php-fpm php-gd php-imagick php-intl php-mbstring php-xml \
php-zip php-curl php-bz2 php-gmp php-pgsql php-redis redis-server \
postgresql unzip curl
```
Damit haben wir:
---
* Webserver: `nginx`
* PHP mit allen benötigten Erweiterungen
* Redis für Caching & Locking
* PostgreSQL als Datenbank
### PostgreSQL einrichten
Damit Nextcloud später auf die Datenbank zugreifen kann, richten wir PostgreSQL korrekt ein. Wir arbeiten im Container als root du brauchst weder sudo noch Umwege. Wichtig ist: PostgreSQL muss so konfiguriert werden, dass du dich mit Benutzername und Passwort lokal verbinden kannst.
1. PostgreSQL-Version prüfen
```bash
ls /etc/postgresql/
```
Du bekommst z.B. 15 zurück. Diese Zahl brauchst du für den Pfad zur Konfigurationsdatei.
2. Konfiguration anpassen
```bash
nano /etc/postgresql/15/main/pg_hba.conf
```
Ersetze 15 ggf. durch deine Version.
Folgende Zeile:
```bash
local all postgres peer
```
ändern in:
```bash
local all postgres md5
```
Zusätzlich am Ende ergänzen:
```bash
host all all 127.0.0.1/32 md5
```
Speichern (STRG+O, Enter), schließen (STRG+X)
3. PostgreSQL neu starten
```bash
systemctl restart postgresql
```
4. Passwort für postgres-Benutzer setzen
Du brauchst jetzt ein Passwort, sonst kannst du dich nicht einloggen.
```bash
su - postgres
```
Dann:
```bash
psql -c "ALTER USER postgres WITH PASSWORD 'DEIN PASSWORT';"
```
Anschließend:
```bash
exit
```
5. Benutzer und Datenbank für Nextcloud anlegen
```bash
psql -U postgres -h 127.0.0.1
```
In der psql-Konsole:
```bash
CREATE DATABASE nextcloud;
CREATE USER nextcloud WITH ENCRYPTED PASSWORD '149774Thomas!!';
GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud;
\q
```
6. Verbindung testen
```bash
psql -U nextcloud -h 127.0.0.1 -d nextcloud -W
```
Wenn die Verbindung aufgebaut wird, ist alles korrekt.
### System vorbereiten
Zuerst bringen wir das System auf den aktuellen Stand und installieren alle benötigten Pakete:
```bash
apt update && apt upgrade -y
apt install -y nginx php-fpm php-gd php-imagick php-intl php-mbstring php-xml php-zip php-curl php-bz2 php-gmp php-pgsql php-redis redis-server postgresql unzip curl
```
Damit haben wir den Webserver, PHP mit allen nötigen Erweiterungen, PostgreSQL als Datenbank, Redis als Cache sowie Werkzeuge zum Download und Entpacken.
### Verzeichnisse anlegen
Wir trennen Programmcode und Daten. Nextcloud selbst liegt unter `/srv/nextcloud/app`, während die Benutzerdaten auf der zweiten Platte gespeichert werden:
### Projektstruktur anlegen
```bash
mkdir -p /srv/nextcloud/app
@@ -166,138 +70,138 @@ mkdir -p /mnt/hdd/nextcloud_data
chown -R www-data:www-data /mnt/hdd/nextcloud_data
```
So ist sichergestellt, dass der Webserver-User `www-data` Zugriff hat.
---
### Nextcloud herunterladen
Jetzt laden wir die aktuelle Version von Nextcloud:
```bash
cd /srv/nextcloud/app
curl -LO https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip && rm latest.zip
chown -R www-data:www-data /srv/nextcloud/app/nextcloud
chown -R www-data:www-data nextcloud
```
Nach diesem Schritt findest du die entpackte Anwendung im Verzeichnis `nextcloud`.
---
### Datenbank einrichten
### PostgreSQL: Benutzer & Datenbank
Für die Datenbank verwenden wir PostgreSQL. Wir legen eine neue Datenbank und einen Benutzer an:
🔸 WICHTIG: Wir nutzen **nur** `su - postgres`, daher ist **keine Änderung** an `pg_hba.conf` nötig!
```bash
sudo -u postgres psql -c "CREATE DATABASE nextcloud;"
sudo -u postgres psql -c "CREATE USER nextcloud WITH PASSWORD 'CHANGE_ME';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud;"
su - postgres
```
Damit ist eine leere Datenbank mit passenden Rechten vorbereitet.
```sql
CREATE DATABASE nextcloud;
CREATE USER nextcloud WITH PASSWORD 'DEIN_SICHERES_PASSWORT';
GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud;
\q
exit
```
Test (optional):
```bash
psql -U nextcloud -h 127.0.0.1 -d nextcloud -W
```
Wenn du Zugriff bekommst → alles korrekt.
---
### PHP-FPM: Version prüfen
```bash
ls /run/php/
```
→ z.B. `php8.3-fpm.sock` → merken
---
### Nginx konfigurieren
Damit Nextcloud über den Webserver erreichbar ist, richten wir jetzt Nginx ein. Dazu brauchen wir eine sogenannte vHostKonfiguration eine kleine Textdatei, die Nginx sagt, unter welchem Pfad Nextcloud liegt und wie PHPDateien behandelt werden sollen.
```bash
nano /etc/nginx/sites-available/nextcloud.conf
```
1. **Prüfe zuerst, wie dein PHPFPMSocket heißt**
Das ist wichtig, weil die Datei je nach PHPVersion leicht anders heißt (z.B. `php8.3-fpm.sock`).
```nginx
server {
listen 80;
server_name _;
```bash
ls /run/php/
```
root /srv/nextcloud/app/nextcloud;
index index.php index.html;
**Erwartung:** Du siehst eine Datei wie `php8.3-fpm.sock`. Merke dir den **exakten Namen**.
client_max_body_size 10G;
2. **vHost-Datei mit Nano anlegen/öffnen**
location = /robots.txt { allow all; log_not_found off; access_log off; }
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { deny all; }
```bash
nano /etc/nginx/sites-available/nextcloud.conf
```
location ~ \.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass unix:/run/php/php8.3-fpm.sock; # ggf. anpassen
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}
}
```
> **Nano kurz erklärt:** Der Bildschirm wird blau, unten siehst du eine Befehlsleiste. Füge den folgenden Text **am Stück** ein. Speichern: **STRG+O**, Enter. Beenden: **STRG+X**.
**Inhalt der Datei (passt auf deinen PHPFPMSockel an!):**
```nginx
server {
listen 80;
server_name _;
root /srv/nextcloud/app/nextcloud;
client_max_body_size 10G; # große Uploads erlauben
index index.php index.html;
# verbotene Pfade
location = /robots.txt { allow all; log_not_found off; access_log off; }
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { deny all; }
# PHP an FPM weiterreichen
location ~ \.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass unix:/run/php/php8.3-fpm.sock; # < ggf. anpassen (siehe Schritt 1)
fastcgi_intercept_errors on;
fastcgi_request_buffering off; # stabile Uploads
}
}
```
3. **Konfiguration aktivieren und prüfen**
```bash
ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
```
**Was passiert hier?**
`ln -s …` schaltet die Site scharf. `nginx -t` prüft auf Tippfehler. Wenn „syntax is ok“ erscheint, lädt `systemctl reload nginx` die neue Konfiguration.
**Fehlerbild:** Falls `nginx -t` rot meckert, öffne die Datei erneut mit `nano /etc/nginx/sites-available/nextcloud.conf` und korrigiere die genannte Zeile. Danach `nginx -t` wiederholen.
```bash
ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
```
---
### Proxy-Host im NPM einrichten
### NPM: Proxy Host einrichten
Jetzt verbinden wir die öffentliche Domain mit deinem Container. Öffne die **Nginx Proxy Manager**Oberfläche und lege einen **Proxy Host** an:
Im Nginx Proxy Manager:
1. **Domain**: `cloud.deine-domain.tld`
2. **Forward Hostname / IP**: die **IP deines NextcloudLXC** (z.B. `10.0.0.42`)
3. **Forward Port**: `80`
4. **SSL**: „**Request a new SSL Certificate**“ aktivieren → EMail eintragen → **Force SSL** und **HTTP/2** aktivieren (HSTS optional)
5. **Advanced (optional, aber empfohlen bei großen Dateien)**:
* **Domain**: `cloud.deine-domain.tld`
* **IP**: LXC-Adresse (z.B. `10.0.0.42`)
* **Port**: 80
* **SSL aktivieren** (Lets Encrypt)
* **Force SSL** + **HTTP/2** aktivieren
* **Advanced Tab** (optional, empfohlen):
```
client_max_body_size 10G;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
```
**Test:** Rufe `https://cloud.deine-domain.tld` im Browser auf. Du solltest jetzt den **NextcloudSetupAssistenten** sehen. Wenn nicht: prüfe Domain, ProxyHostEinträge und ob Nginx im LXC läuft (`systemctl status nginx`).
```
client_max_body_size 10G;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
```
---
In der Nginx Proxy Manager Oberfläche legst du nun einen Proxy Host an:
### Browser-Setup
* Domain: `cloud.deine-domain.tld`
* Ziel: IP des Containers, Port 80
* SSL: Lets Encrypt aktivieren
Ab jetzt ist deine Nextcloud über die Domain erreichbar.
### Erstinstallation im Browser
Beim ersten Aufruf erscheint der Nextcloud-Setup-Assistent. Dort legst du den Admin-Account an und gibst an:
Im Browser: `https://cloud.deine-domain.tld`
* Admin-Benutzer erstellen
* Datenverzeichnis: `/mnt/hdd/nextcloud_data`
* Datenbank: PostgreSQL → Host `127.0.0.1`, DB `nextcloud`, User `nextcloud`, Passwort aus dem Schritt oben
* Datenbank: PostgreSQL → `127.0.0.1`, DB: `nextcloud`, User: `nextcloud`, Passwort: `DEIN_SICHERES_PASSWORT`
### Redis konfigurieren
---
Damit Nextcloud Dateien effizient sperrt und cachen kann, ergänze in `config/config.php`:
### config.php anpassen (Reverse Proxy + Redis)
```bash
nano /srv/nextcloud/app/nextcloud/config/config.php
```
```php
'trusted_domains' => ['cloud.DEINE-DOMAIN.tld'],
'overwrite.cli.url' => 'https://cloud.DEINE-DOMAIN.tld',
'overwritehost' => 'cloud.DEINE-DOMAIN.tld',
'overwriteprotocol' => 'https',
'trusted_proxies' => ['IP.DEINES.NPM'],
'filelocking.enabled' => true,
'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' => [
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
@@ -305,181 +209,59 @@ Damit Nextcloud Dateien effizient sperrt und cachen kann, ergänze in `config/co
],
```
### Nextcloud `config.php` für den Reverse Proxy Schritt für Schritt
Sobald du den SetupAssistenten abgeschlossen hast, legt Nextcloud die Datei `config.php` an. Darin sagen wir Nextcloud, **unter welcher Domain** sie erreichbar ist, dass **TLS am Proxy** terminiert und dass **Redis** für Cache & FileLocking genutzt wird.
1. **Datei öffnen**
```bash
nano /srv/nextcloud/app/nextcloud/config/config.php
```
> **NanoHinweis:** Speichern mit **STRG+O**, Enter. Beenden mit **STRG+X**.
2. **Diese Einträge ergänzen bzw. anpassen** (Platzhalter ersetzen):
```php
'trusted_domains' => [ 'cloud.DEINE-DOMAIN.tld' ],
'overwrite.cli.url' => 'https://cloud.DEINE-DOMAIN.tld',
'overwritehost' => 'cloud.DEINE-DOMAIN.tld',
'overwriteprotocol' => 'https',
'trusted_proxies' => [ 'IP-ODER-SUBNETZ-DEINES-NPM' ],
'filelocking.enabled' => true,
'memcache.local' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => [
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
'timeout' => 1.5,
],
```
**Was bewirken diese Zeilen?**
* **trusted\_domains**: Schutz vor HostHeaderTricks Nextcloud antwortet nur auf **deine** Domain.
* **overwrite\***: Nextcloud erzeugt Links konsequent als **[https://cloud.DEINE-DOMAIN.tld](https://cloud.DEINE-DOMAIN.tld)** (wichtig hinter dem Proxy, sonst drohen MixedContent/Weiterleitungsschleifen).
* **trusted\_proxies**: Erlaubt, dass Nextcloud die `X-Forwarded-*`Header vom NPM vertraut (sonst zeigt Nextcloud falsche ClientIPs/Warnungen).
* **RedisBlock**: Aktiviert Cache + FileLocking über den lokalen RedisSocket stabiler als APCu, besonders bei CLIJobs.
3. **Speichern und testen**
* In Nextcloud: **Einstellungen → Verwaltung → Übersicht**.
* **Erwartung:** Keine Warnungen zu Proxy/Trusted Domains/FileLocking.
* Falls doch: Prüfe Schreibfehler in Domain/IP, leere BrowserCache und lade die Seite neu.
---
### PHP konfigurieren (php.ini & PHPFPMPool) Schritt für Schritt
Damit große Uploads und viele gleichzeitige Anfragen stabil funktionieren, passen wir PHP an.
1. **php.ini (FPM) bearbeiten**
```bash
nano /etc/php/*/fpm/php.ini
```
**Wichtige Einstellungen** (suche die Zeilen und passe sie an):
```ini
; Zeitzone wichtig für Logs/Jobs
date.timezone = Europe/Berlin
; Uploads/Performance
upload_max_filesize = 10G
post_max_size = 10G
memory_limit = 1024M
max_execution_time = 3600
max_input_time = 3600
output_buffering = 0
; OPcache macht PHP spürbar schneller
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.save_comments=1
opcache.validate_timestamps=1
opcache.revalidate_freq=60
```
**Speichern** (STRG+O, Enter) und **beenden** (STRG+X).
2. **PHPFPMPool tunen**
```bash
nano /etc/php/*/fpm/pool.d/www.conf
```
**Sinnvolle Startwerte** (für 48GB RAM im LXC):
```ini
pm = dynamic
pm.max_children = 12
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 6
```
> **Faustregel:** `pm.max_children` ≈ (RAM für PHP in MB / 80). Wenn es eng wird (502/504 Fehler), leicht erhöhen; bei RAMDruck reduzieren.
3. **FPM neu laden**
```bash
systemctl reload php*-fpm
```
4. **Schnelltest (temporär)**
Erzeuge kurz eine InfoSeite, um zu prüfen, ob die Werte wirklich beim Webserver ankommen:
```bash
echo "<?php phpinfo();" > /srv/nextcloud/app/nextcloud/info.php
```
Rufe `https://cloud.DEINE-DOMAIN.tld/info.php` im Browser auf und kontrolliere:
* `Loaded Configuration File` → zeigt deine FPM`php.ini`
* Werte für `upload_max_filesize`, `post_max_size`, `memory_limit`, `date.timezone`
**Wichtig:** Danach die Datei **wieder löschen** (SicherheitsHygiene):
```bash
rm /srv/nextcloud/app/nextcloud/info.php
```
---
In der Datei `/etc/php/*/fpm/php.ini` setzt du:
Tipp: `www-data` sollte zur Gruppe `redis` gehören, sonst funktioniert File Locking nicht:
```bash
usermod -aG redis www-data
```
---
### PHP anpassen (für große Uploads & Performance)
```bash
nano /etc/php/*/fpm/php.ini
```
```ini
upload_max_filesize = 10G
post_max_size = 10G
memory_limit = 1024M
max_execution_time = 3600
output_buffering = 0
date.timezone = Europe/Berlin
```
Danach PHP-FPM neu laden:
```bash
systemctl reload php*-fpm
```
### Cronjobs aktivieren
---
Damit Hintergrundaufgaben laufen, tragen wir einen Cronjob für den Webserver-User ein:
### Cronjob aktivieren (Nextcloud Hintergrundjobs)
```bash
crontab -u www-data -e
```
Dort hinzufügen:
```
```cron
*/5 * * * * php -f /srv/nextcloud/app/nextcloud/cron.php
```
Jetzt führt Nextcloud alle 5 Minuten Hintergrundjobs aus.
---
## Ergebnis
* Nextcloud läuft stabil im LXC und ist über HTTPS erreichbar.
* Die Benutzerdaten liegen getrennt auf der zweiten Festplatte unter `/mnt/hdd/nextcloud_data`.
* PostgreSQL + Redis sorgen für Performance.
* Große Uploads sind möglich, Cronjobs laufen automatisch.
### Häufige Fehlerbilder & schnelle Fixes
* **Endlosschleife oder Mixed Content** → `overwritehost`/`overwriteprotocol` prüfen, NPM zeigt wirklich auf Port 80.
* **Proxy-Header-Warnung in Nextcloud** → `trusted_proxies` enthält nicht die NPM-IP.
* **Uploads > 1 GB brechen ab** → PHP-Limits und `client_max_body_size` in NPM ergänzen.
* **File-Locking-Warnung** → prüfen, ob `www-data` in der Gruppe `redis` ist.
* Nextcloud läuft im LXC, erreichbar via HTTPS
* PostgreSQL-DB ist passwortgesichert & erreichbar
* Daten liegen getrennt unter `/mnt/hdd/nextcloud_data`
* Redis aktiv → keine File-Locking-Warnung
* PHP tuned → große Uploads problemlos
* Hintergrundjobs laufen automatisch
---
## Nächste Schritte
* Vorheriges Kapitel: **Vaultwarden (Kapitel 6)**
* Nächstes Kapitel: **Affine (Kapitel 8)**
* Vorheriges Kapitel: Vaultwarden
* Weiter gehts mit: Affine