chore: the servers are named by the domain they serve

Files called the servers by their own host names, which are the
operator's and say nothing a reader needs. They now say which domain a
server serves: learn.halkyon.eu's server (the instance and its CI
runner), the halkyon.app server (Forgejo and the F-Droid repository).

Two names are settings rather than words. CI's runner label becomes
`instance` (`runs-on: instance`, `labels: ["instance:host"]`): the
runner reads its installed copy of deploy/runner/config.yml, so jobs
wait in the queue until that copy is updated and the runner restarted.
The SSH aliases the scripts and docs use become `learn-deploy` and
`fdroid-upload`. AGENTS.md says to keep it so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-13 23:11:40 +02:00
commit 93b0c0a6b0
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
11 changed files with 32 additions and 31 deletions

View file

@ -1,9 +1,9 @@
# Copy to deploy/.env, restrict it (chmod 600), and fill in. deploy/.env is git-ignored
# and never goes into an image. How it reaches sahaquiel is decided when the server is
# and never goes into an image. How it reaches the server is decided when the server is
# set up (e.g. rendered from Proton Pass on the deploying machine and copied over SSH,
# so the server itself never holds Proton credentials).
# `http://localhost` for the local rehearsal; `learn.halkyon.eu` on sahaquiel.
# `http://localhost` for the local rehearsal; `learn.halkyon.eu` on its server.
DOMAIN=http://localhost
# Postgres password, shared by the postgres and server services.

View file

@ -3,7 +3,7 @@
# production; if it is ever re-enabled, reach it through an SSH tunnel, never through
# this file.
#
# {$DOMAIN} is `learn.halkyon.eu` on sahaquiel, where Caddy obtains and renews a
# {$DOMAIN} is `learn.halkyon.eu` on its server, where Caddy obtains and renews a
# Let's Encrypt certificate by itself, and `http://localhost` for the local rehearsal.
{$DOMAIN} {
encode zstd gzip

View file

@ -1,5 +1,5 @@
# The keys whose signatures deploy/redeploy.sh accepts on main: OpenPGP primary key
# fingerprints, one per line. The deployed checkout's copy decides, so a new key comes in
# through a commit signed by a key already listed here, and its public key goes into
# deploy's GPG keyring on sahaquiel (gpg --import).
# deploy's GPG keyring on the server (gpg --import).
B172B9ED76A32EBCABA24A9F07F6FCF405488B64

View file

@ -1,6 +1,6 @@
#!/bin/sh
# Backs up learn.halkyon.eu off-site. Runs every hour from
# deploy/backup/halkyon-backup.timer, as deploy on sahaquiel; deploy/backups.md says
# deploy/backup/halkyon-backup.timer, as deploy on the server; deploy/backups.md says
# how it was set up and how to restore.
#
# Everything people keep is in the database, their files too (Serverpod's database
@ -12,7 +12,7 @@
# started since, that is everything: their app no longer finds its session and starts
# anew (deploy/backups.md). After 3 months, a deleted account is gone from every
# backup (the privacy page says so). The box's own automatic snapshots, which only
# Hetzner's Console can remove, keep the backups safe from a taken-over sahaquiel,
# Hetzner's Console can remove, keep the backups safe from a taken-over server,
# which can delete what restic wrote.
#
# Failures go to the journal only (decided 2026-10-03):

View file

@ -1,4 +1,4 @@
# The hourly off-site backup of learn.halkyon.eu, on sahaquiel: deploy/backup.sh, as
# The hourly off-site backup of learn.halkyon.eu, on its server: deploy/backup.sh, as
# deploy, started by halkyon-backup.timer. Installed with the timer as
# /etc/systemd/system/halkyon-backup.service; deploy/backups.md has the steps.
#

View file

@ -1,6 +1,6 @@
# Starts halkyon-backup.service at the start of every hour; the run at 03:00,
# sahaquiel's time (Europe/Berlin), also prunes and checks, done before the security
# updates may reboot at 04:00. A run missed while sahaquiel was off happens as soon as
# the server's time (Europe/Berlin), also prunes and checks, done before the security
# updates may reboot at 04:00. A run missed while the server was off happens as soon as
# it is back. Installed as /etc/systemd/system/halkyon-backup.timer.
[Unit]
Description=Hourly off-site backup of learn.halkyon.eu

View file

@ -55,7 +55,7 @@ Once, in this order. The commands name who runs them, and where.
network. Samba and WebDAV stay off; FTP and SFTP on port 22 can't be turned off.
2. Set up **automatic snapshots**: daily, at a fixed time, with as many kept as the box
allows (10 on a BX11).
3. Add a **sub-account** for this server: its own directory (e.g. `sahaquiel`), **SSH
3. Add a **sub-account** for this server: its own directory (e.g. `learn-halkyon-eu`), **SSH
support** and **External reachability** on, Samba and WebDAV off, not read-only
(restic deletes what it prunes). Note its user name (`uXXXXX-subN`) and password; the
password is needed once, below.
@ -68,11 +68,11 @@ sudo apt install restic
### 3. The repository (deploy, on the server)
As `deploy` (`ssh sahaquiel-deploy` on learn.halkyon.eu). A key without a passphrase,
As `deploy` (`ssh learn-deploy` on learn.halkyon.eu). A key without a passphrase,
since nobody is there to type it at 03:00:
```sh
ssh-keygen -t ed25519 -N '' -C 'deploy@sahaquiel: backups' -f ~/.ssh/storagebox
ssh-keygen -t ed25519 -N '' -C 'deploy: learn.halkyon.eu backups' -f ~/.ssh/storagebox
cat >>~/.ssh/config <<'EOF'
Host storagebox
HostName uXXXXX-subN.your-storagebox.de

View file

@ -25,7 +25,7 @@ services:
- "443:443"
- "443:443/udp" # HTTP/3
environment:
# `learn.halkyon.eu` on sahaquiel (automatic Let's Encrypt certificate);
# `learn.halkyon.eu` on its server (automatic Let's Encrypt certificate);
# `http://localhost` for the local rehearsal (plain HTTP, no certificate).
DOMAIN: ${DOMAIN:?set DOMAIN in deploy/.env}
volumes:

View file

@ -1,6 +1,6 @@
#!/bin/sh
# Deploys learn.halkyon.eu from main. The only command CI's deploy key may run: deploy's
# ~/.ssh/authorized_keys on sahaquiel pins that key to this script, from sahaquiel itself:
# ~/.ssh/authorized_keys on the server pins that key to this script, from the server itself:
#
# restrict,from="127.0.0.1,::1",command="/home/deploy/halkyon-learn/deploy/redeploy.sh" ssh-ed25519 … (CI deploy trigger)
#
@ -13,7 +13,7 @@
# before switching to the new server, and fails unless that server answers afterwards. A failure leaves the checkout at the deployed commit, so
# running the CI job again retries. By hand, with your own key:
#
# ssh sahaquiel-deploy halkyon-learn/deploy/redeploy.sh <commit>
# ssh learn-deploy halkyon-learn/deploy/redeploy.sh <commit>
set -eu
main() {

View file

@ -1,4 +1,4 @@
# The Forgejo Actions runner of this repository's CI, on sahaquiel. Installed as
# The Forgejo Actions runner of this repository's CI, on learn.halkyon.eu's server. Installed as
# /etc/forgejo-runner/config.yml, read by forgejo-runner.service (next to this file).
# Written for forgejo-runner v13.1.0; its full reference: `forgejo-runner generate-config`.
#
@ -16,12 +16,12 @@ runner:
timeout: 1h
shutdown_timeout: 10m
fetch_timeout: 30s
# How often to ask Forgejo for work. The default (2 s) is needless load on ramiel,
# a one-core server.
# How often to ask Forgejo for work. The default (2 s) is needless load on
# code.halkyon.app's server, a one-core one.
fetch_interval: 10s
report_interval: 1s
# `runs-on: sahaquiel` in a workflow means: here, on the host.
labels: ["sahaquiel:host"]
# `runs-on: instance` in a workflow means: here, on the instance's server, on the host.
labels: ["instance:host"]
cache:
# No cache server (it would listen on a port of its own); the SDKs and package

View file

@ -1,4 +1,4 @@
# The Forgejo Actions runner of this repository's CI, on sahaquiel. Installed as
# The Forgejo Actions runner of this repository's CI, on learn.halkyon.eu's server. Installed as
# /etc/systemd/system/forgejo-runner.service; its configuration is config.yml, next to
# this file.
#