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.
ondrej/php-PPA, kein Gefrickel.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.
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
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
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
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
Sonst meckert occ bei jedem Aufruf:
echo "apc.enable_cli=1" >> /etc/php/8.3/cli/conf.d/20-apcu.ini
systemctl restart apache2
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
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
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
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.
Im Browser die Container-IP aufrufen, z. B. http://192.168.1.50.
/Daten/nextcloudnextcloudusernextcloudlocalhostOhne 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
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.
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.
Neuen Proxy Host anlegen:
cloud.deine-domain.dehttp192.168.1.5080Unter 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;
}
config.php anpassennano /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
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
Im Nextcloud-Admin-Bereich unter Verwaltung → Übersicht sollten jetzt keine Warnungen mehr stehen. Typische Kandidaten, wenn doch welche auftauchen:
ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; auf der DB nachziehen, dann sudo -u www-data php /var/www/nextcloud/occ maintenance:repair --include-expensive.sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices.Ein LXC ohne Backup ist wie ein Lötkolben ohne Absaugung – geht so lange gut, bis es nicht mehr gut geht. Zu sichern sind:
/Daten/nextcloud/var/www/nextcloud (wegen config/config.php und Apps)mysqldump --single-transaction nextcloud > nextcloud.sqlVor 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.
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