Bumps the cc-ci server host's NixOS dependencies, deliberately (not drift).
Changes
input
before
after
nixpkgs
50ab793 (nixos-24.11, 2025-06-30, EOL)
531670d (nixos-26.05, 2026-08-03)
sops-nix
77c423a (held back to plain buildGoModule for 24.11 compat)
f140661 (master, buildGo125Module / Go 1.25)
This is a 3-release channel jump (24.11 → 25.05 → 25.11 → 26.05). The cc-ci server was pinned
to 24.11, which reached end-of-life on 2025-06-30 and no longer receives security updates. Moving
to 26.05 matches the orchestrator host's channel so both boxes share a nixpkgs and CVEs get patched.
systemd Stage 1 boot (26.05): initrd now boots via systemd by default, replacing the scripted
initrd. No boot.initrd / boot.kernelParams custom options in the cc-ci host config → uses the
new default, no config edit needed. A cold-boot proof is recommended after the rebuild.
dbus-broker default (26.05): requires a reboot to take effect (the nixos-rebuild switch +
optional cold-boot proof covers this).
bash nixos-rebuild removed (26.05): the Python rewrite (nixos-rebuild-ng) is now
mandatory. git must be present on the host (it is). No system.rebuild.enableNg set in the
config → no edit needed.
MySQL 8.0 removed (26.05): not used as a NixOS module on the cc-ci host (keycloak's mariadb
runs in a docker container) → not affected.
fileSystemsmkDefault (25.11): the cc-ci host's hardware.nix defines fileSystems."/"
and fileSystems."/boot/efi" explicitly with device → not affected.
No other module option renames found in the host config (nix/hosts/cc-ci-hetzner/*.nix). The nixos-rebuild build step is the safety net — if a renamed/removed option is hit, the build
fails and names the offending option before any switch.
Deploy plan (orchestrator-executed, authorized by invocation)
Stage this branch on the cc-ci host at /root/cc-ci-deploy/ (plain path flake, excludes .git).
Copy operator-held sops secrets (/etc/cc-ci/secrets/secrets.yaml) into the staged tree.
nixos-rebuild build --flake .#cc-ci first (catch errors before switching).
nixos-rebuild switch --flake .#cc-ci (the live deploy — cycles abra reconcile oneshots).
Health gate: no failed units, 7 infra services active, endpoints 200, disk stable.
Optional cold-boot proof (systemctl reboot + re-verify) — stronger guarantee for the Stage 1 change.
Not merged
This PR is the reviewable record of the bump. The live rebuild is the deploy; the PR is NOT
merged by the orchestrator. The operator reviews/merges at their discretion.
## cc-ci server flake-input bump — nixpkgs 24.11 → 26.05 + sops-nix → master
Bumps the cc-ci server host's NixOS dependencies, deliberately (not drift).
### Changes
| input | before | after |
|---|---|---|
| nixpkgs | `50ab793` (nixos-24.11, 2025-06-30, **EOL**) | `531670d` (nixos-26.05, 2026-08-03) |
| sops-nix | `77c423a` (held back to plain `buildGoModule` for 24.11 compat) | `f140661` (master, `buildGo125Module` / Go 1.25) |
This is a **3-release channel jump** (24.11 → 25.05 → 25.11 → 26.05). The cc-ci server was pinned
to 24.11, which reached end-of-life on 2025-06-30 and no longer receives security updates. Moving
to 26.05 matches the orchestrator host's channel so both boxes share a nixpkgs and CVEs get patched.
### Breaking changes reviewed (25.05 / 25.11 / 26.05 release notes)
- **systemd Stage 1 boot** (26.05): initrd now boots via systemd by default, replacing the scripted
initrd. No `boot.initrd` / `boot.kernelParams` custom options in the cc-ci host config → uses the
new default, no config edit needed. A cold-boot proof is recommended after the rebuild.
- **dbus-broker default** (26.05): requires a reboot to take effect (the `nixos-rebuild switch` +
optional cold-boot proof covers this).
- **bash `nixos-rebuild` removed** (26.05): the Python rewrite (`nixos-rebuild-ng`) is now
mandatory. `git` must be present on the host (it is). No `system.rebuild.enableNg` set in the
config → no edit needed.
- **MySQL 8.0 removed** (26.05): not used as a NixOS module on the cc-ci host (keycloak's mariadb
runs in a docker container) → not affected.
- **`fileSystems` `mkDefault`** (25.11): the cc-ci host's `hardware.nix` defines `fileSystems."/" `
and `fileSystems."/boot/efi"` explicitly with `device` → not affected.
- No other module option renames found in the host config (`nix/hosts/cc-ci-hetzner/*.nix`). The
`nixos-rebuild build` step is the safety net — if a renamed/removed option is hit, the build
fails and names the offending option before any `switch`.
### Deploy plan (orchestrator-executed, authorized by invocation)
1. Stage this branch on the cc-ci host at `/root/cc-ci-deploy/` (plain path flake, excludes `.git`).
2. Copy operator-held sops secrets (`/etc/cc-ci/secrets/secrets.yaml`) into the staged tree.
3. `nixos-rebuild build --flake .#cc-ci` first (catch errors before switching).
4. `nixos-rebuild switch --flake .#cc-ci` (the live deploy — cycles abra reconcile oneshots).
5. Health gate: no failed units, 7 infra services active, endpoints 200, disk stable.
6. Optional cold-boot proof (`systemctl reboot` + re-verify) — stronger guarantee for the Stage 1 change.
### Not merged
This PR is the reviewable record of the bump. **The live rebuild is the deploy; the PR is NOT
merged by the orchestrator.** The operator reviews/merges at their discretion.
nixpkgs: 50ab793 -> 531670d (nixos-26.05, was nixos-24.11 EOL)
sops-nix: 77c423a -> f140661 (master, buildGo125Module now builds on 26.05)
3-release channel jump (24.11 -> 25.05 -> 25.11 -> 26.05) to match the
orchestrator host and get CVE patches. 24.11 was EOL (2025-06-30).
Notable 26.05 changes reviewed: systemd Stage 1 boot (default, no config
change needed), dbus-broker default, bash nixos-rebuild removed (Python
rewrite mandatory; git present on host), MySQL 8.0 removed (not used as a
NixOS module). No system.rebuild/fileSystems/boot.initrd options in the
host config, so no config edits required.
autonomic-bot
requested review from trav 2026-08-03 19:25:15 +00:00
autonomic-bot
requested review from notplants 2026-08-03 19:25:15 +00:00
Since NixOS 25.05, scripted networking installs the default route from the
gateway interface's network-addresses-<iface>.service, matching the interface
via defaultGateway.interface or by subnet inclusion. Hetzner's off-subnet
point-to-point gateway (91.98.47.73/32 on eth0, gw 172.31.1.1) matched
neither with the bare-string form, so the 26.05 switch on 2026-08-03 left the
host with no default route and off the network (recovered via Hetzner rescue:
grubenv default back to the 24.11 generation).
With an explicit interface, the module installs both the gateway host route
and the default route from eth0's own unit:
ip -4 route replace 172.31.1.1 proto static dev eth0
ip -4 route replace default proto static dev eth0 via 172.31.1.1
Verified by nix eval of systemd.services.network-addresses-eth0.script.
Outcome: live on the cc-ci server.nixos-version = 26.05.20260803.531670d (Yarara), generation 24, cold-boot proven, 0 failed units, all core swarm services 1/1, report.ci.commoninternet.net serving HTTP 200.
Incident during first deploy
The initial nixos-rebuild switch (commit 4772e31, flake bump only) took the host off the network (~19:30–20:12 UTC): the 26.05 generation booted but never installed a default route, so SSH/Tailscale/ping were all dead while Hetzner showed the server "running".
Root cause: since NixOS 25.05, scripted networking installs the default route from the gateway interface's network-addresses-<iface>.service, and finds that interface via defaultGateway.interface or by the gateway address being inside one of the interface's subnets. This host (nixos-infect provisioning) had defaultGateway = "172.31.1.1" (bare string, no interface) with eth0 at 91.98.47.73/32 — Hetzner's off-subnet point-to-point gateway matched neither rule, so no unit claimed the default route. On 24.11 the old network-setup.service installed it unconditionally, which is why this never bit before.
Fix:c541cb1 — defaultGateway = { address = "172.31.1.1"; interface = "eth0"; }. With the interface explicit, the module installs both the gateway host route and the default route from eth0's own unit. Verified by nix eval of the generated unit script, then by a live nixos-rebuild test before switch.
Recovery path used: Hetzner rescue mode → mounted disk → grub-editenv default to the gen-22 (24.11) entry → boot → redeploy with fix → test → switch → cold-boot proof. (Note for next time: NixOS grub puts generations in a submenu, so one-shot entries need 1>N syntax, and any persistent grubenv default override must be cleared after the next switch regenerates grub.cfg.)
Merging directly per operator policy: PRs are opened for visibility/history; the skill invocation is the authorization.
## Deployed + incident report (2026-08-03)
**Outcome: live on the cc-ci server.** `nixos-version` = 26.05.20260803.531670d (Yarara), generation 24, cold-boot proven, 0 failed units, all core swarm services 1/1, report.ci.commoninternet.net serving HTTP 200.
### Incident during first deploy
The initial `nixos-rebuild switch` (commit 4772e31, flake bump only) took the host **off the network** (~19:30–20:12 UTC): the 26.05 generation booted but never installed a default route, so SSH/Tailscale/ping were all dead while Hetzner showed the server "running".
**Root cause:** since NixOS 25.05, scripted networking installs the default route from the gateway interface's `network-addresses-<iface>.service`, and finds that interface via `defaultGateway.interface` or by the gateway address being inside one of the interface's subnets. This host (nixos-infect provisioning) had `defaultGateway = "172.31.1.1"` (bare string, no interface) with eth0 at `91.98.47.73/32` — Hetzner's off-subnet point-to-point gateway matched neither rule, so **no unit claimed the default route**. On 24.11 the old `network-setup.service` installed it unconditionally, which is why this never bit before.
**Fix:** c541cb1 — `defaultGateway = { address = "172.31.1.1"; interface = "eth0"; }`. With the interface explicit, the module installs both the gateway host route and the default route from eth0's own unit. Verified by `nix eval` of the generated unit script, then by a live `nixos-rebuild test` before `switch`.
**Recovery path used:** Hetzner rescue mode → mounted disk → `grub-editenv` default to the gen-22 (24.11) entry → boot → redeploy with fix → `test` → `switch` → cold-boot proof. (Note for next time: NixOS grub puts generations in a submenu, so one-shot entries need `1>N` syntax, and any persistent grubenv `default` override must be cleared after the next switch regenerates grub.cfg.)
Merging directly per operator policy: PRs are opened for visibility/history; the skill invocation is the authorization.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
cc-ci server flake-input bump — nixpkgs 24.11 → 26.05 + sops-nix → master
Bumps the cc-ci server host's NixOS dependencies, deliberately (not drift).
Changes
50ab793(nixos-24.11, 2025-06-30, EOL)531670d(nixos-26.05, 2026-08-03)77c423a(held back to plainbuildGoModulefor 24.11 compat)f140661(master,buildGo125Module/ Go 1.25)This is a 3-release channel jump (24.11 → 25.05 → 25.11 → 26.05). The cc-ci server was pinned
to 24.11, which reached end-of-life on 2025-06-30 and no longer receives security updates. Moving
to 26.05 matches the orchestrator host's channel so both boxes share a nixpkgs and CVEs get patched.
Breaking changes reviewed (25.05 / 25.11 / 26.05 release notes)
initrd. No
boot.initrd/boot.kernelParamscustom options in the cc-ci host config → uses thenew default, no config edit needed. A cold-boot proof is recommended after the rebuild.
nixos-rebuild switch+optional cold-boot proof covers this).
nixos-rebuildremoved (26.05): the Python rewrite (nixos-rebuild-ng) is nowmandatory.
gitmust be present on the host (it is). Nosystem.rebuild.enableNgset in theconfig → no edit needed.
runs in a docker container) → not affected.
fileSystemsmkDefault(25.11): the cc-ci host'shardware.nixdefinesfileSystems."/"and
fileSystems."/boot/efi"explicitly withdevice→ not affected.nix/hosts/cc-ci-hetzner/*.nix). Thenixos-rebuild buildstep is the safety net — if a renamed/removed option is hit, the buildfails and names the offending option before any
switch.Deploy plan (orchestrator-executed, authorized by invocation)
/root/cc-ci-deploy/(plain path flake, excludes.git)./etc/cc-ci/secrets/secrets.yaml) into the staged tree.nixos-rebuild build --flake .#cc-cifirst (catch errors before switching).nixos-rebuild switch --flake .#cc-ci(the live deploy — cycles abra reconcile oneshots).systemctl reboot+ re-verify) — stronger guarantee for the Stage 1 change.Not merged
This PR is the reviewable record of the bump. The live rebuild is the deploy; the PR is NOT
merged by the orchestrator. The operator reviews/merges at their discretion.
Deployed + incident report (2026-08-03)
Outcome: live on the cc-ci server.
nixos-version= 26.05.20260803.531670d (Yarara), generation 24, cold-boot proven, 0 failed units, all core swarm services 1/1, report.ci.commoninternet.net serving HTTP 200.Incident during first deploy
The initial
nixos-rebuild switch(commit4772e31, flake bump only) took the host off the network (~19:30–20:12 UTC): the 26.05 generation booted but never installed a default route, so SSH/Tailscale/ping were all dead while Hetzner showed the server "running".Root cause: since NixOS 25.05, scripted networking installs the default route from the gateway interface's
network-addresses-<iface>.service, and finds that interface viadefaultGateway.interfaceor by the gateway address being inside one of the interface's subnets. This host (nixos-infect provisioning) haddefaultGateway = "172.31.1.1"(bare string, no interface) with eth0 at91.98.47.73/32— Hetzner's off-subnet point-to-point gateway matched neither rule, so no unit claimed the default route. On 24.11 the oldnetwork-setup.serviceinstalled it unconditionally, which is why this never bit before.Fix:
c541cb1—defaultGateway = { address = "172.31.1.1"; interface = "eth0"; }. With the interface explicit, the module installs both the gateway host route and the default route from eth0's own unit. Verified bynix evalof the generated unit script, then by a livenixos-rebuild testbeforeswitch.Recovery path used: Hetzner rescue mode → mounted disk →
grub-editenvdefault to the gen-22 (24.11) entry → boot → redeploy with fix →test→switch→ cold-boot proof. (Note for next time: NixOS grub puts generations in a submenu, so one-shot entries need1>Nsyntax, and any persistent grubenvdefaultoverride must be cleared after the next switch regenerates grub.cfg.)Merging directly per operator policy: PRs are opened for visibility/history; the skill invocation is the authorization.