openbureau Homelab — Dokumentation
Stand: 2026-06-04 · Aktueller Ist-Zustand des fertig aufgebauten Homelabs. Der ursprüngliche Plan liegt unter
plan/(kann von der Realität abweichen).
1. Architektur in einem Bild
Internet
│
┌───────▼─────────┐ WireGuard-Reverse-Tunnel ┌──────────────────────────┐
│ VPS 46.225.70.71│◄════════════════════════════════════════│ Heim-Gateway CT101 │
│ (Caddy + Mail) │ VPS wählt NICHT an — das HEIM dialt │ 10.10.0.2 / wählt VPS an │
│ *.kgva.ch │ (Heim öffnet KEINE Ports) └────────────┬──────────────┘
│ Let's Encrypt │ │
└──────────────────┘ Heim-LAN 192.168.1.0/24
Proxmox "tanin" 192.168.1.2
(LXC-Container, ZFS)
- Heim (Proxmox „tanin", 192.168.1.2): Hypervisor. Ein Dienst = ein LXC-Container. ZFS:
rpool(System, NVMe),tank(Daten, 2×4 TB Mirror). - VPS (46.225.70.71): Caddy terminiert HTTPS für alle Domains (Let's-Encrypt-Wildcard
*.kgva.ch) und proxyt via Tunnel ins Heim-LAN. Hostet zusätzlich den Mailserver (docker-mailserver). - WireGuard-Reverse-Tunnel: Das Heim-Gateway (CT101) baut den Tunnel zum VPS auf → das Heim muss KEINE Ports öffnen. Der VPS routet
192.168.1.0/24durch den Tunnel. - AdGuard (CT103): netzweiter DHCP (.10–.99) + DNS + Adblock.
- Zugang von außen:
- Einzelne Dienste: öffentliche Domain → VPS-Caddy → Heim. Kein VPN nötig.
- Komplettes Heimnetz: WireGuard-Client (Laptop/Handy-Config, nutzt AdGuard als DNS).
2. Dienst-Inventar
IP-Konvention:
192.168.1.<CTID>(außerhalb des DHCP-Bereichs). Ausnahmen: alte Instanzen behalten .177/.178.
| CT | IP | Dienst | Domain(s) | Zweck |
|---|---|---|---|---|
| 100 | .100 | PBS | — (intern :8007) | Proxmox Backup Server |
| 101 | .101 | wg-gateway | — | WireGuard-Reverse-Tunnel zum VPS |
| 102 | .102 | fileserver | — (Samba) | Samba-Shares kgva + private (in Nextcloud eingebunden) |
| 103 | .103 | adguard | — (:80) | DHCP + DNS + Adblock |
| 110 | .110 | nextcloud (neu) | cloud.kgva.ch | Hauptcloud (Rieger-Setup, shibui-Theme) |
| 111 | .111 | immich | immich.kgva.ch | Fotos/Videos |
| 112 | .112 | vaultwarden | vault.kgva.ch · vault.gabrielevarano.ch | Passwort-Tresor |
| 113 | .113 | paperless | — (:8000) | Dokumente + OCR |
| 114 | .114 | dashboard | — (:8080, intern/VPN) | Glance-Dashboard |
| 115 | .115 | collabora | collabora.kgva.ch (:9980) · whiteboard.kgva.ch (:3002) | Office + Whiteboard |
| 116 | .116 | stirling | pdf.kgva.ch | Stirling-PDF (PDF-Werkzeuge) |
| 120 | .120 | gitea | git.openbureau.ch · git.kgva.ch | Git (DIESES Repo) |
| 130 | .130 | kgva-website | karimgabrielevarano.xyz | Website |
| 132 | .132 | rapport-website | rapport.openbureau.ch | Website |
| 133 | .133 | dossier-website | dossier.openbureau.ch | Website |
| 134 | .134 | openbureau-dev | dev.openbureau.ch | Dev (Supabase-style :8000 / Web :8080) |
| 135 | .135 | trattoriamarina.ch | (Website) | Marinas Trattoria |
| 140 | .140 | studio | studio.kgva.ch (:8080) · api.studio.kgva.ch (:8000) | Supabase (Social-Media-Backend) — von anderer Claude-Instanz betreut |
| 800 | .177 | nextcloud-old | cloud.gabrielevarano.ch | ALTE Nextcloud (Altdaten, 400 GB-Quota) |
| 802 | .14 (DHCP) | vaultwarden-old | — | alt, läuft sporadisch |
| 805/807/810/811/910/919/990 | — | *-old | — | alte Pre-Rebuild-Gäste (meist gestoppt) |
VPS-Dienste (auf 46.225.70.71):
| Domain | Dienst |
|---|---|
| mail.kgva.ch | docker-mailserver (Postfix/Dovecot/Rspamd, DKIM) |
| webmail.kgva.ch | SnappyMail |
| mailadmin.kgva.ch | DMS Admin-UI |
Mail-Konten: u. a. karim@gabrielevarano.ch (von hosttech migriert), kgva.ch-Adressen. MX → mail.kgva.ch, SPF/DKIM/DMARC gesetzt.
3. Backup
- PBS (CT100) · Datastore
backupauf der Seagate Expansion HDD (USB, xfs,/datastore-hdd, bind in CT100). - PVE-Storage:
pbs→ Datastorebackup. - Job: täglich 02:30 + 14:30 (2×/Tag), alle Gäste,
mode snapshot, inkrementell + dedupliziert. - Retention:
keep-last=4, keep-daily=7, keep-weekly=4, keep-monthly=3. - Kingston XS1000 SSD wurde entfernt/freigeräumt (war der alte Pre-Wipe-Speicher).
- Reboot-Fix:
/etc/tmpfiles.d/zz-pbs-runtime.confin CT100 (sonst/run/proxmox-backup-EACCES nach Reboot). - Wiederherstellung: PBS-WebUI (CT100:8007) oder
qmrestore/pct restoreaus dempbs-Storage.
4. Netzwerk / DNS
- DHCP-Bereich (AdGuard): 192.168.1.10–99 → statische IPs immer ≥ .100 wählen.
- Statische IP für eine CT: PVE
net0aufip=192.168.1.X/24,gw=192.168.1.1UND intern/etc/network/interfaces→iface eth0 inet static(sonst zieht der Container trotzdem DHCP!). - AdGuard-DNS-Rewrites: aktuell keine (immich.gabrielevarano.ch wurde entfernt → Immich nur noch über
immich.kgva.ch). - Wildcard
*.kgva.ch→ VPS.gabrielevarano.chhat eine Wildcard,openbureau.ch/karimgabrielevarano.xyzeigene A-Records.
5. Zugang & Passwörter
- SSH:
~/.ssh/proxmox_homelab→ Host .2 ·~/.ssh/vps_kgva→ VPS. - Proxmox-UI: https://192.168.1.2:8006 (root@pam). Subscription-Nag ist dauerhaft gepatcht (siehe How-Tos).
- Glance-Dashboard: http://192.168.1.114:8080 (nur intern/VPN).
- Service-Logins: sollen alle in Vaultwarden zentralisiert werden (Rotations-Skript:
/root/rotate-passwords.pyauf dem Host → erzeugt Bitwarden-Import-CSV).- ⚠️ Sicherheits-To-do: Viele Dienste nutzen aktuell noch
Rationalism2025!. AdGuard:admin/Rationalism2026!. → bei Gelegenheit rotieren.
- ⚠️ Sicherheits-To-do: Viele Dienste nutzen aktuell noch
6. How-Tos
Neuen Dienst hinzufügen
- CT anlegen (Debian-Template, unprivilegiert,
features nesting=1,keyctl=1, staticip=192.168.1.X/24,gw=…). /etc/network/interfacesintern auf static stellen.- Docker installieren (
curl -fsSL https://get.docker.com | sh) + Dienst per compose. - Im VPS-Caddyfile (
/opt/dms-stack/caddy/Caddyfile) Block ergänzen:dannmeinedienst.kgva.ch { reverse_proxy 192.168.1.X:PORT }docker restart dms-caddy(Caddy holt das Cert automatisch, da*.kgva.ch-Wildcard). - Optional: ins Glance-Dashboard (Monitor + Bookmark) aufnehmen.
Proxmox-Subscription-Nag (dauerhaft entfernt)
- Patch-Script:
/usr/local/bin/pve-no-nag.sh(setzt!== 'active'→=== 'active'inproxmoxlib.js). - apt-Hook
/etc/apt/apt.conf.d/no-nag-scriptre-patcht nach jedem Update. - Kommt der Nag mal wieder: nur Browser-Cache (Strg+Shift+R), der Server ist gepatcht.
Glance-Dashboard
- CT114, Docker, Config in
/opt/glance/{config/glance.yml, assets/}. - Wichtig: Custom-CSS muss unter
server.assets-path(/app/assets) liegen und als/assets/custom.cssreferenziert werden (aus/app/configliefert Glance es mit 404). - Daten-API für die Widgets: Python-Dienst auf dem Host (
/opt/zfs-api/zfs_api.py, systemdzfs-api, Port 9099) →/pools /guests /errors /backup /sysinfo /adguard. Plus Glances auf dem Host (systemdglances, Port 61208,-w --disable-webui).
Whiteboard / Collabora (Nextcloud)
- Beide laufen in CT115. WOPI-Allowlist auf
0.0.0.0/0,::/0(Tunnel-Routing macht IP-Härtung unpraktikabel). - Whiteboard-Verify-Button meldet fälschlich „timeout" — die Echtzeit-Collaboration funktioniert trotzdem.
7. Offene Punkte / To-do
- openbureau.ch (CT131) — Caddy zeigt auf .131:80, Container existiert noch nicht → 502. openbureau-Suite bauen (Website/dev/app/rapport-server).
- Passwörter rotieren (
/root/rotate-passwords.py --apply) + in Vaultwarden importieren. - Master-Passwörter (Vaultwarden) +
Rationalism2025!ablösen. - Entscheiden: Flarum (CT810) / Obsidian-LiveSync (CT805) zurückbringen?
- Alte „-old"-Container aufräumen (NACH der Suite-Migration; CT800 mit Altdaten behalten).
Diese Doku wird manuell gepflegt. Bei Änderungen am Setup hier nachziehen.