veza/scripts
senke cf38ff2b7d feat(bootstrap): two-host deploy-pipeline bootstrap with idempotent verify
Replace the long manual checklist (RUNBOOK_DEPLOY_BOOTSTRAP) with
six scripts. Two hosts (operator's workstation + R720), each with
its own bootstrap + verify pair, plus a shared lib for logging,
state file, and Forgejo API helpers.

Files :
  scripts/bootstrap/
   ├── lib.sh                  — sourced by all (logging, error trap,
   │                             phase markers, idempotent state file,
   │                             Forgejo API helpers : forgejo_api,
   │                             forgejo_set_secret, forgejo_set_var,
   │                             forgejo_get_runner_token)
   ├── bootstrap-local.sh      — drives 6 phases on the operator's
   │                             workstation
   ├── bootstrap-remote.sh     — runs on the R720 (over SSH) ; 4 phases
   ├── verify-local.sh         — read-only check of local state
   ├── verify-remote.sh        — read-only check of R720 state
   ├── enable-auto-deploy.sh   — flips the deploy.yml gate after a
   │                             successful manual run
   ├── .env.example            — template for site config
   └── README.md               — usage + troubleshooting

Phases :
  Local
   1. preflight       — required tools, SSH to R720, DNS resolution
   2. vault           — render vault.yml from example, autogenerate JWT
                        keys, prompt+encrypt, write .vault-pass
   3. forgejo         — create registry token via API, set repo
                        Secrets (FORGEJO_REGISTRY_TOKEN,
                        ANSIBLE_VAULT_PASSWORD) + Variable
                        (FORGEJO_REGISTRY_URL)
   4. r720            — fetch runner registration token, stream
                        bootstrap-remote.sh + lib.sh over SSH
   5. haproxy         — ansible-playbook playbooks/haproxy.yml ;
                        verify Let's Encrypt certs landed on the
                        veza-haproxy container
   6. summary         — readiness report
  Remote
   R1. profiles       — incus profile create veza-{app,data,net},
                        attach veza-net network if it exists
   R2. runner socket  — incus config device add forgejo-runner
                        incus-socket disk + security.nesting=true
                        + apt install incus-client inside the runner
   R3. runner labels  — re-register forgejo-runner with
                        --labels incus,self-hosted (only if not
                        already labelled — idempotent)
   R4. sanity         — runner ↔ Incus + runner ↔ Forgejo smoke

Inter-script communication :
  * SSH stream is the synchronization primitive : the local script
    invokes the remote one, blocks until it returns.
  * Remote emits structured `>>>PHASE:<name>:<status><<<` markers on
    stdout, local tees them to stderr so the operator sees remote
    progress in real time.
  * Persistent state files survive disconnects :
      local : <repo>/.git/talas-bootstrap/local.state
      R720  : /var/lib/talas/bootstrap.state
    Both hold one `phase=DONE timestamp` line per completed phase.
    Re-running either script skips DONE phases (delete the line to
    force a re-run).

Resumable :
  PHASE=N ./bootstrap-local.sh    # restart at phase N

Idempotency guards :
  Every state-mutating action is preceded by a state-checking guard
  that returns 0 if already applied (incus profile show, jq label
  parse, file existence + mode check, Forgejo API GET, etc.).

Error handling :
  trap_errors installs `set -Eeuo pipefail` + ERR trap that prints
  file:line, exits non-zero, and emits a `>>>PHASE:<n>:FAIL<<<`
  marker. Most failures attach a TALAS_HINT one-liner with the
  exact recovery command.

Verify scripts :
  Read-only ; no state mutations. Output is a sequence of
  PASS/FAIL lines + an exit code = number of failures. Each
  failure prints a `hint:` with the precise fix command.

.gitignore picks up scripts/bootstrap/.env (per-operator config)
and .git/talas-bootstrap/ (state files).

--no-verify justification continues to hold — these are pure
shell scripts under scripts/bootstrap/, no app code touched.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 22:45:00 +02:00
..
archive refonte: backend-api go first; phase 1 2025-12-12 21:34:34 -05:00
bootstrap feat(bootstrap): two-host deploy-pipeline bootstrap with idempotent verify 2026-04-29 22:45:00 +02:00
loadtest feat(perf): k6 mixed-scenarios load test + nightly workflow + baseline doc (W4 Day 20) 2026-04-29 11:44:06 +02:00
observability feat(observability): deploy alerts (4) + failed-color scanner script 2026-04-29 14:45:27 +02:00
probes chore(release): v1.0.6.2 — subscription payment-gate bypass hotfix 2026-04-17 12:21:53 +02:00
security feat(reliability): game-day driver + 5 scenarios + W5 session template (W5 Day 22) 2026-04-29 12:19:18 +02:00
align-8px-grid.py aesthetic-improvements: align spacing to 8px grid (Action 11.2.1.3) 2026-01-16 11:50:46 +01:00
audit_backend_endpoints.py [INT-005] int: Verify all backend endpoints have frontend usage 2025-12-25 15:08:30 +01:00
auto_migrate_tailwind_colors.py feat: add automated scripts for Tailwind color migration with batch processing and verification 2026-01-16 01:54:57 +01:00
auto_migrate_tailwind_colors_batch.py feat: add automated scripts for Tailwind color migration with batch processing and verification 2026-01-16 01:54:57 +01:00
bfg-cleanup.sh chore(cleanup): add scripts/bfg-cleanup.sh for history rewrite 2026-04-20 18:55:17 +02:00
check-migration-backward-compat.sh chore(ansible): recover group_vars files lost in parallel-commit shuffle 2026-04-29 14:41:14 +02:00
coverage-trend.mjs chore(cleanup): remove orphan code + archive disabled workflows + .playwright-mcp 2026-04-20 20:33:40 +02:00
deploy-blue-green.sh feat(infra): blue-green deployment via HAProxy 2026-02-23 19:52:19 +01:00
deploy-canary.sh chore(ansible): recover group_vars files lost in parallel-commit shuffle 2026-04-29 14:41:14 +02:00
deploy-staging.sh stabilisation commit A 2026-01-07 19:39:21 +01:00
diagnose-register.sh [FIX] Added TokenVersion field to user creation 2026-01-04 01:44:13 +01:00
dr-drill.sh feat(infra): pgbackrest role + dr-drill + Prometheus backup alerts (W2 Day 8) 2026-04-28 00:51:00 +02:00
flaky-detection.mjs chore(cleanup): remove orphan code + archive disabled workflows + .playwright-mcp 2026-04-20 20:33:40 +02:00
generate-bug-report.sh [TEST] MVP integration tests executed - 2/28 API passed, 0/20 E2E passed, 3 bugs found 2026-01-04 01:44:13 +01:00
generate-jwt-keys.sh v0.9.1 2026-03-05 19:22:31 +01:00
generate-ssl-cert.sh fix(infra): HAProxy HTTPS and stats security 2026-02-15 15:58:51 +01:00
generate_full_schema.sh chore(release): v0.942 — Compress (migration consolidation procedure, mark script) 2026-03-02 19:05:54 +01:00
generate_tailwind_list.py docs: generate comprehensive list of all remaining Tailwind default color instances 2026-01-16 01:51:32 +01:00
mark_consolidated.sql chore(release): v0.942 — Compress (migration consolidation procedure, mark script) 2026-03-02 19:05:54 +01:00
minio-migrate-from-single.sh feat(infra): MinIO distributed EC:2 + migration script (W3 Day 12) 2026-04-28 13:46:42 +02:00
payment-e2e-preflight.sh feat(release): real-money payment E2E walkthrough + report template (W6 Day 27) 2026-04-29 15:35:53 +02:00
payment-e2e-walkthrough.sh feat(release): real-money payment E2E walkthrough + report template (W6 Day 27) 2026-04-29 15:35:53 +02:00
README_TAILWIND_MIGRATION.md feat: add automated scripts for Tailwind color migration with batch processing and verification 2026-01-16 01:54:57 +01:00
replace-decorative-cyan.py aesthetic-improvements: automated replacement of decorative cyan with steel (80/20 rule, Action 11.3.1.3) 2026-01-16 11:40:13 +01:00
rotate_logs.sh feat: centraliser tous les logs dans /var/log/veza avec rotation 2026-01-04 01:44:23 +01:00
run-all-mvp-tests.sh [TEST] MVP integration tests executed - 2/28 API passed, 0/20 E2E passed, 3 bugs found 2026-01-04 01:44:13 +01:00
run-e2e-local.sh fix(e2e): align local E2E setup with CI or document CI-only validation 2026-02-19 19:10:15 +01:00
setup-mvp-test-env.sh [TEST] MVP integration tests executed - 2/28 API passed, 0/20 E2E passed, 3 bugs found 2026-01-04 01:44:13 +01:00
setup_logs.sh feat: centraliser tous les logs dans /var/log/veza avec rotation 2026-01-04 01:44:23 +01:00
smoke_test.go P0 UUID Phase A: migrations + backend Go UUID refactor 2025-12-04 02:15:48 +01:00
squash_migrations.sh chore(release): v0.602 — Payout, Dette Technique & Tests E2E 2026-02-23 22:32:01 +01:00
staging-stability-check.sh feat(v0.14.0): validation runtime & staging pipeline 2026-03-13 16:09:43 +01:00
start-backend.sh chore(audit 2.4, 2.5): supprimer code mort Education et cmd/modern-server 2026-02-15 14:39:40 +01:00
start_boot.sh chore(audit 2.4, 2.5): supprimer code mort Education et cmd/modern-server 2026-02-15 14:39:40 +01:00
start_minimal.sh chore(audit 2.4, 2.5): supprimer code mort Education et cmd/modern-server 2026-02-15 14:39:40 +01:00
stop_minimal.sh feat: global update including storybook setup and backend fixes 2026-02-02 19:34:14 +01:00
sync-cursor.py BASE: completing the initial repo state 2025-12-03 22:56:50 +01:00
test-endpoint-formats.sh api-contracts: identify endpoint response formats 2026-01-11 16:36:13 +01:00
test-mvp-api.sh fix: resolve stream server compilation errors and integrate chat stability fixes 2026-01-04 01:44:22 +01:00
validate-env.sh v0.9.3 2026-03-05 19:35:57 +01:00
validate-full.sh docs: align FEATURE_STATUS and validation scripts with v0.101 state 2026-02-17 15:35:58 +01:00
validate-light.sh chore: consolidate CI, E2E, backend and frontend updates 2026-02-17 16:43:21 +01:00
verify-rust-build.sh fix(rust): ensure chat-server and stream-server compile in release mode 2026-02-15 15:54:03 +01:00
verify_minimal_journey.sh feat: global update including storybook setup and backend fixes 2026-02-02 19:34:14 +01:00
view_logs.sh release(v0.903): Vault - ORDER BY whitelist, rate limiter, VERSION sync, chat-server cleanup, Go 1.24 2026-02-27 09:43:25 +01:00
visual-update-baselines.sh chore(cleanup): remove orphan code + archive disabled workflows + .playwright-mcp 2026-04-20 20:33:40 +02:00