浪人
DE | EN
Claude Code als Homelab-Assistent  -  Teil 3: Einen neuen Service deployen
tech

Claude Code als Homelab-Assistent - Teil 3: Einen neuen Service deployen

Zurück zum Blog
4 Min. Lesezeit

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/

wallos-setup-1

Was in den nächsten 34 Sekunden passierte:

  1. Wallosapp.com aufgerufen und Dokumentation gelesen
  2. GitHub Repo gecheckt für das offizielle Compose-File
  3. Bestehenden Stack als Referenz gelesen - Manyfold, um Traefik Labels und Netzwerkkonfiguration zu verstehen
  4. Docker Hub nach dem aktuellen stabilen Tag abgefragt - 4.7.2 statt :latest
  5. Vollständigen Deploymentplan erstellt

Das Ergebnis war ein sauberer Plan mit allen Details:

EigenschaftWert
Stack-Pfad/home/ronin/docker/wallos/
Subdomainwallos.home.maker-ronin.cloud
Imagebellamy/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.

wallos-setup-2

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 tee stattdessen.”

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

wallos-setup-3

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

wallos-setup-4

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:

SchrittStatus
Image recherchiert (bellamy/wallos:4.7.2)
Stack-Dateien erstellt
Container gestartet & healthy
Traefik-Route aktiv, URL antwortet (302)
Backup-Erweiterung dokumentiert

Das Ergebnis

wallos-setup-5

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.

wallos-setup-6

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

CLAUDE.md wächst mit

wallos-setup-7

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 printf oder tee statt 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.

Das Repo: github.com/RoninRage/homelab-claude-public