The DO management API has a caching layer that delays tag visibility
after push. The v2 registry API returns tags immediately.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Provision form accepts optional initial admin user (no password needed)
- POST /customers/:slug/resend-welcome sends welcome email via customer backend
- Kebab menu "Resend Welcome" option with email input dialog
- Query latest version from backend image tags instead of chart tags
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ArgoCD needs the customers app-of-apps to refresh first so it picks up
the new targetRevision from the charts repo before syncing the child app.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
DO registry API is unreliable for OCI Helm chart tags. Since the CI
pushes images and chart with the same version, use lunarfront-app
image tags which are always indexed correctly.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- RESEND_API_KEY added to config (required env var)
- Provision generates per-customer ENCRYPTION_KEY and patches lunarfront-secrets with resend-api-key, mail-from, business-name, encryption-key
- initialEmail field in ProvisionSchema seeds first admin user via env vars on app first boot
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Cookie-based auth was unreliable through Cloudflare/nginx proxy — cookie
was being sent for some requests but not others. Switch to returning JWT
in login response, storing in localStorage, and sending as Authorization
Bearer header on all API calls. Eliminates all cookie/SameSite/Secure
proxy issues.
- Fix cookie sameSite strict → lax so browser sends it on page refresh
- Add customer name field (separate from slug)
- Add steps JSONB column tracking per-step provisioning state (DB, User, Schema, Pool, Chart)
- Insert customer record before provisioning starts so partial failures are visible
- Show status + step checklist in customers table
- Add DELETE /customers/:slug/record endpoint to clear failed records without touching infra
- Add "Record Only" button in UI for manual cleanup of partial deployments
- Fix SSH key missing trailing newline (error in libcrypto)
- Pass env with SSH command through all git operations
- Add customers table (modules, start/expiration dates, created/updated timestamps)
- Idempotent ALTER TABLE for existing deployments
- GET /customers with pagination, search, and sort
- POST /customers persists slug with modules and dates to DB
- DELETE /customers/:slug removes ArgoCD chart, DO DB, pgbouncer pool, and manager record
- Redesigned frontend: dark slate theme, customers table page with search/sort/pagination, delete confirm dialog, module checkboxes, slate buttons
- users table created on startup via migrate()
- POST /api/auth/setup to create first user (blocked once any user exists)
- POST /api/auth/login returns httpOnly JWT cookie (7d expiry)
- POST /api/auth/logout clears cookie
- GET /api/auth/me for auth check
- All /api/customers routes require valid JWT
- Frontend shows login form when unauthenticated
- Fix type errors in k8s, do, and pgbouncer services