v1.3.35 -- Standalone demo environment¶
A new release that ships a parallel demo stack so operators can capture screenshots, demo argos to someone, or test new features against a populated DB without polluting an existing prod deployment. Zero impact on argos-prod by construction: separate containers, volumes, network, ports, and DB.
This release closes the v1.3.34 deferred-screenshot gap (10 captures + 3 re-takes) by giving the operator a populated panel they can screenshot without sanitization gymnastics on real operator data.
Why standalone¶
The original problem from the v1.3.34 audit: 13 panel screenshots needed re-capture, but the live prod stack contained operator- specific data (real domains, real banned IPs) that can't be committed to a public docs portal. v1.3.35's ~/argos-demo/ runs on the same host with synthetic data only: RFC 5737 IP space, *.example.{com,org,net} hostnames, obviously-fake credentials, demo: markers in every name/reason field where the schema permits.
Non-interference contract¶
| argos-prod | argos-demo | |
|---|---|---|
| Containers | argos-prod-* | argos-demo-* |
| Volumes | argos_prod_* | argos_demo_* |
| Network | argos_prod_net | argos-demo-net |
| Compose project | argos-edge | argos-demo |
| Panel port | 0.0.0.0:9180 | 127.0.0.1:9181 |
| Caddy ports | 0.0.0.0:80, :443 | 127.0.0.1:8090 |
| CrowdSec ports | container-network only | container-network only |
| DB | argos_prod_data | argos_demo_data |
| LAPI | inside argos_prod_net | inside argos-demo-net |
The demo binds Caddy + Panel to 127.0.0.1 so the demo never leaks onto the LAN; reach it via SSH tunnel from a remote workstation if needed.
What ships¶
argos demo seed + argos demo clear CLI¶
Two new subcommands in backend/cmd/argos/cli_demo.go. Same shape as the existing argos channel inspect (added in v1.3.34.2): refuse-to-run gates + idempotent SQL.
Triple-key safety to prevent ever wiping the prod DB:
--yesflag must be passed.ARGOS_DEMO_SEED=1env var must be set.ARGOS_DB_PATHmust NOT contain the substringargos-prod.
A copy-paste of argos demo seed --yes into a prod container shell would fail at gate 2 (env var unset) and gate 3 (path contains argos-prod) — twice over.
seed populates 6 panel-DB surfaces directly via SQL:
| Surface | Count | Idempotency |
|---|---|---|
| Hosts (with target_groups + targets via FK) | 8 | INSERT OR IGNORE on UNIQUE name |
| Country ban expansions | 5 | INSERT OR IGNORE on UNIQUE country_code |
| Whitelist entries | 4 | INSERT OR IGNORE on UNIQUE(scope,value) |
| Notification channels | 3 | INSERT OR IGNORE on UNIQUE name |
| Settings (AppSec tuning + drift state + disabled scenarios) | 6 keys | INSERT OR REPLACE |
| Activity log entries | 15 per run | append (not idempotent — by design) |
clear removes every row tagged with demo: markers. Settings are deliberately untouched (the only way to undo them is via teardown.sh --purge which removes the volume entirely).
Demo scaffold under scripts/demo/¶
| File | Role |
|---|---|
init.sh | Materialises ~/argos-demo/, generates .env with random secrets, brings stack up, seeds panel DB, seeds 10 demo banned IPs into LAPI via cscli, prints access URL. |
teardown.sh | docker compose down -v on the demo project (containers + volumes); --purge also removes ~/argos-demo/. Sanity-checks that argos-prod containers are still running at the end. |
docker-compose.override.yml | Renames every container / volume / network to argos-demo-* / argos_demo_* / argos-demo-net. Pins image: argos-prod-argos:1.3.35 (same image prod runs after make build-prod-image) with build: !reset. Localhost-only port binds. Sets ARGOS_INITIAL_ADMIN_USER=demo + password demo1234. |
README.md | Operator-facing quick reference. |
The init script is idempotent: re-running it on an already-up demo stack does nothing destructive.
Smoke scripts/smoke/demo-environment.sh¶
EFFECT smoke for the full lifecycle. Refuses to run without --yes. Seven phases:
- Capture argos-prod baseline (container IDs + StartedAt).
- Run
init.sh(creates demo stack, seeds DB). - Assert demo containers healthy + panel
/healthz2xx. - Assert all 10 surfaces visible (re-runs seed, asserts summary line; uses
argos channel inspectto verify notification channel surface). - Assert argos-prod baseline UNCHANGED (mid-test).
- Run
teardown.sh --purge. - Assert demo containers + volumes + dir all gone.
- Assert argos-prod baseline STILL UNCHANGED (final).
Phases 0/4/7 form the non-interference triple-check. Self- executed against the live host pre-tag for v1.3.35; PASS.
Documentation¶
docs/operations/demo-environment.md — full operator reference: the non-interference contract, port mapping table, what gets seeded, sanitization commitments, the triple-key safety detail, the screenshot-capture coverage list. Linked into the mkdocs nav under Operations.
Version bump¶
argosVersion and frontend/package.json both bumped from 1.3.34.3 to 1.3.35. The make build-prod-image flow from v1.3.34.3 produces the new image; both prod and demo run it.
Mid-impl gotchas (caught + fixed pre-tag)¶
Gotcha 1 — schema drift. First seed pass used hosts(domain, upstream_url, ...) which migration 005 dropped in favour of the target_groups + targets split. Fix: seed each demo host as a 3-row insert (target_group + target + host with FK) and resolve target_group_id via SELECT after INSERT OR IGNORE. Caught by the live smoke; the unit tests were missing the target_groups + targets schema and silently ran against an outdated mirror — both have been corrected.
Gotcha 2 — sync timing. make build-prod-image runs the docker build from ~/argos-prod, not the live source repo. First image build picked up the un-sync'd source (no demo CLI), producing an image that fell through to server mode on /argos demo seed. Fix: always run scripts/sync-prod.sh --yes (or make deploy-prod which chains both) before make build-prod-image when the source has changed since the last sync. Documented in docs/operations/deployment.md.
Gotcha 3 — initial admin password length. First override shipped with ARGOS_INITIAL_ADMIN_PASSWORD=demo123 (7 chars); auth.HashPassword requires ≥8. Fix: demo1234 (8 chars).
Smoke gate¶
The scripts/smoke/demo-environment.sh --yes smoke is the EFFECT gate for this release. Self-executed against the live host pre-commit; PASS. The seven-phase output (most recent run):
phase 0: capturing argos-prod baseline... PASS
phase 1: running scripts/demo/init.sh... PASS
phase 2: demo health checks... PASS
phase 3: asserting 10 surfaces populated... PASS
phase 4: prod stack non-interference (mid)... PASS
phase 5: running scripts/demo/teardown.sh... PASS
phase 6: demo cleanup checks... PASS
phase 7: prod stack non-interference (final)... PASS
scripts/check-no-personal-data.sh clean. mkdocs build --strict clean. go test ./... clean (10 new demo CLI tests in cli_demo_test.go covering safety gates + idempotency + scoped-clear).
Files changed¶
backend/cmd/argos/main.go(demosubcommand dispatch + help;argosVersionbumped to 1.3.35)backend/cmd/argos/cli_demo.go(new)backend/cmd/argos/cli_demo_test.go(new, 10 tests)frontend/package.json(version 1.3.35)scripts/demo/init.sh(new)scripts/demo/teardown.sh(new)scripts/demo/docker-compose.override.yml(new)scripts/demo/README.md(new)scripts/smoke/demo-environment.sh(new)docs/operations/demo-environment.md(new)docs/release-notes/v1.3.35.md(this file)CHANGELOG.md,mkdocs.yml
Upgrade¶
cd ~/argos-edge
git pull
make sync-prod && make build-prod-image
# (or simply: make deploy-prod, which chains both + recreates prod)
# Bring demo up:
scripts/demo/init.sh
# Browser: http://localhost:9181 login: demo / demo1234
For the screenshot capture session:
scripts/demo/init.sh
# capture screenshots from http://localhost:9181
scripts/demo/teardown.sh --purge # full cleanup when done
What this enables¶
After v1.3.35 + the operator's screenshot capture session, the v1.3.34 deferred-screenshot list (10 new + 3 re-takes) closes. The docs portal will render with embedded captures showing real panel UI populated with synthetic data — no more <!-- TODO: post-v1.3.34 capture session --> placeholders in the README.
The seed CLI is also reusable for any future "I need to demo this surface" need: bring the demo stack up, capture, tear down. Zero impact on prod.