Claude Code als Homelab-Assistent - Teil 3: Einen neuen Service deployen
Claude Code als Homelab-Assistent - Teil 3: Einen neuen Service deployen
Einleitung
In Teil 1 haben wir Claude Code eingerichtet und den ersten Security Audit durchgeführt. In Teil 2 hat Claude Code einen Bug gefunden und behoben. In Teil 3 zeige ich den dritten Anwendungsfall: einen komplett neuen Service von Null deployen - Compose-File, Traefik-Integration, HTTPS, Backup-Erweiterung.
Der Service ist Wallos - ein Open-Source Abo-Tracker. Self-hosted statt irgendwelche Finanzdaten in der Cloud, mit Multi-Currency-Support, Kategorien und Benachrichtigungen. Genau das richtige für jemanden der den Überblick über monatliche Ausgaben behalten will ohne sie einem Drittanbieter zu überlassen.
Was mich an diesem Durchgang besonders interessiert hat: unser Setup ist nicht trivial.
Traefik als Reverse Proxy mit automatischem Wildcard-Zertifikat, DNS-Challenge über
Hostinger, proxy_net als gemeinsames Netzwerk für alle Services. Das ist die Art von
Setup wo man normalerweise selbst alle Labels und Netzwerkkonfigurationen nachschlagen
muss. Claude Code hat das komplett übernommen - und dabei auch noch auf dem Weg auftretende
Fehler selbst gelöst.
Hauptteil
Der Slash Command
/deploy-service
Claude Code fragt nach Service-Name und URL. Die Antwort:
Ich möchte Wallos unter wallos.home.maker-ronin.cloud installieren. Das Projekt und die Dokumentation ist hier zu finden: https://wallosapp.com/

Was in den nächsten 34 Sekunden passierte:
- Wallosapp.com aufgerufen und Dokumentation gelesen
- GitHub Repo gecheckt für das offizielle Compose-File
- Bestehenden Stack als Referenz gelesen - Manyfold, um Traefik Labels und Netzwerkkonfiguration zu verstehen
- Docker Hub nach dem aktuellen stabilen Tag abgefragt -
4.7.2statt:latest - Vollständigen Deploymentplan erstellt
Das Ergebnis war ein sauberer Plan mit allen Details:
| Eigenschaft | Wert |
|---|---|
| Stack-Pfad | /home/ronin/docker/wallos/ |
| Subdomain | wallos.home.maker-ronin.cloud |
| Image | bellamy/wallos:4.7.2 |
Volumes, Umgebungsvariablen, Ports, Netzwerk - alles aufgelistet, bevor eine einzige Datei geschrieben wurde.
Schritt 2 - Dateien erstellen
Nach dem ersten “OK” hat Claude Code die Dateien auf dem Server angelegt.

Hier passierte etwas Interessantes: der erste Versuch schlug fehl.
fish: Expected a string, but found a redirection
cat > /home/ronin/docker/wallos/docker-compose.yml << 'EOF'
Der Server läuft mit Fish Shell statt Bash - und Fish kennt kein Heredoc-Syntax. Claude Code hat das sofort erkannt, ohne dass ich eingreifen musste:
“Fish-Shell - kein Heredoc. Ich nutze
teestattdessen.”
Zweiter Versuch mit printf ... | tee - funktioniert. Dateien erstellt, sofort
verifiziert durch nochmaliges Einlesen.
Das fertige Compose-File:
services:
wallos:
container_name: wallos
image: bellamy/wallos:4.7.2
environment:
TZ: 'Europe/Vienna'
volumes:
- ./db:/var/www/html/db
- ./logos:/var/www/html/images/uploads/logos
restart: unless-stopped
networks:
- proxy_net
security_opt:
- no-new-privileges:true
labels:
- "traefik.enable=true"
- "traefik.http.routers.wallos.rule=Host(`wallos.home.maker-ronin.cloud`)"
- "traefik.http.routers.wallos.entrypoints=websecure"
- "traefik.http.routers.wallos.tls.certresolver=letsencrypt"
- "traefik.http.services.wallos.loadbalancer.server.port=80"
networks:
proxy_net:
external: true
Alles korrekt - fixer Tag, beide Volumes, proxy_net external, alle Traefik Labels
vollständig, no-new-privileges:true als Security-Best-Practice.
Schritt 3 - Start und Traefik-Diagnose

docker compose up -d - Container startet, nach wenigen Sekunden healthy.
Dann der URL-Test: HTTP-Code 000 - die Route war noch nicht aktiv. Statt einfach
abzuwarten hat Claude Code selbst nachgeforscht:
- Traefik API abgefragt ob die Route bekannt ist
- Python JSON Parsing schlug fehl - anderen Ansatz probiert
docker network inspect proxy_net- Wallos ist im Netz- Traefik von innen abgefragt - Route gefunden
"service": "wallos",
"rule": "Host(`wallos.home.maker-ronin.cloud`)",
"priority": 37
Route aktiv. Zweiter URL-Test: HTTP 302 - Redirect zur App. ✅
Schritt 4 - Backup

Claude Code hat das Backup-Script gelesen und festgestellt: Wallos nutzt Bind-Mounts, keine Docker Volumes. Der vorgeschlagene Eintrag fürs Backup-Script:
# Wallos Daten
log "Sichere Wallos Daten..."
restic backup \
/home/ronin/docker/wallos/db \
/home/ronin/docker/wallos/logos \
--tag wallos \
--verbose
Den Eintrag ins Script übernehme ich manuell - so bleibt die Kontrolle über das Backup-Script bei mir.
Die Zusammenfassung von Claude Code nach 1 Minute 5 Sekunden:
| Schritt | Status |
|---|---|
| Image recherchiert (bellamy/wallos:4.7.2) | ✅ |
| Stack-Dateien erstellt | ✅ |
| Container gestartet & healthy | ✅ |
| Traefik-Route aktiv, URL antwortet (302) | ✅ |
| Backup-Erweiterung dokumentiert | ✅ |
Das Ergebnis

https://wallos.home.maker-ronin.cloud - Wallos läuft, HTTPS funktioniert.
Das Wildcard-Zertifikat *.home.maker-ronin.cloud greift automatisch für jede neue
Subdomain - keine extra ACME-Konfiguration, kein DNS-Challenge für Wallos separat.
Das ist der Vorteil wenn Traefik einmal sauber eingerichtet ist: jeder neue Service
bekommt HTTPS automatisch dazu.

Nach dem Anlegen des Admin-Accounts - Wallos läuft, eingeloggt, bereit für die ersten Abonnements.
CLAUDE.md wächst mit

Nach dem Deployment hat Claude Code selbst zwei Learnings identifiziert und vorgeschlagen
die CLAUDE.md zu aktualisieren:
Learning 1 - Fish Shell:
Die SSH-Session läuft unter Fish Shell. << 'EOF' Heredoc-Syntax funktioniert nicht -
Claude Code musste auf printf ausweichen. Ab jetzt steht in CLAUDE.md:
“Shell ist fish - für Datei-Writes
printfoderteestatt Bash-Heredoc verwenden.”
Learning 2 - Traefik API:
Port 8080 ist nicht direkt über localhost:8080 erreichbar - nur innerhalb des
Traefik-Containers. Der korrekte Weg:
docker exec traefik wget -q -O- http://localhost:8080/api/...
Auch das steht jetzt dokumentiert in CLAUDE.md.
Das ist vielleicht das subtilste aber wichtigste Feature dieses Setups: der Kontext
verbessert sich mit jeder Session. Was heute ein unerwarteter Fehler war, ist beim
nächsten Deployment bereits bekanntes Terrain - Claude Code weiß es, weil es in
CLAUDE.md steht.
Kleines Malheur am Rande: Beim ersten Registrierungsversuch habe ich das Passwort
nicht notiert und konnte mich nicht anmelden. Fix: SQLite-Datenbank löschen,
Container neu starten, nochmal registrieren. rm /home/ronin/docker/wallos/db/wallos.db && docker restart wallos - erledigt in 30 Sekunden. Claude Code deployt den Service,
den Admin-Account musst du trotzdem selbst anlegen. 😄
Fazit
Was mich an diesem Durchgang am meisten beeindruckt hat ist nicht dass es funktioniert hat - sondern wie es mit Fehlern umgegangen ist. Fish Shell statt Bash, Python JSON Parsing Fehler, Traefik Route noch nicht aktiv - jedes Mal hat Claude Code das Problem erkannt, einen anderen Ansatz gewählt und weitergemacht. Kein manueller Eingriff, keine Erklärung meinerseits nötig.
Das anspruchsvollste an diesem Setup ist die Traefik-Integration: Wildcard-Zertifikat,
DNS-Challenge, proxy_net, die richtigen Labels in der richtigen Kombination. Das ist
genau die Art von Konfiguration die man bei einem neuen Service jedes Mal nachschlagen
oder von einem bestehenden Stack abkopieren muss. Claude Code hat das aus den bestehenden
Stacks gelernt und korrekt übertragen - in 34 Sekunden Planung, 1 Minute 5 Sekunden
Ausführung.
Von der Idee bis zum laufenden Service mit HTTPS in unter 2 Minuten aktiver Arbeitszeit.
Was als nächstes kommt: Das Konzept lässt sich weiterdenken - regelmäßige automatische Health Checks als Cronjob, wöchentliche Audits die still im Hintergrund laufen, Benachrichtigungen bei kritischen Findings. Die Basis dafür steht. Was daraus wird hängt davon ab wie weit man das treiben möchte.