Fotos, Dokumente, Kalender und Kontakte – all das lag bei mir lange bei Google, Apple und Co. Irgendwann wollte ich meine Daten wieder selbst in der Hand haben. Die Lösung: eine eigene Nextcloud, die bei mir zu Hause läuft, von unterwegs erreichbar ist und trotzdem sauber per HTTPS abgesichert ist. In diesem Beitrag zeige ich, wie mein Aufbau aussieht und wie du so etwas selbst umsetzen kannst – Schritt für Schritt, mit allen wichtigen Befehlen.
Warum eine eigene Cloud?
- Datenhoheit: Die Dateien liegen auf meiner eigenen Hardware, nicht bei einem US-Konzern.
- Keine Abo-Kosten: Speicherplatz kostet nur einmal die Festplatte.
- Alles in einem: Dateien, Kalender, Kontakte, Fotos-Upload vom Handy, Freigabe-Links für Freunde und Familie.
- Lerneffekt: Man versteht danach deutlich besser, wie Webserver, Datenbanken und Zertifikate zusammenspielen.
Die Hardware
Als Server dient bei mir ein kompakter Mini-PC mit einem AMD Ryzen 7 5825U (8 Kerne / 16 Threads) und 32 GB RAM. Darauf läuft Proxmox als Virtualisierungsplattform. Das hat einen großen Vorteil: Nextcloud bekommt eine eigene virtuelle Maschine, und daneben können weitere Dienste laufen, ohne dass sie sich gegenseitig in die Quere kommen. Außerdem lassen sich VMs mit wenigen Klicks sichern und im Notfall wiederherstellen.
Der Mini-PC ist leise, braucht im Leerlauf wenig Strom und hat für eine Familien-Cloud mehr als genug Leistung.
Der Aufbau im Überblick
So sieht der Weg einer Anfrage aus, wenn ich von unterwegs auf meine Cloud zugreife:
- Router: Die Fritz!Box leitet nur die Ports 80 und 443 an den Server weiter – sonst nichts.
- Nginx Proxy Manager (Docker): nimmt die Anfrage entgegen, kümmert sich um das Let’s-Encrypt-Zertifikat und reicht sie weiter.
- Apache + PHP: liefert Nextcloud aus.
- MariaDB: speichert Benutzer, Freigaben und Metadaten.
- Redis + APCu: sorgen als Cache dafür, dass die Oberfläche flott bleibt.
Als Betriebssystem in der VM nutze ich Debian 13. Nextcloud installiere ich bewusst nicht in Docker, sondern klassisch direkt auf dem System. So habe ich volle Kontrolle über PHP, Apache und Datenbank und verstehe jede Stellschraube. Nur der Nginx Proxy Manager läuft als Docker-Container, weil er sich so am bequemsten pflegen lässt.
Schritt 1: Pakete installieren
In der frischen Debian-VM installiere ich zuerst Webserver, Datenbank, PHP mit allen benötigten Erweiterungen und Redis:
apt update && apt upgrade -y
apt install -y apache2 mariadb-server redis-server unzip \
libapache2-mod-php php-gd php-mysql php-curl php-mbstring php-intl \
php-gmp php-bcmath php-xml php-zip php-bz2 php-imagick php-apcu php-redis
Schritt 2: Datenbank anlegen
mariadb-secure-installation
mariadb
In der MariaDB-Konsole lege ich dann Datenbank und Benutzer an:
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'HIER-EIN-LANGES-PASSWORT';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EXIT;
⚠️ Achtung: Verwende für die Datenbank ein langes, zufälliges Passwort – am besten direkt aus dem Passwort-Manager. Es muss sich niemand merken, Nextcloud speichert es in seiner Konfiguration.
Schritt 3: Nextcloud herunterladen
cd /tmp
wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip -d /var/www/
chown -R www-data:www-data /var/www/nextcloud
Schritt 4: Apache einrichten
Für Nextcloud bekommt Apache eine eigene Konfigurationsdatei:
vim /etc/apache2/sites-available/nextcloud.conf
<VirtualHost *:8080>
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>
</VirtualHost>
Weil später der Nginx Proxy Manager die Ports 80 und 443 übernimmt, lasse ich Apache auf Port 8080 lauschen. Dazu in /etc/apache2/ports.conf die Zeile Listen 80 ändern:
Listen 8080
Dann die Seite aktivieren, die nötigen Module einschalten und Apache neu laden:
a2ensite nextcloud.conf
a2dissite 000-default.conf
a2enmod rewrite headers env dir mime
systemctl reload apache2
💡 Tipp: Apache spricht hier bewusst nur unverschlüsseltes HTTP – und zwar nur innerhalb des Heimnetzes. Die Verschlüsselung nach außen übernimmt der Nginx Proxy Manager. So muss ich mich nur an einer Stelle um Zertifikate kümmern.
Schritt 5: PHP anpassen
Die Standardwerte von PHP sind für Nextcloud zu knapp. In der PHP-Konfiguration für Apache (/etc/php/8.4/apache2/php.ini) passe ich folgende Werte an:
memory_limit = 512M
upload_max_filesize = 16G
post_max_size = 16G
max_execution_time = 3600
date.timezone = Europe/Berlin
opcache.enable = 1
opcache.interned_strings_buffer = 16
opcache.memory_consumption = 128
Damit der Cache auch für Hintergrundjobs funktioniert, kommt noch eine Zeile in die APCu-Konfiguration:
echo "apc.enable_cli=1" >> /etc/php/8.4/mods-available/apcu.ini
systemctl restart apache2
Schritt 6: Nginx Proxy Manager mit Let’s Encrypt
Der Nginx Proxy Manager (NPM) läuft bei mir per Docker Compose auf derselben VM. Die docker-compose.yml ist schnell geschrieben:
services:
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "81:81"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
docker compose up -d
In der Weboberfläche des NPM lege ich dann einen Proxy Host an:
- Domain: die Subdomain für die Cloud
- Forward Hostname/IP: die interne Adresse der VM, Port 8080, Schema http
- Websockets Support: an
- SSL: neues Let’s-Encrypt-Zertifikat anfordern, Force SSL, HTTP/2 und HSTS aktivieren
Unter Advanced trage ich noch eine Zeile ein, damit auch große Uploads nicht am Proxy scheitern:
client_max_body_size 0;
⚠️ Achtung: Die Verwaltungsoberfläche des Proxy Managers (Port 81) gehört nicht ins Internet. Im Router werden ausschließlich die Ports 80 und 443 freigegeben.
Schritt 7: Installation abschließen und Proxy eintragen
Jetzt kann ich die Cloud im Browser aufrufen und den Einrichtungsassistenten durchklicken: Admin-Konto anlegen, MariaDB als Datenbank wählen, Benutzer, Passwort und Datenbankname von oben eintragen. Fertig.
Damit Nextcloud weiß, dass es hinter einem Proxy läuft und die Besucher eigentlich per HTTPS kommen, ergänze ich in /var/www/nextcloud/config/config.php noch ein paar Einträge:
'trusted_domains' =>
array (
0 => 'cloud.deine-domain.de',
),
'trusted_proxies' => array ('IP-DES-PROXYS'),
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'https://cloud.deine-domain.de',
'default_phone_region' => 'DE',
'maintenance_window_start' => 1,
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array (
'host' => 'localhost',
'port' => 6379,
),
Dabei kümmert sich APCu um den lokalen Cache und Redis um das Sperren von Dateien, damit es bei gleichzeitigem Zugriff keine Konflikte gibt.
Schritt 8: Hintergrundjobs per Cron
Nextcloud erledigt viele Aufgaben im Hintergrund. Am zuverlässigsten läuft das per Cron:
crontab -u www-data -e
*/5 * * * * php -f /var/www/nextcloud/cron.php
*/10 * * * * php /var/www/nextcloud/occ preview:pre-generate
sudo -u www-data php /var/www/nextcloud/occ background:cron
💡 Tipp: Die zweite Zeile gehört zur App Preview Generator. Sie erzeugt Vorschaubilder schon im Hintergrund, sodass Fotoordner später sofort flüssig angezeigt werden statt erst beim Öffnen.
Zuhause ohne Umweg: lokaler DNS mit AdGuard Home
Von unterwegs geht die Verbindung ganz normal über das Internet. Im Heimnetz wäre das aber ein unnötiger Umweg über den Router – und je nach Router klappt das gar nicht sauber. Deshalb läuft bei mir AdGuard Home als lokaler DNS-Server (eingetragen in der Fritz!Box). Dort gibt es unter Filter → DNS-Umschreibungen einen Eintrag, der die Cloud-Domain zu Hause direkt auf die interne Adresse des Proxys zeigen lässt. Das Zertifikat passt trotzdem, weil der Proxy unter derselben Domain antwortet.
Stolperfalle: „Sicheres DNS“ in Chrome
Bei mir lief das in Safari einwandfrei, Chrome meldete aber zu Hause NET::ERR_CERT_AUTHORITY_INVALID – „Dies ist keine sichere Verbindung“. Der Grund: Chrome nutzt mit der Einstellung „Sicheres DNS verwenden“ einen eigenen DNS-Anbieter und fragt AdGuard gar nicht. Damit landet er beim Router statt beim Proxy und bekommt dessen eigenes Zertifikat zu sehen.
Die Lösung:
chrome://settings/securityöffnen und „Sicheres DNS verwenden“ ausschalten (oder auf den aktuellen Dienstanbieter stellen)chrome://net-internals/#dnsöffnen und Clear host cache klicken- Seite neu laden – fertig
Feinschliff: Datenbank-Tuning
Unter Verwaltung → Übersicht zeigt Nextcloud Hinweise zur Konfiguration. Bei mir meldete die Datenbankprüfung, dass zu viele temporäre Tabellen auf der Festplatte statt im Arbeitsspeicher landen und neue Verbindungen zu selten aus dem Thread-Cache bedient werden. Das lässt sich mit einer kleinen Zusatzdatei für MariaDB beheben:
vim /etc/mysql/mariadb.conf.d/99-nextcloud.cnf
[mysqld]
thread_cache_size = 64
tmp_table_size = 128M
max_heap_table_size = 128M
innodb_log_file_size = 256M
systemctl restart mariadb
mariadb -e "SHOW VARIABLES WHERE Variable_name IN ('thread_cache_size','tmp_table_size','max_heap_table_size');"
⚠️ Achtung: tmp_table_size und max_heap_table_size immer gleich groß setzen – es gilt jeweils der kleinere Wert. Und nicht wundern: Die Warnung in Nextcloud verschwindet erst nach ein paar Tagen, weil die Statistik seit dem Neustart der Datenbank neu gesammelt wird.
Sicherheit: Was ich zusätzlich beachte
- Nur 80 und 443 offen: Alles andere bleibt im Heimnetz.
- Zwei-Faktor-Anmeldung für das Admin-Konto (TOTP-App), dazu ausgedruckte Backup-Codes.
- Lange, einzigartige Passwörter aus dem Passwort-Manager.
- Updates: regelmäßig
apt upgradefür Debian und den Nextcloud-Updater für die Cloud selbst. - Backups: Proxmox sichert die komplette VM regelmäßig.
- Selbsttest: Der offizielle Nextcloud-Sicherheitsscan zeigt, ob von außen alles sauber konfiguriert ist.
Fazit
Eine eigene Nextcloud ist kein Hexenwerk, aber auch kein Fünf-Minuten-Projekt. Mit Proxmox, einer schlanken Debian-VM und dem Nginx Proxy Manager davor läuft meine Cloud seit der Einrichtung zuverlässig und schnell – zu Hause wie unterwegs. Als Nächstes stehen bei mir Backups auf das NAS und vielleicht ein lokaler KI-Assistent für Nextcloud auf der Liste. Dazu dann mehr in einem eigenen Beitrag.
🙋 Betreibst du auch schon eine eigene Cloud oder überlegst noch? Hast du Nextcloud lieber in Docker oder klassisch installiert? Schreib’s mir gern in die Kommentare!