NextCloud im Proxmox LXC
NextCloud im Proxmox LXC: Weil „Die Cloud“ auch nur der Rechner von jemand anderem ist…
…und dieser „jemand“ ab heute du bist. Herzlichen Glückwunsch! Du hast dich offiziell dazu entschieden, die bequeme Welt von Google Drive, Dropbox und Co. zu verlassen, um stattdessen Stunden deiner Lebenszeit in ein schwarzes Terminal-Fenster zu starren. Warum? Weil wir unsere Daten lieben (und ein bisschen Kontrollfreaks sind).
Warum machen wir das hier eigentlich?
Eigentlich hättest du die Fotos von deinem letzten Grillabend einfach bei iCloud hochladen können. Aber nein, du hast einen Proxmox-Server im Keller (oder im Flur, wo er leise fiept und deine Partnerin/deinen Partner in den Wahnsinn treibt).
Die Mission: Wir zimmern uns eine NextCloud in einen LXC-Container.
- Warum LXC? Weil virtuelle Maschinen (VMs) für Leute sind, die zu viel RAM übrig haben. Wir sind effizient (geizig) und wollen Performance!
- Das Ziel: Ein perfekt laufendes System, das deine Dateien synchronisiert, während du dich wie ein Hacker aus einem 90er-Jahre-Film fühlst.
[!WARNING] Haftungsausschluss: Ich übernehme keine Haftung für geschmolzene CPUs, verlorene Urlaubsfotos oder die Tatsache, dass du das ganze Wochenende damit verbringst, Berechtigungen für data-Verzeichnisse zu fixen. Eigenregie auf eigene Gefahr!
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
- Nextcloud 27, 28, 29, 30 und 31 sind End of Life oder kurz davor. Wer neu aufsetzt, nimmt 33 (oder 32, wenn's konservativ sein soll).
- PHP 8.2 läuft noch, stirbt aber Ende 2026. PHP 8.3 ist die offiziell empfohlene Version für Nextcloud 33.
- Ubuntu 24.04 LTS hat PHP 8.3 von Haus aus in den Repos – kein
ondrej/php-PPA, kein Gefrickel. - Hinter einem Reverse Proxy brauchst du HTTPS nicht im Container. Der Proxy macht TLS, der Container spricht HTTP.
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-dompdftaucht 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:
DeinSicheresPasswortist kein sicheres Passwort. Das musst du tatsächlich ersetzen. Am besten mitopenssl 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.
- Admin-Konto: Nutzername und Passwort setzen.
- Datenverzeichnis:
/Daten/nextcloud - Datenbank: MySQL/MariaDB
- Datenbank-Nutzer:
nextclouduser - Passwort: (dein gesetztes)
- Datenbank-Name:
nextcloud - Host:
localhost
- Datenbank-Nutzer:
- Empfohlene Apps: Nach Geschmack. Ich nehm die meistens nicht, der Installer ist da wählerisch optimistisch.
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:
- Domain Names:
cloud.deine-domain.de - Scheme:
http - Forward Hostname / IP: Container-IP, z. B.
192.168.1.50 - Forward Port:
80 - Block Common Exploits: an
- Websockets Support: an
- SSL: Let's Encrypt, Force SSL, HTTP/2, HSTS
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:
- „Strict-Transport-Security"-Header fehlt → im NPM aktivieren oder eigenen Header setzen.
- „Die Datenbank wird ohne Unicode-Unterstützung betrieben" →
ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;auf der DB nachziehen, dannsudo -u www-data php /var/www/nextcloud/occ maintenance:repair --include-expensive. - „Einige Indizes fehlen" →
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices. - „PHP-Speicherlimit unter 512 MB" → Hast du in Schritt 5 ignoriert, gib zu.
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:
- Das Datenverzeichnis:
/Daten/nextcloud - Das Webverzeichnis:
/var/www/nextcloud(wegenconfig/config.phpund Apps) - 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