incus-contrib/incusos/targets
Maarten 594467ddf6 Add Hetzner lab guide + target configs for AWX and HAProxy
Validates full end-to-end deployment: OC + 3-node Incus cluster,
OVN overlay, HAProxy HA pair, AWX on K3s, Prometheus/Grafana stack.

New files:
- hetzner/hetzner-lab-guide.md — complete end-to-end deployment guide
- incusos/targets/hetzner/awx.yaml — AWX deploy config (hz-node-03, 10.10.0.122)
- incusos/targets/hetzner/haproxy.yaml — HAProxy deploy config (VIP 10.10.0.200)

Script fixes discovered during Hetzner deployment:
- deploy-awx: parse target_remote correctly (was reading target_node key);
  add RESUME flag support; fix target_node passthrough to incus launch;
  fix aether_url sed to not strip :8443 port
- deploy-observability: fix --remote flag (was --cluster-remote in docs),
  fix --resume to clearly skip phases 1-5 including node-exporters
- hetzner/proxmox-setup: state detection improvements from full run
- incusos-proxmox, deploy-haproxy: minor fixes from Hetzner testing

Guide covers known Aether v6.4.202 workarounds:
- HAProxy ACL bug (OVN LB DNAT-only, source IP not VIP)
- AWX cluster binding API bug (DB workaround documented)
- OVN SNAT unreliable for net-prod containers (offline install procedure)
- node-exporter manual deploy when --resume skips phase 5

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-03 16:03:08 +01:00
..
beelink Add Hetzner bare metal setup guide, proxmox-setup script, and multi-target config layout 2026-03-02 15:52:57 +01:00
hetzner Add Hetzner lab guide + target configs for AWX and HAProxy 2026-03-03 16:03:08 +01:00
README.md Add Hetzner bare metal setup guide, proxmox-setup script, and multi-target config layout 2026-03-02 15:52:57 +01:00

README.md

Target Configurations

Target-specific Proxmox connection configs and lab definitions. Each subdirectory represents a physical host (or host type) with its own network topology, storage backend, and resource sizing.

How it works

incusos-proxmox already supports --proxmox FILE to point at any connection config. Targets are just an organizational convention -- no script changes required.

Directory layout

targets/
├── beelink/
│   ├── proxmox.yaml.example     # Connection template (LAN, vmbr0, local-lvm)
│   └── lab-cluster.yaml          # 3-node cluster sized for beelink (4C/4G/50G)
└── hetzner/
    ├── proxmox.yaml.example     # Connection template (WireGuard, vmbr1, local-zfs)
    ├── lab-cluster.yaml          # 3-node cluster sized for hetzner (8C/16G/100G)
    └── lab-production.yaml       # OC + 3-node cluster for hetzner

Usage

1. Copy the example and fill in credentials

cp incusos/targets/hetzner/proxmox.yaml.example incusos/targets/hetzner/proxmox.yaml
# Edit with your API token, host IP, etc.

2. Deploy with explicit --proxmox

incusos-proxmox --proxmox incusos/targets/hetzner/proxmox.yaml \
                incusos/targets/hetzner/lab-cluster.yaml
# Point the auto-discovered proxmox.yaml at your active target
ln -sf targets/hetzner/proxmox.yaml incusos/proxmox.yaml

# Now deploy without --proxmox
incusos-proxmox incusos/targets/hetzner/lab-cluster.yaml

Environment variables

incusos-proxmox reads PROXMOX_TOKEN_SECRET from the environment (or the env file at the repo root). When working with multiple targets, use different variable names per host:

# In env file
PROXMOX_TOKEN_SECRET=beelink-token-here
HETZNER_PROXMOX_TOKEN_SECRET=hetzner-token-here

Before deploying to a specific target, export the right secret:

# Deploy to Hetzner
export PROXMOX_TOKEN_SECRET="$HETZNER_PROXMOX_TOKEN_SECRET"
incusos-proxmox --proxmox incusos/targets/hetzner/proxmox.yaml \
                incusos/targets/hetzner/lab-cluster.yaml

Key differences between targets

Setting Beelink Hetzner
Host 192.168.1.10 (LAN) 10.10.0.1 (WireGuard)
Method ssh api
Bridge vmbr0 vmbr1 (private)
Storage local-lvm local-zfs
VLAN 69 (none)
Gateway 192.168.100.1 10.10.0.1
VM IPs 192.168.102.x/22 10.10.0.x/24
VM cores 4 8
VM memory 4-8 GiB 16 GiB
VM disk 50 GiB 100 GiB