feat: consolidate secret stores — single granular secrets/*.enc, deprecate .env.vault.enc #777
Labels
No labels
action
backlog
blocked
bug-report
cannot-reproduce
in-progress
in-triage
needs-triage
prediction/actioned
prediction/dismissed
prediction/unreviewed
priority
rejected
reproduced
tech-debt
underspecified
vision
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: disinto-admin/disinto#777
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
Two parallel secret stores:
secrets/<NAME>.enc— per-key, age-encrypted. Populated bydisinto secrets add. No runtime consumer today. Onlydisinto secrets showever decrypts these..env.vault.enc— monolithic, sops/dotenv-encrypted. The only store actually loaded into containers (viadocker/edge/dispatcher.sh→sops -d --output-type dotenv).Two mental models, redundant subcommands (
edit-vault,show-vault,migrate-vault), and today'sdisinto secrets addsilently deposits secrets into a dead-letter directory. Operator runs the command, edge container still logsCADDY_SSH_KEY not set, skipping(docker/edge/entrypoint-edge.sh:207).Proposed solution
Consolidate on
secrets/<NAME>.encas THE store. One file per secret, granular, small surface.1. Wire container dispatchers to load
secrets/*.encinto envdocker/edge/dispatcher.sh(and agent / ops dispatchers) decrypt declared secrets at startup and export them.2. Containers declare required secrets
secrets.required = ["CADDY_SSH_KEY", "CADDY_SSH_HOST", ...]in the container's TOML, or equivalent in compose.entrypoint-edge.sh:207.3. Deprecate the monolithic vault
.env.vault,.env.vault.enc, and subcommandsedit-vault/show-vault/migrate-vaultfrombin/disinto.docker/edge/dispatcher.sh(lines 32-40 currently).4. One-shot migration for existing operators
disinto secrets migrate-from-vaultsplits an existing.env.vault.encintosecrets/<KEY>.encfiles, verifies each, then removes the old vault on success.Context
disinto-admin/disinto-ops#10.secrets addmust accept piped stdin before we can deprecateedit-vault) — now closed.Acceptance criteria
secrets.required = ["CADDY_SSH_KEY", "CADDY_SSH_HOST", "CADDY_SSH_USER", "CADDY_ACCESS_LOG"]; dispatcher exports them;collect-engagement.shruns without additional env wiring.env.vault*files and all vault-specific subcommands removed frombin/disintoand all formulas / docsmigrate-from-vaultconverts an existing monolithic vault correctly (verified by round-trip test)disinto secretshelp text shows one store, four verbs:add,show,remove,listAffected files
bin/disinto— removeedit-vault,show-vault,migrate-vaultsubcommands; addmigrate-from-vaultdocker/edge/dispatcher.sh— replace sops round-trip with per-secret age decryption (lines 32-40)docker/edge/entrypoint-edge.sh— replace silent-skip at line 207 with hard fail on missing required secretslib/vault.sh— update or remove vault-env.sh wiring now that.env.vault.encis deprecatedBlocked — issue #777
no_push2026-04-15T14:42:14ZDiagnostic output