PDF-Export: Nutzen Sie die Druckfunktion Ihres Browsers und wählen Sie "Als PDF speichern" als Ziel.

Anleitung ( #blog)

Nextcloud 33 auf [[proxmox]] LXC – eine Anleitung vom Universaldilettant

Stand: April 2026 – für den Fall, dass dich jemand (z. B. dein zukünftiges Ich) in einem halben Jahr fragt, wie du das damals hinbekommen hast.

Diese Anleitung beschreibt eine saubere Installation von Nextcloud 33 (Hub 26 Winter) in einem unprivilegierten LXC-Container auf Proxmox, mit Ubuntu 24.04 LTS, PHP 8.3, Apache, MariaDB, Redis und späterem Betrieb hinter einem Reverse Proxy (Nginx Proxy Manager). Also das volle Programm, aber ohne die üblichen YouTube-Stolperfallen, die einem nach drei Wochen auf die Füße fallen.

Warum nicht einfach Snap oder Docker? Kann man machen. Man lernt dabei aber weniger, was meistens der eigentliche Sinn der Übung im Homelab ist. Wer Bequemlichkeit wollte, hätte Dropbox gebucht.


0. Was du vorher wissen solltest


1. Container in Proxmox anlegen

In Proxmox einen neuen unprivilegierten LXC-Container anlegen:

Einstellung Wert
Template ubuntu-24.04-standard
CPU 2 Kerne (Home-Setup), 4 Kerne (wenn's mehrere Nutzer sind)
RAM 4 GB Minimum, 6–8 GB wenn du Office/Collabora dazu willst
Swap 512 MB
Root-Disk 20 GB (reicht fürs System)
Zusätzliche Disk 50+ GB, gemountet auf /Daten (für die Nutzerdaten)
Features nesting=1 aktivieren
Netzwerk statische IP empfohlen, z. B. 192.168.1.50/24

Wichtig bei unprivilegiertem LXC: Wenn du /Daten als Bind-Mount vom Proxmox-Host durchreichst, denk an das UID-Mapping. www-data hat im Container UID 33, auf dem Host wird daraus standardmäßig UID 100033. Sonst wunderst du dich später über Permission-Errors, die keinen Sinn zu ergeben scheinen.


2. System vorbereiten

apt update && apt upgrade -y && apt autoremove -y
apt install -y curl wget unzip nano sudo ufw

SSH-Root-Login aktivieren ist praktisch fürs Copy-Paste, aber nur im internen Netz und mit ordentlichem Passwort (oder besser: Key-Auth):

sed -i 's/#*PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
systemctl restart ssh

Zeitzone setzen, damit die Logs nicht in UTC durch die Gegend schießen:

timedatectl set-timezone Europe/Berlin

3. Apache installieren

apt install -y apache2
systemctl enable --now apache2

Default-Site erstmal deaktivieren, damit sie uns später nicht in die Quere kommt:

a2dissite 000-default.conf

4. PHP 8.3 und alle benötigten Module

Ubuntu 24.04 liefert PHP 8.3 direkt mit. Keine Fremdquellen nötig.

apt install -y \
  php8.3 libapache2-mod-php8.3 \
  php8.3-gd php8.3-mysql php8.3-curl php8.3-mbstring \
  php8.3-intl php8.3-gmp php8.3-bcmath php8.3-xml \
  php8.3-imagick php8.3-zip php8.3-apcu php8.3-redis \
  php8.3-ldap php8.3-smbclient php8.3-cli php8.3-opcache \
  php8.3-fpm \
  libmagickcore-7.q16-10-extra \
  redis-server unzip

Hinweis: php-dompdf taucht in diversen YouTube-Anleitungen auf, ist aber kein offizielles Nextcloud-Requirement. Weggelassen.

PHP-Module aktivieren:

a2enmod rewrite headers env dir mime setenvif ssl

5. PHP konfigurieren

5.1 Apache-PHP (php.ini)

nano /etc/php/8.3/apache2/php.ini

Folgende Werte anpassen (Suche mit Strg+W):

memory_limit = 2048M
upload_max_filesize = 20G
post_max_size = 20G
max_execution_time = 3600
max_input_time = 3600
output_buffering = Off
date.timezone = Europe/Berlin
opcache.enable = 1
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.memory_consumption = 128
opcache.save_comments = 1
opcache.revalidate_freq = 1

5.2 APCu für CLI aktivieren

Sonst meckert occ bei jedem Aufruf:

echo "apc.enable_cli=1" >> /etc/php/8.3/cli/conf.d/20-apcu.ini

5.3 Apache neu starten

systemctl restart apache2

6. MariaDB installieren und einrichten

apt install -y mariadb-server
systemctl enable --now mariadb
mysql_secure_installation

Bei mysql_secure_installation durchklicken: Root-Passwort setzen, anonyme Nutzer raus, Test-DB raus, Remote-Root aus. Also einmal alles mit „Y" bestätigen.

Datenbank und Nutzer anlegen:

mysql -u root -p
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'DeinSicheresPasswort';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Merke: DeinSicheresPasswort ist kein sicheres Passwort. Das musst du tatsächlich ersetzen. Am besten mit openssl rand -base64 24.

Für Performance noch ein paar Einstellungen in der MariaDB-Config:

nano /etc/mysql/mariadb.conf.d/50-server.cnf

Unter [mysqld] ergänzen:

transaction_isolation = READ-COMMITTED
innodb_file_per_table = 1
innodb_read_only_compressed = OFF

Dann neu starten:

systemctl restart mariadb

7. Nextcloud herunterladen

cd /tmp
wget https://download.nextcloud.com/server/releases/latest.zip
unzip -q latest.zip
mv nextcloud /var/www/

Datenverzeichnis vorbereiten (falls /Daten als separater Mount existiert):

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

8. Apache-VHost für Nextcloud

Eigene Site-Konfiguration – nicht die Default verbiegen:

nano /etc/apache2/sites-available/nextcloud.conf

Inhalt (hinter Reverse Proxy reicht HTTP auf Port 80):

<VirtualHost *:80>
    ServerName cloud.deine-domain.de
    DocumentRoot /var/www/nextcloud/

    <Directory /var/www/nextcloud/>
        Require all granted
        AllowOverride All
        Options FollowSymLinks MultiViews

        <IfModule mod_dav.c>
            Dav off
        </IfModule>
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log
    CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined
</VirtualHost>

Aktivieren und Apache neu starten:

a2ensite nextcloud.conf
systemctl reload apache2

9. Berechtigungen setzen

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

Das ist etwas strenger als chmod 755 quer durch alles, entspricht aber dem, was die Nextcloud-Doku empfiehlt.


10. Web-Installation abschließen

Im Browser die Container-IP aufrufen, z. B. http://192.168.1.50.


11. Redis-Caching konfigurieren

Ohne das läuft Nextcloud zwar, aber gefühlt wie durch Honig. Mit Redis ist es… immer noch Nextcloud, aber schneller.

Redis-Socket einrichten:

nano /etc/redis/redis.conf

Folgende Zeilen setzen bzw. anpassen:

port 0
unixsocket /var/run/redis/redis-server.sock
unixsocketperm 770

www-data zur Redis-Gruppe hinzufügen, damit Apache auf den Socket darf:

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

Dann in die Nextcloud-Konfiguration:

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

Vor dem schließenden ); ergänzen:

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

Apache neu starten:

systemctl restart apache2

12. Cronjob einrichten

Der Background-Job-Modus "AJAX" ist zwar der Default, aber offiziell deprecated. Also Cron. Ist nicht schwer:

crontab -u www-data -e

Folgende Zeile eintragen:

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

In der Nextcloud-Admin-Oberfläche dann unter Verwaltung → Grundeinstellungen → Hintergrundaufgaben auf „Cron" umstellen.


13. Reverse Proxy (Nginx Proxy Manager)

Wenn du Nextcloud über eine Domain mit SSL nutzt (NPM, Traefik, Caddy – whatever), müssen zwei Dinge passen: die NPM-Konfig und die config.php deiner Nextcloud.

13.1 Nginx Proxy Manager

Neuen Proxy Host anlegen:

Unter Advanced reinkopieren (Nextcloud hat spezielle Anforderungen an WebDAV- und Well-Known-Redirects):

client_max_body_size 20G;
proxy_request_buffering off;

location /.well-known/carddav {
    return 301 $scheme://$host/remote.php/dav;
}
location /.well-known/caldav {
    return 301 $scheme://$host/remote.php/dav;
}

13.2 Nextcloud config.php anpassen

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

In das 'trusted_domains'-Array deine Domain eintragen und folgende Werte ergänzen (die IP des Reverse Proxys anpassen):

  'trusted_domains' =>
  array (
    0 => '192.168.1.50',
    1 => 'cloud.deine-domain.de',
  ),
  'trusted_proxies' => ['192.168.1.10'],
  'overwrite.cli.url' => 'https://cloud.deine-domain.de',
  'overwriteprotocol' => 'https',
  'overwritehost' => 'cloud.deine-domain.de',

Apache reloaden:

systemctl reload apache2

14. Firewall (UFW)

Nur das offen lassen, was wirklich gebraucht wird:

ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp    # SSH
ufw allow 80/tcp    # HTTP (vom Reverse Proxy)
ufw enable

Wer ganz paranoid ist, beschränkt Port 80 auf die IP des Reverse Proxys:

ufw allow from 192.168.1.10 to any port 80 proto tcp

15. Abschluss-Checks

Im Nextcloud-Admin-Bereich unter Verwaltung → Übersicht sollten jetzt keine Warnungen mehr stehen. Typische Kandidaten, wenn doch welche auftauchen:


16. Backup (nicht vergessen!)

Ein LXC ohne Backup ist wie ein Lötkolben ohne Absaugung – geht so lange gut, bis es nicht mehr gut geht. Zu sichern sind:

  1. Das Datenverzeichnis: /Daten/nextcloud
  2. Das Webverzeichnis: /var/www/nextcloud (wegen config/config.php und Apps)
  3. Die Datenbank: mysqldump --single-transaction nextcloud > nextcloud.sql

Vor größeren Aktionen immer in den Maintenance Mode:

sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on
# ... backup läuft ...
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off

Und auf Proxmox-Ebene zusätzlich regelmäßig einen Container-Snapshot. Doppelt hält besser.


Fertig.

Wenn alles läuft: Glückwunsch. Wenn nicht: die Logs sind unter /var/log/apache2/nextcloud_error.log, /var/www/nextcloud/data/nextcloud.log und dem Output von journalctl -u apache2. In dieser Reihenfolge nachschauen, dann hat man's meistens.

Und falls du in sechs Monaten wieder hier landest, weil du's vergessen hast: willkommen zurück. Passiert den Besten.

– vy 73 de DL6LG