feat(halkyon,myrmex,train,meditate)!: a register for each app, at halkyon.li and myrmex.li (ADR 0045, step 5)
All checks were successful
CI / check (push) Successful in 46m25s

halkyon.li's deploy under Halkyon Days' names (D13, D23): the compose
files compose.halkyon.yaml, compose.myrmex.yaml and
compose.myrmex-search.yaml, the service myrmex-server, the images
halkyon-halkyon-server, halkyon-halkyon-dictionaries and
halkyon-myrmex-server, the databases halkyon_halkyon and halkyon_myrmex
and the superuser halkyon_halkyon, and every variable under its
service's name (LEARN_ is HALKYON_, TODO_ MYRMEX_). The Compose project
and its network keep halkyon-learn, as the volumes are named after it.

Every server is a register of its own (D7, D9, D20): no
ACCOUNT_REGISTER_URL, INSTANCE_SECRET or INSTANCE_MEMBER_ any more; each
reads its sign-in settings as <APP>_SIGN_UP, <APP>_SIMPLELOGIN_…, and so
on (the mail server alone is shared), signs in with a SimpleLogin app of
its own, and serves its register's pages itself: Myrmex's, Train's and
Meditate's servers add the SimpleLogin callback, the privacy page and
the profile pages, and their Caddy sites forward them.

Halkyon answers at halkyon.li and Myrmex at myrmex.li (D22):
learn.halkyon.li and todo.halkyon.li leave ramiel's HAProxy and Caddy;
Halkyon's and Myrmex's builds, snaps and F-Droid listings connect to the
new addresses, and Halkyon's App Links name halkyon.li.

The switch is a script run once by hand (D24), as the deployed
redeploy.sh can't carry the migration records nor rename an open
database: deploy/host/switch-0045.sh rewrites .env (env-0045.sh: every
secret kept, a decoy key made for each new register), dumps every
database, renames them and the superuser through a temporary superuser
in one transaction, fast-forwards, carries the migration records to the
modules' new names, migrates, copies the developer's account (its keys
and its operator's scope, D21) into the other registers, and starts
everything. deploy/host/link-simplelogin.sh then links each register's
new SimpleLogin identity to that account, found by the four words of its
wait screen. Their SQL was run against PostgreSQL 16 on the databases
the migrations define. redeploy.sh no longer carries records.

BREAKING CHANGE: learn.halkyon.li and todo.halkyon.li no longer answer;
the apps connect to halkyon.li and myrmex.li, and each app's accounts
are its own.

Whats-New: Each app now keeps its own accounts; Halkyon is at halkyon.li and Myrmex at myrmex.li.
Whats-New-De: Jede App führt jetzt ihre eigenen Konten; Halkyon ist unter halkyon.li erreichbar und Myrmex unter myrmex.li.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-13 02:04:48 +01:00
commit b4540e53cd
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -14,7 +14,8 @@
"Halkyon Meditate" for now, "Halkyon" over their word in their wordmark, cobalt over
copper; the Proton Pass items of Halkyon's and Myrmex's keystores renamed by the
developer after the apps (`Halkyon – Android release keystore`, `Myrmex – …`), as
the release tool finds an app's item by its name.
the release tool finds an app's item by its name. Amended on 13 Nov 2026 by the
developer for step 5: D20 to D24.
- **Builds on:** ADR 0015 (one repository), ADR 0016 (one account across an instance),
ADR 0017 (a password and an authenticator), ADR 0020 (SimpleLogin), ADR 0031 (the
apps' icons), ADR 0039 (halkyon.li at home).
@ -190,6 +191,55 @@ gives people calm from prying, surveillance-capitalist eyes.
#FFB4AB, with #3B0905 on it, container #5C1712 with #FFDAD5. Proton's apps keep
strong reds in their dark themes too (Mail's #F5385A, Wallet's #FB7878), but theirs
are crimson (349°), 12° from our strawberry (337°); ours sits at 3°.
- **D20 Each register signs in with a SimpleLogin app of its own** (the developer's
choice, over the agent's recommendation of one app shared by the four until
SimpleLogin goes): Halkyon keeps the instance's app, its callback moved to
`https://halkyon.li/simplelogin-callback`; Myrmex, Train and Meditate each take one
of the developer's apps kept in reserve (SimpleLogin made no new ones after 22 Oct
2026), with their secrets as `MYRMEX_SIMPLELOGIN_…`, `TRAIN_…` and `MEDITATE_…`.
SimpleLogin gives a person a different ID in each app (ADR 0020), so a copied
identity would match nothing: the account is linked on each new register by its
operator instead (D21). Each server serves the forwarding page, the privacy page and
the profile pages itself, as a register does.
- **D21 Only the developer's account moves, linked by the operator** (the developer's
choices): D16 for Myrmex, Train and Meditate alike, nobody else's, as nobody else
uses them. The switch copies the account's keys (its `account_password` row: the
wrapped keys and the public keys, which no register's secret touches) and its
operator's scope into each; not its email identity, authenticator or recovery
codes, which are keyed with Halkyon's secrets, each register having its own (D7);
they come back with a password, once there is mail (D8). Then the developer signs
in on each with its SimpleLogin app, which makes an account waiting for approval,
and `deploy/host/link-simplelogin.sh` moves that SimpleLogin identity onto the
developer's account and deletes the empty one. Over building the link into the
module's operator screen: no code for a step taken once. Train and Meditate are
`SIGN_UP=closed` once linked (D9); Halkyon and Myrmex stay on approval (D15).
- **D22 learn.halkyon.li and todo.halkyon.li go** (the developer's choice, over
redirecting them): Halkyon answers at `halkyon.li`, Myrmex at `myrmex.li`, Train and
Meditate where they are; the old names leave HAProxy, Caddy and DNS. Only the
developer's own links named them. Halkyon's and Myrmex's builds connect to
`https://halkyon.li/` and `https://myrmex.li/`; Train's keeps `train.halkyon.eu`
until the developer decides otherwise.
- **D23 The databases, the superuser and the images take the new names too** (the
developer's choice, over keeping them as the Compose project keeps its own):
`halkyon_learn` becomes `halkyon_halkyon`, as database and as the instance's
PostgreSQL superuser, `halkyon_todo` `halkyon_myrmex`, as database and role, and
the images `halkyon-halkyon-server`, `halkyon-halkyon-dictionaries` and
`halkyon-myrmex-server`, the service `todo-server` `myrmex-server`. The Compose
project and its edge network keep `halkyon-learn`, as Docker names the volumes
after the project. The servers' development and test databases keep their names, as
renaming them would start each developer's own database empty.
- **D24 The switch is a script run once by hand** (the agent's recommendation, which
the developer chose, over two deploys): `deploy/redeploy.sh` runs as the copy
deployed, which predates step 3's carrying of the migration records, and can't
rename a database a server holds open. `deploy/host/switch-0045.sh`, run as
`deploy` on the instance's host once the night's CI run passed, checks the
signatures as redeploy.sh does, dumps every database, stops the services, renames
the databases and the superuser, rewrites `.env` (`deploy/host/env-0045.sh`: D13's
names, a register's secrets made for each), fast-forwards, carries the migration
records, migrates, copies the developer's account into the other registers (D21),
starts everything and waits for each server; deploys after it are redeploy.sh's
again. It runs from a copy taken out of the commit, as the deployed checkout lacks
it, and goes on where it stopped when run again.
## Steps