Jedes System bekommt seinen eigenen, schlanken LXC-Container. Damit das nicht jedes Mal von vorn losgeht, baue ich einmal eine saubere Vorlage und klone sie für jeden Dienst.
Warum ein Container pro Dienst?
- Getrennt sichern und zurückspielen: Ein missglücktes Update in Paperless betrifft nur Paperless. Snapshot zurück, fertig.
- Ressourcen im Blick: Jeder Dienst bekommt sein eigenes Limit für Arbeitsspeicher und CPU. Proxmox zeigt sofort, wer wie viel braucht.
- Sparsam: LXC-Container teilen sich den Kernel mit Proxmox und brauchen nur einen Bruchteil einer VM. Ideal für den Thin Client.
- Übersichtlich: Ein Container, ein Name, eine IP, eine Aufgabe.
Der Preis: Statt einem System pflegt man zehn. Genau dafür kommt im nächsten Kapitel Ansible ins Spiel.
Der Plan: Namen und Adressen
Bevor es losgeht, lege ich fest, welcher Container welche ID und IP bekommt. Die IDs sind frei wählbar, ein System macht es später leichter.
| ID | Name | IP | Aufgabe |
|---|---|---|---|
| 9000 | tpl-debian | – | Vorlage (wird nie gestartet) |
| 100 | proxy | 192.168.178.30 | nginx, HTTPS |
| 101 | login | 192.168.178.31 | Keycloak (optional) |
| 102 | status | 192.168.178.32 | Uptime Kuma |
| 110 | paperless | 192.168.178.40 | Dokumente |
| 111 | medien | 192.168.178.41 | ResourceSpace |
| 112 | mitglieder | 192.168.178.42 | Admidio |
| 113 | flows | 192.168.178.43 | n8n |
| 114 | web | 192.168.178.44 | WordPress |
| 115 | cloud | 192.168.178.45 | Nextcloud |
| 116 | tresor | 192.168.178.46 | Vaultwarden |
| 120 | ansible | 192.168.178.50 | Verwaltung (optional, sonst vom eigenen Rechner) |
Die Adressen müssen außerhalb des Bereichs liegen, den der Router per DHCP verteilt. Bei der FRITZ!Box steht dieser Bereich unter Heimnetz → Netzwerk → IPv4-Einstellungen.
Schritt 1: Debian-Vorlage herunterladen
In der Proxmox-Oberfläche unter local → CT Templates → Templates das aktuelle debian-13-standard herunterladen. Oder in der Shell des Knotens:
pveam update
pveam available --section system | grep debian
pveam download local debian-13-standard_<VERSION>_amd64.tar.zst
Schritt 2: Den Vorlagen-Container bauen
Oben rechts CT erstellen:
| Allgemein | CT-ID 9000, Hostname tpl-debian, „Unprivilegierter Container“ angehakt, Root-Passwort und den eigenen SSH-Public-Key eintragen |
| Template | das eben geladene Debian-Template |
| Disks | 8 GB reichen für die Vorlage, größer machen kann man jeden Klon später |
| CPU / Speicher | 1 Kern, 512 MB, wird pro Klon angepasst |
| Netzwerk | Bridge vmbr0, vorerst DHCP |
Den Container starten und in seiner Konsole die Grundausstattung installieren, die jeder Dienst braucht:
apt update && apt full-upgrade -y
apt install -y sudo curl ca-certificates gnupg openssh-server python3 \
unattended-upgrades apt-listchanges locales
timedatectl set-timezone Europe/Berlin
dpkg-reconfigure locales # de_DE.UTF-8 auswählen
# Sicherheitsupdates automatisch einspielen
dpkg-reconfigure -plow unattended-upgrades
# Verwaltungsbenutzer für Ansible
adduser --disabled-password --gecos "" admin
usermod -aG sudo admin
echo "admin ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/admin
mkdir -p /home/admin/.ssh
cp /root/.ssh/authorized_keys /home/admin/.ssh/
chown -R admin: /home/admin/.ssh && chmod 700 /home/admin/.ssh
python3 ist wichtig, damit Ansible später jeden Klon verwalten kann.
Aufräumen, bevor es eine Vorlage wird
Jeder Klon soll eine eigene Identität bekommen. Deshalb werden die Maschinen-ID und die SSH-Hostschlüssel entfernt. Danach den Container herunterfahren, nicht neu starten:
apt clean
truncate -s 0 /etc/machine-id
rm -f /etc/ssh/ssh_host_*
history -c
poweroff
Dann in Proxmox mit Rechtsklick auf Container 9000 In Template umwandeln. Ab jetzt ist er schreibgeschützt und dient nur noch als Kopiervorlage.
Schritt 3: Klonen und anpassen
Rechtsklick auf die Vorlage, Klonen, Modus Vollständiger Klon (unabhängig von der Vorlage). In der Shell geht das so, hier am Beispiel Paperless:
pct clone 9000 110 --hostname paperless --full
pct set 110 --cores 2 --memory 3072 --onboot 1 \
--net0 name=eth0,bridge=vmbr0,ip=192.168.178.40/24,gw=192.168.178.1
pct resize 110 rootfs 32G
pct start 110
# neue SSH-Hostschlüssel für diesen Klon
pct exec 110 -- dpkg-reconfigure openssh-server
Die Maschinen-ID erzeugt systemd beim ersten Start selbst neu. Ab hier ist der Container per ssh admin@192.168.178.40 erreichbar und bereit für seine Anwendung.
Sonderfall: Docker im Container
Die meisten Dienste installiere ich direkt im Container, ohne Docker. Für Paperless, Keycloak, Vaultwarden und Uptime Kuma ist Docker aber deutlich einfacher, weil die Projekte genau so ausgeliefert werden. Damit Docker in einem unprivilegierten LXC läuft, unter Optionen → Features Nesting und keyctl aktivieren:
pct set 110 --features nesting=1,keyctl=1
pct reboot 110
Gut zu wissen: Proxmox selbst empfiehlt für Docker eine VM, weil Docker in Containern nach größeren Updates gelegentlich zickt. Für diese Dienste nehme ich das in Kauf, sichere aber vor jedem Proxmox-Update einen Snapshot. Wer auf Nummer sicher gehen will, packt die Docker-Dienste gemeinsam in eine kleine VM.