#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

```bash
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):

```bash
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:

```bash
timedatectl set-timezone Europe/Berlin
```

---

## 3. Apache installieren

```bash
apt install -y apache2
systemctl enable --now apache2
```

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

```bash
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.

```bash
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:

```bash
a2enmod rewrite headers env dir mime setenvif ssl
```

---

## 5. PHP konfigurieren

### 5.1 Apache-PHP (`php.ini`)

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

Folgende Werte anpassen (Suche mit `Strg+W`):

```ini
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:

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

### 5.3 Apache neu starten

```bash
systemctl restart apache2
```

---

## 6. MariaDB installieren und einrichten

```bash
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:

```bash
mysql -u root -p
```

```sql
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:

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

Unter `[mysqld]` ergänzen:

```ini
transaction_isolation = READ-COMMITTED
innodb_file_per_table = 1
innodb_read_only_compressed = OFF
```

Dann neu starten:

```bash
systemctl restart mariadb
```

---

## 7. Nextcloud herunterladen

```bash
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):

```bash
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:

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

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

```apache
<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:

```bash
a2ensite nextcloud.conf
systemctl reload apache2
```

---

## 9. Berechtigungen setzen

```bash
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`
- **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:

```bash
nano /etc/redis/redis.conf
```

Folgende Zeilen setzen bzw. anpassen:

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

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

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

Dann in die Nextcloud-Konfiguration:

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

Vor dem schließenden `);` ergänzen:

```php
  '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:

```bash
systemctl restart apache2
```

---

## 12. Cronjob einrichten

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

```bash
crontab -u www-data -e
```

Folgende Zeile eintragen:

```cron
*/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):

```nginx
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

```bash
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):

```php
  '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:

```bash
systemctl reload apache2
```

---

## 14. Firewall (UFW)

Nur das offen lassen, was wirklich gebraucht wird:

```bash
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:

```bash
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, dann `sudo -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:

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:

```bash
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_