Files
Sergey Antropoff 48df10b17e Prepare 0.1.0 for lab release: durable handlers, HTTP Compose, CI, and pulumi-tests.
- Harden DB-backed handlers and seed profiles; align client wire shapes for
  cluster resources, QEMU config, and node SSL fields
- Serve plain HTTP on Compose :8006; keep TLS optional (--profile tls) and
  terminate HTTPS at Kubernetes Ingress
- Add pulumi-tests (full contract surface majors 6–9 + BPG lifecycle) and
  make pulumi-tests
- Ship bilingual docs, CHANGELOG, SECURITY, CONTRIBUTING, and GitHub Actions
  (make ci + Compose/Helm validation)
2026-07-18 04:18:05 +03:00

4.7 KiB

Language / Язык: English | Русский

Operations

Day-2 commands

make up                 # start stack
make down               # stop stack
make restart
make logs
make dev                # foreground reload-oriented workflow
make db-migrate         # idempotent migrations
make seed PROFILE=small # atomic reseed
make shell              # interactive tools container

Migrations

Ordered SQL files apply transactionally and record SHA-256 checksums. Re-running make db-migrate is safe. Altering an already-applied migration is rejected. /health/ready stays unavailable until the latest packaged migration is present. Task workers retry claims after migrations catch up.

Reseed

make seed PROFILE=medium

Reseed replaces mutable simulation state. External automation state (Terraform state files, Pulumi stacks, Ansible inventories that encode VMIDs) may then drift — refresh or recreate those side channels.

Worker recovery

Workers use PostgreSQL leases. After a crash or restart, expired leases are reclaimed and incomplete work can resume safely. Tunables: TASK_WORKER_CONCURRENCY, TASK_LEASE_SECONDS, SIMULATION_TIME_SCALE.

Changing the default API major

  1. Prefer setting CONTRACT_SNAPSHOT to the desired bundled/normalized snapshot for cold start (Compose / k8s / OpenShift).
  2. Use Web UI apply or POST /ui/api/contract/apply?major=N for temporary process-local switches.

Backing up lab state

PostgreSQL is the system of record. Use normal Postgres backup/restore (pg_dump / volume snapshots) if you need to preserve a seeded laboratory. Application containers are disposable when the database volume remains.

Publishing to Docker Hub

make release builds the runtime image (production target — not the local bind-mounted dev image) and pushes it to Docker Hub:

docker login   # once; account must own or can push to DOCKERHUB_USER
make release

Defaults:

Variable Default Meaning
DOCKERHUB_USER inecs Docker Hub namespace/org
IMAGE_NAME proxmox-api-simulator Repository name
VERSION from pyproject.toml Image tag
PUSH_LATEST 1 Also tag/push :latest

Examples:

make release
make release VERSION=0.2.0
make release DOCKERHUB_USER=myorg PUSH_LATEST=0
make release-build   # build/tag locally without pushing

Published tags:

  • inecs/proxmox-api-simulator:<version>
  • inecs/proxmox-api-simulator:latest (unless PUSH_LATEST=0)

After publishing, paste Docker Hub overview into the Hub repository description if it drifted, and keep GitHub “About” wording aligned (“stateful Proxmox VE API simulator” — not a thin mock).

CI on GitHub Actions runs make ci plus Compose/Helm validation on every push and PR to main (see .github/workflows/ci.yml).

Quick start with the published compose file

docker-compose.release.yml pulls the Hub runtime image and starts PostgreSQL + migrate + simulator:

docker compose -f docker-compose.release.yml up -d
docker compose -f docker-compose.release.yml run --rm --entrypoint python \
  simulator -m app.simulation.seed_cli

curl -sS http://localhost:8006/health/ready
open http://localhost:8006/

Helpers from a git checkout:

make release-up
make release-seed PROFILE=small
make release-down

Useful overrides:

Variable Default Meaning
DOCKER_IMAGE inecs/proxmox-api-simulator Image repository
IMAGE_TAG latest Tag to pull
SIMULATOR_PORT 8006 Host HTTP port (simulator)
TICKET_SIGNING_KEY lab default Change outside toy labs
POSTGRES_PASSWORD proxmox DB password

Both development and release Compose publish HTTP :8006 on the host (same port as real PVE, which uses HTTPS). Optional HTTPS for proxmoxer-style clients: docker compose --profile tls on host :8443. See Ports and TLS.

For Kubernetes with public TLS (cert-manager / Let's Encrypt), use the Helm chart — see Kubernetes / Helm.

Upgrades

  1. Pull / rebuild images (make install / make docker-build as appropriate).
  2. Run migrations.
  3. Confirm /health/ready.
  4. Re-check /admin/compatibility and /api2/json/version.
  5. Re-run make test-compatibility if you validate external clients in CI (seeds the medium profile — pve1/pve2/pve3 — for migration smoke).

Resetting a lab

make seed PROFILE=small
# or via UI: unload demo → minimal, then seed again

For a hard database reset use make db-reset (destructive — see Makefile help).