# đŸ› ïž Kapitel 7 – Nextcloud (Nginx + PostgreSQL + Redis, NPM-Setup) > [!INFO] > Dieses Kapitel ist eine vorbereitete Rohfassung. Es enthĂ€lt bereits alle technischen Schritte in korrekter Reihenfolge. Die Blogtexte und ErklĂ€rungen folgen spĂ€ter. ## ✹ Einleitung [Platzhalter fĂŒr Einstiegstext: Was ist Nextcloud, warum ist es sinnvoll, was kann man damit tun. Hinweis auf UnabhĂ€ngigkeit von Google & Co., Einsatz als Streamer, fĂŒr Teamsharing etc.] ## 📋 Voraussetzungen [Platzhalter fĂŒr grafische Checkliste oder Übersicht: z. B. Screenshot LXC-Übersicht] - Proxmox-Host mit 2 Platten (System + Daten) - LXC mit Ubuntu 24.04, „Nesting“ aktiviert - Nginx Proxy Manager (NPM) lĂ€uft bereits - Domain zeigt korrekt auf den Proxy - Container-Ressourcen: 2 vCPU, 4–8 GB RAM - Grundkenntnisse in Proxmox, SSH, Terminal ## ⚙ LXC-Container anlegen **In der Proxmox-GUI:** - CT-Name: `nextcloud` - Template: `Ubuntu 24.04 LTS` - CPU: 2+, RAM: 4096+ MB - „Nesting“ aktivieren (unter „Optionen“) **Zweite Festplatte direkt einbinden:** - Mount Point: `/mnt/hdd` - GrĂ¶ĂŸe: z. B. `500` GB - Backup: deaktivieren Nach dem Start: ```bash ssh root@ ls -ld /mnt/hdd ``` → Wenn ein gĂŒltiges Verzeichnis erscheint, ist alles korrekt gemountet. ## 📩 System vorbereiten [Platzhalter: Warum update & Basis-Tools wichtig sind] ```bash apt update && apt upgrade -y apt install -y curl gnupg2 ca-certificates lsb-release apt-transport-https software-properties-common unzip nano sudo gnupg ``` ## 🌐 Dienste installieren [Platzhalter: Warum explizites PHP-Repo nötig ist (Ubuntu 24.04 enthĂ€lt nicht alle Module). Verweis auf Ondƙej SurĂœ PPA – Standard bei professionellen PHP-Deployments.] ### Dienste + PHP 8.3 + Module installieren ```bash apt install -y nginx redis-server postgresql php8.3-fpm php8.3-pgsql php8.3-cli php8.3-common php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip php8.3-curl php8.3-bz2 php8.3-intl php8.3-gmp php8.3-imagick php8.3-redis ``` ## 📁 Verzeichnisse anlegen ```bash mkdir -p /srv/nextcloud/app mkdir -p /mnt/hdd/nextcloud_data chown -R www-data:www-data /mnt/hdd/nextcloud_data chmod 750 /mnt/hdd/nextcloud_data ``` ## ⚙ PHP konfigurieren ### `php.ini` (globale Werte) ```bash nano /etc/php/8.3/fpm/php.ini ``` ```ini upload_max_filesize = 10G post_max_size = 10G memory_limit = 1024M max_execution_time = 3600 max_input_time = 3600 date.timezone = Europe/Berlin opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 opcache.interned_strings_buffer=16 ``` ### `www.conf` (Pool-Konfiguration) ```bash nano /etc/php/8.3/fpm/pool.d/www.conf ``` ```ini pm = dynamic pm.max_children = 12 pm.start_servers = 3 pm.min_spare_servers = 2 pm.max_spare_servers = 6 ``` PHP-FPM neu laden: ```bash systemctl reload php8.3-fpm ``` ## 🐘 PostgreSQL initialisieren (fĂŒr LXC) ```bash pg_dropcluster 16 main --stop pg_createcluster 16 main --start systemctl enable postgresql systemctl start postgresql ``` Zugang zur DB: ```bash su - postgres ``` Datenbank anlegen: ```sql psql CREATE DATABASE nextcloud; CREATE USER nextcloud WITH PASSWORD 'DEIN_SICHERES_PASSWORT'; GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud; \q ``` ```sql psql -d nextcloud -- Zugriff auf public erlauben GRANT ALL ON SCHEMA public TO nextcloud; -- Und Ownership auf den Nutzer ĂŒbertragen ALTER SCHEMA public OWNER TO nextcloud; ``` Dann wieder raus: ```bash exit ``` ## 🔄 Redis konfigurieren [Platzhalter: Warum Redis wichtig ist (Caching, File Locking, keine APCu mehr). Nur lokal via Socket, daher keine Authentifizierung nötig.] ### Redis-Zugriffsrechte setzen ```bash usermod -aG redis www-data ``` > [!NOTE] > Dadurch kann der Webserver-User (`www-data`) auf den Redis-Socket zugreifen. ### Redis-Konfiguration prĂŒfen ```bash nano /etc/redis/redis.conf ``` Die folgenden Zeilen sollten gesetzt sein (oder geĂ€ndert werden): ```ini supervised systemd unixsocket /var/run/redis/redis-server.sock unixsocketperm 770 ``` > [!TIP] > Weitere Einstellungen wie `bind` oder `requirepass` brauchst du **nicht**, > solange du Redis **nur lokal ĂŒber den Socket** nutzt. Redis neu starten: ```bash systemctl restart redis-server systemctl restart php8.3-fpm ``` --- Fertig. Jetzt ist Redis bereit fĂŒr Nextcloud – Caching und Locking funktionieren nach dem Setup automatisch, wenn wir die EintrĂ€ge in der `config.php` ergĂ€nzen. ## âŹ‡ïž Nextcloud herunterladen [Platzhalter: Warum wir Nextcloud manuell installieren (Version kontrollieren, Updates nachvollziehbar, keine Snap/FPM-Probleme).] ### Download & Entpacken ```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 nextcloud ``` > [!NOTE] > Aktuelle Version prĂŒfen: https://nextcloud.com/changelog/ --- ## ⚙ `config.php` vorbereiten [Platzhalter: Warum wir die Datei *vorher* anlegen (Proxy-Erkennung, Redis, saubere Setup-Erfahrung). Wird beim ersten Aufruf automatisch ergĂ€nzt.] ### Datei erstellen ```bash nano /srv/nextcloud/app/nextcloud/config/config.php ``` ### Inhalt einfĂŒgen ```php [ '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', 'redis' => [ 'host' => '/var/run/redis/redis-server.sock', 'port' => 0, 'timeout' => 1.5, ], ); ``` ```bash chown -R www-data:www-data /srv/nextcloud/app/nextcloud/config ``` > [!TIP] > `trusted_proxies` kann z. B. `10.0.0.1` sein, wenn NPM im selben Netz lĂ€uft. > Mehrere Proxies können als Array ergĂ€nzt werden. --- Damit ist Nextcloud bereit – gleich folgt der Abschnitt zur **Nginx-Konfiguration**. ## 🌐 Nginx konfigurieren (vHost intern) [Platzhalter: Warum wir keinen HTTPS/SSL im Container brauchen (TLS wird von NPM ĂŒbernommen). Nginx hier nur als lokaler Webserver fĂŒr PHP-FPM + Nextcloud.] ### Neue Konfigurationsdatei anlegen ```bash nano /etc/nginx/sites-available/nextcloud.conf ``` ### Inhalt einfĂŒgen ```nginx server { listen 80; server_name cloud.DEINE-DOMAIN.tld; root /srv/nextcloud/app/nextcloud; index index.php index.html; client_max_body_size 10G; fastcgi_buffers 64 4K; add_header Referrer-Policy "no-referrer" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; location = /robots.txt { allow all; log_not_found off; access_log off; } location ~ ^/(?:\.htaccess|data|config|db_structure\\.xml|README) { deny all; } location ~ \\.php(?:$|/) { include fastcgi_params; fastcgi_split_path_info ^(.+\\.php)(/.*)$; 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; fastcgi_intercept_errors on; fastcgi_request_buffering off; } } ``` ### Site aktivieren ```bash ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/ rm /etc/nginx/sites-enabled/default nginx -t && systemctl reload nginx ``` > [!NOTE] > `nginx -t` prĂŒft die Konfiguration. Nur wenn „syntax is ok“ erscheint, darfst du reloaden. --- Sobald das erledigt ist, folgt der Abschnitt fĂŒr **NPM‑Proxy + Domain-Setup**. Sag einfach, wann du soweit bist – oder wenn du auf ein Problem triffst. ## 🌍 NPM-Proxy konfigurieren [Platzhalter: Warum wir Nginx Proxy Manager verwenden (TLS-Termination, zentraler Reverse Proxy, Let’s Encrypt, Portweiterleitung). Nextcloud selbst kennt nur HTTP und lĂ€uft im LXC ohne Zertifikat.] ### Im Nginx Proxy Manager (Web-GUI): 1. Gehe auf **Hosts → Proxy Hosts → Add Proxy Host** 2. Trage ein: | Feld | Wert | |-----------------------|---------------------------------| | **Domain Names** | `cloud.DEINE-DOMAIN.tld` | | **Forward Hostname/IP** | `` | | **Forward Port** | `80` | | **Access** | Websockets aktivieren ✅ | | **SSL** | → **Request a new SSL Certificate** | | → **Force SSL** aktivieren ✅ | | → **HTTP/2 Support** aktivieren ✅ > [!TIP] > Trage bei „E-Mail“ eine gĂŒltige Adresse ein, sonst schlĂ€gt das Zertifikat fehl. > HSTS kannst du bei Bedarf aktivieren (empfohlen). ### (Optional) FĂŒr große Uploads: Reiter „Advanced“: ```nginx client_max_body_size 10G; proxy_read_timeout 3600; proxy_send_timeout 3600; ``` --- **Jetzt testen:** Öffne im Browser: ``` https://cloud.DEINE-DOMAIN.tld ``` Du solltest den **Nextcloud-Setup-Assistenten** sehen – ohne Fehlermeldung, ohne Mixed Content. Falls du eine Nginx-Standardseite siehst: Proxy nicht korrekt → prĂŒfe Domain, IP und Port. --- ## ⏱ Cronjob fĂŒr Hintergrundprozesse Nextcloud erledigt viele Aufgaben im Hintergrund – z. B. Vorschaugenerierung, Datei-Indexierung, etc. Diese Jobs laufen am zuverlĂ€ssigsten per Cron. ### Cron fĂŒr `www-data` anlegen: ```bash crontab -u www-data -e ``` → Eintrag ganz unten einfĂŒgen: ```cron */5 * * * * php -f /srv/nextcloud/app/nextcloud/cron.php ``` > Bedeutet: Alle 5 Minuten wird das Skript `cron.php` ausgefĂŒhrt. Speichern: `STRG+O`, Enter Beenden: `STRG+X` --- ## 🌐 Nextcloud im Browser einrichten Rufe deine Instanz im Browser auf: ``` https://cloud.DEINE-DOMAIN.tld ``` Du siehst nun das Setup-Formular von Nextcloud. ### ⚙ Setup-Einstellungen Trage folgende Werte ein: **Admin-Zugang:** - Benutzername: frei wĂ€hlbar - Passwort: stark wĂ€hlen **Datenverzeichnis:** ``` /mnt/hdd/nextcloud_data ``` **Datenbank:** - Typ: **PostgreSQL** - Benutzer: `nextcloud` - Passwort: `DEIN_SICHERES_PASSWORT` - Datenbankname: `nextcloud` - Host: `localhost` > ⚠ Wichtig: Wenn Nextcloud sich nicht mit der Datenbank verbinden kann, prĂŒfe `config.php`, Datenbankrechte oder ob der PostgreSQL-Dienst lĂ€uft. --- ###Feinschliff & Optimierung Nach der Grundinstallation erscheinen im Admin-Panel oft Hinweise. Diese sind kein Fehler, sondern Empfehlungen, um die Instanz stabil, sicher und performant zu machen. Wir gehen sie jetzt Schritt fĂŒr Schritt durch. --- Schritt: MIME-Type fĂŒr .mjs aktivieren Ziel: Browser können moderne JavaScript-Dateien korrekt laden. Ohne das brechen manche Nextcloud-Apps ab. Anleitung: * Datei öffnen: nano /etc/nginx/sites-available/nextcloud.conf * Innerhalb des server { ... }-Blocks einfĂŒgen: types { application/javascript mjs; } * Konfiguration testen und neu laden: nginx -t && systemctl reload nginx PrĂŒfen: * Im Admin-Panel verschwindet die Meldung. * Im Browser (F12 → Netzwerk) ist application/javascript als MIME-Type sichtbar. --- Schritt: /ocm-provider/ und ocs-provider auflösen Ziel: Externe Freigaben und Federation funktionieren. Anleitung: * In derselben Datei (nextcloud.conf) hinzufĂŒgen: location \~ ^/(?\:ocm-provider|ocs-provider)/ { try\_files \$uri \$uri/ =404; index index.php; } * Danach Nginx neu laden: nginx -t && systemctl reload nginx PrĂŒfen: * Admin-Meldung verschwindet. * Aufruf von [https://cloud.DEINE-DOMAIN.tld/ocm-provider/](https://cloud.DEINE-DOMAIN.tld/ocm-provider/) zeigt kein Nginx-404 mehr. --- Schritt: .well-known Weiterleitungen Ziel: Federation, CalDAV, CardDAV und WebFinger funktionieren. Anleitung: * In nextcloud.conf unterhalb des server { ... }-Blocks ergĂ€nzen: location = /.well-known/webfinger { return 301 /index.php/.well-known/webfinger; } location = /.well-known/nodeinfo { return 301 /index.php/.well-known/nodeinfo; } location ^\~ /.well-known/acme-challenge { default\_type "text/plain"; root /var/www/letsencrypt; } location = /.well-known/carddav { return 301 /remote.php/dav; } location = /.well-known/caldav { return 301 /remote.php/dav; } * Neu laden: nginx -t && systemctl reload nginx PrĂŒfen: * Meldung im Adminbereich verschwindet. * Test: curl -I [https://cloud.DEINE-DOMAIN.tld/.well-known/carddav](https://cloud.DEINE-DOMAIN.tld/.well-known/carddav) → liefert 301. --- Schritt: Debug-Mode deaktivieren Ziel: Produktivbetrieb ohne unnötige Fehlerausgaben. Anleitung: * Datei öffnen: nano /srv/nextcloud/app/nextcloud/config/config.php * Sicherstellen, dass folgende Zeile existiert: 'debug' => false, PrĂŒfen: * Adminpanel zeigt nicht mehr „Debug-Modus aktiv“. --- Schritt: Wartungsfenster setzen Ziel: Ressourcenintensive Tasks laufen nachts. Anleitung: sudo -u www-data php /srv/nextcloud/app/nextcloud/occ config\:system\:set maintenance\_window\_start --value="2" PrĂŒfen: * Adminbereich zeigt kein Warnsymbol mehr. --- Schritt: MIME-Type Migration Ziel: Neueste Dateitypen sind registriert. Anleitung: sudo -u www-data php /srv/nextcloud/app/nextcloud/occ maintenance\:repair --include-expensive PrĂŒfen: * Meldung „MIME-Type-Migration verfĂŒgbar“ verschwindet. --- Schritt: Fehlende Indizes Ziel: Datenbankabfragen werden schneller. Anleitung: sudo -u www-data php /srv/nextcloud/app/nextcloud/occ db\:add-missing-indices PrĂŒfen: * Keine Admin-Warnung mehr zu Indizes. --- Schritt: PATH-Variable fĂŒr PHP Ziel: Systembefehle werden korrekt gefunden. Anleitung: * Datei öffnen: nano /etc/php/8.3/fpm/pool.d/[www.conf](http://www.conf) * Am Ende ergĂ€nzen: env\[PATH] = /usr/local/bin:/usr/bin:/bin * Neu laden: systemctl reload php8.3-fpm PrĂŒfen: * Meldung zu getenv("PATH") verschwindet. --- Schritt: Standard-Telefonregion Ziel: Telefonnummern ohne Vorwahl validieren. Anleitung: * In config.php einfĂŒgen: 'default\_phone\_region' => 'DE', PrĂŒfen: * Adminpanel zeigt keinen Hinweis mehr. --- Schritt: Mailserver einrichten Ziel: System kann Benachrichtigungen verschicken. Anleitung (Beispiel SMTP): * In config.php eintragen: 'mail\_smtpmode' => 'smtp', 'mail\_smtpsecure' => 'tls', 'mail\_sendmailmode' => 'smtp', 'mail\_from\_address' => 'nextcloud', 'mail\_domain' => 'deine-domain.tld', 'mail\_smtphost' => 'mail.deine-domain.tld', 'mail\_smtpport' => '587', 'mail\_smtpauth' => 1, 'mail\_smtpname' => '[user@deine-domain.tld](mailto:user@deine-domain.tld)', 'mail\_smtppassword' => 'PASSWORT' * Alternativ per Web-UI → Einstellungen → Grundeinstellungen → E-Mail-Server PrĂŒfen: * Testmail versenden. * Adminhinweis verschwindet. --- Schritt: Imagick mit SVG-Support Ziel: Bessere Bildvorschauen. Anleitung: apt install -y libmagickcore-6.q16-6-extra systemctl restart php8.3-fpm PrĂŒfen: * Adminmeldung zu SVG verschwindet. --- ### Ergebnis Nach diesen Schritten ist die Instanz vollstĂ€ndig optimiert: * Keine Warnmeldungen mehr * Volle Performance durch Indizes + Redis * Sichere Produktion (kein Debug, sauberes Wartungsfenster) * Alle Nextcloud-Apps funktionieren fehlerfrei