infrastructure:bootstrap
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| infrastructure:bootstrap [2026/02/09 14:12] – mxm | infrastructure:bootstrap [2026/02/10 20:44] (current) – big rewrite to ansible mxm | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Bootstrap Guide ====== | ====== Bootstrap Guide ====== | ||
| - | Komplettanleitung zum Aufbau des Automation Stacks von Grund auf. Wir haben hier als Standard-Fall die Installation im lokalen Netzwerk dokumentiert. Parallel teste ich aber auch auf einem preiswerten VPS auf Hetzner im Projekt // | + | Komplettanleitung zum Aufbau des Automation Stacks von Grund auf. |
| ===== Übersicht ===== | ===== Übersicht ===== | ||
| Line 9: | Line 9: | ||
| ───────────────── | ───────────────── | ||
| Proxmox | Proxmox | ||
| - | UniFi Netzwerk | + | Cloudflare |
| - | Cloudflare | + | vault.yml |
| - | vault.yml | + | Inventory wählen |
| </ | </ | ||
| ===== DAY 0 — Foundation ===== | ===== DAY 0 — Foundation ===== | ||
| - | ==== Netzwerk | + | ==== Inventory Environment wählen |
| - | === UniFi === | + | Der Stack unterstützt mehrere Environments über Inventory-Dateien: |
| - | **VLAN anlegen:** | + | * **Home environment**: '' |
| + | | ||
| + | | ||
| + | * Domain: home.miskam.xyz | ||
| + | * **Hetzner environment**: | ||
| + | * Netzwerk: 10.10.10.0/ | ||
| + | * Proxmox node: " | ||
| + | * Domain: test.miskam.xyz | ||
| - | ^ VLAN ^ Name ^ Subnet ^ Gateway ^ | + | **Eigenes Environment hinzufügen: |
| - | | 160 | Server | 10.100.160.0/ | + | |
| - | **Firewall-Regeln:** | + | <code bash> |
| + | # 1. Inventory kopieren | ||
| + | cp ansible/ | ||
| - | ^ Regel ^ Von ^ Nach ^ Port ^ Aktion ^ | + | # 2. Anpassen |
| - | | WAN-HTTP | WAN | 10.100.161.102 | 80,443 | Allow | | + | vim ansible/ |
| - | | VPN-Server | 192.168.7.0/24 | 10.100.160.0/ | + | </code> |
| - | | Server-LAN | 10.100.160.0/23 | LAN | * | Allow | | + | |
| - | **Port-Forwarding:** | + | In der Inventory-Datei definieren: |
| + | | ||
| + | * '' | ||
| + | | ||
| + | | ||
| + | * '' | ||
| - | ^ Extern ^ Intern ^ Service ^ | + | Beispiel Hetzner: |
| - | | 80 | 10.100.161.102:80 | Traefik HTTP | | + | <code yaml> |
| - | | 443 | 10.100.161.102:443 | Traefik HTTPS | | + | all: |
| + | vars: | ||
| + | network: | ||
| + | prefix: "10.10.10" | ||
| + | gateway: " | ||
| + | | ||
| + | domain: test.miskam.xyz | ||
| + | |||
| + | children: | ||
| + | proxmox: | ||
| + | hosts: | ||
| + | hv-test: | ||
| + | ansible_host: | ||
| + | |||
| + | automation_stack: | ||
| + | hosts: | ||
| + | traefik: | ||
| + | ct_id: 110 | ||
| + | ct_hostname: | ||
| + | # ... weitere Container | ||
| + | </ | ||
| ==== Cloudflare ==== | ==== Cloudflare ==== | ||
| **Domain hinzufügen: | **Domain hinzufügen: | ||
| - | - home.miskam.xyz | + | - Domain |
| **API Token erstellen: | **API Token erstellen: | ||
| - My Profile → API Tokens → Create Token | - My Profile → API Tokens → Create Token | ||
| - Template: "Edit zone DNS" | - Template: "Edit zone DNS" | ||
| - | - Zone: home.miskam.xyz | + | - Zone: Deine Domain |
| - → Token speichern für vault.yml | - → Token speichern für vault.yml | ||
| Line 53: | Line 85: | ||
| ^ Type ^ Name ^ Value ^ | ^ Type ^ Name ^ Value ^ | ||
| | A | *.home.miskam.xyz | < | | A | *.home.miskam.xyz | < | ||
| + | | A | *.test.miskam.xyz | < | ||
| ==== Proxmox ==== | ==== Proxmox ==== | ||
| - | === lokal === | + | === lokal (Home) |
| **Installation: | **Installation: | ||
| Line 74: | Line 106: | ||
| bridge-vlan-aware yes | bridge-vlan-aware yes | ||
| EOF | EOF | ||
| - | ifreload -a | + | ifreload -a |
| </ | </ | ||
| - | === Hetzner === | + | === Hetzner |
| + | |||
| + | **NAT-Setup für private Netzwerk:** | ||
| < | < | ||
| Line 85: | Line 119: | ||
| auto eno1 | auto eno1 | ||
| - | #real IP address | + | iface eno1 inet static |
| - | iface nic0 inet static | + | address |
| - | address | + | gateway |
| - | gateway | + | |
| auto vmbr0 | auto vmbr0 | ||
| - | #private sub network | ||
| iface vmbr0 inet static | iface vmbr0 inet static | ||
| address | address | ||
| Line 103: | Line 135: | ||
| EOF | EOF | ||
| ifreload -a | ifreload -a | ||
| + | </ | ||
| + | |||
| + | **Port-Forwarding** (Ports 80/443 → Traefik): | ||
| + | |||
| + | Nach Bootstrap einmalig ausführen: | ||
| + | <code bash> | ||
| + | cd ansible | ||
| + | ansible-playbook configure-nat.yml --vault-password-file ../ | ||
| </ | </ | ||
| Line 109: | Line 149: | ||
| * User: root@pam | * User: root@pam | ||
| * Token ID: ansible | * Token ID: ansible | ||
| - | * Privilege Separation: aus | + | |
| * → Token speichern für vault.yml | * → Token speichern für vault.yml | ||
| - | |||
| - | ==== Ops Container einrichten (OpenClaw) ==== | ||
| - | < | ||
| - | pveam download local debian-13-standard_13.1-2_amd64.tar.zst | ||
| - | |||
| - | TEMPLATE=" | ||
| - | |||
| - | pct create 100 $TEMPLATE --hostname ops --memory 2048 --cores 2 \ | ||
| - | --rootfs local-lvm: | ||
| - | --features nesting=1 --unprivileged 1 --start 1 | ||
| - | |||
| - | # install curl, requirement for the openclaw installer | ||
| - | pct exec 100 -- bash -c "apt update && apt install curl -y" | ||
| - | # install openclaw (unconfigured) | ||
| - | pct exec 100 -- bash -c "curl -fsSL https:// | ||
| - | # install uv | ||
| - | pct exec 100 -- bash -c "curl -LsSf https:// | ||
| - | # add uv to $PATH | ||
| - | pct exec 100 -- bash -c "/ | ||
| - | # install ansible | ||
| - | pct exec 100 -- bash -c "/ | ||
| - | pct exec 100 -- bash -c "/ | ||
| - | # install ansible collections | ||
| - | pct exec 100 -- bash -c " | ||
| - | |||
| - | |||
| - | |||
| - | </ | ||
| - | |||
| ==== vault.yml vorbereiten ==== | ==== vault.yml vorbereiten ==== | ||
| - | |||
| - | Dann Proxmox API Token erstellen: | ||
| - | |||
| - | • Datacenter → Permissions → API Tokens → Add | ||
| - | • User: root@pam | ||
| - | • Token ID: ansible | ||
| - | • Privilege Separation: aus | ||
| - | Token-Secret kopieren für vault.yml. | ||
| - | |||
| - | Alle Secrets für den Bootstrap in einer Datei: | ||
| <code bash> | <code bash> | ||
| - | cd ansible/ | + | # 1. Vault-Passwort erstellen |
| - | cat > vault.yml.plain << ' | + | echo ' |
| - | # Proxmox | + | chmod 600 .vault_pass |
| - | vault_proxmox_api_user: | + | |
| - | vault_proxmox_api_token: | + | |
| - | # Cloudflare | + | # 2. Vault generieren (mit Platzhaltern) |
| - | vault_cloudflare_token: | + | ./ |
| - | # PostgreSQL | + | # 3. Anpassen |
| - | vault_postgresql_admin: | + | vim vault.yml |
| - | vault_postgresql_n8n: | + | </ |
| - | vault_postgresql_vaultwarden: | + | |
| - | vault_postgresql_forgejo: | + | |
| - | # Services | + | **Pflichtfelder: |
| - | vault_vaultwarden_admin_token: " | + | * '' |
| - | vault_n8n_encryption_key: " | + | * '' |
| - | vault_grafana_admin: "GENERATE_ME" | + | * '' |
| - | vault_dokuwiki_admin: " | + | * '' |
| + | * '' | ||
| - | # Bot User (für Vaultwarden nach Migration) | + | **Optional |
| - | vault_bot_email: "mxm-[email protected]" | + | * Alle Passwörter und Encryption Keys |
| - | vault_bot_password: | + | * '' |
| - | EOF | + | |
| - | # Secrets generieren | + | <code bash> |
| - | sed -i " | + | # 4. Verschlüsseln |
| - | + | ./bootstrap.sh --encrypt | |
| - | # Verschlüsseln | + | |
| - | ansible-vault encrypt vault.yml.plain --output vault.yml | + | |
| - | rm vault.yml.plain | + | |
| </ | </ | ||
| ===== DAY 1 — Bootstrap ===== | ===== DAY 1 — Bootstrap ===== | ||
| - | ==== Voraussetzungen | + | ==== Bootstrap starten |
| - | | + | **Home environment |
| - | | + | <code bash> |
| - | * vault.yml verschlüsselt vorhanden | + | ./ |
| - | * Git-Repo geklont | + | </ |
| - | ==== 1.1 Bootstrap starten ==== | + | **Hetzner environment: |
| + | <code bash> | ||
| + | INVENTORY_FILE=ansible/ | ||
| + | </ | ||
| + | **Eigenes environment: | ||
| <code bash> | <code bash> | ||
| - | cd ansible/ | + | INVENTORY_FILE=ansible/inventory-production.yml |
| - | ./ | + | |
| - | # → Vault-Passwort eingeben | + | |
| </ | </ | ||
| Line 210: | Line 206: | ||
| bootstrap.sh | bootstrap.sh | ||
| │ | │ | ||
| - | ├─► 1. Control Node (CT 103) | + | ├─► 1. Validierung |
| - | │ └── | + | │ ├── Cloudflare API |
| + | │ ├── SSH Keys | ||
| + | │ | ||
| │ | │ | ||
| - | ├─► 2. Traefik (CT 102) | + | ├─► 2. LXC Container (via Proxmox API) |
| - | │ | + | │ |
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| │ | │ | ||
| - | ├─► 3. PostgreSQL (CT 110) | + | ├─► 3. SSH Key Injection |
| - | │ | + | │ |
| │ | │ | ||
| - | ├─► 4. Vaultwarden (CT 112) | + | ├─► 4. Base Packages |
| - | │ | + | │ |
| │ | │ | ||
| - | ├─► 5. Services | + | ├─► 5. Service Deployment |
| - | │ | + | │ |
| - | │ | + | │ |
| - | │ | + | │ |
| - | │ | + | │ |
| - | │ | + | │ |
| + | │ | ||
| + | │ | ||
| + | │ | ||
| │ | │ | ||
| - | | + | |
| - | │ | + | └── |
| - | │ | + | |
| - | ├─► 7. / | + | |
| - | │ | + | |
| - | │ | + | |
| - | ├─► 8. node_exporter | + | |
| - | │ | + | |
| - | │ | + | |
| - | └─► 9. migrate-secrets.yml | + | |
| - | └── | + | |
| </ | </ | ||
| + | |||
| + | **Dauer:** 15-20 Minuten (abhängig von Netzwerk-Geschwindigkeit) | ||
| ==== Container-Übersicht ==== | ==== Container-Übersicht ==== | ||
| - | ^ CT ^ Name ^ IP ^ RAM ^ Disk ^ Port ^ | + | ^ CT ^ Name ^ IP (Suffix) |
| - | | 102 | traefik | 10.100.161.102 | + | | 110 | traefik | .110 | 512M | 2G | 80,443, |
| - | | 103 | openclaw | 10.100.160.249 | 2G | 8G | 18789 | | + | | 111 | postgres | .111 | 1G | 8G | 5432 | |
| - | | 110 | postgres | 10.100.161.110 | + | | 112 | n8n | .112 | 1G | 4G | 5678 | |
| - | | 111 | n8n | 10.100.161.111 | + | | 113 | vaultwarden | .113 | 512M | 2G | 8080 | |
| - | | 112 | vaultwarden | 10.100.161.112 | + | | 114 | dokuwiki | .114 | 512M | 2G | 80 | |
| - | | 113 | dokuwiki | 10.100.161.113 | + | | 115 | uptime-kuma | .115 | 512M | 2G | 3001 | |
| - | | 114 | uptime-kuma | 10.100.161.114 | + | | 116 | monitoring | .116 | 1G | 4G | 9090,3000 | |
| - | | 115 | monitoring | 10.100.161.115 | + | | 117 | forgejo | .117 | 512M | 4G | 3000 | |
| - | | 116 | forgejo | 10.100.161.116 | + | |
| - | ==== Abhängigkeiten ==== | + | IP-Suffix wird an '' |
| + | Beispiel: Home = 10.100.161.110, | ||
| - | < | + | ==== Firewall-Regeln (automatisch) ==== |
| - | Proxmox + UniFi + Cloudflare | + | |
| - | │ | + | |
| - | ▼ | + | |
| - | ┌─────────────────┐ | + | |
| - | │ | + | |
| - | └────────┬────────┘ | + | |
| - | │ | + | |
| - | ┌──────────────┼──────────────┐ | + | |
| - | ▼ ▼ ▼ | + | |
| - | ┌──────────┐ | + | |
| - | │ Control | + | |
| - | │ Node │ │ | + | |
| - | └────┬─────┘ | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | ┌────────────┐ | + | |
| - | │ /etc/hosts │ | + | |
| - | │*.srv.intern│ | + | |
| - | └────────────┘ | + | |
| - | │ | + | |
| - | ▼ | + | |
| - | ┌─────────────────┐ | + | |
| - | │ migrate-secrets │ | + | |
| - | │ → Vaultwarden | + | |
| - | └─────────────────┘ | + | |
| - | </ | + | |
| - | ===== DAY 2 — Operations ===== | + | Jeder Service konfiguriert seine eigenen Firewall-Regeln: |
| - | Nach erfolgreichem Bootstrap: | + | * **PostgreSQL (111)**: Erlaubt 5432 von n8n, vaultwarden, |
| + | * **n8n (112)**: Erlaubt 5678 von traefik | ||
| + | * **Vaultwarden (113)**: Erlaubt 8080 von traefik | ||
| + | * **DokuWiki (114)**: Erlaubt 80 von traefik | ||
| + | * **Uptime Kuma (115)**: Erlaubt 3001 von traefik | ||
| + | * **Monitoring (116)**: Erlaubt 3000+9090 von traefik | ||
| + | * **Forgejo (117)**: Erlaubt 3000 von traefik | ||
| + | * **Alle Container**: | ||
| - | * **Secrets: | + | Regeln werden automatisch beim Service-Deployment angewendet. |
| - | * **Monitoring: | + | |
| - | * **Git:** Forgejo (lokales Repo-Mirror) | + | |
| - | ==== URLs ==== | + | ===== DAY 2 — Operations ===== |
| + | |||
| + | ==== Service-URLs ==== | ||
| ^ Service ^ URL ^ | ^ Service ^ URL ^ | ||
| - | | n8n | https:// | + | | n8n | https:// |
| - | | Vaultwarden | https:// | + | | Vaultwarden | https:// |
| - | | DokuWiki | https:// | + | | DokuWiki | https:// |
| - | | Uptime Kuma | https:// | + | | Uptime Kuma | https:// |
| - | | Grafana | https:// | + | | Grafana | https:// |
| - | | Forgejo | https:// | + | | Forgejo | https:// |
| + | | Traefik Dashboard | https:// | ||
| - | ==== Credentials | + | ==== Ansible Operations |
| - | Alle Zugangsdaten in Vaultwarden: | + | **Alle Services neu deployen:** |
| - | * **Organisation:** mxmlabs | + | <code bash> |
| - | * **Collection:** Network Automation | + | cd ansible |
| + | ansible-playbook site.yml --vault-password-file ../ | ||
| + | |||
| + | # Hetzner: | ||
| + | ansible-playbook -i inventory-hetzner.yml site.yml --vault-password-file ../ | ||
| + | </ | ||
| + | |||
| + | **Einzelner Service:** | ||
| + | <code bash> | ||
| + | ansible-playbook site.yml --limit n8n --vault-password-file ../ | ||
| + | </ | ||
| + | |||
| + | **Vault editieren:** | ||
| + | <code bash> | ||
| + | ansible-vault edit ../ | ||
| + | </ | ||
| + | |||
| + | **Connectivity testen:** | ||
| + | <code bash> | ||
| + | ansible automation_stack -m ping --vault-password-file ../ | ||
| + | |||
| + | # Hetzner: | ||
| + | ansible -i inventory-hetzner.yml automation_stack -m ping --vault-password-file ../ | ||
| + | </ | ||
| + | |||
| + | ===== Besonderheiten ===== | ||
| + | |||
| + | ==== Traefik Rate Limiting ==== | ||
| + | |||
| + | * **n8n**: Kein Rate Limiting (80+ Assets beim ersten Laden) | ||
| + | | ||
| + | * **Auth Services**: 5 req/s, burst 10 (vaultwarden, | ||
| + | |||
| + | ==== Traefik SSH Port ==== | ||
| + | |||
| + | Traefik verwendet Port 2222 für SSH, weil Port 22 an Forgejo weitergeleitet wird (Git SSH). | ||
| + | |||
| + | ==== Container Teardown ==== | ||
| + | |||
| + | Zum vollständigen Entfernen aller Container: | ||
| + | <code bash> | ||
| + | # Mit Bestätigung | ||
| + | ./ | ||
| + | |||
| + | # Oder direkt via Ansible | ||
| + | cd ansible | ||
| + | ansible-playbook teardown.yml --vault-password-file ../ | ||
| + | </ | ||
| ---- | ---- | ||
| - | //Erstellt: 2026-02-07// | + | //Erstellt: 2026-02-07 |
infrastructure/bootstrap.1770646335.txt.gz · Last modified: by mxm
