Zum Inhalt

Workflow: Infrastructure

Proxmox, LXC, Docker und Homelab-Setups planen und umsetzen.

Übersicht

Aspekt Details
Ziel Reproduzierbare Infrastruktur-Deployments
Features Plan Mode, Background Tasks, Skills
Scope Proxmox, LXC, Docker, Networking
Output Configs, Scripts, Dokumentation

Feature-Kombination

┌─────────────────────────────────────────────────────────┐
│                    PLAN MODE                            │
│  Architektur planen, Dependencies klären                │
└───────────────────────────┬─────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│              CONFIG GENERIERUNG                         │
│  docker-compose, LXC configs, Ansible                   │
└───────────────────────────┬─────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│              BACKGROUND TASKS                           │
│  Deployment-Tests, Validierung                          │
└─────────────────────────────────────────────────────────┘

Workflow: Neuen Service deployen

Schritt 1: Anforderung beschreiben

Ich will Wazuh (SIEM) auf Proxmox deployen:

Ressourcen:
- 1 Manager Node
- 2 Worker Nodes (für Skalierung)
- Elasticsearch Cluster

Constraints:
- Proxmox VE 8.x
- LXC bevorzugt wo möglich
- Separate VLANs für Management und Data

Output: Deployment-Plan + Configs

Schritt 2: Plan Mode für Architektur

Claude liefert strukturierten Plan:

## Wazuh Deployment Plan

### Architektur

```text
┌─────────────┐     ┌─────────────┐
│   Wazuh     │     │  Elastic    │
│  Dashboard  │────▶│  Kibana     │
│  (LXC 201)  │     │  (LXC 204)  │
└─────────────┘     └─────────────┘
       │                   │
       ▼                   ▼
┌─────────────┐     ┌───────────────┐
│   Wazuh     │────▶│ Elasticsearch │
│  Manager    │     │   Cluster     │
│  (LXC 202)  │     │ (VM 205-207)  │
└─────────────┘     └───────────────┘
       ├────────────────┐
       ▼                ▼
┌─────────────┐  ┌─────────────┐
│   Wazuh     │  │   Wazuh     │
│  Worker 1   │  │  Worker 2   │
│  (LXC 203)  │  │  (LXC 204)  │
└─────────────┘  └─────────────┘

Ressourcen

Node Typ vCPU RAM Disk VLAN
Dashboard LXC 2 4GB 20GB 10
Manager LXC 4 8GB 50GB 10
Worker 1 LXC 4 8GB 50GB 10
Worker 2 LXC 4 8GB 50GB 10
ES Node 1 VM 4 16GB 200GB 20
ES Node 2 VM 4 16GB 200GB 20
ES Node 3 VM 4 16GB 200GB 20

Deployment-Reihenfolge

  1. Netzwerk (VLANs, Firewall Rules)
  2. Elasticsearch Cluster
  3. Wazuh Manager
  4. Wazuh Workers
  5. Dashboard
  6. Agent-Enrollment testen
    ### Schritt 3: Configs generieren
    
    Der Plan sieht gut aus. Generiere:
  7. LXC Create-Scripts für Proxmox
  8. Ansible Playbook für Wazuh Installation
  9. docker-compose für lokales Testing
    ## Workflow: Docker Stack
    
    ### Standard Docker-Compose
    
    Erstelle docker-compose für Traefik + Authentik:

Requirements: - Traefik als Reverse Proxy - Authentik für SSO - Let's Encrypt Certs - Redis für Authentik

Network: proxy_net (extern) Volumes: in /opt/container-name/ Kein version: in compose file

Output:

```yaml
# /opt/traefik/docker-compose.yml
services:
  traefik:
    image: traefik:v3.0
    container_name: traefik
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./config:/etc/traefik:ro
      - ./certs:/certs
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - proxy_net
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
      - "traefik.http.routers.dashboard.service=api@internal"
      - "traefik.http.routers.dashboard.middlewares=authentik@docker"

networks:
  proxy_net:
    external: true

Multi-Service Stack

Erstelle kompletten Monitoring Stack:
- Prometheus
- Grafana
- Alertmanager
- Node Exporter (als DaemonSet-Äquivalent)

Alle Services in einem Compose-File.
Persistente Volumes.
Interne Kommunikation über Docker Network.

Workflow: LXC auf Proxmox

LXC Template

Erstelle Proxmox LXC Config für einen Docker-Host:

Template: debian-12-standard
Resources: 4 vCPU, 8GB RAM, 50GB Disk
Network: VLAN 10, DHCP
Features: nesting=1, keyctl=1 (für Docker)

Output: 
1. pct create Command
2. Post-Install Script für Docker

Output:

#!/bin/bash
# Create Docker-Host LXC

VMID=300
TEMPLATE="local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst"
STORAGE="local-zfs"
HOSTNAME="docker-host-01"

pct create $VMID $TEMPLATE \
  --hostname $HOSTNAME \
  --cores 4 \
  --memory 8192 \
  --swap 0 \
  --rootfs $STORAGE:50 \
  --net0 name=eth0,bridge=vmbr0,tag=10,ip=dhcp \
  --features nesting=1,keyctl=1 \
  --unprivileged 1 \
  --onboot 1 \
  --start 0

# Post-Create Setup
pct start $VMID
sleep 10

pct exec $VMID -- bash -c '
  apt update && apt upgrade -y
  apt install -y curl gnupg lsb-release

  # Docker Install
  curl -fsSL https://get.docker.com | sh

  # Docker Compose Plugin
  apt install -y docker-compose-plugin

  # User Setup
  useradd -m -s /bin/bash admin
  usermod -aG docker admin
'

echo "LXC $VMID ($HOSTNAME) created and configured"

Workflow: Netzwerk-Design

VLAN-Struktur

Plane VLAN-Struktur für Homelab:

Anforderungen:
- Management (Proxmox, IPMI)
- Production Services (Docker, VMs)
- IoT (isoliert)
- Guest (isoliert, Internet only)
- Storage (nur intern)

Firewall: OPNsense
Switches: Managed, VLAN-fähig

Output: VLAN-Plan + Firewall-Regeln

IP-Adressierung

Erstelle IP-Adressierungsplan:

Netz: 10.0.0.0/16
VLANs: 10, 20, 30, 40, 50 (wie oben)

Pro VLAN:
- Subnetz
- Gateway (auf OPNsense)
- DHCP Range
- Statische IPs (Bereich)
- DNS Server

Infra-Skill erstellen

# ~/.claude/skills/infrastructure/SKILL.md
---
name: infra
description: Plant und generiert Infrastructure Configs.
  Aktiviert bei Proxmox, LXC, Docker, VLAN, Deployment.
---

# Infrastructure Generator

## Proxmox Standards

- LXC IDs: 100-199 (Templates), 200-299 (Prod), 300-399 (Dev)
- VM IDs: 1000-1999 (Prod), 2000-2999 (Dev)
- Storage: local-zfs für VMs, local für ISOs

## Docker Standards

- Compose Files ohne version:
- Volumes in /opt/container-name/
- Networks: proxy_net (extern), app_net (intern)
- Restart: unless-stopped
- Container Namen: service-name (keine Underscores)

## Netzwerk Standards

- VLAN 1: Native (nicht nutzen)
- VLAN 10: Management
- VLAN 20: Production
- VLAN 30: Development  
- VLAN 40: IoT
- VLAN 50: Guest
- VLAN 99: Storage

## Output Formate

- Shell Scripts für Proxmox
- docker-compose.yml für Docker
- Ansible Playbooks für Automation
- Markdown für Dokumentation

Tipps für gute Ergebnisse

DO ✅

Plane Deployment für Immich (Photo Management):

Umgebung:
- Proxmox VE 8.2
- LXC mit Docker (nesting enabled)
- Storage: NFS Share für Photos
- Reverse Proxy: Traefik (bereits vorhanden)
- Auth: Authentik (bereits vorhanden)

Ressourcen:
- Max 4 vCPU, 8GB RAM
- Photos-Volume extern

Output:
1. LXC Create Script
2. docker-compose.yml
3. Traefik Labels für Routing
4. Backup-Strategie

Klare Umgebung, Constraints, gewünschter Output.


DON'T ❌

Wie installiere ich Docker?

Welches OS? Welche Docker-Version? Welcher Use Case?


TIPP: Iterativ deployen 💡

Nicht alles auf einmal, sondern:

# Erst Basis
Erstelle LXC für Docker Host

# Test, dann erweitern
Jetzt docker-compose für den ersten Service

# Dann Integration
Füge Traefik Labels hinzu

TIPP: Validierung im Background 💡

Validiere diese docker-compose im Background:
- Syntax Check (docker compose config)
- Image Pull Test
- Port-Konflikte prüfen

Ich arbeite währenddessen am nächsten Service.

Kosten-Optimierung

Szenario Empfehlung
Einzelner Service Sonnet direkt
Komplexe Architektur Plan Mode + Sonnet
Multi-Service Stack Plan Mode + Haiku Sub-Agents
Migration Sub-Agents pro Service

Troubleshooting

LXC startet nicht

LXC 201 startet nicht mit Fehler:
[Error Message]

Config:
@/etc/pve/lxc/201.conf

Diagnose und Fix bitte.

Docker Network Probleme

Container können sich nicht erreichen:
- Container A: docker-compose.yml A
- Container B: docker-compose.yml B

Beide sollen über proxy_net kommunizieren.

Aktuelle Configs:
[Configs einfügen]

Storage voll

ZFS Pool ist 85% voll.
Aktuelle Nutzung: zfs list

Was kann ich aufräumen?
Welche Snapshots sind sicher zu löschen?

Best Practices

Infrastructure as Code: Immer reproduzierbar

Kein manuelles Klicken das nicht dokumentiert ist:

Erstelle für alle Proxmox-Änderungen:
1. Den Shell-Command oder pct-Command
2. Ein Ansible-Playbook das denselben Zustand herstellt
3. Einen Kommentar: Warum diese Einstellung?

Ziel: Vom Nullzustand reproduzierbar in < 2 Stunden.

Staging-First Workflow

Für Homelab / MSP-Infrastruktur:

Anforderung beschreiben
Plan Mode: Architektur planen
Lokal testen (docker compose oder Proxmox Dev-Node)
Review & Anpassung
Produktiv deployen

Claude-Prompt für Staging-Setup:

Erstelle zusätzlich zur Produktiv-Config:
- docker-compose.override.yml für lokales Testing
- Kommentare welche Variablen für Staging anzupassen sind
- Smoke-Test-Script das die wichtigsten Funktionen prüft

Container-Standards für Konsistenz

Konsistente Labels und Struktur erleichtern das spätere Management:

# Standard-Labels für alle Services
labels:
  - "traefik.enable=true"
  - "com.example.service=${SERVICE_NAME}"
  - "com.example.version=${VERSION:-latest}"
  - "com.example.owner=homelab"
Erstelle docker-compose mit unseren Standards:
- Volumes in /opt/${service}/data/
- Kein `version:` Header (deprecated)
- restart: unless-stopped für alle Services
- Labels: traefik.enable + service-name
- Networks: proxy_net (extern) + app-intern (intern)

Backup-Strategie vor dem Deployment

Proxmox Snapshots als Sicherheitsnetz:

# Snapshot vor Major-Änderungen (Claude-Prompt)
Erstelle ein Script das:
1. Snapshot aller betroffenen LXC/VMs macht (pct/qm snapshot)
2. Naming: "pre-[change-description]-[date]"
3. Nach erfolgreichem Test: Snapshot löschen
4. Bei Rollback: pct/qm rollback + Log der Aktion

Netzwerk-Changes: Immer Out-of-Band

Beim Ändern von Netzwerk-Konfigurationen:

Vor dem Erstellen des Scripts: Erkläre mir
was passiert wenn Schritt 3 fehlschlägt.

Gibt es einen Fall wo ich den Management-Zugriff verliere?
Wenn ja: Wie stelle ich ihn wieder her?

Claude denkt Rollback-Szenarien mit wenn man explizit fragt.