Originally created by: athanclark
Closes [#499], closes [#502], closes [#511], closes [#513], closes [#515], closes [#516], closes [#517], closes [#518], closes [#519], closes [#520]. Refs [#501] (left as a follow-up, see there).
Windows server:
%ProgramData%\OpenChronology):-TrustExistingData takes everything over once an administrator has checked it.%TEMP%.Database roles:
database-setup service, run as the superuser before each migration, creates pgmp and a non-superuser openchronology_app role that owns the database. Migrations, the app, seeding and the mail worker connect as that role; existing databases are handed over to it.APP_DATABASE_PASSWORD to .env. Compose refuses to start without it.NixOS: the module's virtual host sets its own proxy headers with recommendedProxySettings off for its location, so one X-Forwarded-For reaches the server. The NixOS test turns the global setting on.
Releases:
attest job attests every release asset, SHA256SUMS.txt included. It uses actions/attest-build-provenance, pinned to v3.0.0's commit, with id-token/attestations: write only on that job.docs/licensing.md explains gh attestation verify.Hardening:
.next/cache;persist-credentials: false on CI checkouts.UMask=0077.JOURNALD_KNOWN_HOSTS for strict host keys.ADMIN_INITIAL_PASSWORD after first sign-in;Not changed: separate Unix accounts for the log receivers. That needs a new user in every package, and upgrade scripts that find and regroup the operator's chosen files, so it's left as a follow-up.
Verified:
database-setup.sh ran against PostgreSQL 16 with pgmp. The role isn't a superuser; it owns everything but pgmp's objects; schema.sql, trigger toggles and pgmp arithmetic work as it; COPY … TO PROGRAM is denied.docker compose config resolves.🤖 Generated with Claude Code
Tickets: #499
Tickets: #501
Tickets: #502
Tickets: #511
Tickets: #513
Tickets: #514
Tickets: #515
Tickets: #516
Tickets: #517
Tickets: #518
Tickets: #519
Tickets: #520
Tickets: #530
Tickets: #531
Ticket changed by: athanclark