homelab
Infrastruktur als Code für das Heimnetz. Alle Services laufen containerisiert auf corebob und werden über Traefik als Reverse Proxy erreichbar gemacht. Dieses Repository enthält alle Docker-Compose-Konfigurationen und wird automatisch auf gitea.basti.badana.de gespiegelt.
Architektur
Internet
│
▼
┌─────────────────────┐
│ öffentliche VM │ traefik.basti.badana.de
│ Traefik + Gitea │ gitea.basti.badana.de
│ Let's Encrypt TLS │
└─────────────────────┘
▲
│ Push-Mirror (bei jedem Commit)
│
┌─────────────────────┐
│ corebob │ 192.168.178.113
│ Ubuntu 26.04 LTS │ 16 Kerne, 15 GB RAM, 98 GB Disk
│ Docker + Traefik │
│ Interne Services │
└─────────────────────┘
▲
│ DNS (*.core.bob → 192.168.178.113)
│
┌─────────────────────┐
│ bobhole (Pi-hole) │
│ DNS für core.bob │
└─────────────────────┘
Netzwerk
| Host | Domain | Zweck |
|---|---|---|
| corebob | *.core.bob |
Interne Services, nur im Heimnetz erreichbar |
| öffentliche VM | *.basti.badana.de |
Extern erreichbare Services |
Services
corebob (intern)
| Service | URL | Compose |
|---|---|---|
| Traefik Dashboard | https://traefik.core.bob/dashboard/ | traefik/ |
| Gitea | https://gitea.core.bob | gitea/ |
Öffentliche VM
| Service | URL | Compose |
|---|---|---|
| Traefik Dashboard | https://traefik.basti.badana.de | traefik-public/ |
| Gitea (Mirror) | https://gitea.basti.badana.de | gitea-public/ |
Verzeichnisstruktur
homelab/
├── traefik/ # Traefik auf corebob
│ ├── docker-compose.yml
│ ├── traefik.yml # Statische Konfiguration
│ └── dynamic-tls.yml # TLS-Zertifikat (mkcert)
├── gitea/ # Gitea auf corebob
│ └── docker-compose.yml
├── traefik-public/ # Traefik auf öffentlicher VM
│ └── docker-compose.yml
├── gitea-public/ # Gitea auf öffentlicher VM
│ └── docker-compose.yml
└── README.md
Nicht im Repository (gitignore):
certs/,.mkcert-ca/,data/
Zertifikate und persistente Service-Daten werden nicht versioniert.
TLS / Zertifikate
corebob (intern, mkcert)
Interne Services nutzen eine selbst signierte CA, erstellt mit mkcert.
CA-Root: ~/traefik/.mkcert-ca/rootCA.pem
Zertifikat: ~/traefik/certs/core.bob.crt
Key: ~/traefik/certs/core.bob.key
Gültig für: core.bob, *.core.bob
Läuft ab: September 2028
Die Root-CA muss einmalig auf jedem Client-Gerät installiert werden:
# Arch Linux (Chromium/System):
sudo cp rootCA.pem /etc/ca-certificates/trust-source/anchors/rootCA-corebob.crt
sudo update-ca-trust
# Ubuntu/Debian:
sudo cp rootCA.pem /usr/local/share/ca-certificates/rootCA-corebob.crt
sudo update-ca-certificates
# Firefox/Librewolf:
# about:preferences#privacy → Zertifikate anzeigen → Importieren
Öffentliche VM (Let's Encrypt)
Traefik holt automatisch Zertifikate via ACME TLS-Challenge. Keine manuelle Konfiguration nötig.
DNS
Pi-hole auf bobhole liefert Wildcard-DNS für *.core.bob:
# /etc/dnsmasq.d/core.bob.conf
address=/core.bob/192.168.178.113
Pi-hole v6 erfordert etc_dnsmasq_d = true in /etc/pihole/pihole.toml.
Neuen Service hinzufügen
Auf corebob
- Verzeichnis anlegen:
mkdir ~/homelab/<service> docker-compose.ymlerstellen mit diesen Traefik-Labels:
services:
myservice:
image: ...
labels:
- "traefik.enable=true"
- "traefik.http.routers.myservice.rule=Host(`myservice.core.bob`)"
- "traefik.http.routers.myservice.entrypoints=websecure"
- "traefik.http.routers.myservice.tls=true"
- "traefik.http.services.myservice.loadbalancer.server.port=<PORT>"
networks:
- traefik
networks:
traefik:
external: true
- Service starten:
cd ~/homelab/<service> && docker compose up -d - Ins Repo committen und pushen:
cd ~/homelab
git add <service>/
git commit -m "Add <service>"
git push
Der Push-Mirror synchronisiert automatisch auf gitea.basti.badana.de.
Auf der öffentlichen VM
Gleiche Struktur, aber:
- Netzwerk:
proxystatttraefik - Kein
tls=trueLabel nötig (Let's Encrypt greift automatisch viamyresolver)
Docker-Netzwerke
| Netzwerk | Wo | Zweck |
|---|---|---|
traefik |
corebob | Verbindet alle internen Services mit Traefik |
proxy |
öffentliche VM | Verbindet alle externen Services mit Traefik |
Netzwerke einmalig anlegen falls nicht vorhanden:
docker network create traefik # corebob
docker network create proxy # öffentliche VM
Gitea-Mirror
Das Repository wird bei jedem Commit automatisch gespiegelt:
| URL | |
|---|---|
| Primär | https://gitea.core.bob/claude/homelab |
| Mirror | https://gitea.basti.badana.de/claude/homelab |
Mirror-Intervall: 8 Stunden (zusätzlich sync bei jedem Push).