initial, copy postgres stuff for migrations, main.go test

This commit is contained in:
2026-09-04 21:11:41 +02:00
parent 506df87f84
commit 090cc0f00d
14 changed files with 863 additions and 0 deletions
+58
View File
@@ -0,0 +1,58 @@
# Database setup
## Once, as a superuser
psql -U postgres -f scripts/bootstrap.sql
Creates the roles, the `hammy` database, the four schemas, and the default
privileges. Change the three `CHANGE_ME` passwords first.
## Migrations, as hammy_owner
for f in migrations/*.sql; do
psql -U hammy_owner -d hammy -v ON_ERROR_STOP=1 -f "$f"
done
Running these **as hammy_owner is not optional**. `ALTER DEFAULT PRIVILEGES FOR
ROLE hammy_owner` only fires for objects that role creates; run them as a
superuser and the tables end up owned by the superuser with no grants, so
`hammy_app` sees four empty schemas.
`hammy_owner` is `NOLOGIN`, so connect as a superuser and switch:
psql -U postgres -d hammy -c 'SET ROLE hammy_owner' -f migrations/001_types.sql
or give it `LOGIN` for the duration of the setup and revoke it after.
Verify afterwards:
SELECT relname, relacl FROM pg_class
WHERE relnamespace = 'core'::regnamespace AND relkind = 'r';
Every row should show `hammy_app=arwd/hammy_owner`. All NULL means the
migrations ran as the wrong role.
## Files
| File | Contents |
|---|---|
| `scripts/bootstrap.sql` | Roles, database, schemas, default privileges. Superuser, once. |
| `migrations/001_types.sql` | `touch_updated_at()`, the `callsign`/`email`/`gridsquare` domains. |
| `migrations/002_core.sql` | `users`, `verifications`, `subscriptions`. |
| `migrations/003_api.sql` | `owners`, `keys`, `usage_daily`. |
| `migrations/004_logbook.sql` | `imports`, `qsos`. |
| `migrations/005_privacy.sql` | `forget_user()`, `forget_owner()`, `prune_verifications()`. |
## sqlc
`sqlc.yaml` points only at 001-004. It parses SQL to learn the schema and will
choke on `CREATE ROLE`, `ALTER DEFAULT PRIVILEGES` and `DO $$` blocks, which is
another reason those live in `scripts/` rather than `migrations/`.
## Already have the old numbering?
The previous layout was `001_bootstrap` through `006_fixes`, applied by hand. If
that database exists and has no data worth keeping, `DROP DATABASE hammy` plus
`DROP ROLE` the four roles, then start from `bootstrap.sql`. The corrections
from the old `006_fixes.sql` are folded into 002-005 here, so there is no
separate fixes file any more.