feat: Postgres in place: a database per stack, migrations, backup and Drizzle Gateway #506

Merged
root merged 44 commits from claude/implement-spec-354-102e80 into main 2026-10-13 14:10:06 +00:00
root commented 2026-10-13 10:17:33 +00:00 (Migrated from gitlab.core-project.space)

Summary

Every stack (production and each preview) runs its own private Postgres 18, migrated by a one-shot step before the app is replaced. Production is backed up nightly; a Drizzle Gateway on the VPS browses every stack through an SSH tunnel. Empty schema, no table: nothing a Player sees changes.

flowchart LR
  subgraph stack["stack (chess / chess-pr-N)"]
    db[(db: postgres 18.4<br/>volume at /var/lib/postgresql<br/>no published port)]
    migrate[migrate: dist/migrate.js<br/>one-shot]
    app[app: dist/main.js]
  end
  up[up.sh] -->|1. up, wait healthy| db
  up -->|2. run to exit 0| migrate
  up -->|3. only then replace| app
  up -->|4. attach, warn if down| gw[Drizzle Gateway<br/>127.0.0.1:4983]
  migrate --> db
  app --> db
  gw -->|role gateway: rows, no DDL| db
  backup[backup-production job<br/>nightly schedule, BACKUP=1] -->|pg_dump -Fc, restore check, age| artifact[(job artifact, 30 days)]
apps/api/
├── drizzle/                     # committed migrations (baseline, no table)
├── src/common/database.ts       # open, check, migrate, ensureGatewayRole, close
├── src/config/config.ts         # DATABASE_URL required, *_PASSWORD_FILE overrides
├── src/main.ts                  # connect, check, then listen
└── src/migrate.ts               # migrate entry point; the server never migrates
deploy/
├── compose.yaml                 # + db, migrate, internal network, secrets
├── compose.preview.yaml         # preview caps: shared_buffers, 20 connections, 256m
├── up.sh / down.sh / verify*.sh # db → migrate → app; Gateway attach/detach; checks
├── backup/                      # dump, restore check, encrypt, recipient key
├── gateway/                     # hand-applied Compose project, README, attach script
└── owner-setup.sh               # owner wizard (4 stages)
compose.dev.yaml + scripts/      # one dev Postgres per machine, one database per worktree (`pnpm db`)
.gitlab-ci.yml                   # e2e job gets a postgres:18.4 service
infra/gitlab/vps/
├── deploy.gitlab-ci.yml         # production fails fast without its two password variables
└── backup-production.gitlab-ci.yml  # nightly backup job, its own schedule
docs/adr/0038-…                  # API tests on in-process Postgres (PGlite); real Postgres elsewhere

Evidence

  • GitLab pipeline 40 green on every job, after the rebase onto main: checks, front-test, e2e (built API on a postgres:18.4 service), build, review (preview with its Postgres): https://gitlab.core-project.space/amaurycoudr/chess-project/-/pipelines/40
  • Moved from GitHub: this was GitHub PR #393. The .github/workflows/ edits are dropped (GitHub Actions are off); their GitLab equivalents are the e2e service, the production job's password check and backup-production. Our ADR became 0038, since main took 0036 and 0037. API test start-up got a 60 s hook budget after PGlite starts timed out under CI load (pipeline 12).

Earlier evidence, from GitHub Actions:

  • Gate: five commands green; e2e test:slow 35/35 locally on the dev and built targets against a real migrated Postgres.
  • #367 (PGlite integration tests): empty db reaches the latest migration; rerun changes nothing; a schema change with no generated migration fails pnpm test; an unreachable db is refused naming DATABASE_URL.
  • #368: two worktrees running pnpm dev side by side used two databases on the one container; the migrate step against a missing db names pnpm db; a stopped server leaves 0 connections. CI's browser-suite job gets a Postgres service container.
  • #369, on a preview (GitHub draft PR #394, closed):
  • #370, on local Docker (GitHub Actions billing refused the VPS run; this MR's review job has since deployed the Gateway-aware stack green): Gateway on the stack's network after up.sh; the gateway role reads a row, cannot create a table (permission denied for schema public) and logs in with its password (a wrong one fails the check); ensuring the role twice changes nothing; Gateway stopped → up.sh exits 0 with a warning; removal with the Gateway attached → verify-gone passes; port on 127.0.0.1:4983 only, "check it matches" reports a match. PGlite tests cover read/write, refusal of create/alter/drop, and idempotence.
  • #371, on local Docker: a good dump restores into a throwaway Postgres 18.4; a truncated, corrupted, non-dump, empty or migration-less dump fails with exit 1; encryption round-trips byte-identical and only the .age file is uploaded (if-no-files-found: error, 30 days).
  • Gateway licence (ghcr.io/drizzle-team/gateway:1.6.2@sha256:db9c50c7…): no licence file in the image (label NOASSERTION, inherited from its base) and no licence key. Drizzle's Studio page calls it "a free self-hosted Drizzle Studio", formerly paid, with no stated usage restriction; it is closed source. Approved by the owner for this use.
  • Not yet proven on the VPS: #370's checks; production's verify finding no caps (runs on the first production deploy); the preview cap and reaper paths (they share down.sh + verify-gone.sh with the close, which is proven).

Merge Danger

Door: one-way, narrowly.

The first production deploy creates production's database volume and fixes its password from DATABASE_PASSWORD at that moment. Reverting the code is a git revert; the volume and the stored password stay until removed by hand. The schema is empty, so no data is at stake yet.

Blast Radius: production

The production job now refuses to run without the masked DATABASE_PASSWORD and GATEWAY_DATABASE_PASSWORD CI/CD variables, and the API refuses to start without a reachable database. A missing secret fails the deploy, and the old app keeps serving. The nightly backup fails until the owner's age public key is committed. The backup schedule is created by hand. Every contributor needs pnpm db (Docker) before pnpm dev; pnpm test needs no Docker.

Proposed rule changes (not edited here)

  • apps/api/CODING_STANDARDS.md, layout sentence: "...src/main.ts boots and src/migrate.ts migrates, src/app.ts with src/app.module.ts assembles the app, src/config/ reads the environment, src/common/ holds what every feature shares, among it the framework-free database module common/database.ts (connect, migrate, ensure the Gateway role) with the schema beside it, drizzle/ holds the committed migrations, and src/room/ is the one feature module..."
  • apps/api/CODING_STANDARDS.md, rule 6, second half: "...the wire through the real app in process with test/rpc.fixtures.ts, whose fetch hands each request to the Express instance, no server or port, and whose app runs on an in-process database from test/database.fixtures.ts, one per test file."

Owner checks

  • Confirm ADR 0038 (was 0036 on GitHub).
  • Drizzle Gateway licence allows this use.
  • deploy/owner-setup.sh stage 1: DATABASE_PASSWORD as a masked, protected GitLab variable (the old GitHub secret is gone; production never used it).
  • Stage 2: backup key pair; commit deploy/backup/backup-recipient.txt on this branch.
  • Stage 3: GATEWAY_DATABASE_PASSWORD as a masked, protected GitLab variable.
  • Stage 4: Gateway applied on the VPS; add connections in its UI by container name (chess-db-1, chess-pr-<n>-db-1), user gateway, database chess.
  • Create a pipeline schedule on main, 41 2 * * * UTC, variable BACKUP=1.
  • After merge: run a pipeline on main with BACKUP=1, green, recorded on #354.

Closes #354
Closes #367
Closes #368
Closes #369
Closes #370
Closes #371

## Summary Every stack (production and each preview) runs its own private Postgres 18, migrated by a one-shot step before the app is replaced. Production is backed up nightly; a Drizzle Gateway on the VPS browses every stack through an SSH tunnel. Empty schema, no table: nothing a **Player** sees changes. ```mermaid flowchart LR subgraph stack["stack (chess / chess-pr-N)"] db[(db: postgres 18.4<br/>volume at /var/lib/postgresql<br/>no published port)] migrate[migrate: dist/migrate.js<br/>one-shot] app[app: dist/main.js] end up[up.sh] -->|1. up, wait healthy| db up -->|2. run to exit 0| migrate up -->|3. only then replace| app up -->|4. attach, warn if down| gw[Drizzle Gateway<br/>127.0.0.1:4983] migrate --> db app --> db gw -->|role gateway: rows, no DDL| db backup[backup-production job<br/>nightly schedule, BACKUP=1] -->|pg_dump -Fc, restore check, age| artifact[(job artifact, 30 days)] ``` ```text apps/api/ ├── drizzle/ # committed migrations (baseline, no table) ├── src/common/database.ts # open, check, migrate, ensureGatewayRole, close ├── src/config/config.ts # DATABASE_URL required, *_PASSWORD_FILE overrides ├── src/main.ts # connect, check, then listen └── src/migrate.ts # migrate entry point; the server never migrates deploy/ ├── compose.yaml # + db, migrate, internal network, secrets ├── compose.preview.yaml # preview caps: shared_buffers, 20 connections, 256m ├── up.sh / down.sh / verify*.sh # db → migrate → app; Gateway attach/detach; checks ├── backup/ # dump, restore check, encrypt, recipient key ├── gateway/ # hand-applied Compose project, README, attach script └── owner-setup.sh # owner wizard (4 stages) compose.dev.yaml + scripts/ # one dev Postgres per machine, one database per worktree (`pnpm db`) .gitlab-ci.yml # e2e job gets a postgres:18.4 service infra/gitlab/vps/ ├── deploy.gitlab-ci.yml # production fails fast without its two password variables └── backup-production.gitlab-ci.yml # nightly backup job, its own schedule docs/adr/0038-… # API tests on in-process Postgres (PGlite); real Postgres elsewhere ``` ## Evidence - **GitLab pipeline 40 green** on every job, after the rebase onto `main`: checks, front-test, e2e (built API on a `postgres:18.4` service), build, review (preview with its Postgres): https://gitlab.core-project.space/amaurycoudr/chess-project/-/pipelines/40 - **Moved from GitHub:** this was GitHub PR #393. The `.github/workflows/` edits are dropped (GitHub Actions are off); their GitLab equivalents are the e2e service, the production job's password check and `backup-production`. Our ADR became 0038, since `main` took 0036 and 0037. API test start-up got a 60 s hook budget after PGlite starts timed out under CI load (pipeline 12). Earlier evidence, from GitHub Actions: - **Gate:** five commands green; e2e `test:slow` 35/35 locally on the dev and built targets against a real migrated Postgres. - **#367** (PGlite integration tests): empty db reaches the latest migration; rerun changes nothing; a schema change with no generated migration fails `pnpm test`; an unreachable db is refused naming `DATABASE_URL`. - **#368:** two worktrees running `pnpm dev` side by side used two databases on the one container; the migrate step against a missing db names `pnpm db`; a stopped server leaves 0 connections. CI's browser-suite job gets a Postgres service container. - **#369, on a preview** (GitHub draft PR #394, closed): - Extended verify green (healthy app + db only, migrate exit 0, migrations listed, no published port, volume at the Postgres 18 path, caps on, no password in metadata): https://github.com/amaurycoudr/chess-project/actions/runs/38160656159 - **Drill:** a failing migration failed the deploy before the app was touched; the old container kept serving (same ETag/Last-Modified): https://github.com/amaurycoudr/chess-project/actions/runs/38161206665 - Revert redeployed green; an unchanged redeploy reran migrate and changed nothing: https://github.com/amaurycoudr/chess-project/actions/runs/38161466112 - Close removed db container, volume and network; verify-gone passed: https://github.com/amaurycoudr/chess-project/actions/runs/38162327327 - Password delivery: Compose secrets work against the remote daemon (no env fallback). A preview's throwaway passwords live in `deploy/lib.sh`, not the preview overlay, since a Compose secret cannot hold a literal. - **#370, on local Docker** (GitHub Actions billing refused the VPS run; this MR's `review` job has since deployed the Gateway-aware stack green): Gateway on the stack's network after `up.sh`; the `gateway` role reads a row, cannot create a table (`permission denied for schema public`) and logs in with its password (a wrong one fails the check); ensuring the role twice changes nothing; Gateway stopped → `up.sh` exits 0 with a warning; removal with the Gateway attached → verify-gone passes; port on `127.0.0.1:4983` only, "check it matches" reports a match. PGlite tests cover read/write, refusal of create/alter/drop, and idempotence. - **#371, on local Docker:** a good dump restores into a throwaway Postgres 18.4; a truncated, corrupted, non-dump, empty or migration-less dump fails with exit 1; encryption round-trips byte-identical and only the `.age` file is uploaded (`if-no-files-found: error`, 30 days). - **Gateway licence** (`ghcr.io/drizzle-team/gateway:1.6.2@sha256:db9c50c7…`): no licence file in the image (label `NOASSERTION`, inherited from its base) and no licence key. Drizzle's Studio page calls it "a free self-hosted Drizzle Studio", formerly paid, with no stated usage restriction; it is closed source. Approved by the owner for this use. - **Not yet proven on the VPS:** #370's checks; production's verify finding no caps (runs on the first production deploy); the preview cap and reaper paths (they share `down.sh` + `verify-gone.sh` with the close, which is proven). ## Merge Danger **Door:** one-way, narrowly. The first production deploy creates production's database volume and fixes its password from `DATABASE_PASSWORD` at that moment. Reverting the code is a `git revert`; the volume and the stored password stay until removed by hand. The schema is empty, so no data is at stake yet. **Blast Radius:** production The production job now refuses to run without the masked `DATABASE_PASSWORD` and `GATEWAY_DATABASE_PASSWORD` CI/CD variables, and the API refuses to start without a reachable database. A missing secret fails the deploy, and the old app keeps serving. The nightly backup fails until the owner's age public key is committed. The backup schedule is created by hand. Every contributor needs `pnpm db` (Docker) before `pnpm dev`; `pnpm test` needs no Docker. ## Proposed rule changes (not edited here) - `apps/api/CODING_STANDARDS.md`, layout sentence: "...`src/main.ts` boots and `src/migrate.ts` migrates, `src/app.ts` with `src/app.module.ts` assembles the app, `src/config/` reads the environment, `src/common/` holds what every feature shares, among it the framework-free database module `common/database.ts` (connect, migrate, ensure the Gateway role) with the schema beside it, `drizzle/` holds the committed migrations, and `src/room/` is the one feature module..." - `apps/api/CODING_STANDARDS.md`, rule 6, second half: "...the wire through the real app in process with `test/rpc.fixtures.ts`, whose fetch hands each request to the Express instance, no server or port, and whose app runs on an in-process database from `test/database.fixtures.ts`, one per test file." ## Owner checks - [x] Confirm ADR 0038 (was 0036 on GitHub). - [x] Drizzle Gateway licence allows this use. - [x] `deploy/owner-setup.sh` stage 1: `DATABASE_PASSWORD` as a masked, protected GitLab variable (the old GitHub secret is gone; production never used it). - [x] Stage 2: backup key pair; commit `deploy/backup/backup-recipient.txt` on this branch. - [x] Stage 3: `GATEWAY_DATABASE_PASSWORD` as a masked, protected GitLab variable. - [x] Stage 4: Gateway applied on the VPS; add connections in its UI by container name (`chess-db-1`, `chess-pr-<n>-db-1`), user `gateway`, database `chess`. - [x] Create a pipeline schedule on `main`, `41 2 * * *` UTC, variable `BACKUP=1`. - [ ] After merge: run a pipeline on `main` with `BACKUP=1`, green, recorded on #354. Closes #354 Closes #367 Closes #368 Closes #369 Closes #370 Closes #371
root commented 2026-10-13 10:50:28 +00:00 (Migrated from gitlab.core-project.space)

added 59 commits

  • aa0ed9df...c3952cbe - 19 commits from branch main
  • c3952cbe...64f5b457 - 30 earlier commits
  • afd8ffa4 - docs(repo): say how the Drizzle Gateway reaches every stack
  • 987348ad - refactor(api): give withPasswordFile one object argument
  • 2bd18282 - fix(api): let the migrate entry point run without PORT
  • 9376b328 - refactor(api): name the Gateway role once in ensureGatewayRole
  • 34c0aee7 - refactor(api): read the migrations folder from the drizzle config in the database test
  • 4fdb5fac - refactor(ci): move the backup and Gateway files under the paths ADR 0032 governs
  • 5d91078a - refactor(ci): point the deploy comments at ADR 0032 rather than paraphrase it
  • 7f9d186f - refactor(repo): read the dev Postgres port from compose.dev.yaml alone
  • 78cf2928 - refactor(ci): share the deploy checks' helpers through lib.sh and split verify.sh by concern
  • c5979e38 - fix(ci): check the Gateway role's password over the stack network, where it is required

Compare with previous version

added 59 commits <ul><li>aa0ed9df...c3952cbe - 19 commits from branch <code>main</code></li><li>c3952cbe...64f5b457 - 30 earlier commits</li><li>afd8ffa4 - docs(repo): say how the Drizzle Gateway reaches every stack</li><li>987348ad - refactor(api): give withPasswordFile one object argument</li><li>2bd18282 - fix(api): let the migrate entry point run without PORT</li><li>9376b328 - refactor(api): name the Gateway role once in ensureGatewayRole</li><li>34c0aee7 - refactor(api): read the migrations folder from the drizzle config in the database test</li><li>4fdb5fac - refactor(ci): move the backup and Gateway files under the paths ADR 0032 governs</li><li>5d91078a - refactor(ci): point the deploy comments at ADR 0032 rather than paraphrase it</li><li>7f9d186f - refactor(repo): read the dev Postgres port from compose.dev.yaml alone</li><li>78cf2928 - refactor(ci): share the deploy checks&#39; helpers through lib.sh and split verify.sh by concern</li><li>c5979e38 - fix(ci): check the Gateway role&#39;s password over the stack network, where it is required</li></ul> [Compare with previous version](/amaurycoudr/chess-project/-/merge_requests/6/diffs?diff_id=15&start_sha=aa0ed9dfdb6a3c5f2cb09f948b7c85650f2c4a64)
project_1_bot_05dcee5cd59f879ab35191d664847a9d commented 2026-10-13 11:52:33 +00:00 (Migrated from gitlab.core-project.space)

added 5 commits

  • c5979e38...258e265c - 2 commits from branch main
  • c7ced72f - Merge remote-tracking branch 'origin/main' into feat/354-postgres-gitlab
  • b805c84c - ci: drop the GitHub workflow edits, which GitLab no longer runs
  • 44b917f1 - ci: run the database's CI on GitLab: e2e Postgres, production passwords, backup

Compare with previous version

added 5 commits <ul><li>c5979e38...258e265c - 2 commits from branch <code>main</code></li><li>c7ced72f - Merge remote-tracking branch &#39;origin/main&#39; into feat/354-postgres-gitlab</li><li>b805c84c - ci: drop the GitHub workflow edits, which GitLab no longer runs</li><li>44b917f1 - ci: run the database&#39;s CI on GitLab: e2e Postgres, production passwords, backup</li></ul> [Compare with previous version](/amaurycoudr/chess-project/-/merge_requests/6/diffs?diff_id=19&start_sha=c5979e3839b8ebfcf2162acc71fcddad7db94e79)
root commented 2026-10-13 12:07:10 +00:00 (Migrated from gitlab.core-project.space)

marked this merge request as ready

marked this merge request as **ready**
project_1_bot_05dcee5cd59f879ab35191d664847a9d commented 2026-10-13 12:10:06 +00:00 (Migrated from gitlab.core-project.space)

added 43 commits

  • 44b917f1...44b78db7 - 33 earlier commits
  • 397d67e4 - refactor(api): name the Gateway role once in ensureGatewayRole
  • 50bf270e - refactor(api): read the migrations folder from the drizzle config in the database test
  • fc91d58f - refactor(ci): move the backup and Gateway files under the paths ADR 0032 governs
  • 3c6480d6 - refactor(ci): point the deploy comments at ADR 0032 rather than paraphrase it
  • c49cb221 - refactor(repo): read the dev Postgres port from compose.dev.yaml alone
  • 8dc9f9bc - refactor(ci): share the deploy checks' helpers through lib.sh and split verify.sh by concern
  • 1b2e9fb8 - fix(ci): check the Gateway role's password over the stack network, where it is required
  • dc36b322 - Merge remote-tracking branch 'origin/main' into feat/354-postgres-gitlab
  • 6538ba77 - ci: drop the GitHub workflow edits, which GitLab no longer runs
  • 69809f69 - ci: run the database's CI on GitLab: e2e Postgres, production passwords, backup

Compare with previous version

added 43 commits <ul><li>44b917f1...44b78db7 - 33 earlier commits</li><li>397d67e4 - refactor(api): name the Gateway role once in ensureGatewayRole</li><li>50bf270e - refactor(api): read the migrations folder from the drizzle config in the database test</li><li>fc91d58f - refactor(ci): move the backup and Gateway files under the paths ADR 0032 governs</li><li>3c6480d6 - refactor(ci): point the deploy comments at ADR 0032 rather than paraphrase it</li><li>c49cb221 - refactor(repo): read the dev Postgres port from compose.dev.yaml alone</li><li>8dc9f9bc - refactor(ci): share the deploy checks&#39; helpers through lib.sh and split verify.sh by concern</li><li>1b2e9fb8 - fix(ci): check the Gateway role&#39;s password over the stack network, where it is required</li><li>dc36b322 - Merge remote-tracking branch &#39;origin/main&#39; into feat/354-postgres-gitlab</li><li>6538ba77 - ci: drop the GitHub workflow edits, which GitLab no longer runs</li><li>69809f69 - ci: run the database&#39;s CI on GitLab: e2e Postgres, production passwords, backup</li></ul> [Compare with previous version](/amaurycoudr/chess-project/-/merge_requests/6/diffs?diff_id=25&start_sha=44b917f1c45296c0b56aadc45d64916128310178)
project_1_bot_05dcee5cd59f879ab35191d664847a9d commented 2026-10-13 12:14:10 +00:00 (Migrated from gitlab.core-project.space)

mentioned in merge request !510

mentioned in merge request !510
project_1_bot_05dcee5cd59f879ab35191d664847a9d commented 2026-10-13 12:15:06 +00:00 (Migrated from gitlab.core-project.space)

mentioned in merge request !511

mentioned in merge request !511
project_1_bot_05dcee5cd59f879ab35191d664847a9d commented 2026-10-13 12:30:18 +00:00 (Migrated from gitlab.core-project.space)

added 1 commit

  • 91e37585 - test(api): start each file's in-process Postgres in a hook with a budget of its own

Compare with previous version

added 1 commit <ul><li>91e37585 - test(api): start each file&#39;s in-process Postgres in a hook with a budget of its own</li></ul> [Compare with previous version](/amaurycoudr/chess-project/-/merge_requests/6/diffs?diff_id=43&start_sha=69809f6978387cb8579776658160fa9438fc41f7)
project_1_bot_05dcee5cd59f879ab35191d664847a9d commented 2026-10-13 13:03:31 +00:00 (Migrated from gitlab.core-project.space)

changed the description

changed the description
project_1_bot_05dcee5cd59f879ab35191d664847a9d commented 2026-10-13 13:15:16 +00:00 (Migrated from gitlab.core-project.space)

added 1 commit

  • 04c481c9 - chore(ci): commit the owner's age public key for the nightly backup

Compare with previous version

added 1 commit <ul><li>04c481c9 - chore(ci): commit the owner&#39;s age public key for the nightly backup</li></ul> [Compare with previous version](/amaurycoudr/chess-project/-/merge_requests/6/diffs?diff_id=69&start_sha=91e375851c17de1e5f1b63cd57e2c021ba3fa64e)
project_1_bot_05dcee5cd59f879ab35191d664847a9d commented 2026-10-13 13:15:23 +00:00 (Migrated from gitlab.core-project.space)

marked the checklist item Stage 2: backup key pair; commit deploy/backup/backup-recipient.txt on this branch. as completed

marked the checklist item **Stage 2: backup key pair; commit deploy/backup/backup\-recipient\.txt on this branch\.** as completed
project_1_bot_05dcee5cd59f879ab35191d664847a9d commented 2026-10-13 13:15:23 +00:00 (Migrated from gitlab.core-project.space)

marked the checklist item Stage 4: Gateway applied on the VPS; add connections in its UI by container name chess\-db\-1, chess\-pr\-\<n\>\-db\-1, user gateway, database chess. as completed

marked the checklist item **Stage 4: Gateway applied on the VPS; add connections in its UI by container name \(chess\-db\-1, chess\-pr\-\<n\>\-db\-1\), user gateway, database chess\.** as completed
root commented 2026-10-13 13:46:18 +00:00 (Migrated from gitlab.core-project.space)

marked the checklist item deploy/owner-setup.sh stage 1: DATABASE_PASSWORD as a masked, protected GitLab variable (the old GitHub secret is gone; production never used it). as completed

marked the checklist item **deploy/owner\-setup\.sh stage 1: DATABASE\_PASSWORD as a masked, protected GitLab variable \(the old GitHub secret is gone; production never used it\)\.** as completed
root commented 2026-10-13 13:46:18 +00:00 (Migrated from gitlab.core-project.space)

marked the checklist item Stage 3: GATEWAY_DATABASE_PASSWORD as a masked, protected GitLab variable. as completed

marked the checklist item **Stage 3: GATEWAY\_DATABASE\_PASSWORD as a masked, protected GitLab variable\.** as completed
root commented 2026-10-13 13:46:18 +00:00 (Migrated from gitlab.core-project.space)

marked the checklist item Create a pipeline schedule on main, 41 2 * * * UTC, variable BACKUP=1. as completed

marked the checklist item **Create a pipeline schedule on main, 41 2 \* \* \* UTC, variable BACKUP\=1\.** as completed
root commented 2026-10-13 13:49:24 +00:00 (Migrated from gitlab.core-project.space)

added 51 commits

  • 04c481c9...6e37a388 - 7 commits from branch main
  • 6e37a388...7d1893d7 - 34 earlier commits
  • 9dc7bd33 - refactor(api): read the migrations folder from the drizzle config in the database test
  • 7be273fb - refactor(ci): move the backup and Gateway files under the paths ADR 0032 governs
  • 6ccd6822 - refactor(ci): point the deploy comments at ADR 0032 rather than paraphrase it
  • ca387364 - refactor(repo): read the dev Postgres port from compose.dev.yaml alone
  • c861d8a7 - refactor(ci): share the deploy checks' helpers through lib.sh and split verify.sh by concern
  • 8eb8aaac - fix(ci): check the Gateway role's password over the stack network, where it is required
  • 7a26f698 - ci: drop the GitHub workflow edits, which GitLab no longer runs
  • b70c205c - ci: run the database's CI on GitLab: e2e Postgres, production passwords, backup
  • 3ed9b8bc - test(api): start each file's in-process Postgres in a hook with a budget of its own
  • fc5f6597 - chore(ci): commit the owner's age public key for the nightly backup

Compare with previous version

added 51 commits <ul><li>04c481c9...6e37a388 - 7 commits from branch <code>main</code></li><li>6e37a388...7d1893d7 - 34 earlier commits</li><li>9dc7bd33 - refactor(api): read the migrations folder from the drizzle config in the database test</li><li>7be273fb - refactor(ci): move the backup and Gateway files under the paths ADR 0032 governs</li><li>6ccd6822 - refactor(ci): point the deploy comments at ADR 0032 rather than paraphrase it</li><li>ca387364 - refactor(repo): read the dev Postgres port from compose.dev.yaml alone</li><li>c861d8a7 - refactor(ci): share the deploy checks&#39; helpers through lib.sh and split verify.sh by concern</li><li>8eb8aaac - fix(ci): check the Gateway role&#39;s password over the stack network, where it is required</li><li>7a26f698 - ci: drop the GitHub workflow edits, which GitLab no longer runs</li><li>b70c205c - ci: run the database&#39;s CI on GitLab: e2e Postgres, production passwords, backup</li><li>3ed9b8bc - test(api): start each file&#39;s in-process Postgres in a hook with a budget of its own</li><li>fc5f6597 - chore(ci): commit the owner&#39;s age public key for the nightly backup</li></ul> [Compare with previous version](/amaurycoudr/chess-project/-/merge_requests/6/diffs?diff_id=71&start_sha=04c481c98888f1779cd5b6335f2e83e0a768c93a)
root commented 2026-10-13 13:55:12 +00:00 (Migrated from gitlab.core-project.space)

changed the description

changed the description
root (Migrated from gitlab.core-project.space) merged commit into main 2026-10-13 14:10:06 +00:00
Sign in to join this conversation.
No description provided.