12 KiB
homelab manifest
Referenz für Aufbau und Betrieb meines Proxmox-Servers. Architekturarbeit + privat. Ein Mini-PC, 1× 1TB NVMe, 2× 4TB, 1× 2TB externe HDD. An dieses Dokument richte ich die Maschine aus — nicht umgekehrt.
prinzipien
- Filesystem-first. Das Dateisystem ist die Wahrheit. Web-UIs, SMB und Sync sind nur Clients darauf. Keine App "besitzt" die Daten allein.
- FOSS und self-hosted, config-as-code. Jede Konfiguration (Caddyfile, compose, ZFS-Layout, Samba) liegt versioniert im Gitea.
- Öffentlich = Caddy, privat = WireGuard-only. Nach aussen offen: nur der WireGuard-Port plus 80/443 für die öffentlichen Websites. Alles andere erreiche ich nur durch den Tunnel.
- RAID ist kein Backup. 3-2-1: 3 Kopien, 2 Medien, 1 offsite.
- ZFS-Pool nie über ~85%. Copy-on-Write braucht Luft. Auslastung wird überwacht, nicht geschätzt.
- Grosse Daten ≠ vzdump. Bulk-Mounts laufen mit
backup=0, separat gesichert perzfs send/Restic. vzdump nur für die schlanken rootfs. - Bewusster Hybrid. Single-purpose Infra → native LXC. Echte Multi-Container-App-Stacks → ein Docker-LXC pro Stack. Nie "ein Docker pro LXC für alles".
- Ein Werkzeug pro Aufgabe. Lieber ein schlankes Tool das eine Sache gut macht als ein Monolith der alles halb kann.
- Reserve ist eingeplant, nicht zufällig. Quotas sind Sicherheitsdeckel, kein starres Partitionieren.
hardware & pools
| Pool | Medium | Topologie | nutzbar | Zweck |
|---|---|---|---|---|
rpool |
1× 1TB NVMe | Single-Disk ZFS | ~900 GiB | OS, alle rootfs, Datenbanken, oft gelesene Dienste |
tank |
2× 4TB | ZFS Mirror (RAID1) | ~3.6 TiB | schwere Daten: Shares, Nextcloud, Immich, Paperless |
| — | 1× 2TB ext. HDD | — | ~1.8 TiB | lokales Backup-Ziel (zfs recv / Restic) |
ZFS-Settings beide Pools: ashift=12, compression=lz4, atime=off. Mirror überlebt einen Plattentod und heilt Bitrot beim Scrub (monatlich). NVMe ist Einzelplatte → keine Redundanz, aber nichts Unersetzliches liegt nur dort.
dienste & container
Native LXC für Infra, ein Docker-LXC pro echtem App-Stack. CTID nach Rolle in Blöcken. [K] = Kern (zuerst), [+] = Erweiterung (nach Bedarf).
| CTID | Dienst | Typ | rootfs | Daten | für | |
|---|---|---|---|---|---|---|
| 100 | Caddy (Reverse Proxy) | native | 8G | — | beide | K |
| 101 | WireGuard (wg-easy) | docker | 4G | — | beide | K |
| 102 | Fileserver — Samba + Filebrowser + Syncthing | native | 8G | tank/business, tank/private |
beide | K |
| 103 | AdGuard Home (DNS + Adblock) | native | 4G | — | beide | + |
| 110 | Nextcloud (app+db+redis) | docker | 40G | tank/nextcloud |
privat | K |
| 111 | Immich (server+ML+db+redis) | docker | 60G | tank/immich |
privat | K |
| 112 | Vaultwarden | native | 4G | — | beide | K |
| 113 | Paperless-ngx (DMS + OCR) | docker | 30G | tank/paperless |
Arbeit | + |
| 114 | Stirling-PDF (PDF-Toolkit) | docker | 8G | — | Arbeit | + |
| 115 | Collabora Online (Office in NC) | docker | 16G | — | Arbeit | + |
| 116 | BookStack (Büro-Wiki / Detailbibliothek) | docker | 8G | — | Arbeit | + |
| 120 | Gitea | native | 8G | tank/gitea |
Arbeit | K |
| 121 | CI-Runner (Forgejo/Woodpecker) | docker | 16G | — | Arbeit | + |
| 122 | Penpot (Open-Source Figma) | docker | 16G | — | Arbeit | + |
| 130+ | Websites (Hugo/static via Caddy) | native | 8G ea. | — | Arbeit | K |
| 140 | Uptime Kuma (Monitoring/Status) | docker | 8G | — | Betrieb | + |
| 141 | Beszel (System-/Pool-Metriken) | docker | 8G | — | Betrieb | + |
| 142 | Homepage (Dashboard / "Launcher") | docker | 4G | — | Betrieb | + |
| 160 | Jellyfin (Medien) | docker | 16G | tank/media* |
privat | + |
| 161 | Navidrome (Musik) | native | 8G | tank/media* |
privat | + |
| 162 | Linkwarden (Referenz-/Bookmark-Archiv) | docker | 16G | — | beide | + |
| 163 | Miniflux (RSS) | docker | 4G | — | privat | + |
Nummernschema: 100–109 Infra/Netz · 110–119 Cloud-Apps · 120–129 Dev · 130–139 Web · 140–149 Betrieb · 160–169 Medien/Privat. Lücken bleiben.
* Medienbibliothek braucht eine bewusste Budget-Entscheidung — bei echter Film-Sammlung eher eine zusätzliche Platte einplanen statt den Tank zu sprengen.
app-katalog: was sonst noch sinn macht
Fürs Büro (stark empfohlen)
- Paperless-ngx — Dokumentenarchiv mit OCR und Volltextsuche. Löst das Papierproblem: Verträge, Rechnungen, Baugesuche, Korrespondenz scannen → durchsuchbar. Watch-Ordner zieht Scans automatisch ein.
- Stirling-PDF — alles für PDFs: zusammenführen, teilen, OCR, komprimieren, signieren. Du lebst in Plan-PDFs und Eingaben.
- Collabora Online — Office-Dokumente direkt im Browser/in Nextcloud editieren. XLSX-kompatibel für Raumlisten.
- BookStack — Büro-Wiki: Detailbibliothek-Doku, Standards, Vorlagen, Projektwissen an einem Ort.
Für den Betrieb des Homelabs
- Uptime Kuma — weisst sofort wenn ein Dienst down ist (inkl. Push aufs Handy).
- Beszel (oder Netdata) — System- und Pool-Metriken → erfüllt die <85%-Alert-Regel.
- Homepage — eine Startseite die alle Dienste verlinkt, das DSM-Launcher-Gefühl.
Privat
- AdGuard Home — netzweiter Tracker-/Werbeblocker + interner DNS (löst gleich die internen Hostnamen).
- Linkwarden — visuelles Referenz-/Bookmark-Archiv. Beruflich top für Präzedenzfälle, Materialien, Detail-Ideen.
- Jellyfin — Filme/Serien, ergänzt Navidrome (Musik).
- Miniflux — minimalistischer RSS-Reader.
Für deine Software (openbureau)
- CI-Runner (Forgejo Actions / Woodpecker) — Tests + Auto-Deploy der Hugo-Site, Builds für Rapport/Dossier/Pendenz.
- Penpot — Open-Source Figma für UI/Mockups.
der zugriff auf den share (die synology-erfahrung, nachgebaut)
Synologys Magie ist ein Bündel von Zugriffswegen auf dieselben Dateien. Filesystem-first nachgebaut, alles im Fileserver-LXC (102):
- Samba → klassisches Netzlaufwerk auf Mac/Linux/Windows. Voller nativer Speed für Rhino/CAD vom Desktop. Der Hauptzugang für die Arbeit.
- Filebrowser → Web-"File Station": browsen, hoch-/runterladen, Share-Links mit Passwort/Ablauf. Liest das FS live, kein DB-Desync. Auch im Handy-Browser brauchbar (PWA).
- Syncthing → das "Synology Drive": ausgewählte Ordner kontinuierlich auf Laptop syncen, offline arbeiten. Files bleiben plain auf der Platte → SMB funktioniert weiter parallel.
- Homepage → eine Kachel-Startseite über alles, der Launcher.
Bewusst nicht Seafile: das wäre der bessere Sync-Client, speichert Dateien aber in eigenem Block-Format → dann ginge SMB auf denselben Daten nicht mehr. Verletzt filesystem-first.
shares & datenstruktur
Zwei getrennte Datasets (= zwei Samba-Shares): saubere Trennung von Rechten, Snapshots und Backup-Priorität. Ein künftiger Mitarbeiter/Praktikant kriegt business, nie private.
tank/business — Architekturbüro
Projektbezogen, Phasen nach SIA 102. Unterstriche sortieren Nicht-Projekt-Ordner nach oben.
business/
├── _vorlagen/ Planköpfe, Dokumentvorlagen, CAD-Templates
├── _bibliothek/
│ ├── details/ wiederverwendbare Konstruktionsdetails
│ ├── cad-blocks/
│ ├── materialien/
│ └── referenzen/ Präzedenzfälle, Vorbilder
├── _buro/ Administration, Buchhaltung, Marketing
└── projekte/
└── 2026-001_projektname/
├── 00_admin/ Verträge, Honorar, Protokolle, Korrespondenz
├── 01_grundlagen/ Bestand, Vermessung, Gutachten, Fotos
├── 02_vorstudien/ SIA 21 — Machbarkeit, Wettbewerb
├── 03_vorprojekt/ SIA 31
├── 04_bauprojekt/ SIA 32
├── 05_bewilligung/ SIA 33 — Baugesuch
├── 06_ausschreibung/ SIA 41
├── 07_ausfuhrung/ SIA 51/52/53 — Werkplanung, Baustelle
├── 08_abschluss/ Abnahme, Revision, Doku
├── cad/ Rhino .3dm (working)
├── plaene/ ausgegebene PDF-Pläne
├── visualisierung/ Renderings
└── fotos/ Baustellenfotos
Projektnummer JJJJ-NNN_name → sortierbar, gleiche Logik wie die CTIDs.
tank/private — persönlich
private/
├── dokumente/ Verträge, Versicherung, Behörden
│ └── 2026/
├── finanzen/
├── studium/ HSLU Master — Module, Arbeiten, Thesis
├── projekte/ persönliche Projekte
├── scans/ Eingang für Paperless
└── archiv/
Nextcloud bleibt schlank für Kalender/Kontakte/Mobile und leichtes Teilen (eigenes tank/nextcloud). Optional kann es tank/private als External Storage einhängen, damit die App am Handy auch an die privaten Files kommt — mit dem bekannten Scan-Vorbehalt.
speicher-aufteilung (thin + quota, mit reserve)
tank — ~3.6 TiB nutzbar
| Dataset | Quota | Zweck |
|---|---|---|
tank/business |
1.3 TiB | Architekturarbeit (SMB + Filebrowser + Syncthing) |
tank/immich |
600 GiB | Foto-/Videobibliothek |
tank/private |
300 GiB | persönliche Files (SMB + Filebrowser + Syncthing) |
tank/paperless |
150 GiB | Dokumentenarchiv |
tank/nextcloud |
150 GiB | Sync/Mobile/Teilen |
tank/dump |
150 GiB | vzdump der rootfs |
tank/gitea |
50 GiB | Repos |
| Summe Quotas | ~2.7 TiB | = ~72% bei voll ausgereizten Quotas |
| freie Reserve | ~0.9 TiB | bewusst unallokiert → Pool bleibt unter 85% |
Quotas sind Deckel, nicht Reservierungen. Sie dürfen den Pool in Summe überschreiten — hier tun sie's bewusst nicht, damit selbst bei vollen Quotas Luft bleibt. Medien (Jellyfin) würden diese Reserve fressen → eigene Platte einplanen.
rpool — ~900 GiB nutzbar
OS + ARC + alle rootfs (Kern + Erweiterungen): grob ~350 GiB. Datenbanken liegen in den rootfs auf der NVMe (schnelle Random-IO). Reserve ~550 GiB — bewusst grosszügig: Snapshots, künftige Dienste, Option ein heisses Dataset (z.B. Immich-Thumbnails) auf die NVMe zu pinnen.
mount-konventionen
Zwei Fälle, bewusst unterschiedlich:
- Exklusive Service-Daten (Nextcloud, Immich, Paperless, Gitea) → Proxmox-verwalteter Mountpoint, eigenes subvol:
mp0: tank/nextcloud,mp=/data,backup=0,size=150G - Geteilte Datasets (
business,private, von Samba+Filebrowser+Syncthing im selben LXC genutzt) → Bind-Mount des Host-Pfads:mp0: /tank/business,mp=/srv/business mp1: /tank/private,mp=/srv/private
backup=0 auf allen grossen Mounts. Dataset-Settings nach Inhalt: recordsize=1M für Immich/Renderings, Default 128K sonst.
netz & zugriff
- Öffentlich: Router → nur 80/443 → Caddy (100), macht TLS und routet zu den öffentlichen Websites. Sonst nichts nach aussen.
- Privat: Router → nur WireGuard-UDP → wg-easy (101). Proxmox-UI, Nextcloud, Immich, Vaultwarden, Filebrowser, Paperless: nur durch den Tunnel über interne Hostnamen.
- Interne Namen über AdGuard (103) als DNS + Caddy als internen Proxy → keine IPs merken.
backup-strategie (3-2-1)
- Snapshots (sanoid) auf allen
tank-Datendatasets — Schutz gegen "ups, gelöscht". - Lokal:
zfs send/Restic der wichtigen Datasets +tank/dump→ 2TB externe HDD. - Offsite: Restic der Unersetzlichen (
business,private,immich,nextcloud,paperless,gitea,vaultwarden) → Hetzner Storage Box, verschlüsselt + versioniert.
RAID gegen Plattentod. Snapshots gegen Fehler. Offsite gegen Brand und Ransomware. Alle drei. Restore mindestens einmal testen — ein ungetestetes Backup ist kein Backup.
checkliste
- Proxmox auf NVMe,
rpoolals Single-Disk ZFS tankals Mirror, Settings setzen, Scrub-Cron- Datasets + Quotas anlegen
- Fileserver-LXC (102): Samba (2 Shares) + Filebrowser + Syncthing
- Ordnerstruktur business/private anlegen
- Caddy + WireGuard + AdGuard (Netzgerüst)
- Kern-Apps (NC, Immich, Vaultwarden, Gitea), dann Erweiterungen nach Bedarf
- Monitoring (Uptime Kuma, Beszel) + Pool-Alert <85%
- sanoid + Restic offsite, Restore testen