Skip to content

deploy: bring provisioning + notification to prod; scaffold SMS seal service - #565

Merged
izzywdev merged 4 commits into
masterfrom
claude/multi-service-dockerfile-deps-uzgczg
Aug 4, 2026
Merged

deploy: bring provisioning + notification to prod; scaffold SMS seal service#565
izzywdev merged 4 commits into
masterfrom
claude/multi-service-dockerfile-deps-uzgczg

Conversation

@izzywdev

@izzywdev izzywdev commented Aug 4, 2026

Copy link
Copy Markdown
Owner

📋 Description

You had four backend services sitting enabled: false in prod. I checked each against what actually gates it, and two of the four turned out to already have their preconditions met — so this PR brings provisioning-service and notification-service online, and scaffolds the dispatching service that unblocks sms-service. payment-service remains blocked (see Future Work).

⚠️ Deploy-sensitive: master is deploy-on-push. Per the repo rule, merge this in a deploy window and watch the Argo roll.

🔄 Type of Change

  • 🔧 Refactoring / deploy configuration (no app-logic change)
  • 🔨 Build/dependency update (Dockerfile toolchain floor) + new CI dispatch workflow

🔧 Implementation Details

provisioning-service — clean enable

  • Flip enabled: true. Its only hard secretKeyRef, INTERNAL_PROVISION_SECRET, is already sealed in fuzefront-secrets. Thin Kafka→HTTP bridge: no DB, no migrations, no ingress. Image built + tag-bumped by release.yml.

notification-service — enable + pre-empt the chat-service #499 collision

  • Dedicated fuzefront_notification DB so its knex_migrations ledger can't collide with the backend's in fuzefront_platform (the chat prod: chat-service migrate crash-loops — running against shared fuzefront_platform DB (fuzefront app Degraded) #499 crash-loop). Both the Deployment and db-migrate Job target notificationService.dbName; db-bootstrap (weight -5) creates + grants it before migrate (-3).
  • migrate.enabled: true — nothing else creates the tables and it doesn't self-migrate. Idempotent (knex).
  • Enabled with already-sealed DB_PASSWORD + JWT_SECRET; NOTIFICATION_INTERNAL_TOKEN stays unset (if-guarded → only disables /internal/publish).
  • Dockerfile node:18-alpinenode:24-alpine (toolchain floor).

sms-service — scaffold the sealing dispatch service

  • New .github/workflows/seal-sms-secrets.yml (workflow_dispatch), mirroring seal-consumer-secret.yml. It reads the three Twilio values from GitHub repo secrets the owner sets and mints SMS_AUTH_SECRET itself, sealing all four into fuzefront-secrets (merge-in). Vendor plaintext never touches chat, a PR diff, or a build log — the governance "agents scaffold the wiring, never hold the values" split. Fails loudly if any Twilio secret is unset, so it can't seal a placeholder. SEAL_PROD_SECRETS.md points at it.
  • sms-service stays enabled: false here on purpose. Sealing is inert (keys added, no pod renders). Go-live is a separate deploy-window commit after the seal is confirmed.

🧪 Testing

  • Static verification against the tree: sealed-secret keys, release.yml matrix + bump anchors, secretKeyRef optionality, hook ordering; edited YAML + new workflow YAML parse.
  • ⚠️ Local helm template/docker build not possible in this sandbox (no docker daemon; get.helm.sh proxy-blocked). Pre-merge net: helm-validate (render + kubeconform) and the release.yml image build.

📝 Deployment Notes

  • Creates fuzefront_notification via the existing bootstrap Job — no manual step.
  • No new secrets required for provisioning or notification (both use already-sealed keys).
  • Post-merge: watch the umbrella Argo sync; confirm both new pods reach Ready and fuzefront-notification-db-migrate succeeds.

To bring sms-service live (owner, after this merges)

  1. Set repo secrets TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_VERIFY_SERVICE_SID.
  2. Run the Seal Twilio + SMS secrets workflow (dry_run=true first to preview).
  3. In a deploy window, flip smsService.enabled: true (I can send that PR).

Note: the seal workflow pushes the sealed file to master, matching the existing seal-consumer-secret.yml convention. If required_signatures rejects the Actions-bot push, that's a pre-existing property of that pattern — flag it and I'll switch both to a verified (API) commit.

Future Work — payment-service (still blocked)

Not in the release.yml build matrix (tag ""InvalidImageName) and it's a scaffold, not the live money path (billing is). Go-live = add its release build + seal Stripe keys + a product call. Happy to wire the build as a follow-up.

claude and others added 2 commits August 4, 2026 21:06
Two of the four prod-disabled backend services are now safe to enable;
this brings them online.

provisioning-service: flip enabled: true. Its only hard secretKeyRef
(INTERNAL_PROVISION_SECRET) is already sealed into fuzefront-secrets, and
it is a thin Kafka->HTTP bridge with no DB, migrations, or ingress, so no
new precondition remains.

notification-service:
- Give it a dedicated fuzefront_notification database so its knex
  migration ledger cannot collide with the backend's knex_migrations in
  fuzefront_platform (the chat-service #499 crash-loop, pre-empted). The
  db-bootstrap Job creates + grants the DB when the service is enabled;
  the Deployment and the db-migrate Job both target notificationService.dbName.
- Set migrate.enabled so the schema is created before the service starts
  (it does not self-migrate); idempotent via knex.
- Enable it. DB_PASSWORD and JWT_SECRET are already sealed;
  NOTIFICATION_INTERNAL_TOKEN is optional (if-guarded) so leaving it unset
  only disables the /internal/publish fan-out.
- Bump the Dockerfile to node:24-alpine, meeting the mandated toolchain
  floor (it was still on node:18-alpine).

sms-service and payment-service remain disabled: they are blocked on
owner-only preconditions (sealing 4 Twilio/SMS keys; and a missing
release.yml image build) documented in values-prod.yaml.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hc8XVgyLJkyeMsRysJYCqP
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Automated code review (gate-code-review)

Credit balance is too low

Report-only — this check never blocks merge.

@github-actions
github-actions Bot enabled auto-merge (squash) August 4, 2026 21:09
Scaffolds the dispatching service that seals the four keys sms-service /
phone-2FA needs (TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN,
TWILIO_VERIFY_SERVICE_SID, SMS_AUTH_SECRET) into the existing
fuzefront-secrets SealedSecret, mirroring seal-consumer-secret.yml.

The three Twilio values are read from GitHub repo secrets the owner sets,
so plaintext vendor credentials never appear in chat, a PR diff, or a
build log; SMS_AUTH_SECRET is minted in-workflow (it is an internal shared
token, not a vendor value). Fails loudly if any Twilio secret is unset, so
it can never seal a placeholder that would CrashLoop the pod.

Sealing is inert until go-live: it only adds keys to the Secret while
smsService.enabled stays false. Enabling SMS remains a separate,
deploy-window GitOps commit. Points SEAL_PROD_SECRETS.md at the workflow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hc8XVgyLJkyeMsRysJYCqP
@izzywdev izzywdev changed the title deploy: bring provisioning-service and notification-service to prod deploy: bring provisioning + notification to prod; scaffold SMS seal service Aug 4, 2026
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Automated code review (gate-code-review)

Credit balance is too low

Report-only — this check never blocks merge.

@izzywdev
izzywdev merged commit 7314c4d into master Aug 4, 2026
40 of 41 checks passed
@izzywdev
izzywdev deleted the claude/multi-service-dockerfile-deps-uzgczg branch August 4, 2026 21:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants