Update all metadata and documentation for new repo structure
- .gitignore: envs/*/env, envs/*/proxmox.yaml instead of old incusos/ paths - .claude/rules/*.md: all paths: directives updated from incusos/ to bin/ - .claude/skills/*.md: helper script paths updated - CLAUDE.md: structure diagram, capabilities paths, context loading table - README.md: structure, quick start examples with new paths - bin/TESTING.md, bin/README.md: command examples updated - envs/hetzner/setup/: all guide and script path references updated - bin/examples/proxmox.yaml.example: updated copy instructions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
855cbfa073
commit
4617de8869
|
|
@ -1,7 +1,7 @@
|
||||||
# Aether API Payloads Context
|
# Aether API Payloads Context
|
||||||
|
|
||||||
paths:
|
paths:
|
||||||
- incus-mitm
|
- bin/helpers/incus-mitm
|
||||||
- api-interception
|
- api-interception
|
||||||
|
|
||||||
## How Aether Communicates with Incus
|
## How Aether Communicates with Incus
|
||||||
|
|
@ -20,11 +20,11 @@ prefix is `6cfd2a1949a7`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Live stream with Aether filter
|
# Live stream with Aether filter
|
||||||
incusos/helpers/incus-mitm --live --filter aether
|
bin/helpers/incus-mitm --live --filter aether
|
||||||
|
|
||||||
# Capture to file
|
# Capture to file
|
||||||
incusos/helpers/incus-mitm --capture 120
|
bin/helpers/incus-mitm --capture 120
|
||||||
incusos/helpers/incus-mitm --analyze /tmp/incus-events-*.json --filter aether
|
bin/helpers/incus-mitm --analyze /tmp/incus-events-*.json --filter aether
|
||||||
```
|
```
|
||||||
|
|
||||||
### API Call Patterns
|
### API Call Patterns
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
paths:
|
paths:
|
||||||
- "ansible/**"
|
- "ansible/**"
|
||||||
- "incusos/deploy-awx"
|
- "bin/deploy-awx"
|
||||||
- "incusos/awx-manifests/*"
|
- "bin/data/awx-manifests/*"
|
||||||
- "notes/awx-guide.md"
|
- "notes/awx-guide.md"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
paths:
|
paths:
|
||||||
- "incusos/lab-test"
|
- "bin/lab-test"
|
||||||
- "incusos/incusos-proxmox"
|
- "bin/incusos-proxmox"
|
||||||
- "notes/clustering-guide.md"
|
- "notes/clustering-guide.md"
|
||||||
- "notes/production-lab-guide.md"
|
- "notes/production-lab-guide.md"
|
||||||
---
|
---
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
paths:
|
paths:
|
||||||
- "incusos/deploy-haproxy"
|
- "bin/deploy-haproxy"
|
||||||
- "incusos/helpers/aether-browser"
|
- "bin/helpers/aether-browser"
|
||||||
- "notes/haproxy-guide.md"
|
- "notes/haproxy-guide.md"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
# Hetzner Setup Context
|
# Hetzner Setup Context
|
||||||
|
|
||||||
paths:
|
paths:
|
||||||
- hetzner/*
|
- envs/hetzner/*
|
||||||
- incusos/targets/hetzner/*
|
- envs/hetzner/setup/*
|
||||||
|
|
||||||
## Network Topology
|
## Network Topology
|
||||||
|
|
||||||
|
|
@ -35,7 +35,7 @@ VMs cannot use public IPs directly.
|
||||||
|
|
||||||
### proxmox-setup Script
|
### proxmox-setup Script
|
||||||
|
|
||||||
`hetzner/proxmox-setup` runs from the workstation over SSH.
|
`envs/hetzner/setup/proxmox-setup` runs from the workstation over SSH.
|
||||||
All commands executed via `ssh <host> <command>`.
|
All commands executed via `ssh <host> <command>`.
|
||||||
Follows same conventions as other scripts: setup_colors, info/warn/error,
|
Follows same conventions as other scripts: setup_colors, info/warn/error,
|
||||||
--dry-run, --yes flags.
|
--dry-run, --yes flags.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
paths:
|
paths:
|
||||||
- "incusos/helpers/incusos-health"
|
- "bin/helpers/incusos-health"
|
||||||
- "notes/incusos-break-fix.md"
|
- "notes/incusos-break-fix.md"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
---
|
---
|
||||||
paths:
|
paths:
|
||||||
- "incusos/incusos-iso"
|
- "bin/incusos-iso"
|
||||||
- "incusos/incusos-seed"
|
- "bin/incusos-seed"
|
||||||
- "incusos/incusos-proxmox"
|
- "bin/incusos-proxmox"
|
||||||
- "incusos/helpers/*"
|
- "bin/helpers/*"
|
||||||
- "incusos/examples/*"
|
- "bin/examples/*"
|
||||||
---
|
---
|
||||||
|
|
||||||
# IncusOS Scripts Context
|
# IncusOS Scripts Context
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
paths:
|
paths:
|
||||||
- "incusos/incusos-proxmox"
|
- "bin/incusos-proxmox"
|
||||||
- "incusos/lab-test"
|
- "bin/lab-test"
|
||||||
- "incusos/examples/*"
|
- "bin/examples/*"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Lab Infrastructure
|
# Lab Infrastructure
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
paths:
|
paths:
|
||||||
- "incusos/deploy-observability"
|
- "bin/deploy-observability"
|
||||||
- "incusos/observability-dashboards"
|
- "bin/data/observability-dashboards"
|
||||||
- "notes/observability-guide.md"
|
- "notes/observability-guide.md"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
paths:
|
paths:
|
||||||
- "notes/operations-center-guide.md"
|
- "notes/operations-center-guide.md"
|
||||||
- "incusos/incusos-proxmox"
|
- "bin/incusos-proxmox"
|
||||||
- "incusos/examples/*oc*"
|
- "bin/examples/*oc*"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Operations Center
|
# Operations Center
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
# OVN Internals Context
|
# OVN Internals Context
|
||||||
|
|
||||||
paths:
|
paths:
|
||||||
- ovn-inspect
|
- bin/helpers/ovn-inspect
|
||||||
- ovn-deep-dive
|
- notes/ovn-deep-dive*
|
||||||
|
|
||||||
## OVN Architecture in this Cluster
|
## OVN Architecture in this Cluster
|
||||||
|
|
||||||
|
|
@ -26,7 +26,7 @@ Incus manages OVN objects using a `net8` prefix convention.
|
||||||
- NB/SB commands: `incus exec oc-node-01:ovn-central -- ovn-nbctl ...`
|
- NB/SB commands: `incus exec oc-node-01:ovn-central -- ovn-nbctl ...`
|
||||||
- OVS commands: Need privileged container with `/run/openvswitch` mounted
|
- OVS commands: Need privileged container with `/run/openvswitch` mounted
|
||||||
(deploy Alpine on net-prod, `apk add openvswitch`)
|
(deploy Alpine on net-prod, `apk add openvswitch`)
|
||||||
- Helper script: `incusos/helpers/ovn-inspect --nb|--sb|--ovs|--full|--trace`
|
- Helper script: `bin/helpers/ovn-inspect --nb|--sb|--ovs|--full|--trace`
|
||||||
|
|
||||||
### Important Details
|
### Important Details
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
---
|
---
|
||||||
paths:
|
paths:
|
||||||
- "incusos/incusos-proxmox"
|
- "bin/incusos-proxmox"
|
||||||
- "incusos/observe-deploy"
|
- "bin/diagnostic/observe-deploy"
|
||||||
- "incusos/helpers/*"
|
- "bin/helpers/*"
|
||||||
- "incusos/examples/*"
|
- "bin/examples/*"
|
||||||
- "incusos/TESTING.md"
|
- "bin/TESTING.md"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Proxmox VE Deployment
|
# Proxmox VE Deployment
|
||||||
|
|
|
||||||
|
|
@ -26,14 +26,11 @@ Thumbs.db
|
||||||
# Go binaries (flasher-tool)
|
# Go binaries (flasher-tool)
|
||||||
flasher-tool
|
flasher-tool
|
||||||
|
|
||||||
# Proxmox connection configs (contain secrets, per-target and default)
|
# Per-environment secrets and connection configs
|
||||||
incusos/proxmox.yaml
|
envs/*/env
|
||||||
incusos/targets/*/proxmox.yaml
|
envs/*/proxmox.yaml
|
||||||
|
|
||||||
# Per-target env files
|
# Legacy: root env file (backward compat)
|
||||||
env-*
|
|
||||||
|
|
||||||
# Environment secrets
|
|
||||||
env
|
env
|
||||||
|
|
||||||
# Observational deploy output (screenshots, logs)
|
# Observational deploy output (screenshots, logs)
|
||||||
|
|
|
||||||
72
CLAUDE.md
72
CLAUDE.md
|
|
@ -20,16 +20,16 @@ incus-contrib/
|
||||||
│ └── playbooks/
|
│ └── playbooks/
|
||||||
│ ├── post-deploy.yml # Runs after Aether creates an instance
|
│ ├── post-deploy.yml # Runs after Aether creates an instance
|
||||||
│ └── decommission.yml # Runs before Aether deletes an instance
|
│ └── decommission.yml # Runs before Aether deletes an instance
|
||||||
├── incusos/ # IncusOS installation tooling
|
├── bin/ # ALL reusable scripts
|
||||||
│ ├── README.md
|
|
||||||
│ ├── incusos-iso # ISO/IMG builder (wraps flasher-tool)
|
│ ├── incusos-iso # ISO/IMG builder (wraps flasher-tool)
|
||||||
│ ├── incusos-seed # Seed archive generator (Linux + macOS)
|
│ ├── incusos-seed # Seed archive generator (Linux + macOS)
|
||||||
│ ├── incusos-proxmox # Declarative Proxmox VM deployment + lab lifecycle
|
│ ├── incusos-proxmox # Declarative Proxmox VM deployment + lab lifecycle
|
||||||
|
│ ├── lab-test # Guided lab validation (12 test phases)
|
||||||
│ ├── deploy-awx # AWX deployment + management on Incus cluster
|
│ ├── deploy-awx # AWX deployment + management on Incus cluster
|
||||||
│ ├── deploy-haproxy # HAProxy LB deployment + management via Aether
|
│ ├── deploy-haproxy # HAProxy LB deployment + management via Aether
|
||||||
│ ├── deploy-observability # Prometheus + Grafana + Loki observability stack
|
│ ├── deploy-observability # Prometheus + Grafana + Loki observability stack
|
||||||
│ ├── awx-manifests/ # K8s manifests for AWX Operator + instance
|
│ ├── manage-dashboards # Grafana dashboard management
|
||||||
│ ├── observability-dashboards/ # Grafana dashboard JSON exports
|
│ ├── pve-api # Python Proxmox API helper
|
||||||
│ ├── helpers/
|
│ ├── helpers/
|
||||||
│ │ ├── proxmox-screenshot # VMID -> PNG console screenshot
|
│ │ ├── proxmox-screenshot # VMID -> PNG console screenshot
|
||||||
│ │ ├── proxmox-api # Authenticated API calls (handles ! in token)
|
│ │ ├── proxmox-api # Authenticated API calls (handles ! in token)
|
||||||
|
|
@ -37,18 +37,41 @@ incus-contrib/
|
||||||
│ │ ├── ovn-inspect # OVN/OVS topology inspection (--nb/--sb/--ovs/--trace)
|
│ │ ├── ovn-inspect # OVN/OVS topology inspection (--nb/--sb/--ovs/--trace)
|
||||||
│ │ ├── incus-mitm # API traffic capture and analysis (--capture/--live/--analyze)
|
│ │ ├── incus-mitm # API traffic capture and analysis (--capture/--live/--analyze)
|
||||||
│ │ └── incusos-health # IncusOS health inspection (--status/--tpm/--partitions/--all)
|
│ │ └── incusos-health # IncusOS health inspection (--status/--tpm/--partitions/--all)
|
||||||
│ ├── lab-test # Guided lab validation (12 test phases)
|
│ ├── data/ # Static data consumed by scripts
|
||||||
│ ├── observe-deploy # Single-VM deploy with console screenshots
|
│ │ ├── awx-manifests/ # K8s manifests for AWX Operator + instance
|
||||||
│ ├── targets/ # Per-host configs (beelink/, hetzner/)
|
│ │ └── observability-dashboards/ # Grafana dashboard JSON exports
|
||||||
|
│ ├── diagnostic/ # Investigation/one-off tools
|
||||||
|
│ │ ├── observe-deploy # Single-VM deploy with console screenshots
|
||||||
|
│ │ ├── investigate-boot # Boot investigation
|
||||||
|
│ │ └── test-boot-reliability # Parallel boot testing
|
||||||
|
│ ├── examples/ # Example seed + Proxmox YAML files
|
||||||
|
│ └── TESTING.md
|
||||||
|
├── envs/ # Per-environment config + secrets
|
||||||
|
│ ├── README.md # How environments work
|
||||||
|
│ ├── beelink/ # Beelink mini PC target
|
||||||
|
│ │ ├── env # Secrets (gitignored)
|
||||||
|
│ │ ├── proxmox.yaml # Proxmox connection (gitignored)
|
||||||
|
│ │ ├── proxmox.yaml.example
|
||||||
|
│ │ ├── lab-cluster.yaml
|
||||||
|
│ │ ├── awx.yaml
|
||||||
|
│ │ ├── haproxy.yaml
|
||||||
|
│ │ └── observability.yaml
|
||||||
|
│ └── hetzner/ # Hetzner dedicated server target
|
||||||
|
│ ├── env # Secrets (gitignored)
|
||||||
│ ├── proxmox.yaml # Proxmox connection (gitignored)
|
│ ├── proxmox.yaml # Proxmox connection (gitignored)
|
||||||
│ ├── TESTING.md
|
│ ├── proxmox.yaml.example
|
||||||
│ └── examples/ # Example seed + Proxmox YAML files
|
│ ├── lab-cluster.yaml
|
||||||
├── hetzner/ # Hetzner dedicated server setup
|
│ ├── lab-production.yaml
|
||||||
│ ├── README.md # Overview, prerequisites, quickstart
|
│ ├── awx.yaml
|
||||||
│ ├── hetzner-setup.md # Step-by-step Proxmox setup guide
|
│ ├── haproxy.yaml
|
||||||
│ └── proxmox-setup # Interactive setup helper (runs over SSH)
|
│ ├── observability.yaml
|
||||||
├── env # PROXMOX_TOKEN_SECRET, PROXMOX_ROOT_PASSWORD, AETHER_ADMIN_PASSWORD (gitignored)
|
│ └── setup/ # Host provisioning
|
||||||
└── notes/ # Reference guides (clustering, networking, OC, AWX, etc.)
|
│ ├── README.md
|
||||||
|
│ ├── hetzner-setup.md
|
||||||
|
│ ├── hetzner-lab-guide.md
|
||||||
|
│ └── proxmox-setup
|
||||||
|
├── notes/ # Reference guides (clustering, networking, OC, AWX, etc.)
|
||||||
|
└── sources/ # External software (gitignored)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Capabilities you have
|
## Capabilities you have
|
||||||
|
|
@ -56,7 +79,7 @@ incus-contrib/
|
||||||
### Proxmox VM screenshots
|
### Proxmox VM screenshots
|
||||||
Take console screenshots during deploys to see boot progress or errors:
|
Take console screenshots during deploys to see boot progress or errors:
|
||||||
```
|
```
|
||||||
incusos/helpers/proxmox-screenshot VMID [/tmp/output.png]
|
bin/helpers/proxmox-screenshot VMID [/tmp/output.png]
|
||||||
```
|
```
|
||||||
Use the Read tool on the PNG to view it. **USE THIS PROACTIVELY** during
|
Use the Read tool on the PNG to view it. **USE THIS PROACTIVELY** during
|
||||||
deploy scenarios to monitor boot progress, diagnose hangs, and verify installs.
|
deploy scenarios to monitor boot progress, diagnose hangs, and verify installs.
|
||||||
|
|
@ -64,9 +87,9 @@ deploy scenarios to monitor boot progress, diagnose hangs, and verify installs.
|
||||||
### Proxmox API calls
|
### Proxmox API calls
|
||||||
Make authenticated API calls (handles the `!` in `automation@pve!deploy`):
|
Make authenticated API calls (handles the `!` in `automation@pve!deploy`):
|
||||||
```
|
```
|
||||||
incusos/helpers/proxmox-api GET /nodes/pve/qemu/900/status/current --json
|
bin/helpers/proxmox-api GET /nodes/pve/qemu/900/status/current --json
|
||||||
incusos/helpers/proxmox-api GET /nodes/pve/status --json
|
bin/helpers/proxmox-api GET /nodes/pve/status --json
|
||||||
incusos/helpers/proxmox-api POST /nodes/pve/qemu/900/status/stop
|
bin/helpers/proxmox-api POST /nodes/pve/qemu/900/status/stop
|
||||||
```
|
```
|
||||||
|
|
||||||
### Aether API
|
### Aether API
|
||||||
|
|
@ -75,7 +98,7 @@ Aether has a documented REST API at `https://192.168.102.160:8443/api/`.
|
||||||
- **Swagger UI**: `https://192.168.102.160:8443/api/docs`
|
- **Swagger UI**: `https://192.168.102.160:8443/api/docs`
|
||||||
- **OpenAPI spec**: `https://192.168.102.160:8443/api/swagger.yaml`
|
- **OpenAPI spec**: `https://192.168.102.160:8443/api/swagger.yaml`
|
||||||
- **Auth**: JWT via `POST /api/auth/token` with `{"username":"...","password":"..."}`
|
- **Auth**: JWT via `POST /api/auth/token` with `{"username":"...","password":"..."}`
|
||||||
Credentials in `env` file (`AETHER_ADMIN_PASSWORD`). Token valid 24h.
|
Credentials in `envs/*/env` file (`AETHER_ADMIN_PASSWORD`). Token valid 24h.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Get JWT
|
# Get JWT
|
||||||
|
|
@ -117,11 +140,11 @@ that curl cannot handle reliably. **USE PLAYWRIGHT** for these interactions.
|
||||||
`browser_click`, `browser_fill`, `browser_screenshot` etc. as tools when
|
`browser_click`, `browser_fill`, `browser_screenshot` etc. as tools when
|
||||||
the Playwright MCP server is running. Prefer MCP tools when available.
|
the Playwright MCP server is running. Prefer MCP tools when available.
|
||||||
|
|
||||||
**Helper script**: `incusos/helpers/aether-browser` provides standalone
|
**Helper script**: `bin/helpers/aether-browser` provides standalone
|
||||||
Playwright automation when MCP tools aren't loaded:
|
Playwright automation when MCP tools aren't loaded:
|
||||||
```bash
|
```bash
|
||||||
source env # loads AETHER_ADMIN_PASSWORD
|
source envs/beelink/env # loads AETHER_ADMIN_PASSWORD
|
||||||
NODE_PATH=~/node_modules node incusos/helpers/aether-browser <action> [args]
|
NODE_PATH=~/node_modules node bin/helpers/aether-browser <action> [args]
|
||||||
```
|
```
|
||||||
|
|
||||||
Actions:
|
Actions:
|
||||||
|
|
@ -177,6 +200,7 @@ still UI-only. The API endpoint may have been added since the guide was written.
|
||||||
- **Flags**: both short (`-d`) and long (`--defaults`)
|
- **Flags**: both short (`-d`) and long (`--defaults`)
|
||||||
- **Defaults**: useful behavior with zero flags
|
- **Defaults**: useful behavior with zero flags
|
||||||
- **Dry run**: all scripts support `--dry-run`
|
- **Dry run**: all scripts support `--dry-run`
|
||||||
|
- **Config**: deploy scripts use `--config FILE` for environment-specific settings
|
||||||
- **Cert detection**: files on disk first (`~/.config/incus/client.crt`), CLI second
|
- **Cert detection**: files on disk first (`~/.config/incus/client.crt`), CLI second
|
||||||
- **Errors**: include actionable remediation steps
|
- **Errors**: include actionable remediation steps
|
||||||
- **No hardcoded package managers**: say "install the Incus client" with a link
|
- **No hardcoded package managers**: say "install the Incus client" with a link
|
||||||
|
|
@ -201,7 +225,7 @@ which files are being edited:
|
||||||
| `incusos-immutability.md` | incusos-health, incusos-break-fix |
|
| `incusos-immutability.md` | incusos-health, incusos-break-fix |
|
||||||
| `proxmox-ssh-rules.md` | **Always loaded** (no paths filter) |
|
| `proxmox-ssh-rules.md` | **Always loaded** (no paths filter) |
|
||||||
| `lab-infrastructure.md` | incusos-proxmox, lab-test, examples |
|
| `lab-infrastructure.md` | incusos-proxmox, lab-test, examples |
|
||||||
| `hetzner-setup.md` | hetzner/, incusos/targets/hetzner/ |
|
| `hetzner-setup.md` | envs/hetzner/, setup scripts |
|
||||||
|
|
||||||
For deep reference, see the guides in `notes/`.
|
For deep reference, see the guides in `notes/`.
|
||||||
|
|
||||||
|
|
|
||||||
65
README.md
65
README.md
|
|
@ -1,4 +1,4 @@
|
||||||
# incu-contrib
|
# incus-contrib
|
||||||
|
|
||||||
Peripheral tools, snippets, and scripts for working with [Incus](https://linuxcontainers.org/incus/),
|
Peripheral tools, snippets, and scripts for working with [Incus](https://linuxcontainers.org/incus/),
|
||||||
[IncusOS](https://linuxcontainers.org/incus-os/), and the broader ecosystem.
|
[IncusOS](https://linuxcontainers.org/incus-os/), and the broader ecosystem.
|
||||||
|
|
@ -7,9 +7,10 @@ Primarily aimed at home lab environments but useful in production as well.
|
||||||
|
|
||||||
## Contents
|
## Contents
|
||||||
|
|
||||||
### [`incusos/`](incusos/)
|
### [`bin/`](bin/)
|
||||||
|
|
||||||
Scripts for building IncusOS installation media and seed configurations:
|
Reusable scripts for building IncusOS installation media, deploying labs,
|
||||||
|
and managing services:
|
||||||
|
|
||||||
- **`incusos-iso`** -- Build customized IncusOS ISO/IMG images using the official flasher-tool.
|
- **`incusos-iso`** -- Build customized IncusOS ISO/IMG images using the official flasher-tool.
|
||||||
Supports both architectures (x86_64, aarch64), multiple applications (Incus, Operations Center),
|
Supports both architectures (x86_64, aarch64), multiple applications (Incus, Operations Center),
|
||||||
|
|
@ -23,15 +24,29 @@ Scripts for building IncusOS installation media and seed configurations:
|
||||||
YAML, and the script handles seed generation, ISO upload, VM creation with correct
|
YAML, and the script handles seed generation, ISO upload, VM creation with correct
|
||||||
settings (UEFI, TPM 2.0, VirtIO-SCSI), and automated installation.
|
settings (UEFI, TPM 2.0, VirtIO-SCSI), and automated installation.
|
||||||
|
|
||||||
- **`targets/`** -- Per-host Proxmox connection configs and lab definitions. Each
|
|
||||||
subdirectory (beelink, hetzner) has a `proxmox.yaml.example` and lab YAML files
|
|
||||||
sized for that host. See [`targets/README.md`](incusos/targets/README.md).
|
|
||||||
|
|
||||||
- **`deploy-awx`** -- Deploy and manage AWX (Ansible automation) on the Incus
|
- **`deploy-awx`** -- Deploy and manage AWX (Ansible automation) on the Incus
|
||||||
cluster. Handles VM creation, K3s install, AWX Operator deployment, project/template
|
cluster. Handles VM creation, K3s install, AWX Operator deployment, project/template
|
||||||
configuration, and Aether integration.
|
configuration, and Aether integration. Requires `--config` for environment settings.
|
||||||
|
|
||||||
See [`incusos/README.md`](incusos/README.md) for full documentation.
|
- **`deploy-haproxy`** -- Deploy HA HAProxy load balancing via Aether. Requires
|
||||||
|
`--config` for environment settings.
|
||||||
|
|
||||||
|
- **`deploy-observability`** -- Deploy Prometheus + Grafana + Loki monitoring stack.
|
||||||
|
Requires `--config` for environment settings.
|
||||||
|
|
||||||
|
See [`bin/README.md`](bin/README.md) for full documentation.
|
||||||
|
|
||||||
|
### [`envs/`](envs/)
|
||||||
|
|
||||||
|
Per-environment configuration, secrets, and deployment settings:
|
||||||
|
|
||||||
|
- **`beelink/`** -- Beelink mini PC target (LAN, vmbr0, VLAN 69, local-lvm)
|
||||||
|
- **`hetzner/`** -- Hetzner dedicated server target (WireGuard, vmbr1, local-zfs)
|
||||||
|
- **`setup/`** -- Host provisioning guide and interactive setup script
|
||||||
|
|
||||||
|
Each environment has: `env` (secrets), `proxmox.yaml` (connection),
|
||||||
|
lab YAML files (VM definitions), and service configs (`awx.yaml`, `haproxy.yaml`,
|
||||||
|
`observability.yaml`). See [`envs/README.md`](envs/README.md).
|
||||||
|
|
||||||
### [`ansible/`](ansible/)
|
### [`ansible/`](ansible/)
|
||||||
|
|
||||||
|
|
@ -43,18 +58,6 @@ API (not SSH) for all instance operations — works regardless of network topolo
|
||||||
- **`playbooks/decommission.yml`** -- Runs before Aether deletes an instance.
|
- **`playbooks/decommission.yml`** -- Runs before Aether deletes an instance.
|
||||||
Graceful service shutdown and decommission logging (best-effort).
|
Graceful service shutdown and decommission logging (best-effort).
|
||||||
|
|
||||||
### [`hetzner/`](hetzner/)
|
|
||||||
|
|
||||||
Setup guide and automation for deploying IncusOS labs on a Hetzner dedicated server:
|
|
||||||
|
|
||||||
- **`hetzner-setup.md`** -- Step-by-step guide: Proxmox install, private networking,
|
|
||||||
WireGuard tunnel, firewall lockdown, and API token creation.
|
|
||||||
- **`proxmox-setup`** -- Interactive helper script that automates the guide steps
|
|
||||||
over SSH. Configures repos, bridge, storage, WireGuard, firewall, and API tokens.
|
|
||||||
|
|
||||||
See also [`incusos/targets/`](incusos/targets/) for per-host connection configs
|
|
||||||
and lab definitions.
|
|
||||||
|
|
||||||
### [`notes/`](notes/)
|
### [`notes/`](notes/)
|
||||||
|
|
||||||
Guides and reference material (roughly in learning order):
|
Guides and reference material (roughly in learning order):
|
||||||
|
|
@ -89,19 +92,27 @@ Guides and reference material (roughly in learning order):
|
||||||
go install github.com/lxc/incus-os/incus-osd/cmd/flasher-tool@latest
|
go install github.com/lxc/incus-os/incus-osd/cmd/flasher-tool@latest
|
||||||
|
|
||||||
# Build a default IncusOS ISO with your client cert injected
|
# Build a default IncusOS ISO with your client cert injected
|
||||||
./incusos/incusos-iso
|
bin/incusos-iso
|
||||||
|
|
||||||
# Build for a specific architecture and application
|
# Build for a specific architecture and application
|
||||||
./incusos/incusos-iso --arch aarch64 --app operations-center --defaults
|
bin/incusos-iso --arch aarch64 --app operations-center --defaults
|
||||||
|
|
||||||
# Generate all common ISO variants at once
|
# Generate all common ISO variants at once
|
||||||
./incusos/incusos-iso --batch
|
bin/incusos-iso --batch
|
||||||
|
|
||||||
# Generate a standalone seed archive
|
# Generate a standalone seed archive
|
||||||
./incusos/incusos-seed --app incus --defaults --output my-seed.tar
|
bin/incusos-seed --app incus --defaults --output my-seed.tar
|
||||||
|
|
||||||
# Generate a SEED_DATA FAT image for external boot media
|
# Deploy a cluster on Hetzner
|
||||||
./incusos/incusos-seed --format fat --app incus --defaults --output seed.img
|
source envs/hetzner/env
|
||||||
|
bin/incusos-proxmox --proxmox envs/hetzner/proxmox.yaml envs/hetzner/lab-production.yaml
|
||||||
|
|
||||||
|
# Deploy AWX on Hetzner
|
||||||
|
bin/deploy-awx --config envs/hetzner/awx.yaml --deploy
|
||||||
|
|
||||||
|
# Deploy HAProxy on beelink
|
||||||
|
source envs/beelink/env
|
||||||
|
bin/deploy-haproxy --config envs/beelink/haproxy.yaml --deploy
|
||||||
```
|
```
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
|
||||||
|
|
@ -376,7 +376,7 @@ directory and current directory. Override with `--proxmox FILE`.
|
||||||
Copy the template to get started:
|
Copy the template to get started:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp incusos/examples/proxmox.yaml.example incusos/proxmox.yaml
|
cp bin/examples/proxmox.yaml.example envs/beelink/proxmox.yaml
|
||||||
# Edit with your Proxmox host, credentials, and storage settings
|
# Edit with your Proxmox host, credentials, and storage settings
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -557,25 +557,25 @@ default — prints what it will do, confirms, executes, and reports pass/fail.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Run all phases (deploy, single-node tests, cluster, workloads, migration)
|
# Run all phases (deploy, single-node tests, cluster, workloads, migration)
|
||||||
./incusos/lab-test examples/lab-cluster.yaml
|
bin/lab-test examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Deploy and verify only
|
# Deploy and verify only
|
||||||
./incusos/lab-test --phase deploy examples/lab-cluster.yaml
|
bin/lab-test --phase deploy examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Single-node workload tests
|
# Single-node workload tests
|
||||||
./incusos/lab-test --phase single examples/lab-cluster.yaml
|
bin/lab-test --phase single examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Form cluster from deployed nodes
|
# Form cluster from deployed nodes
|
||||||
./incusos/lab-test --phase cluster examples/lab-cluster.yaml
|
bin/lab-test --phase cluster examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Test migration and evacuation
|
# Test migration and evacuation
|
||||||
./incusos/lab-test --phase migrate examples/lab-cluster.yaml
|
bin/lab-test --phase migrate examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Full run without prompts
|
# Full run without prompts
|
||||||
./incusos/lab-test --yes examples/lab-cluster.yaml
|
bin/lab-test --yes examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Clean up test instances (keeps VMs)
|
# Clean up test instances (keeps VMs)
|
||||||
./incusos/lab-test --cleanup examples/lab-cluster.yaml
|
bin/lab-test --cleanup examples/lab-cluster.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
### Phases
|
### Phases
|
||||||
|
|
|
||||||
|
|
@ -140,17 +140,16 @@ key auth first (`ssh-copy-id root@<host>`).
|
||||||
### Step 2: Set Up Proxmox Connection
|
### Step 2: Set Up Proxmox Connection
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp incusos/examples/proxmox.yaml.example incusos/proxmox.yaml
|
cp bin/examples/proxmox.yaml.example envs/beelink/proxmox.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
Edit `incusos/proxmox.yaml` with your Proxmox host settings. This is
|
Edit `envs/beelink/proxmox.yaml` with your Proxmox host settings, or
|
||||||
auto-discovered by the scripts and avoids repeating credentials in each
|
use `--proxmox envs/beelink/proxmox.yaml` to point at it explicitly.
|
||||||
lab config.
|
|
||||||
|
|
||||||
### Step 3: Create a Test Config
|
### Step 3: Create a Test Config
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp incusos/examples/proxmox-minimal.yaml my-test.yaml
|
cp bin/examples/proxmox-minimal.yaml my-test.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
Edit `my-test.yaml` -- change only the host IP (or rely on proxmox.yaml):
|
Edit `my-test.yaml` -- change only the host IP (or rely on proxmox.yaml):
|
||||||
|
|
@ -176,7 +175,7 @@ Using VMID 900+ avoids clashing with existing VMs.
|
||||||
### Step 4: Dry Run
|
### Step 4: Dry Run
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./incusos/incusos-proxmox --dry-run my-test.yaml
|
bin/incusos-proxmox --dry-run my-test.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
**Verify in the output:**
|
**Verify in the output:**
|
||||||
|
|
@ -193,7 +192,7 @@ Using VMID 900+ avoids clashing with existing VMs.
|
||||||
### Step 5: Deploy (Single VM)
|
### Step 5: Deploy (Single VM)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./incusos/incusos-proxmox my-test.yaml
|
bin/incusos-proxmox my-test.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
**Watch the phases:**
|
**Watch the phases:**
|
||||||
|
|
@ -219,7 +218,7 @@ Using VMID 900+ avoids clashing with existing VMs.
|
||||||
After the deploy completes, verify with the built-in status command:
|
After the deploy completes, verify with the built-in status command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./incusos/incusos-proxmox --status my-test.yaml
|
bin/incusos-proxmox --status my-test.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
**Verify in the output:**
|
**Verify in the output:**
|
||||||
|
|
@ -256,7 +255,7 @@ check the Proxmox console — stale ARP entries can be misleading.
|
||||||
Re-run the deploy to verify the reconcile menu:
|
Re-run the deploy to verify the reconcile menu:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./incusos/incusos-proxmox my-test.yaml
|
bin/incusos-proxmox my-test.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
**Verify:** The script detects the existing VM and shows the interactive menu.
|
**Verify:** The script detects the existing VM and shows the interactive menu.
|
||||||
|
|
@ -265,7 +264,7 @@ Choose option 1 to run status checks without modifying anything.
|
||||||
Also test with `--yes` to verify it defaults to safe behavior:
|
Also test with `--yes` to verify it defaults to safe behavior:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./incusos/incusos-proxmox --yes my-test.yaml
|
bin/incusos-proxmox --yes my-test.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
**Verify:** Runs post-deployment checks, does NOT destroy.
|
**Verify:** Runs post-deployment checks, does NOT destroy.
|
||||||
|
|
@ -273,7 +272,7 @@ Also test with `--yes` to verify it defaults to safe behavior:
|
||||||
### Step 9: Clean Up the Test VM
|
### Step 9: Clean Up the Test VM
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./incusos/incusos-proxmox --cleanup my-test.yaml
|
bin/incusos-proxmox --cleanup my-test.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
- Confirms before destroying
|
- Confirms before destroying
|
||||||
|
|
@ -346,9 +345,9 @@ proxmox:
|
||||||
Deploy and verify:
|
Deploy and verify:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./incusos/incusos-proxmox --dry-run my-test.yaml # Should show pool in plan
|
bin/incusos-proxmox --dry-run my-test.yaml # Should show pool in plan
|
||||||
./incusos/incusos-proxmox my-test.yaml # VM created in pool
|
bin/incusos-proxmox my-test.yaml # VM created in pool
|
||||||
./incusos/incusos-proxmox --status my-test.yaml # Status scoped to pool
|
bin/incusos-proxmox --status my-test.yaml # Status scoped to pool
|
||||||
```
|
```
|
||||||
|
|
||||||
### Step 12: (Optional) Full Lab Deployment
|
### Step 12: (Optional) Full Lab Deployment
|
||||||
|
|
@ -356,10 +355,10 @@ Deploy and verify:
|
||||||
Once single-VM tests pass, deploy the full 4-VM lab:
|
Once single-VM tests pass, deploy the full 4-VM lab:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp incusos/examples/proxmox-lab.yaml my-lab.yaml
|
cp bin/examples/proxmox-lab.yaml my-lab.yaml
|
||||||
# Edit: change host IP, adjust start_vmid if needed
|
# Edit: change host IP, adjust start_vmid if needed
|
||||||
./incusos/incusos-proxmox --dry-run my-lab.yaml
|
bin/incusos-proxmox --dry-run my-lab.yaml
|
||||||
./incusos/incusos-proxmox my-lab.yaml
|
bin/incusos-proxmox my-lab.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
This deploys 1 Operations Center + 3 Incus nodes. After deployment:
|
This deploys 1 Operations Center + 3 Incus nodes. After deployment:
|
||||||
|
|
@ -379,44 +378,44 @@ VMs: single-node workloads, cluster formation, migration, and evacuation.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Check environment
|
# 1. Check environment
|
||||||
./incusos/incusos-proxmox --doctor
|
bin/incusos-proxmox --doctor
|
||||||
|
|
||||||
# 2. Deploy 3 nodes
|
# 2. Deploy 3 nodes
|
||||||
./incusos/incusos-proxmox --yes examples/lab-cluster.yaml
|
bin/incusos-proxmox --yes examples/lab-cluster.yaml
|
||||||
|
|
||||||
# 3. Add incus remotes for each node (use IPs from --status)
|
# 3. Add incus remotes for each node (use IPs from --status)
|
||||||
./incusos/incusos-proxmox --status examples/lab-cluster.yaml
|
bin/incusos-proxmox --status examples/lab-cluster.yaml
|
||||||
incus remote add incus-lab-01 <IP1> --accept-certificate
|
incus remote add incus-lab-01 <IP1> --accept-certificate
|
||||||
incus remote add incus-lab-02 <IP2> --accept-certificate
|
incus remote add incus-lab-02 <IP2> --accept-certificate
|
||||||
incus remote add incus-lab-03 <IP3> --accept-certificate
|
incus remote add incus-lab-03 <IP3> --accept-certificate
|
||||||
|
|
||||||
# 4. Run full lab validation
|
# 4. Run full lab validation
|
||||||
./incusos/lab-test --yes examples/lab-cluster.yaml
|
bin/lab-test --yes examples/lab-cluster.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
### Phase-by-Phase Testing
|
### Phase-by-Phase Testing
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Single-node workloads only (container + VM launch/exec)
|
# Single-node workloads only (container + VM launch/exec)
|
||||||
./incusos/lab-test --phase single --skip-deploy examples/lab-cluster.yaml
|
bin/lab-test --phase single --skip-deploy examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Cluster formation only
|
# Cluster formation only
|
||||||
./incusos/lab-test --phase cluster --skip-deploy examples/lab-cluster.yaml
|
bin/lab-test --phase cluster --skip-deploy examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Cluster workloads (scheduler placement + targeted placement)
|
# Cluster workloads (scheduler placement + targeted placement)
|
||||||
./incusos/lab-test --phase workload --skip-deploy examples/lab-cluster.yaml
|
bin/lab-test --phase workload --skip-deploy examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Migration and evacuation tests
|
# Migration and evacuation tests
|
||||||
./incusos/lab-test --phase migrate --skip-deploy examples/lab-cluster.yaml
|
bin/lab-test --phase migrate --skip-deploy examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Extended phases (require a working cluster):
|
# Extended phases (require a working cluster):
|
||||||
./incusos/lab-test --phase storage --skip-deploy examples/lab-cluster.yaml
|
bin/lab-test --phase storage --skip-deploy examples/lab-cluster.yaml
|
||||||
./incusos/lab-test --phase network --skip-deploy examples/lab-cluster.yaml
|
bin/lab-test --phase network --skip-deploy examples/lab-cluster.yaml
|
||||||
./incusos/lab-test --phase projects --skip-deploy examples/lab-cluster.yaml
|
bin/lab-test --phase projects --skip-deploy examples/lab-cluster.yaml
|
||||||
./incusos/lab-test --phase backup --skip-deploy examples/lab-cluster.yaml
|
bin/lab-test --phase backup --skip-deploy examples/lab-cluster.yaml
|
||||||
./incusos/lab-test --phase limits --skip-deploy examples/lab-cluster.yaml
|
bin/lab-test --phase limits --skip-deploy examples/lab-cluster.yaml
|
||||||
./incusos/lab-test --phase security --skip-deploy examples/lab-cluster.yaml
|
bin/lab-test --phase security --skip-deploy examples/lab-cluster.yaml
|
||||||
./incusos/lab-test --phase resilience --skip-deploy examples/lab-cluster.yaml
|
bin/lab-test --phase resilience --skip-deploy examples/lab-cluster.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
### Extended Test Phases
|
### Extended Test Phases
|
||||||
|
|
@ -660,17 +659,17 @@ and detailed test results.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Remove test instances only (keeps VMs and cluster)
|
# Remove test instances only (keeps VMs and cluster)
|
||||||
./incusos/lab-test --cleanup examples/lab-cluster.yaml
|
bin/lab-test --cleanup examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Destroy VMs only
|
# Destroy VMs only
|
||||||
./incusos/incusos-proxmox --cleanup examples/lab-cluster.yaml
|
bin/incusos-proxmox --cleanup examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Full cleanup: VMs + deployment ISO + seeds + remotes + cache
|
# Full cleanup: VMs + deployment ISO + seeds + remotes + cache
|
||||||
./incusos/incusos-proxmox --cleanup --deep --yes examples/lab-cluster.yaml
|
bin/incusos-proxmox --cleanup --deep --yes examples/lab-cluster.yaml
|
||||||
|
|
||||||
# Pool-wide: destroy ALL managed VMs (no config file needed)
|
# Pool-wide: destroy ALL managed VMs (no config file needed)
|
||||||
./incusos/incusos-proxmox --cleanup-all --yes
|
bin/incusos-proxmox --cleanup-all --yes
|
||||||
./incusos/incusos-proxmox --cleanup-all --deep --yes # nuke everything
|
bin/incusos-proxmox --cleanup-all --deep --yes # nuke everything
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
@ -707,14 +706,14 @@ openssl pkcs12 -export \
|
||||||
-out ~/.config/incus/client.pfx
|
-out ~/.config/incus/client.pfx
|
||||||
|
|
||||||
# 4. Verify
|
# 4. Verify
|
||||||
./incusos/incusos-proxmox --doctor
|
bin/incusos-proxmox --doctor
|
||||||
```
|
```
|
||||||
|
|
||||||
### Step 1: Deploy OC Server
|
### Step 1: Deploy OC Server
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./incusos/incusos-proxmox --yes incusos/examples/lab-oc-deploy.yaml
|
bin/incusos-proxmox --yes bin/examples/lab-oc-deploy.yaml
|
||||||
./incusos/incusos-proxmox --status incusos/examples/lab-oc-deploy.yaml
|
bin/incusos-proxmox --status bin/examples/lab-oc-deploy.yaml
|
||||||
# Note OC_IP from output
|
# Note OC_IP from output
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -763,9 +762,9 @@ ls -lh /tmp/IncusOS-oc.iso # ~3.4 GB
|
||||||
### Step 6: Deploy Nodes (Hybrid)
|
### Step 6: Deploy Nodes (Hybrid)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./incusos/incusos-proxmox --iso /tmp/IncusOS-oc.iso --yes \
|
bin/incusos-proxmox --iso /tmp/IncusOS-oc.iso --yes \
|
||||||
incusos/examples/lab-oc-nodes.yaml
|
bin/examples/lab-oc-nodes.yaml
|
||||||
./incusos/incusos-proxmox --status incusos/examples/lab-oc-nodes.yaml
|
bin/incusos-proxmox --status bin/examples/lab-oc-nodes.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
`incusos-proxmox` creates VMs, uploads the OC ISO to ide2, generates per-node
|
`incusos-proxmox` creates VMs, uploads the OC ISO to ide2, generates per-node
|
||||||
|
|
@ -858,10 +857,10 @@ incus delete oc-node-01:test-ct --force 2>/dev/null
|
||||||
incus delete oc-node-01:test-vm --force 2>/dev/null
|
incus delete oc-node-01:test-vm --force 2>/dev/null
|
||||||
|
|
||||||
# Nodes
|
# Nodes
|
||||||
./incusos/incusos-proxmox --cleanup --deep --yes incusos/examples/lab-oc-nodes.yaml
|
bin/incusos-proxmox --cleanup --deep --yes bin/examples/lab-oc-nodes.yaml
|
||||||
|
|
||||||
# OC server
|
# OC server
|
||||||
./incusos/incusos-proxmox --cleanup --deep --yes incusos/examples/lab-oc-deploy.yaml
|
bin/incusos-proxmox --cleanup --deep --yes bin/examples/lab-oc-deploy.yaml
|
||||||
|
|
||||||
# Remotes
|
# Remotes
|
||||||
operations-center remote remove oc-lab 2>/dev/null
|
operations-center remote remove oc-lab 2>/dev/null
|
||||||
|
|
|
||||||
|
|
@ -103,6 +103,7 @@ ${BOLD}ACTIONS${RESET}
|
||||||
--doctor Diagnose common issues
|
--doctor Diagnose common issues
|
||||||
|
|
||||||
${BOLD}OPTIONS${RESET}
|
${BOLD}OPTIONS${RESET}
|
||||||
|
-c, --config FILE Load environment config from YAML file (see envs/)
|
||||||
-r, --remote NAME Incus remote (default: ${CLUSTER_REMOTE})
|
-r, --remote NAME Incus remote (default: ${CLUSTER_REMOTE})
|
||||||
--nodes NODE1,NODE2 Manual node list (skip auto-discovery)
|
--nodes NODE1,NODE2 Manual node list (skip auto-discovery)
|
||||||
--monitoring-target NODE Node to deploy monitoring container on (default: ${MONITORING_TARGET})
|
--monitoring-target NODE Node to deploy monitoring container on (default: ${MONITORING_TARGET})
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# proxmox.yaml.example - Proxmox connection config template
|
# proxmox.yaml.example - Proxmox connection config template
|
||||||
#
|
#
|
||||||
# Copy to incusos/proxmox.yaml and edit with your settings.
|
# Copy to envs/<env>/proxmox.yaml and edit with your settings.
|
||||||
# This file is auto-discovered by incusos-proxmox and lab-test.
|
# Use with: bin/incusos-proxmox --proxmox envs/<env>/proxmox.yaml
|
||||||
#
|
#
|
||||||
# Lab config files (lab-cluster.yaml, lab-oc.yaml, etc.) reference
|
# Lab config files (lab-cluster.yaml, lab-oc.yaml, etc.) reference
|
||||||
# this for connection settings, so you only need to change credentials
|
# this for connection settings, so you only need to change credentials
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
#
|
#
|
||||||
# Storage: local-zfs (ZFS pool on dedicated disks).
|
# Storage: local-zfs (ZFS pool on dedicated disks).
|
||||||
#
|
#
|
||||||
# See hetzner/hetzner-setup.md for the full setup guide.
|
# See envs/hetzner/setup/hetzner-setup.md for the full setup guide.
|
||||||
|
|
||||||
host: 10.10.0.1 # Proxmox host IP (via WireGuard, on vmbr1)
|
host: 10.10.0.1 # Proxmox host IP (via WireGuard, on vmbr1)
|
||||||
method: api # api recommended (WireGuard may add SSH latency)
|
method: api # api recommended (WireGuard may add SSH latency)
|
||||||
|
|
|
||||||
|
|
@ -51,12 +51,12 @@ and API tokens for `incusos-proxmox`.
|
||||||
### 4. Deploy IncusOS VMs
|
### 4. Deploy IncusOS VMs
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp incusos/targets/hetzner/proxmox.yaml.example incusos/targets/hetzner/proxmox.yaml
|
cp envs/hetzner/proxmox.yaml.example envs/hetzner/proxmox.yaml
|
||||||
# Fill in the API token from step 3
|
# Fill in the API token from step 3
|
||||||
|
|
||||||
export PROXMOX_TOKEN_SECRET="<token>"
|
export PROXMOX_TOKEN_SECRET="<token>"
|
||||||
incusos-proxmox --proxmox incusos/targets/hetzner/proxmox.yaml \
|
bin/incusos-proxmox --proxmox envs/hetzner/proxmox.yaml \
|
||||||
incusos/targets/hetzner/lab-cluster.yaml
|
envs/hetzner/lab-cluster.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
## What's in this directory
|
## What's in this directory
|
||||||
|
|
@ -92,5 +92,5 @@ Internet
|
||||||
|
|
||||||
## Related files
|
## Related files
|
||||||
|
|
||||||
- [`incusos/targets/hetzner/`](../incusos/targets/hetzner/) -- Proxmox connection configs and lab definitions
|
- [`envs/hetzner/`](../) -- Proxmox connection configs and lab definitions
|
||||||
- [`incusos/targets/README.md`](../incusos/targets/README.md) -- Multi-target concept explanation
|
- [`envs/README.md`](../../README.md) -- Multi-target concept explanation
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ Hetzner dedicated (256 GB RAM, 32+ cores)
|
||||||
- WireGuard tunnel active (10.10.99.x → 10.10.0.x accessible)
|
- WireGuard tunnel active (10.10.99.x → 10.10.0.x accessible)
|
||||||
- This repository cloned locally
|
- This repository cloned locally
|
||||||
- `env` file populated (see below)
|
- `env` file populated (see below)
|
||||||
- `incusos/targets/hetzner/proxmox.yaml` filled in
|
- `envs/hetzner/proxmox.yaml` filled in
|
||||||
- Incus client installed on workstation
|
- Incus client installed on workstation
|
||||||
|
|
||||||
### env file
|
### env file
|
||||||
|
|
@ -56,8 +56,8 @@ export AETHER_ADMIN_PASSWORD="admin1234"
|
||||||
### proxmox.yaml
|
### proxmox.yaml
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp incusos/targets/hetzner/proxmox.yaml.example \
|
cp envs/hetzner/proxmox.yaml.example \
|
||||||
incusos/targets/hetzner/proxmox.yaml
|
envs/hetzner/proxmox.yaml
|
||||||
# Fill in: host, node name, token_id, storage
|
# Fill in: host, node name, token_id, storage
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -68,9 +68,9 @@ cp incusos/targets/hetzner/proxmox.yaml.example \
|
||||||
```bash
|
```bash
|
||||||
source env
|
source env
|
||||||
|
|
||||||
incusos/incusos-proxmox \
|
bin/incusos-proxmox \
|
||||||
--proxmox incusos/targets/hetzner/proxmox.yaml \
|
--proxmox envs/hetzner/proxmox.yaml \
|
||||||
incusos/targets/hetzner/lab-production.yaml
|
envs/hetzner/lab-production.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
**What gets deployed:**
|
**What gets deployed:**
|
||||||
|
|
@ -88,8 +88,8 @@ interrupt. Monitor progress:
|
||||||
```bash
|
```bash
|
||||||
# Screenshot VM console (requires PROXMOX_ROOT_PASSWORD in env)
|
# Screenshot VM console (requires PROXMOX_ROOT_PASSWORD in env)
|
||||||
source env
|
source env
|
||||||
incusos/helpers/proxmox-screenshot 910 # hz-oc
|
bin/helpers/proxmox-screenshot 910 # hz-oc
|
||||||
incusos/helpers/proxmox-screenshot 911 # hz-node-01
|
bin/helpers/proxmox-screenshot 911 # hz-node-01
|
||||||
```
|
```
|
||||||
|
|
||||||
Wait until all VMs are reachable:
|
Wait until all VMs are reachable:
|
||||||
|
|
@ -324,7 +324,7 @@ export AETHER_ADMIN_PASSWORD="admin1234"
|
||||||
|
|
||||||
### 6.1 Create config file
|
### 6.1 Create config file
|
||||||
|
|
||||||
Save as `incusos/targets/hetzner/hz-haproxy.yaml` (or `/tmp/hz-deploy.yaml`):
|
Save as `envs/hetzner/hz-haproxy.yaml` (or `/tmp/hz-deploy.yaml`):
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
haproxy:
|
haproxy:
|
||||||
|
|
@ -360,14 +360,14 @@ Alternatively, use the script (requires the UI steps above for first build):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
source env
|
source env
|
||||||
incusos/deploy-haproxy -c /tmp/hz-deploy.yaml --deploy --skip-image
|
bin/deploy-haproxy -c /tmp/hz-deploy.yaml --deploy --skip-image
|
||||||
```
|
```
|
||||||
|
|
||||||
### 6.3 Full deploy
|
### 6.3 Full deploy
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
source env
|
source env
|
||||||
incusos/deploy-haproxy -c /tmp/hz-deploy.yaml --deploy
|
bin/deploy-haproxy -c /tmp/hz-deploy.yaml --deploy
|
||||||
```
|
```
|
||||||
|
|
||||||
This:
|
This:
|
||||||
|
|
@ -378,7 +378,7 @@ This:
|
||||||
On subsequent runs (if backends already exist):
|
On subsequent runs (if backends already exist):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
incusos/deploy-haproxy -c /tmp/hz-deploy.yaml --deploy \
|
bin/deploy-haproxy -c /tmp/hz-deploy.yaml --deploy \
|
||||||
--skip-backends --skip-image
|
--skip-backends --skip-image
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -398,7 +398,7 @@ for i in $(seq 1 6); do curl -s http://10.10.0.200/ | grep 'Backend:'; done
|
||||||
|
|
||||||
### 7.1 Create config file
|
### 7.1 Create config file
|
||||||
|
|
||||||
Save as `incusos/targets/hetzner/awx.yaml`:
|
Save as `envs/hetzner/awx.yaml`:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
awx:
|
awx:
|
||||||
|
|
@ -424,7 +424,7 @@ awx:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
source env
|
source env
|
||||||
incusos/deploy-awx -c incusos/targets/hetzner/awx.yaml --deploy
|
bin/deploy-awx -c envs/hetzner/awx.yaml --deploy
|
||||||
```
|
```
|
||||||
|
|
||||||
This deploys a Debian 12 VM with K3s + AWX Operator. Takes ~20 minutes.
|
This deploys a Debian 12 VM with K3s + AWX Operator. Takes ~20 minutes.
|
||||||
|
|
@ -433,7 +433,7 @@ AWX will be at `http://10.10.0.122:30080`.
|
||||||
On partial failure (e.g. network issue mid-deploy), resume:
|
On partial failure (e.g. network issue mid-deploy), resume:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
incusos/deploy-awx -c incusos/targets/hetzner/awx.yaml --deploy --resume
|
bin/deploy-awx -c envs/hetzner/awx.yaml --deploy --resume
|
||||||
# Skips VM creation and K3s install phases, jumps to AWX Operator phase
|
# Skips VM creation and K3s install phases, jumps to AWX Operator phase
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -459,7 +459,7 @@ incus exec hz-cluster:awx -- rm -f \
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
source env
|
source env
|
||||||
incusos/deploy-awx -c incusos/targets/hetzner/awx.yaml --configure
|
bin/deploy-awx -c envs/hetzner/awx.yaml --configure
|
||||||
```
|
```
|
||||||
|
|
||||||
This creates:
|
This creates:
|
||||||
|
|
@ -470,7 +470,7 @@ This creates:
|
||||||
Get AWX admin password:
|
Get AWX admin password:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
incusos/deploy-awx -c /tmp/hz-awx.yaml --status
|
bin/deploy-awx -c /tmp/hz-awx.yaml --status
|
||||||
```
|
```
|
||||||
|
|
||||||
### 7.4 Join Aether
|
### 7.4 Join Aether
|
||||||
|
|
@ -479,7 +479,7 @@ Generate an AWX API token for Aether:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
source env
|
source env
|
||||||
incusos/deploy-awx -c incusos/targets/hetzner/awx.yaml --join-aether
|
bin/deploy-awx -c envs/hetzner/awx.yaml --join-aether
|
||||||
# Prints the PAT token and template IDs
|
# Prints the PAT token and template IDs
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -533,7 +533,7 @@ the AWX endpoint, post-deploy, and decommission templates.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
source env
|
source env
|
||||||
incusos/deploy-observability \
|
bin/deploy-observability \
|
||||||
--remote hz-cluster \
|
--remote hz-cluster \
|
||||||
--monitoring-target hz-node-01 \
|
--monitoring-target hz-node-01 \
|
||||||
--monitoring-ip 10.10.10.70 \
|
--monitoring-ip 10.10.10.70 \
|
||||||
|
|
@ -649,7 +649,7 @@ On partial failure (phases 6-9 only), resume:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
source env
|
source env
|
||||||
incusos/deploy-observability \
|
bin/deploy-observability \
|
||||||
--remote hz-cluster \
|
--remote hz-cluster \
|
||||||
--monitoring-target hz-node-01 \
|
--monitoring-target hz-node-01 \
|
||||||
--monitoring-ip 10.10.10.70 \
|
--monitoring-ip 10.10.10.70 \
|
||||||
|
|
@ -836,11 +836,11 @@ incus exec hz-cluster:nginx-lb-01 -- ip a
|
||||||
# Force destroy all VMs (no nice cleanup needed for test lab)
|
# Force destroy all VMs (no nice cleanup needed for test lab)
|
||||||
source env
|
source env
|
||||||
for vmid in 910 911 912 913; do
|
for vmid in 910 911 912 913; do
|
||||||
incusos/helpers/proxmox-api POST \
|
bin/helpers/proxmox-api POST \
|
||||||
"/nodes/aether-lab/qemu/${vmid}/status/stop" \
|
"/nodes/aether-lab/qemu/${vmid}/status/stop" \
|
||||||
'{"forceStop":1}' 2>/dev/null || true
|
'{"forceStop":1}' 2>/dev/null || true
|
||||||
sleep 3
|
sleep 3
|
||||||
incusos/helpers/proxmox-api DELETE \
|
bin/helpers/proxmox-api DELETE \
|
||||||
"/nodes/aether-lab/qemu/${vmid}?purge=1&destroy-unreferenced-disks=1"
|
"/nodes/aether-lab/qemu/${vmid}?purge=1&destroy-unreferenced-disks=1"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -295,7 +295,7 @@ Each step prompts for confirmation. Use `--yes` to skip prompts, or
|
||||||
`--skip-repos`, `--skip-storage`, etc. to skip individual steps.
|
`--skip-repos`, `--skip-storage`, etc. to skip individual steps.
|
||||||
|
|
||||||
At the end, the script prints:
|
At the end, the script prints:
|
||||||
- A ready-to-use `proxmox.yaml` config for `incusos/targets/hetzner/`
|
- A ready-to-use `proxmox.yaml` config for `envs/hetzner/`
|
||||||
- An `env` file snippet with the API token
|
- An `env` file snippet with the API token
|
||||||
- A WireGuard client config to save on your workstation
|
- A WireGuard client config to save on your workstation
|
||||||
|
|
||||||
|
|
@ -330,15 +330,15 @@ Host hetzner-lab-wg
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Copy and fill in the connection config
|
# Copy and fill in the connection config
|
||||||
cp incusos/targets/hetzner/proxmox.yaml.example incusos/targets/hetzner/proxmox.yaml
|
cp envs/hetzner/proxmox.yaml.example envs/hetzner/proxmox.yaml
|
||||||
|
|
||||||
# Set the API token
|
# Set the API token
|
||||||
export PROXMOX_TOKEN_SECRET="<token from proxmox-setup output>"
|
export PROXMOX_TOKEN_SECRET="<token from proxmox-setup output>"
|
||||||
|
|
||||||
# Dry run -- verify correct bridge, IPs, storage
|
# Dry run -- verify correct bridge, IPs, storage
|
||||||
incusos-proxmox --dry-run \
|
bin/incusos-proxmox --dry-run \
|
||||||
--proxmox incusos/targets/hetzner/proxmox.yaml \
|
--proxmox envs/hetzner/proxmox.yaml \
|
||||||
incusos/targets/hetzner/lab-cluster.yaml
|
envs/hetzner/lab-cluster.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
Confirm the output shows: `vmbr1` bridge, `10.10.0.x` IPs, `local-zfs`
|
Confirm the output shows: `vmbr1` bridge, `10.10.0.x` IPs, `local-zfs`
|
||||||
|
|
|
||||||
|
|
@ -247,7 +247,7 @@ ${BOLD}PREREQUISITES${RESET}
|
||||||
|
|
||||||
${BOLD}SEE ALSO${RESET}
|
${BOLD}SEE ALSO${RESET}
|
||||||
hetzner/hetzner-setup.md Manual installation guide
|
hetzner/hetzner-setup.md Manual installation guide
|
||||||
incusos/targets/hetzner/ Target config files
|
envs/hetzner/ Target config files
|
||||||
EOF
|
EOF
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
@ -1302,7 +1302,7 @@ show_summary() {
|
||||||
step "Summary"
|
step "Summary"
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${BOLD}proxmox.yaml for incusos/targets/hetzner/:${RESET}"
|
echo -e "${BOLD}proxmox.yaml for envs/hetzner/:${RESET}"
|
||||||
echo ""
|
echo ""
|
||||||
echo " host: ${SUBNET_GW}"
|
echo " host: ${SUBNET_GW}"
|
||||||
echo " method: api"
|
echo " method: api"
|
||||||
|
|
@ -1327,11 +1327,11 @@ show_summary() {
|
||||||
echo ""
|
echo ""
|
||||||
echo " 1. Save WireGuard client config and connect"
|
echo " 1. Save WireGuard client config and connect"
|
||||||
echo " 2. Copy proxmox.yaml.example and fill in credentials:"
|
echo " 2. Copy proxmox.yaml.example and fill in credentials:"
|
||||||
echo " cp incusos/targets/hetzner/proxmox.yaml.example incusos/targets/hetzner/proxmox.yaml"
|
echo " cp envs/hetzner/proxmox.yaml.example envs/hetzner/proxmox.yaml"
|
||||||
echo " 3. Test with dry run:"
|
echo " 3. Test with dry run:"
|
||||||
echo " export PROXMOX_TOKEN_SECRET=\"\$HETZNER_PROXMOX_TOKEN_SECRET\""
|
echo " export PROXMOX_TOKEN_SECRET=\"\$HETZNER_PROXMOX_TOKEN_SECRET\""
|
||||||
echo " incusos-proxmox --dry-run --proxmox incusos/targets/hetzner/proxmox.yaml \\"
|
echo " bin/incusos-proxmox --dry-run --proxmox envs/hetzner/proxmox.yaml \\"
|
||||||
echo " incusos/targets/hetzner/lab-cluster.yaml"
|
echo " envs/hetzner/lab-cluster.yaml"
|
||||||
echo ""
|
echo ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue