Promote to production #135

Merged
jfraeys merged 10 commits from main into prod 2026-10-13 18:20:06 -04:00
Owner

Promotion: staging passed. Run scripts/plan-prod.sh locally before merging

Merging this PR is the approval record; it deploys nothing. Then check out the validated commit and run scripts/promote-prod.sh (or scripts/deploy-services.sh --tags ... --limit services for an Ansible-only change); both refuse any other commit.

Staging validation: passed on commit bbc85650c0 (this run)
Production drift check: clean

Ansible preview (staging clone, synthetic secrets — approximate, not exact prod values)


PLAY [Deploy the Docker-based services stack] **********************************
skipping: no hosts matched

PLAY RECAP *********************************************************************
### Promotion: staging passed. Run `scripts/plan-prod.sh` locally before merging Merging this PR is the approval record; it deploys nothing. Then check out the validated commit and run `scripts/promote-prod.sh` (or `scripts/deploy-services.sh --tags ... --limit services` for an Ansible-only change); both refuse any other commit. **Staging validation:** passed on commit bbc85650c0cb074cf834742e255a7eada6679811 (this run) **Production drift check:** clean ### Ansible preview (staging clone, synthetic secrets — approximate, not exact prod values) ``` PLAY [Deploy the Docker-based services stack] ********************************** skipping: no hosts matched PLAY RECAP ********************************************************************* ```
fix(hardening): cap the persistent systemd journal at 500M
All checks were successful
Lint / lint (pull_request) Successful in 1m56s
Secret scan / scan (pull_request) Successful in 13s
e386ef03f8
The journal reached 2.4 GB of the 25 GB services disk (82% used, HostDiskSpaceWarning) because nothing capped it.
A journald drop-in sets SystemMaxUse (hardening_journald_max_use); changing it restarts journald and vacuums once.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
ci(lint): run amtool check-config in CI with a checksum-pinned amtool
All checks were successful
Lint / lint (pull_request) Successful in 1m30s
Secret scan / scan (pull_request) Successful in 12s
59ce6cc4b5
The lint runners have no Docker, so the Alertmanager config test skipped its amtool step there. The job now installs a pinned
amtool (v0.34.1, SHA-256 checked, registered in docs/tool-versions.yml); the test uses a local amtool, else Docker, else skips.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
ci(lint): pinned promtool, amtool, sops and age so the alert-rule and key-isolation tests run in CI
All checks were successful
Lint / lint (pull_request) Successful in 2m39s
Secret scan / scan (pull_request) Successful in 13s
5600d6eecc
The runners have no Docker, sops or age, so test-alert-rules.sh and test-project-key-isolation.sh printed SKIP in the lint job.
One checksum-verified install step now provides all four (promtool 3.15.0 = running Prometheus); test-alert-rules.sh uses a
local promtool, else Docker, else skips. Registered in docs/tool-versions.yml.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
chore(secrets): new POSTFIX_SENDER_ALERTS_APIKEY (the old key was rejected by Zedmail with 535)
All checks were successful
Secret scan / scan (pull_request) Successful in 15s
6530355942
Encrypted vault only; the value is not shown anywhere. Postfix already runs with the new key (operator redeployed it).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Merge pull request 'fix(hardening): cap the persistent systemd journal at 500M' (#127) from jfraeys/fix/journald-size-cap into main
Some checks failed
Staging Validation / validate (push) Failing after 3m46s
Staging Validation / promote (push) Has been skipped
fae7a21696
Reviewed-on: #127
fix(staging): the journald-cap check belongs to the post-deploy validation pass
All checks were successful
Lint / lint (pull_request) Successful in 1m49s
Secret scan / scan (pull_request) Successful in 14s
ac0a511cca
The first validate-hardening pass runs before web.yml/services.yml apply the hardening role, so the drop-in does not exist yet and
the check failed both staging nodes (run #596 after the journald-cap merge). Gate it like the auditd and Docker checks.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Merge pull request 'fix(staging): run the journald-cap check in the post-deploy validation pass' (#134) from jfraeys/fix/journald-check-post-deploy into main
All checks were successful
Staging Validation / validate (push) Successful in 14m31s
Staging Validation / promote (push) Successful in 8s
Lint / lint (pull_request) Successful in 1m51s
Secret scan / scan (pull_request) Successful in 14s
bbc85650c0
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jfraeys/infra!135
No description provided.