Nextcloud auf Debian 13 ohne Docker installieren: Nginx, PHP 8.3, MariaDB und Redis. Schritt für Schritt zur eigenen Cloud — performant, sicher und vollständig unter deiner Kontrolle.

Nextcloud auf Debian 13 ohne Docker installieren: Apache, PHP 8.3, MariaDB und Redis. Schritt für Schritt zur eigenen Cloud — performant, sicher und vollständig unter deiner Kontrolle.

Nextcloud debian

💡 Hinweis: Dieses Tutorial setzt voraus, dass du einen normalen Benutzer mit sudo-Rechten verwendest — wie im Tutorial Debian 13 Server absichern beschrieben. Außerdem solltest du Nginx installiert haben.

Einleitung — Warum Nextcloud from scratch?

Wer eine eigene Cloud will, kennt den Klassiker: Google Drive und Dropbox sind bequem, aber eure Daten liegen auf fremden Servern. Nextcloud ist die führende Open-Source-Alternative — Dateisync, Kalender, Kontakte, Office, Chat, alles selbst gehostet.

Es gibt zwei Wege, Nextcloud zu installieren: Docker (AIO) oder Bare-Metal. Docker ist schneller eingerichtet, aber für Produktiv-Setups mit hoher Last und vielen Nutzern empfehlen die Nextcloud-Entwickler selbst die klassische Installation. Du bekommst maximale Performance, vollständige Kontrolle über jede Komponente und kannst gezielt tunen.

Wir installieren Nextcloud daher klassisch auf Nginx + PHP 8.3-FPM + MariaDB + Redis. Das ist unter Self-Hostern der beliebteste Stack — Nginx ist schlanker und schneller als Apache, vor allem bei vielen parallelen Verbindungen.

Was wir aufbauen

  • Nginx als Webserver — schlank, schnell, optimiert für hohe Concurrency
  • PHP 8.3-FPM mit allen nötigen Modulen
  • MariaDB 11 als Datenbank
  • Redis für File-Locking und Memory-Cache
  • APCu als lokaler Memory-Cache
  • Let’s Encrypt SSL mit automatischer Erneuerung
  • Cron-basierte Background-Jobs (statt AJAX)

Hardware-Empfehlung

NutzerRAMCPUStorage
1-52 GB2 Cores20 GB + Daten
5-204 GB2 Cores50 GB + Daten
20-1008 GB4 Cores100 GB + Daten
100+16 GB+8 Cores+nach Bedarf

In diesem Guide richten wir Nextcloud von Grund auf ein — von der Stack-Installation über Performance-Tuning bis zum ersten Login.


Voraussetzungen

Bevor wir starten, braucht ihr:

  • Einen Debian 13 (Trixie) Server — Eingerichtet nach unserem Debian 13 Server-Guide
  • Nginx installiert — siehe unser Nginx-Tutorial
  • Mindestens 2 GB RAM (4 GB empfohlen)
  • Mindestens 20 GB Speicher (mehr für Nutzer-Daten)
  • Eine Domain (z.B. cloud.example.com)
  • certbot installiert für SSL — siehe Let’s Encrypt Tutorial
  • Ports 80 und 443 offen

Firewall-Ports öffnen

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status

DNS vorbereiten

Typ:   A
Name:  cloud
Wert:  EURE-SERVER-IP
TTL:   3600

Auflösung prüfen:

dig +short cloud.example.com

Schritt 1: System aktualisieren

sudo apt update && sudo apt upgrade -y

Wir installieren noch ein paar Tools, die wir gleich brauchen:

sudo apt install -y curl wget unzip sudo gnupg2 lsb-release ca-certificates

Schritt 2: Nginx-Installation prüfen

Falls Nginx noch nicht läuft (siehe Nginx-Tutorial):

sudo apt install -y nginx
sudo systemctl enable --now nginx

Status prüfen:

sudo systemctl status nginx

Im Browser http://EURE-SERVER-IP aufrufen — sollte die Nginx-Default-Seite zeigen.


Schritt 3: PHP 8.3 mit allen Modulen installieren

Debian 13 bringt PHP 8.4 mit, aber Nextcloud ist offiziell für PHP 8.3 zertifiziert. Wir nutzen das Sury-Repository für 8.3

curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
sudo dpkg -i /tmp/debsuryorg-archive-keyring.deb

echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list

sudo apt update

💡 Hinweis: Falls ihr PHP 8.4 nutzen wollt (in Debian 13 Standard): Nextcloud 30+ unterstützt 8.4 offiziell. Tauscht in den folgenden Befehlen einfach 8.3 gegen 8.4 — der Rest bleibt identisch. Wir bleiben hier bei 8.3 als bewährter Kombination.

Jetzt PHP 8.3-FPM inklusive aller nötigen Extensions:

sudo apt install -y php8.3-fpm php8.3-cli php8.3-common php8.3-curl php8.3-gd \
    php8.3-mbstring php8.3-mysql php8.3-xml php8.3-zip php8.3-bz2 \
    php8.3-intl php8.3-bcmath php8.3-gmp php8.3-imagick php8.3-redis \
    php8.3-apcu php8.3-opcache php8.3-ldap php8.3-imap php8.3-smbclient \
    libmagickcore-6.q16-6-extra

PHP-FPM aktivieren:

sudo systemctl enable --now php8.3-fpm
sudo systemctl status php8.3-fpm

Testet PHP:

php -v

Ihr solltet PHP 8.3.x sehen.


Schritt 4: PHP-Performance tunen

Die Standard-PHP-Werte sind für Nextcloud zu niedrig. Wir passen sie für FPM an.

php.ini anpassen

sudo nano /etc/php/8.3/fpm/php.ini

Sucht und setzt diese Werte:

memory_limit = 512M
upload_max_filesize = 16G
post_max_size = 16G
max_execution_time = 3600
max_input_time = 3600
output_buffering = 0
date.timezone = Europe/Berlin
opcache.enable = 1
opcache.interned_strings_buffer = 32
opcache.max_accelerated_files = 10000
opcache.memory_consumption = 256
opcache.save_comments = 1
opcache.revalidate_freq = 60
opcache.jit = 1255
opcache.jit_buffer_size = 128M

⚠️ Wichtig: upload_max_filesize und post_max_size müssen identisch sein, sonst lehnt PHP große Uploads ab. Stellt sie auf das, was eure Nutzer maximal hochladen sollen.

PHP-FPM Pool tune

sudo nano /etc/php/8.3/fpm/pool.d/www.conf

Sucht und setzt:

pm = dynamic
pm.max_children = 120
pm.start_servers = 12
pm.min_spare_servers = 6
pm.max_spare_servers = 18
pm.max_requests = 500

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

💡 Tipp: pm.max_children skaliert mit RAM. Faustregel: (verfügbarer-RAM-für-PHP-in-MB) / 30. Bei 4 GB freiem RAM also ca. 120-130 Children. Bei kleinen Servern (1 GB RAM) reduziert auf 30-40.

PHP-FPM neu starten:

sudo systemctl restart php8.3-fpm

Schritt 5: MariaDB installieren und absichern

sudo apt install -y mariadb-server mariadb-client
sudo systemctl enable --now mariadb

Sicherheits-Setup ausführen:

sudo mariadb-secure-installation

Antwortet:

  • Switch to unix_socket authentication?n
  • Change root password?n (bleibt auf Unix-Socket)
  • Remove anonymous users?y
  • Disallow root login remotely?y
  • Remove test database?y
  • Reload privilege tables?y

Datenbank für Nextcloud anlegen

sudo mariadb

In der MariaDB-Shell:

CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'EUER_SICHERES_PASSWORT';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EXIT;

⚠️ Wichtig: Generiert ein wirklich starkes Passwort (z.B. mit openssl rand -base64 32). Notiert es euch — wir brauchen es gleich beim Nextcloud-Setup.

MariaDB für Nextcloud optimieren

sudo nano /etc/mysql/mariadb.conf.d/90-nextcloud.cnf

Inhalt:

[mysqld]
transaction_isolation = READ-COMMITTED
binlog_format = ROW
innodb_large_prefix = 1
innodb_file_format = barracuda
innodb_file_per_table = 1
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

💡 Tipp: innodb_buffer_pool_size solltet ihr auf ca. 50% eures verfügbaren RAMs setzen — bei 4 GB RAM also 2 GB. Das beschleunigt Datenbankzugriffe massiv

sudo systemctl restart mariadb

Schritt 6: Redis installieren

Redis übernimmt File-Locking und Memory-Cache — essentiell für Multi-User-Setups.

sudo apt install -y redis-server
sudo systemctl enable --now redis-server

Konfiguration für Nextcloud anpassen:

sudo nano /etc/redis/redis.conf

Sucht und setzt:

maxmemory 256mb
maxmemory-policy allkeys-lru
unixsocket /var/run/redis/redis-server.sock
unixsocketperm 770

www-data braucht Zugriff auf den Redis-Socket:

sudo usermod -aG redis www-data
sudo systemctl restart redis-server

Schritt 7: Nextcloud herunterladen

cd /tmp
wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip
sudo mv nextcloud /var/www/
sudo chown -R www-data:www-data /var/www/nextcloud
sudo chmod -R 750 /var/www/nextcloud

Daten-Verzeichnis anlegen

Es ist Best Practice, die Nutzerdaten außerhalb des Webroots zu speichern:

sudo mkdir -p /var/nextcloud-data
sudo chown -R www-data:www-data /var/nextcloud-data
sudo chmod 750 /var/nextcloud-data

Schritt 8: Nginx vHost konfigurieren

Das ist der Kern des Setups — eine sorgfältig konfigurierte Nginx-Site für Nextcloud. Die Config orientiert sich an der offiziellen Nextcloud-Doku.

sudo nano /etc/nginx/sites-available/nextcloud.conf

Inhalt:

upstream php-handler {
    server unix:/run/php/php8.3-fpm.sock;
}

# HTTP → HTTPS redirect (außer ACME-Challenge)
server {
    listen 80;
    listen [::]:80;
    server_name cloud.example.com;

    # Let's Encrypt validation
    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

# Hauptserver — HTTPS
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;

    server_name cloud.example.com;

    # SSL — wird von certbot eingetragen
    # ssl_certificate /etc/letsencrypt/live/cloud.example.com/fullchain.pem;
    # ssl_certificate_key /etc/letsencrypt/live/cloud.example.com/privkey.pem;

    # Sicherheits-Header (HSTS wird per add_header gesetzt)
    add_header Strict-Transport-Security             "max-age=15552000; includeSubDomains; preload" always;
    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-Permitted-Cross-Domain-Policies     "none"             always;
    add_header X-Robots-Tag                          "noindex, nofollow" always;
    add_header X-XSS-Protection                      "1; mode=block"    always;

    # X-Frame-Options ist überflüssig wenn fastcgi_hide_header gesetzt
    fastcgi_hide_header X-Powered-By;

    # Document root
    root /var/www/nextcloud;
    index index.php index.html /index.php$request_uri;

    # Maximale Upload-Größe
    client_max_body_size 16G;
    client_body_timeout 300s;
    fastcgi_buffers 64 4K;

    # gzip
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml text/javascript application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

    # Pagespeed
    pagespeed off;

    # WebDAV / CalDAV / CardDAV Redirects
    location = /.well-known/carddav  { return 301 /remote.php/dav/; }
    location = /.well-known/caldav   { return 301 /remote.php/dav/; }
    location = /.well-known/webfinger     { return 301 /index.php$uri; }
    location = /.well-known/nodeinfo      { return 301 /index.php$uri; }

    # ACME-Challenge (für certbot --webroot, falls genutzt)
    location ^~ /.well-known {
        location = /.well-known/carddav     { return 301 /remote.php/dav/; }
        location = /.well-known/caldav      { return 301 /remote.php/dav/; }
        location = /.well-known/webfinger   { return 301 /index.php$uri; }
        location = /.well-known/nodeinfo    { return 301 /index.php$uri; }
        try_files $uri $uri/ =404;
    }

    # Bekannte Pfade blockieren, die niemand erreichen sollte
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
        deny all;
    }

    # Hauptlogik
    location / {
        rewrite ^ /index.php;
    }

    location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
        deny all;
    }
    location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }

    location ~ \.php(?:$|\/) {
        fastcgi_split_path_info ^(.+?\.php)(\/.*)$;
        set $path_info $fastcgi_path_info;
        try_files $fastcgi_script_name =404;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;
        fastcgi_param modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
        fastcgi_read_timeout 3600;
        fastcgi_send_timeout 3600;
    }

    # Statische Assets — aggressives Caching
    location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map|ogg|flac)$ {
        try_files $uri /index.php$request_uri;
        expires 6M;
        access_log off;
    }
    location ~ \.woff2?$ {
        try_files $uri /index.php$request_uri;
        expires 7d;
        access_log off;
    }

    # Webcal
    location /remote {
        return 301 /remote.php$request_uri;
    }

    location / {
        try_files $uri $uri/ /index.php$request_uri;
    }

    # Logs
    access_log /var/log/nginx/nextcloud.access.log;
    error_log  /var/log/nginx/nextcloud.error.log;
}

⚠️ Wichtig: Die obige Config ist umfangreich, aber jeder Block ist wichtig. Die location ~ \.php(?:$|\/) Sektion mit fastcgi_split_path_info ist essentiell — Nextcloud braucht das für interne URL-Routing. Vereinfacht das nicht.

Site aktivieren:

sudo ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

SSL-Zertifikat holen

sudo certbot --nginx -d cloud.example.com

Folgt dem Wizard. Certbot trägt die Zertifikate automatisch in die vHost-Config ein und konfiguriert HTTPS.

Geschafft! Nginx läuft mit HTTPS. Im Browser solltet ihr unter https://cloud.example.com jetzt die Nextcloud-Setup-Seite sehen.


Schritt 9: Nextcloud Setup-Wizard

Öffnet im Browser:

https://cloud.example.com

Im Wizard:

  • Admin-Username: Wählt einen Namen, NICHT admin (Brute-Force-Schutz)
  • Admin-Passwort: Sehr starkes Passwort
  • Datenverzeichnis: /var/nextcloud-data
  • Datenbank: MySQL/MariaDB
  • DB-User: nextcloud
  • DB-Passwort: Das von Schritt 5
  • DB-Name: nextcloud
  • DB-Host: localhost:3306

Klickt auf Installation abschließen. Nach 1-2 Minuten landet ihr im Nextcloud-Dashboard.


Schritt 10: Caching aktivieren (Redis & APCu)

Die zentrale Konfigurationsdatei ist /var/www/nextcloud/config/config.php. Wir erweitern sie um Caching

sudo nano /var/www/nextcloud/config/config.php

Vor der schließenden ); einfügen:

  'memcache.local' => '\OC\Memcache\APCu',
  'memcache.locking' => '\OC\Memcache\Redis',
  'memcache.distributed' => '\OC\Memcache\Redis',
  'redis' => [
    'host' => '/var/run/redis/redis-server.sock',
    'port' => 0,
    'timeout' => 1.5,
  ],
  'default_phone_region' => 'DE',
  'maintenance_window_start' => 1,

Speichern und PHP-FPM neu laden

sudo systemctl reload php8.3-fpm

Schritt 11: Cron statt AJAX einrichten

Nextcloud führt Hintergrund-Jobs (Cleanup, Notifications, Sharing-Sync) aus. Standard: AJAX bei jedem Page-Load — schlecht für Performance. Besser: Cron

sudo crontab -u www-data -e

Einfügen:

*/5 * * * * php -f /var/www/nextcloud/cron.php

Im Nextcloud-Dashboard: Einstellungen → Verwaltung → Grundlegende Einstellungen → Hintergrund-Jobs auf Cron umstellen.


Schritt 12: Trusted Domains und HTTPS-Zwang

In config.php sicherstellen, dass eure Domain als trusted_domain steht:

sudo nano /var/www/nextcloud/config/config.ph
  'trusted_domains' => [
    0 => 'cloud.example.com',
  ],
  'overwrite.cli.url' => 'https://cloud.example.com',
  'overwriteprotocol' => 'https',

PHP-FPM neu laden:

sudo systemctl reload php8.3-fpm

Schritt 13: Sicherheits-Check und Performance-Check

Im Nextcloud-Dashboard: Einstellungen → Verwaltung → Übersicht.

Hier seht ihr Warnungen, falls noch etwas fehlt. Typische Hinweise und ihre Lösungen:

„Letzter Cron-Job ist länger her“

Cron prüfen:

sudo systemctl status cron
sudo grep CRON /var/log/syslog | tail

„Memcache ist nicht konfiguriert“

Caching-Config aus Schritt 10 fehlt → ergänzen.

„Module ‚imagick‘ fehlt“

sudo apt install -y php8.3-imagick libmagickcore-6.q16-6-extra
sudo systemctl restart php8.3-fpm

„PHP-Module für Vorschau-Generierung fehlen“

sudo apt install -y ffmpeg libreoffice

Dann in config.php:

  'enabledPreviewProviders' => [
    'OC\Preview\Image',
    'OC\Preview\HEIC',
    'OC\Preview\TIFF',
    'OC\Preview\Movie',
    'OC\Preview\PDF',
    'OC\Preview\MarkDown',
    'OC\Preview\OpenDocument',
  ],

„Reverse-Proxy-Header X-Forwarded-For“

Mit Nginx als direkter Webserver ist das normal kein Problem. Falls ihr Nextcloud hinter einem zusätzlichen Reverse Proxy (Cloudflare, weiterer Nginx) habt, in config.php:

  'trusted_proxies' => ['127.0.0.1', '::1'],
  'forwarded_for_headers' => ['HTTP_X_FORWARDED_FOR'],

„Pretty URLs sind nicht aktiviert“

Bei Nginx ist das automatisch über die vHost-Config geregelt — die Warnung sollte mit unserer Config nicht erscheinen. Falls doch:

bash

sudo -u www-data php /var/www/nextcloud/occ maintenance:update:htaccess

In config.php:

  'htaccess.RewriteBase' => '/',
  'overwrite.cli.url' => 'https://cloud.example.com',

💡 Tipp: Das occ-Tool ist euer Schweizer Taschenmesser. Damit könnt ihr Nutzer anlegen, Apps installieren, Reparaturen durchführen, Backups starten — alles über die Kommandozeile. sudo -u www-data php /var/www/nextcloud/occ zeigt alle Befehle.


Schritt 14: Erste Nutzer und Apps

Nutzer per CLI anlegen

sudo -u www-data php /var/www/nextcloud/occ user:add --display-name="Max Mustermann" max

Ihr werdet nach dem Passwort gefragt.

Wichtige Apps aktivieren

Über die Web-UI: Apps → Featured. Empfehlenswerte Erstausstattung:

  • Calendar — CalDAV-Kalender
  • Contacts — CardDAV-Adressbuch
  • Notes — Markdown-Notizen
  • Tasks — Aufgabenliste
  • Mail — IMAP-Client
  • Talk — Chat & Video
  • Deck — Kanban-Board
  • Photos — Foto-Galerie

Per CLI installieren:

sudo -u www-data php /var/www/nextcloud/occ app:install calendar
sudo -u www-data php /var/www/nextcloud/occ app:install contacts
sudo -u www-data php /var/www/nextcloud/occ app:install notes

Backups

Nextcloud hat drei Datenquellen, die ALLE gesichert werden müssen:

  • /var/www/nextcloud/config/config.php — Konfiguration
  • /var/nextcloud-data/ — Nutzer-Daten
  • MariaDB-Datenbank nextcloud

Automatisches Backup-Script

sudo nano /usr/local/bin/nextcloud-backup.sh

Inhalt:

#!/bin/bash
set -e

BACKUP_DIR="/var/backups/nextcloud"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
RETENTION_DAYS=14

mkdir -p "$BACKUP_DIR"

# Wartungsmodus aktivieren
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on

# Datenbank-Dump
mysqldump --single-transaction \
  -h localhost -u nextcloud -pEUER_DB_PASSWORT nextcloud \
  | gzip > "$BACKUP_DIR/db-$TIMESTAMP.sql.gz"

# Config sichern
tar -czf "$BACKUP_DIR/config-$TIMESTAMP.tar.gz" \
  -C /var/www/nextcloud config

# Daten sichern (kann groß werden!)
tar -czf "$BACKUP_DIR/data-$TIMESTAMP.tar.gz" \
  -C /var nextcloud-data

# Wartungsmodus aus
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off

# Alte Backups löschen
find "$BACKUP_DIR" -type f -mtime +$RETENTION_DAYS -delete

echo "Backup completed: $TIMESTAMP"

⚠️ Wichtig: Speichert das DB-Passwort niemals als Klartext im Script. Besser: ~/.my.cnf für www-data anlegen oder Variablen aus einer separaten Datei mit chmod 600 einlesen.

Ausführbar machen und mit systemd Timer automatisieren — wie in unserem restic Backup-Tutorial beschrieben.

⚠️ Best Practice: Bei vielen Nutzerdaten wird tar schnell unhandlich. Nutzt restic mit Deduplication — das spart 80% Speicherplatz und ermöglicht schnelle inkrementelle Backups.


Updates

Nextcloud-Updates laufen entweder per Web-UI (Updater-App) oder per CLI. CLI ist robuster:

# Wartungsmodus aktivieren
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on

# Backup vor dem Update!
sudo /usr/local/bin/nextcloud-backup.sh

# Updater ausführen
sudo -u www-data php /var/www/nextcloud/updater/updater.phar

# Wartungsmodus aus
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off

# Datenbank-Indizes prüfen
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices

💡 Empfehlung: Springt nie mehrere Major-Versionen auf einmal (z.B. 30 → 33). Updatet immer eine Version weiter und prüft danach den Status. Andernfalls können Migrationsprobleme auftreten.


Zusammenfassung & Checkliste

SchrittStatus
Debian 13 Server eingerichtet
Nginx installiert und läuft
PHP 8.3-FPM mit allen Extensions installiert
PHP-Performance-Settings gesetzt
PHP-FPM Pool getuned
MariaDB installiert und abgesichert
Nextcloud-Datenbank angelegt
MariaDB für Nextcloud optimiert
Redis installiert und konfiguriert
Nextcloud heruntergeladen und entpackt
Daten-Verzeichnis außerhalb Webroot
Nginx vHost konfiguriert
SSL-Zertifikat eingerichtet
Setup-Wizard abgeschlossen
Caching (APCu + Redis) konfiguriert
Cron-Job statt AJAX
Trusted Domains eingetragen
Sicherheits-Check ohne Warnungen
Backup-Script eingerichtet
Backup einmal manuell getestet

Troubleshooting

„502 Bad Gateway“ nach Setup

Nginx kann nicht zu PHP-FPM verbinden. Prüft:

# Läuft FPM?
sudo systemctl status php8.3-fpm

# Stimmt der Socket-Pfad in der Nginx-Config?
ls -la /run/php/php8.3-fpm.sock

# Logs anschauen
sudo tail -f /var/log/nginx/error.log

Falls php8.2-fpm.sock statt php8.3-fpm.sock läuft: PHP-Version stimmt nicht — auf 8.3 wechseln oder die Nginx-Config anpassen.

„Internal Server Error“

sudo tail -f /var/log/nginx/nextcloud.error.log
sudo tail -f /var/log/php8.3-fpm.log

Häufige Ursachen: PHP-Modul fehlt, Permissions auf /var/www/nextcloud falsch, OPcache-Probleme.

Permissions-Probleme

Reset auf saubere Werte:

sudo find /var/www/nextcloud/ -type d -exec chmod 750 {} \;
sudo find /var/www/nextcloud/ -type f -exec chmod 640 {} \;
sudo chown -R www-data:www-data /var/www/nextcloud
sudo chown -R www-data:www-data /var/nextcloud-data

Uploads brechen ab bei großen Dateien

  • upload_max_filesize und post_max_size in PHP zu klein?
  • client_max_body_size in Nginx zu klein? (Aktuell 16G)
  • fastcgi_read_timeout zu kurz? (Aktuell 3600s)
  • Cloudflare davor? Cloudflare-Free hat 100 MB Upload-Limit

„Memcache ist nicht konfiguriert“ trotz Redis-Setup

  • Hat www-data Zugriff auf den Redis-Socket? sudo -u www-data redis-cli -s /var/run/redis/redis-server.sock ping
  • Modul installiert? php -m | grep redis
  • In config.php beide Zeilen memcache.local UND memcache.locking gesetzt?

„Last cron job execution“-Warnung

sudo systemctl status cron
sudo crontab -u www-data -l

Cron muss laufen und der Eintrag muss vorhanden sein.

Nextcloud-Updater bricht ab

# Manuell weitermachen
sudo -u www-data php /var/www/nextcloud/occ upgrade
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-columns
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-primary-keys

CalDAV/CardDAV-Clients finden Server nicht

Prüft die .well-known-Redirects mit:

curl -I https://cloud.example.com/.well-known/caldav
curl -I https://cloud.example.com/.well-known/carddav

Beide sollten 301 Moved Permanently zurückgeben mit Location-Header auf /remote.php/dav/.


Nächste Schritte

Nextcloud läuft — und jetzt? Hier sind sinnvolle nächste Schritte:

  • Collabora Online integrieren — Eigenes Office im Browser (Word/Excel/PowerPoint-kompatibel)
  • Authentik als SSO — Verbindet Nextcloud mit eurem Authentik-Setup
  • OnlyOffice als Alternative zu Collabora
  • Nextcloud Talk mit TURN-Server — Video-Calls auch hinter NAT
  • External Storage — S3, SFTP, SMB als Mount in Nextcloud
  • High Performance Backend für Filesnotify_push für Live-Sync ohne Polling
  • Server-Side Encryption — Verschlüsselung sensibler Daten

Nextcloud ist die Schaltzentrale eures digitalen Lebens. Die offizielle Admin-Doku ist sehr umfangreich.

Habt ihr Fragen oder Probleme? Schreibt es in die Kommentare — ich helfe gerne!

Kommentar hinterlassen