25b64bee8a
Written against the actual implementation rather than the existing docs, and validated locally against MariaDB 11 containers. No application behaviour changed — this commit adds two documents. deploy/first-production-deployment.md covers pre-deployment checks, the eight deployment steps, smoke tests for backend, database and application, and rollback. It documents what deploy.sh really does: it backs up first and aborts on failure, and it replaces containers with up -d --force-recreate rather than running compose down, so the window is container start time. It also records the startup sequence as implemented — reconcile, migrate, reconcile — and that Database.Migrate() throws rather than limping on. Validation surfaced things worth writing down. The connection string resolves from inside the backend container, so Server=127.0.0.1 means the container and not the host; this broke a validation run before it could have broken a deploy. DATABASE_PROVIDER defaults to sqlite, and if it goes missing the backend does not quietly serve an empty database — it exits with "no such table: INFORMATION_SCHEMA.TABLES", which is loud but baffling if unexplained. A blank AUTH_JWT_KEY throws at startup when auth is required, which is the right behaviour. The runbook maps each of these log lines to its cause. Rollback is documented with the distinction stated plainly: a code rollback keeps all data and is almost always the whole fix, while a database restore discards everything written since the dump. Restore only when the data itself is wrong. docs/release-checklist.md records the completed architecture work, local verification results, known risks with severities, the unresolved CI runner blocker and what would unblock it, and seven first-deployment warnings. Validated: compose build; compose up on a fresh MariaDB (42 tables, backend healthy); the depends_on health gate holding the frontend until the backend is healthy; restart against the populated database with rows preserved; backup and restore; and the failure paths. Not validated, and said so in both documents: the authenticated end-to-end journey, because signing in needs a password. 393 backend tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>