Blogbeitrag

Nextcloud Community Edition installieren und optimieren

Praxisanleitung für Nextcloud CE mit Apache, PHP 8.3, MariaDB, Redis/APCu, Cronjob, Reverse Proxy Manager und optionaler LDAP-Anbindung.

20. June 2026
Beitragsbild<p><strong>Kurzbeschreibung:</strong> Eine praxisnahe Anleitung für die Installation von Nextcloud Community Edition auf einem Ubuntu-/Debian-Server mit Apache, PHP 8.3, MariaDB, Redis/APCu, Cronjob, Reverse Proxy Manager und optionaler LDAP-Anbindung.</p>
<hr>
<h2>Ziel der Anleitung</h2>
<p>Diese Anleitung beschreibt eine klassische Nextcloud-Installation auf einem Linux-Server. Sie eignet sich für kleine Umgebungen, Homelab-Systeme oder interne Server, bei denen Nextcloud direkt auf dem System installiert wird.</p>
<p>Verwendete Komponenten:</p>
<ul>
<li>Apache2 als Webserver</li>
<li>PHP 8.3 mit benötigten Modulen</li>
<li>MariaDB als Datenbank</li>
<li>Redis und APCu für Caching und File Locking</li>
<li>Cronjob für Hintergrundaufgaben</li>
<li>optional LDAP/Active Directory</li>
<li>optional Reverse Proxy Manager für HTTPS-Zugriff von außen</li>
</ul>
<p>Hinweis: Platzhalter wie <code>cloud.example.de</code>, <code>192.168.x.x</code>, <code>nextclouduser</code> und <code>sicheres_passwort</code> müssen an die eigene Umgebung angepasst werden.</p>
<hr>
<h2>1. System aktualisieren</h2>
<p>Zuerst wird das System aktualisiert:</p>
<pre><code>
sudo apt update

sudo apt upgrade -y

</code></pre>
<p>Falls noch nicht vorhanden, können grundlegende Werkzeuge installiert werden:</p>
<pre><code>
sudo apt install -y software-properties-common unzip nano wget curl ca-certificates

</code></pre>
<hr>
<h2>2. Apache installieren</h2>
<p>Nextcloud kann mit Apache betrieben werden. Installation:</p>
<pre><code>
sudo apt install -y apache2

</code></pre>
<p>Apache starten und aktivieren:</p>
<pre><code>
sudo systemctl enable --now apache2

</code></pre>
<hr>
<h2>3. PHP 8.3 installieren</h2>
<p>Je nach Ubuntu-Version ist PHP 8.3 nicht direkt in den Standard-Paketquellen enthalten. In diesem Fall kann das Ondřej-PPA verwendet werden:</p>
<pre><code>
sudo add-apt-repository ppa:ondrej/php -y

sudo add-apt-repository ppa:ondrej/apache2 -y

sudo apt update

</code></pre>
<p>Danach PHP 8.3 und die benötigten Module installieren:</p>
<pre><code>
sudo apt install -y \

php8.3 libapache2-mod-php8.3 php8.3-cli php8.3-fpm \

php8.3-mysql php8.3-zip php8.3-xml php8.3-mbstring \

php8.3-gd php8.3-curl php8.3-imagick php8.3-intl \

php8.3-bcmath php8.3-gmp php8.3-apcu php8.3-redis \

php8.3-smbclient php8.3-ldap php8.3-memcached php8.3-bz2 \

php-pear redis-server libmagickcore-6.q16-6-extra

</code></pre>
<hr>
<h2>4. PHP-Konfiguration anpassen</h2>
<p>Die Apache-PHP-Konfiguration öffnen:</p>
<pre><code>
sudo nano /etc/php/8.3/apache2/php.ini

</code></pre>
<p>Empfohlene Werte, abhängig von Servergröße und Umgebung:</p>
<pre><code>
memory_limit = 1024M

upload_max_filesize = 20G

post_max_size = 20G

date.timezone = Europe/Berlin

output_buffering = Off

</code></pre>
<p>Für OPcache können folgende Werte gesetzt oder angepasst werden:</p>
<pre><code>
opcache.enable=1

opcache.enable_cli=1

opcache.memory_consumption=256

opcache.interned_strings_buffer=32

opcache.max_accelerated_files=10000

opcache.save_comments=1

opcache.revalidate_freq=1

</code></pre>
<p>Hinweis: Sehr hohe Werte wie <code>memory_limit = 10G</code> oder <code>opcache.memory_consumption = 2048</code> sind nur sinnvoll, wenn der Server entsprechend viel RAM hat. Für viele Installationen reichen kleinere Werte aus.</p>
<hr>
<h2>5. MariaDB installieren und Datenbank anlegen</h2>
<p>MariaDB installieren:</p>
<pre><code>
sudo apt install -y mariadb-server

sudo systemctl enable --now mariadb

</code></pre>
<p>Grundabsicherung starten:</p>
<pre><code>
sudo mysql_secure_installation

</code></pre>
<p>Danach in die MariaDB-Konsole wechseln:</p>
<pre><code>
sudo mysql

</code></pre>
<p>Datenbank und Benutzer erstellen:</p>
<pre><code>
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

CREATE USER &#x27;nextclouduser&#x27;@&#x27;localhost&#x27; IDENTIFIED BY &#x27;sicheres_passwort_hier_eintragen&#x27;;

GRANT ALL PRIVILEGES ON nextcloud.* TO &#x27;nextclouduser&#x27;@&#x27;localhost&#x27;;

FLUSH PRIVILEGES;

EXIT;

</code></pre>
<p>Wichtig: Das Passwort sollte lang und zufällig sein und nicht in öffentlichen Dokumentationen oder Git-Repositories landen.</p>
<hr>
<h2>6. Nextcloud herunterladen</h2>
<p>In das temporäre Verzeichnis wechseln und Nextcloud herunterladen.</p>
<p>Beispiel mit einer festen Version:</p>
<pre><code>
cd /tmp

wget https://download.nextcloud.com/server/releases/latest.zip -O nextcloud.zip

unzip nextcloud.zip

sudo mv nextcloud /var/www/

</code></pre>
<p>Berechtigungen setzen:</p>
<pre><code>
sudo chown -R www-data:www-data /var/www/nextcloud/

sudo chmod -R 755 /var/www/nextcloud/

</code></pre>
<hr>
<h2>7. Datenverzeichnis vorbereiten</h2>
<p>Es ist sinnvoll, das Nextcloud-Datenverzeichnis außerhalb des Webroots abzulegen.</p>
<p>Beispiel:</p>
<pre><code>
sudo mkdir -p /home/data

sudo chown -R www-data:www-data /home/data

sudo chmod 750 /home/data

</code></pre>
<p>Dieses Verzeichnis wird später im Webinstaller als Datenverzeichnis angegeben.</p>
<hr>
<h2>8. Apache VirtualHost erstellen</h2>
<p>Neue Apache-Konfiguration anlegen:</p>
<pre><code>
sudo nano /etc/apache2/sites-available/nextcloud.conf

</code></pre>
<p>Beispielkonfiguration:</p>
<pre><code>
&lt;VirtualHost *:80&gt;

ServerAdmin admin@example.de

ServerName cloud.example.de

DocumentRoot /var/www/nextcloud



&lt;Directory /var/www/nextcloud/&gt;

Options +FollowSymlinks

AllowOverride All

Require all granted



&lt;IfModule mod_dav.c&gt;

Dav off

&lt;/IfModule&gt;



SetEnv HOME /var/www/nextcloud

SetEnv HTTP_HOME /var/www/nextcloud

&lt;/Directory&gt;



ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log

CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined

&lt;/VirtualHost&gt;

</code></pre>
<p>Benötigte Apache-Module aktivieren:</p>
<pre><code>
sudo a2ensite nextcloud.conf

sudo a2enmod rewrite headers env dir mime

sudo systemctl restart apache2

</code></pre>
<hr>
<h2>9. Webinstaller ausführen</h2>
<p>Jetzt im Browser die lokale IP oder Domain aufrufen:</p>
<pre><code>
http://SERVER-IP/

</code></pre>
<p>Im Installer werden eingetragen:</p>
<ul>
<li>Admin-Benutzer und Admin-Passwort</li>
<li>Datenverzeichnis, zum Beispiel <code>/home/data</code></li>
<li>Datenbank: MariaDB/MySQL</li>
<li>Datenbankname: <code>nextcloud</code></li>
<li>Datenbankbenutzer: <code>nextclouduser</code></li>
<li>Datenbankpasswort: das zuvor gesetzte Passwort</li>
<li>Datenbankhost: <code>localhost</code></li>
</ul>
<p>Nach Abschluss können die Standard-Apps installiert werden, falls gewünscht.</p>
<hr>
<h2>10. APCu aktivieren</h2>
<p>APCu wird für lokalen Cache verwendet.</p>
<p>Datei öffnen:</p>
<pre><code>
sudo nano /etc/php/8.3/mods-available/apcu.ini

</code></pre>
<p>Folgenden Wert setzen:</p>
<pre><code>
apc.enable_cli=1

</code></pre>
<hr>
<h2>11. Redis für File Locking konfigurieren</h2>
<p>Redis-Konfiguration öffnen:</p>
<pre><code>
sudo nano /etc/redis/redis.conf

</code></pre>
<p>Diese Werte setzen oder anpassen:</p>
<pre><code>
port 0

unixsocket /var/run/redis/redis.sock

unixsocketperm 770

</code></pre>
<p><code>www-data</code> zur Redis-Gruppe hinzufügen:</p>
<pre><code>
sudo usermod -a -G redis www-data

</code></pre>
<p>Redis und Apache neu starten:</p>
<pre><code>
sudo systemctl restart redis-server

sudo systemctl restart apache2

</code></pre>
<hr>
<h2>12. Nextcloud config.php optimieren</h2>
<p>Die Nextcloud-Konfiguration öffnen:</p>
<pre><code>
sudo nano /var/www/nextcloud/config/config.php

</code></pre>
<p>Innerhalb des bestehenden Arrays können folgende Werte ergänzt oder angepasst werden:</p>
<pre><code>
&#x27;trusted_proxies&#x27; =&gt;

array (

0 =&gt; &#x27;192.168.x.x&#x27;,

),

&#x27;overwriteprotocol&#x27; =&gt; &#x27;https&#x27;,

&#x27;default_language&#x27; =&gt; &#x27;de&#x27;,

&#x27;default_locale&#x27; =&gt; &#x27;de&#x27;,

&#x27;default_phone_region&#x27; =&gt; &#x27;DE&#x27;,

&#x27;skeletondirectory&#x27; =&gt; &#x27;&#x27;,

&#x27;loglevel&#x27; =&gt; 2,

&#x27;filelocking.enabled&#x27; =&gt; true,

&#x27;memcache.local&#x27; =&gt; &#x27;\\OC\\Memcache\\APCu&#x27;,

&#x27;memcache.locking&#x27; =&gt; &#x27;\\OC\\Memcache\\Redis&#x27;,

&#x27;redis&#x27; =&gt;

array (

&#x27;host&#x27; =&gt; &#x27;/var/run/redis/redis.sock&#x27;,

&#x27;port&#x27; =&gt; 0,

&#x27;timeout&#x27; =&gt; 0.0,

),

&#x27;log_type&#x27; =&gt; &#x27;file&#x27;,

&#x27;logfile&#x27; =&gt; &#x27;/var/www/nextcloud/data/nextcloud.log&#x27;,

&#x27;logdateformat&#x27; =&gt; &#x27;F d, Y H:i:s&#x27;,

&#x27;maintenance&#x27; =&gt; false,

</code></pre>
<p>Hinweise:</p>
<ul>
<li><code>trusted_proxies</code> nur setzen, wenn wirklich ein Reverse Proxy verwendet wird.</li>
<li>Die IP-Adresse muss die interne IP des Reverse Proxys sein.</li>
<li><code>overwriteprotocol =&gt; https</code> ist hinter einem HTTPS-Reverse-Proxy häufig notwendig.</li>
<li><code>loglevel = 2</code> ist für den Normalbetrieb sinnvoller als <code>4</code>, da <code>4</code> sehr viele Debug-Informationen erzeugt.</li>
</ul>
<hr>
<h2>13. Cronjob für Nextcloud einrichten</h2>
<p>Nextcloud sollte nicht per AJAX-Cron laufen, sondern per System-Cron.</p>
<p>Cron für <code>www-data</code> öffnen:</p>
<pre><code>
sudo crontab -u www-data -e

</code></pre>
<p>Eintragen:</p>
<pre><code>
*/5 * * * * php -f /var/www/nextcloud/cron.php

</code></pre>
<p>Danach in Nextcloud unter:</p>
<pre><code>
Administrationseinstellungen → Grundeinstellungen → Hintergrund-Aufgaben

</code></pre>
<p>auf <code>Cron</code> umstellen.</p>
<hr>
<h2>14. HTTPS und HSTS</h2>
<p>Wenn Nextcloud direkt mit Let&#x27;s Encrypt auf dem Server betrieben wird, kann HSTS in der Apache-SSL-Konfiguration gesetzt werden.</p>
<p>Beispiel innerhalb des SSL-VirtualHosts:</p>
<pre><code>
&lt;IfModule mod_headers.c&gt;

Header always set Strict-Transport-Security &quot;max-age=15552000; includeSubDomains&quot;

&lt;/IfModule&gt;

</code></pre>
<p>Wichtig: HSTS sollte erst aktiviert werden, wenn HTTPS zuverlässig funktioniert. Bei falscher Konfiguration kann man sich sonst selbst aussperren oder Browser auf HTTPS zwingen, obwohl das Zertifikat/Proxy-Setup noch nicht sauber ist.</p>
<hr>
<h2>15. Einstellungen im Nginx Proxy Manager</h2>
<p>Wenn Nextcloud hinter Nginx Proxy Manager läuft, sind folgende Optionen sinnvoll:</p>
<ul>
<li>Block Common Exploits: aktivieren</li>
<li>Websockets Support: aktivieren</li>
<li>Force SSL: aktivieren</li>
<li>HTTP/2 Support: aktivieren</li>
<li>HSTS: erst aktivieren, wenn HTTPS sauber funktioniert</li>
</ul>
<p>Im Feld <code>Advanced</code> können folgende Werte ergänzt werden:</p>
<pre><code>
client_body_buffer_size 512k;

proxy_read_timeout 86400s;

client_max_body_size 0;



location /.well-known/carddav {

return 301 $scheme://$host/remote.php/dav;

}



location /.well-known/caldav {

return 301 $scheme://$host/remote.php/dav;

}



location /.well-known/webfinger {

return 301 $scheme://$host/index.php/.well-known/webfinger;

}



location /.well-known/nodeinfo {

return 301 $scheme://$host/index.php/.well-known/nodeinfo;

}

</code></pre>
<hr>
<h2>16. Optionale LDAP-/Active-Directory-Anbindung</h2>
<p>Für die LDAP-Anbindung wird in Nextcloud die App <code>LDAP user and group backend</code> benötigt.</p>
<p>Beispielwerte mit Platzhaltern:</p>
<pre><code>
Host: ldap://192.168.x.x

User DN: CN=ldap,CN=Users,DC=example,DC=de

Passwort: Passwort des LDAP-Benutzers

Base DN: DC=example,DC=de

</code></pre>
<p>Erklärung:</p>
<ul>
<li><code>Host</code>: IP oder DNS-Name des Domain Controllers</li>
<li><code>User DN</code>: Distinguished Name des LDAP-Benutzers</li>
<li><code>Passwort</code>: Passwort dieses LDAP-Benutzers</li>
<li><code>Base DN</code>: Basis der Domäne, zum Beispiel <code>DC=example,DC=de</code></li>
</ul>
<p>In produktiven Umgebungen sollte nach Möglichkeit LDAPS verwendet werden:</p>
<pre><code>
ldaps://dc01.example.de

</code></pre>
<hr>
<h2>17. Wartungsbefehle und Fehlerbehebung</h2>
<h3>Fehlende Datenbank-Indizes</h3>
<p>Wenn Nextcloud fehlende Indizes meldet:</p>
<pre><code>
cd /var/www/nextcloud

sudo -u www-data php occ db:add-missing-indices

</code></pre>
<h3>Too Many Requests / Bruteforce-Sperre</h3>
<p>Wenn ein Benutzer sein Passwort geändert hat, aber ein alter Client weiter mit dem alten Passwort verbindet, kann Nextcloud die IP blockieren.</p>
<p>Typische Meldung:</p>
<pre><code>
OCA\DAV\Connector\Sabre\Exception\TooManyRequests

</code></pre>
<p>Zurücksetzen für eine bestimmte öffentliche Client-IP:</p>
<pre><code>
sudo -u www-data php /var/www/nextcloud/occ security:bruteforce:reset &lt;OEFFENTLICHE-IP&gt;

</code></pre>
<p>Beispiel:</p>
<pre><code>
sudo -u www-data php /var/www/nextcloud/occ security:bruteforce:reset 203.0.113.10

</code></pre>
<h3>Nextcloud-Systemcheck</h3>
<p>Nach der Installation sollte der Nextcloud-Adminbereich geprüft werden:</p>
<pre><code>
Administrationseinstellungen → Übersicht

</code></pre>
<p>Dort werden Hinweise zu fehlenden PHP-Modulen, falschen Proxy-Einstellungen, fehlenden Indizes oder Hintergrundaufgaben angezeigt.</p>
<hr>
<h2>18. Abschluss-Checkliste</h2>
<ul>
<li>System aktualisiert</li>
<li>Apache installiert und aktiviert</li>
<li>PHP 8.3 inklusive Module installiert</li>
<li>PHP-Werte angepasst</li>
<li>MariaDB installiert</li>
<li>Datenbank und Benutzer erstellt</li>
<li>Nextcloud nach <code>/var/www/nextcloud</code> entpackt</li>
<li>Datenverzeichnis vorbereitet</li>
<li>Apache VirtualHost eingerichtet</li>
<li>Webinstaller abgeschlossen</li>
<li>APCu aktiviert</li>
<li>Redis für File Locking eingerichtet</li>
<li>Cronjob für <code>www-data</code> eingerichtet</li>
<li>Reverse Proxy korrekt konfiguriert</li>
<li>Admin-Übersicht in Nextcloud geprüft</li>
</ul>
<hr>
<h2>Fazit</h2>
<p>Mit Apache, PHP 8.3, MariaDB, Redis und APCu lässt sich eine stabile Nextcloud Community Edition Installation aufbauen. Wichtig ist, nach der Grundinstallation die Optimierungen sauber nachzuziehen: Caching, Cronjob, Proxy-Einstellungen und Admin-Übersicht entscheiden später darüber, ob die Installation dauerhaft sauber und performant läuft.</p>

← Zurück zum Blog