Skip to content

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:

  1. --yes flag must be passed.
  2. ARGOS_DEMO_SEED=1 env var must be set.
  3. ARGOS_DB_PATH must NOT contain the substring argos-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:

  1. Capture argos-prod baseline (container IDs + StartedAt).
  2. Run init.sh (creates demo stack, seeds DB).
  3. Assert demo containers healthy + panel /healthz 2xx.
  4. Assert all 10 surfaces visible (re-runs seed, asserts summary line; uses argos channel inspect to verify notification channel surface).
  5. Assert argos-prod baseline UNCHANGED (mid-test).
  6. Run teardown.sh --purge.
  7. Assert demo containers + volumes + dir all gone.
  8. 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 (demo subcommand dispatch + help; argosVersion bumped 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.