Graceful fresh-provider bootstrap ladder (#336, #882) #1172

Merged
kiara merged 36 commits from kiara/fediversity:bootstrap-order into main 2026-07-05 09:31:17 +02:00
Owner

Graceful fresh-provider bootstrap ladder (#336, #882)

A fresh hosting provider comes up along the chain incus -> terraform-backend -> openbao -> valkey -> spire -> netbox, but every rung wants something a later rung provides: the TF graph needs a state backend it itself deploys, secret-bearing components want their secrets from openbao-via-SPIRE before openbao is initialized or SPIRE has a trust root, and NetBox self-discovery reads state from a backend that does not exist yet. This climbs the ladder rung by rung so an external team can deploy a provider without owning any Fediversity-team secret beyond the irreducible floor.

The design is written up in notes/bootstrap-full-ladder.md; the remaining load-bearing seeds and their provenance are audited in notes/bootstrap-seeds.md; operator steps are in notes/bootstrap.md.

State chicken-and-egg (#336, #515)

The hosting-provider group deploys the nimbolus terraform-backend (an HTTP state store) as one of its own nodes, yet TF deployments need an HTTP backend to store state. Add the standard OpenTofu local-then-migrate bootstrap, gated behind an explicit BOOTSTRAP=1 env flag so a transient backend outage in steady state can never silently fork state to a local file.

The mechanism is a thin generic wrapper (src/effects/tf/common/bootstrap-apply.sh) in method-agnostic shared tfRun, so tf-incus-hosts (the real path), tf-hosts, and tf-incus-operator-hosts inherit it. On the normal path (no BOOTSTRAP=1) it is a byte-identical pass-through to the baked-HTTP apply; SSH deploys have no HTTP backend so it is force-disabled. Under BOOTSTRAP=1:

  • Cycle 1 (HTTP unreachable): apply with a backend "local" override in a writable copy of the read-only baked tf-env, self-state pointed at the local file.
  • Cycle 2 (HTTP reachable, local state present): init -migrate-state -force-copy copies state up to the running backend, then a .migrated marker gates re-migration.
  • Cycle 3+ (or no BOOTSTRAP): short-circuit to the plain HTTP apply; idempotent.

A single BOOTSTRAP=1 invocation converges both applies on one clock, blocking on backend reachability between them via the reusable src/effects/tf/common/wait-for-http.sh (loud-fail-past-timeout, no silent fallback to local state). Deploy-time tofu init stays offline: the withPlugins tofu on PATH resolves providers from its baked filesystem mirror.

Secret-provenance chicken-and-egg (#493, #882)

The state store does not recur, but every secret-bearing component hits the same first-boot problem: it wants its secret from openbao-via-SPIRE, and on a fresh provider openbao is empty, SPIRE has no trust root, and the agent has no SVID. Each rung is made graph-native:

  • Stage 0 -- incus (out-of-band). The graph provisioning LXC needs an Incus daemon on :8443 that cannot be brought up by the graph depending on it. Formalize the hosting-provider-ssh-incus target (SSH effect, no HTTP backend so bootstrap is force-disabled) as documented step 0, plus the redeploy/reset-failed recovery for the incus node's spire-agent/openbao-agent units that fail before the ladder is up.
  • Stage 2 -- openbao first-boot. openbao-init.service decides whether to init from openbao's own -status, never re-initing an already-initialized node (which would orphan the unseal key); the already-init but sealed path re-unseals from the persisted key and a lost seed fails loud. Adds a services.openbao-init.unsealMethod (manual-key | tpm-sealed) seam, and implements tpm-sealed: the unseal key is sealed to the node's vTPM (the same vTPM SPIRE attests against, #633) instead of persisted to disk, retiring the on-disk unseal-key seed on TPM nodes. manual-key stays the default.
  • Stage 3 -- SPIRE trust-root self-bootstrap (keystone). EK auto-registration was already graph-native (register-ek.sh in the tf-incus-hosts post-apply hook). Close the last out-of-band step: the SPIRE server serves the (public) CA trust bundle over plain HTTP :8082, and each agent's spire-agent-trust-bundle oneshot self-fetches its trust root on first boot with a bounded retry, ordered before spire-agent.service. A pre-seeded bundle still short-circuits the fetch.
  • Stage 4 -- valkey fails closed. The nixpkgs redis module renders requirepass from a file with an unguarded cat; an absent/empty bootstrap-password file (failed render on a fresh provider) would silently start valkey passwordless and publicly reachable. Promote each instance's edge on generate-vars/openbao-agent-default from Wants to Requires and add a test -s ExecStartPre gate so the instance refuses to start without a non-empty password.
  • Stage 5 -- netbox self-read degrades to DHCP. A bare tofu apply without the BOOTSTRAP=1 wrapper trapped at plan time on a terraform_remote_state.self read of the not-yet-existing backend. A data "external" reachability probe (self-state-reachable.sh, same "any HTTP response = up" definition) gates the self-read's count to 0 when the backend is unreachable, so a naive fresh-provider apply degrades to DHCP-only instead of hanging. BOOTSTRAP=1 stays the blessed entrypoint.
  • Stage 6 -- retire the seed catalog. openbao-spire-auth self-fetches the same public SPIRE CA bundle over HTTP instead of an out-of-band copy. The secrets resource gains a per-secret provider (agenix | vars) so any post-ladder secret can be sourced from SPIRE-attested openbao over the contracts.fileSecrets interface, letting an external team avoid owning Fediversity agenix recipients. notes/bootstrap-seeds.md audits the four irreducible seeds that remain (operator SSH access, openbao unseal key on non-TPM nodes, agenix recipients, deployment SSH key).

Tests

  • checks/deployment/tf-hosts-bootstrap models the true state chicken-and-egg (the terraform-backend node is a deployed target, not the deployer) and proves the before / local-state / migrate / idempotent progression.
  • deployment-tf-self-state-reachable -- a cheap native check running the real probe against all six backend scenarios (empty / unknown / local-present / local-absent / http-down / http-up).
  • integrations-spire-openbao covers openbao idempotency + crash-recovery re-unseal and runs the openbao node under tpm-sealed with a swtpm, asserting init.json carries no plaintext key material.
  • integrations-spire-incus asserts a fresh agent self-fetches a trust bundle matching the server with no pre-seeded bundle.
  • test-valkey-service asserts the instance refuses to start with a truncated bootstrap-password file, then starts cleanly once restored.

Disclaimer: I used a coding agent in the creation of this patch.

## Graceful fresh-provider bootstrap ladder (#336, #882) A fresh hosting provider comes up along the chain `incus -> terraform-backend -> openbao -> valkey -> spire -> netbox`, but every rung wants something a later rung provides: the TF graph needs a state backend it itself deploys, secret-bearing components want their secrets from openbao-via-SPIRE before openbao is initialized or SPIRE has a trust root, and NetBox self-discovery reads state from a backend that does not exist yet. This climbs the ladder rung by rung so an external team can deploy a provider without owning any Fediversity-team secret beyond the irreducible floor. The design is written up in `notes/bootstrap-full-ladder.md`; the remaining load-bearing seeds and their provenance are audited in `notes/bootstrap-seeds.md`; operator steps are in `notes/bootstrap.md`. ### State chicken-and-egg (#336, #515) The hosting-provider group deploys the nimbolus `terraform-backend` (an HTTP state store) as one of its own nodes, yet TF deployments need an HTTP backend to store state. Add the standard OpenTofu local-then-migrate bootstrap, gated behind an explicit `BOOTSTRAP=1` env flag so a transient backend outage in steady state can never silently fork state to a local file. The mechanism is a thin generic wrapper (`src/effects/tf/common/bootstrap-apply.sh`) in method-agnostic shared `tfRun`, so `tf-incus-hosts` (the real path), `tf-hosts`, and `tf-incus-operator-hosts` inherit it. On the normal path (no `BOOTSTRAP=1`) it is a byte-identical pass-through to the baked-HTTP apply; SSH deploys have no HTTP backend so it is force-disabled. Under `BOOTSTRAP=1`: - **Cycle 1 (HTTP unreachable):** apply with a `backend "local"` override in a writable copy of the read-only baked `tf-env`, self-state pointed at the local file. - **Cycle 2 (HTTP reachable, local state present):** `init -migrate-state -force-copy` copies state up to the running backend, then a `.migrated` marker gates re-migration. - **Cycle 3+ (or no `BOOTSTRAP`):** short-circuit to the plain HTTP apply; idempotent. A single `BOOTSTRAP=1` invocation converges both applies on one clock, blocking on backend reachability between them via the reusable `src/effects/tf/common/wait-for-http.sh` (loud-fail-past-timeout, no silent fallback to local state). Deploy-time `tofu init` stays offline: the `withPlugins` `tofu` on PATH resolves providers from its baked filesystem mirror. ### Secret-provenance chicken-and-egg (#493, #882) The state store does not recur, but every secret-bearing component hits the same first-boot problem: it wants its secret from openbao-via-SPIRE, and on a fresh provider openbao is empty, SPIRE has no trust root, and the agent has no SVID. Each rung is made graph-native: - **Stage 0 -- incus (out-of-band).** The graph provisioning LXC needs an Incus daemon on `:8443` that cannot be brought up by the graph depending on it. Formalize the `hosting-provider-ssh-incus` target (SSH effect, no HTTP backend so `bootstrap` is force-disabled) as documented step 0, plus the redeploy/`reset-failed` recovery for the incus node's `spire-agent`/`openbao-agent` units that fail before the ladder is up. - **Stage 2 -- openbao first-boot.** `openbao-init.service` decides whether to init from openbao's own `-status`, never re-initing an already-initialized node (which would orphan the unseal key); the `already-init but sealed` path re-unseals from the persisted key and a lost seed fails loud. Adds a `services.openbao-init.unsealMethod` (`manual-key` | `tpm-sealed`) seam, and **implements `tpm-sealed`**: the unseal key is sealed to the node's vTPM (the same vTPM SPIRE attests against, #633) instead of persisted to disk, retiring the on-disk unseal-key seed on TPM nodes. `manual-key` stays the default. - **Stage 3 -- SPIRE trust-root self-bootstrap (keystone).** EK auto-registration was already graph-native (`register-ek.sh` in the tf-incus-hosts post-apply hook). Close the last out-of-band step: the SPIRE server serves the (public) CA trust bundle over plain HTTP `:8082`, and each agent's `spire-agent-trust-bundle` oneshot self-fetches its trust root on first boot with a bounded retry, ordered before `spire-agent.service`. A pre-seeded bundle still short-circuits the fetch. - **Stage 4 -- valkey fails closed.** The nixpkgs `redis` module renders `requirepass` from a file with an unguarded `cat`; an absent/empty bootstrap-password file (failed render on a fresh provider) would silently start valkey passwordless and publicly reachable. Promote each instance's edge on `generate-vars`/`openbao-agent-default` from `Wants` to `Requires` and add a `test -s` `ExecStartPre` gate so the instance refuses to start without a non-empty password. - **Stage 5 -- netbox self-read degrades to DHCP.** A bare `tofu apply` without the `BOOTSTRAP=1` wrapper trapped at plan time on a `terraform_remote_state.self` read of the not-yet-existing backend. A `data "external"` reachability probe (`self-state-reachable.sh`, same "any HTTP response = up" definition) gates the self-read's `count` to 0 when the backend is unreachable, so a naive fresh-provider apply degrades to DHCP-only instead of hanging. `BOOTSTRAP=1` stays the blessed entrypoint. - **Stage 6 -- retire the seed catalog.** `openbao-spire-auth` self-fetches the same public SPIRE CA bundle over HTTP instead of an out-of-band copy. The `secrets` resource gains a per-secret `provider` (`agenix` | `vars`) so any post-ladder secret can be sourced from SPIRE-attested openbao over the `contracts.fileSecrets` interface, letting an external team avoid owning Fediversity agenix recipients. `notes/bootstrap-seeds.md` audits the four irreducible seeds that remain (operator SSH access, openbao unseal key on non-TPM nodes, agenix recipients, deployment SSH key). ### Tests - `checks/deployment/tf-hosts-bootstrap` models the true state chicken-and-egg (the `terraform-backend` node is a deployed target, not the deployer) and proves the before / local-state / migrate / idempotent progression. - `deployment-tf-self-state-reachable` -- a cheap native check running the real probe against all six backend scenarios (empty / unknown / local-present / local-absent / http-down / http-up). - `integrations-spire-openbao` covers openbao idempotency + crash-recovery re-unseal and runs the openbao node under `tpm-sealed` with a swtpm, asserting `init.json` carries no plaintext key material. - `integrations-spire-incus` asserts a fresh agent self-fetches a trust bundle matching the server with no pre-seeded bundle. - `test-valkey-service` asserts the instance refuses to start with a truncated bootstrap-password file, then starts cleanly once restored. Disclaimer: I used a coding agent in the creation of this patch.
@ -231,0 +295,4 @@
# The self-state seed (`seed-self-state.sh`, #833), invoked before each
# bootstrap apply with the cycle-appropriate `TF_VAR_self_state_*` so
# the netbox self-read survives. Empty when the effect sets no preRun.
BOOTSTRAP_SEED = if preRun == "" then "" else preRun;
Author
Owner

in other words... = if preRun;?

in other words... `= if preRun;`?
kiara marked this conversation as resolved
@ -0,0 +126,4 @@
with subtest("Normalizing reinvocation: migrate local state up to HTTP"):
# Backend node is live now, so a second BOOTSTRAP=1 run migrates the local
# state up to the HTTP backend and applies against it.
Author
Owner

if one is to run the bootstrap command twice, then why not just have the bootstrap env var(s) already do it twice so it already reaches the stable state?

if one is to run the bootstrap command twice, then why not just have the bootstrap env var(s) already do it twice so it already reaches the stable state?
kiara marked this conversation as resolved
@ -0,0 +1,82 @@
# Graceful bootstrap of a fresh hosting-provider TF backend (#336, #882)
Author
Owner

so far this bootstrap script just resolves the bootstrap challenge for the initially lacking TF backend? because #336 lists at least 6 known components that we want to use in our deployments yet initially have yet to deploy themselves - of which this is only the 2nd one (out of 6).
6. to be fair, #1150 may have tackled it for netbox, the last item.

  1. incus we might not able to have as part of the *-all deployments deployed by incus, so it should probably be deployed separately upfront by ssh - and maybe incus just either shouldn't be exposed in *-all, or even should go in a separate group from the rest there (such that like *-all logic would not need to be maimed just because hypervisors deploy differently from the services they get used to deploy).

so overall i'm still wondering for such a bootstrap test/script about at least openbao, valkey and spire.

so far this bootstrap script just resolves the bootstrap challenge for the initially lacking TF backend? because #336 lists at least 6 known components that we want to use in our deployments yet initially have yet to deploy themselves - of which this is only the 2nd one (out of 6). 6. to be fair, #1150 may have tackled it for netbox, the last item. 1. incus we might not able to have as part of the `*-all` deployments deployed by incus, so it should probably be deployed separately upfront by ssh - and maybe incus just either shouldn't be exposed in `*-all`, or even should go in a separate group from the rest there (such that like `*-all` logic would not need to be maimed just because hypervisors deploy differently from the services they get used to deploy). so overall i'm still wondering for such a bootstrap test/script about at least openbao, valkey and spire.
kiara marked this conversation as resolved
kiara force-pushed bootstrap-order from 0a44cabeed
Some checks failed
nixosConfigurations-dev-forgejo-runner / dev-forgejo-runner (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-api / hosting-provider-api (pull_request) Successful in 15s
devShells-default / default (pull_request) Successful in 19s
nixosConfigurations-dev-forgejo / dev-forgejo (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-authelia / hosting-provider-authelia (pull_request) Successful in 16s
nix-unit-effects-common-lib / effects-common-lib (pull_request) Successful in 22s
nix-unit-contracts-lib / contracts-lib (pull_request) Successful in 27s
nix-unit-effects-tf-common-conversion / effects-tf-common-conversion (pull_request) Successful in 11s
nixosConfigurations-hosting-provider-bind / hosting-provider-bind (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-garage / hosting-provider-garage (pull_request) Successful in 16s
checks-contracts-chaining / contracts-chaining (pull_request) Successful in 38s
nixosConfigurations-hosting-provider-incus / hosting-provider-incus (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-monitoring / hosting-provider-monitoring (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-lldap / hosting-provider-lldap (pull_request) Successful in 17s
nix-unit-lib-data-model / lib-data-model (pull_request) Successful in 22s
nixosConfigurations-hosting-provider-netbox / hosting-provider-netbox (pull_request) Successful in 12s
nixosConfigurations-hosting-provider-openbao / hosting-provider-openbao (pull_request) Successful in 13s
nix-unit-lib-function / lib-function (pull_request) Successful in 21s
nix-unit-lib-lib / lib-lib (pull_request) Successful in 21s
nixosConfigurations-hosting-provider-otel-collector / hosting-provider-otel-collector (pull_request) Successful in 15s
nix-unit-lib-renames-for-source / lib-renames-for-source (pull_request) Successful in 9s
nixosConfigurations-hosting-provider-panel / hosting-provider-panel (pull_request) Successful in 16s
nix-unit-resources-garage-forward-compat / resources-garage-forward-compat (pull_request) Successful in 9s
nixosConfigurations-hosting-provider-spire / hosting-provider-spire (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-postgresql / hosting-provider-postgresql (pull_request) Successful in 22s
nix-unit-resources-redis-port / resources-redis-port (pull_request) Successful in 8s
nixosConfigurations-hosting-provider-terraform-backend / hosting-provider-terraform-backend (pull_request) Successful in 19s
nixosConfigurations-hosting-provider-valkey / hosting-provider-valkey (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-windmill / hosting-provider-windmill (pull_request) Successful in 20s
nix-unit-resources-generateFiles / resources-generateFiles (pull_request) Successful in 28s
nixosConfigurations-operator-authelia / operator-authelia (pull_request) Successful in 21s
nix-unit-resources-otel / resources-otel (pull_request) Successful in 37s
nixosConfigurations-operator-lldap / operator-lldap (pull_request) Successful in 20s
nix-unit-resources-secrets / resources-secrets (pull_request) Successful in 24s
checks-contracts-cross-node / contracts-cross-node (pull_request) Successful in 57s
nixosConfigurations-operator-combined / operator-combined (pull_request) Successful in 26s
nixosConfigurations-operator-peertube / operator-peertube (pull_request) Successful in 19s
nixosConfigurations-operator-mastodon / operator-mastodon (pull_request) Successful in 19s
nixosConfigurations-operator-pixelfed / operator-pixelfed (pull_request) Successful in 15s
nixosConfigurations-operator-smtp / operator-smtp (pull_request) Successful in 14s
nixosConfigurations-operator-valkey / operator-valkey (pull_request) Successful in 13s
Nix flake completeness check / _complete (pull_request) Successful in 2m18s
checks-contracts-filebackup-hardcoded-file-backup / contracts-filebackup-hardcoded-file-backup (pull_request) Failing after 1m5s
checks-contracts-filesecrets-hardcoded-secret / contracts-filesecrets-hardcoded-secret (pull_request) Successful in 29s
checks-contracts-generatefiles-vars / contracts-generatefiles-vars (pull_request) Successful in 26s
checks-contracts-ldap-lldap / contracts-ldap-lldap (pull_request) Successful in 36s
checks-contracts-ldap-openldap / contracts-ldap-openldap (pull_request) Successful in 33s
checks-contracts-oidc-dex / contracts-oidc-dex (pull_request) Successful in 29s
flake-show / flake-show (pull_request) Successful in 5m8s
checks-contracts-redis-valkey / contracts-redis-valkey (pull_request) Successful in 33s
checks-contracts-s3-minio / contracts-s3-minio (pull_request) Successful in 36s
checks-contracts-smtp-maddy / contracts-smtp-maddy (pull_request) Successful in 31s
checks-contracts-smtp-opensmtpd / contracts-smtp-opensmtpd (pull_request) Successful in 25s
checks-contracts-ssl-self-signed / contracts-ssl-self-signed (pull_request) Successful in 26s
checks-contracts-generatefiles-vars-openbao / contracts-generatefiles-vars-openbao (pull_request) Successful in 4m53s
checks-contracts-streamingbackup-hardcoded / contracts-streamingbackup-hardcoded (pull_request) Successful in 26s
checks-panel-docs / panel-docs (pull_request) Successful in 7s
checks-test-mastodon-service / test-mastodon-service (pull_request) Successful in 8m29s
checks-resources-secrets-agenix / resources-secrets-agenix (pull_request) Successful in 26s
checks-core-docs / core-docs (pull_request) Successful in 9m16s
checks-test-monitoring-storage / test-monitoring-storage (pull_request) Successful in 1m11s
checks-test-otel-wiring / test-otel-wiring (pull_request) Successful in 10s
checks-test-valkey-service / test-valkey-service (pull_request) Successful in 10s
checks-treefmt / treefmt (pull_request) Successful in 11s
checks-deployment-tf-incus-hosts / deployment-tf-incus-hosts (pull_request) Successful in 10m27s
checks-test-pixelfed-service / test-pixelfed-service (pull_request) Successful in 3m35s
checks-contracts-systemd-openbaod / contracts-systemd-openbaod (pull_request) Successful in 9m13s
checks-deployment-nixos-hosts / deployment-nixos-hosts (pull_request) Successful in 11m34s
checks-deployment-tf-hosts / deployment-tf-hosts (pull_request) Successful in 8m9s
checks-integrations-spire-incus / integrations-spire-incus (pull_request) Successful in 9m14s
checks-deployment-ssh-hosts / deployment-ssh-hosts (pull_request) Successful in 22m16s
checks-deployment-tf-hosts-bootstrap / deployment-tf-hosts-bootstrap (pull_request) Successful in 19m6s
checks-integrations-octodns / integrations-octodns (pull_request) Successful in 7m13s
checks-test-netbox-service / test-netbox-service (pull_request) Successful in 9m34s
checks-apps-tf / apps-tf (pull_request) Successful in 57m55s
checks-apps-api / apps-api (pull_request) Successful in 45m7s
checks-apps-tf-incus / apps-tf-incus (pull_request) Successful in 46m45s
to c84a1d6296
Some checks failed
checks-contracts-chaining / contracts-chaining (pull_request) Successful in 10s
nixosConfigurations-dev-forgejo / dev-forgejo (pull_request) Successful in 18s
nixosConfigurations-dev-forgejo-runner / dev-forgejo-runner (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-api / hosting-provider-api (pull_request) Successful in 19s
devShells-default / default (pull_request) Successful in 23s
nixosConfigurations-hosting-provider-authelia / hosting-provider-authelia (pull_request) Successful in 20s
checks-contracts-cross-node / contracts-cross-node (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-bind / hosting-provider-bind (pull_request) Successful in 18s
checks-deployment-nixos-hosts / deployment-nixos-hosts (pull_request) Successful in 30s
nix-unit-contracts-lib / contracts-lib (pull_request) Successful in 33s
nix-unit-effects-common-lib / effects-common-lib (pull_request) Successful in 34s
nixosConfigurations-hosting-provider-garage / hosting-provider-garage (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-incus / hosting-provider-incus (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-lldap / hosting-provider-lldap (pull_request) Successful in 19s
nix-unit-effects-tf-common-conversion / effects-tf-common-conversion (pull_request) Successful in 19s
nixosConfigurations-hosting-provider-monitoring / hosting-provider-monitoring (pull_request) Successful in 17s
checks-contracts-filebackup-hardcoded-file-backup / contracts-filebackup-hardcoded-file-backup (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-netbox / hosting-provider-netbox (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-openbao / hosting-provider-openbao (pull_request) Successful in 14s
nixosConfigurations-hosting-provider-otel-collector / hosting-provider-otel-collector (pull_request) Successful in 14s
nix-unit-lib-data-model / lib-data-model (pull_request) Successful in 24s
nix-unit-lib-function / lib-function (pull_request) Successful in 20s
checks-contracts-filesecrets-hardcoded-secret / contracts-filesecrets-hardcoded-secret (pull_request) Successful in 11s
nixosConfigurations-hosting-provider-panel / hosting-provider-panel (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-spire / hosting-provider-spire (pull_request) Successful in 16s
nix-unit-lib-lib / lib-lib (pull_request) Successful in 23s
nix-unit-lib-renames-for-source / lib-renames-for-source (pull_request) Successful in 9s
nixosConfigurations-hosting-provider-postgresql / hosting-provider-postgresql (pull_request) Successful in 23s
nix-unit-resources-garage-forward-compat / resources-garage-forward-compat (pull_request) Successful in 9s
nixosConfigurations-hosting-provider-terraform-backend / hosting-provider-terraform-backend (pull_request) Successful in 17s
checks-contracts-generatefiles-vars-openbao / contracts-generatefiles-vars-openbao (pull_request) Successful in 14s
nixosConfigurations-hosting-provider-valkey / hosting-provider-valkey (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-windmill / hosting-provider-windmill (pull_request) Successful in 16s
nix-unit-resources-redis-port / resources-redis-port (pull_request) Successful in 8s
nixosConfigurations-operator-authelia / operator-authelia (pull_request) Successful in 15s
nixosConfigurations-operator-lldap / operator-lldap (pull_request) Successful in 17s
checks-contracts-generatefiles-vars / contracts-generatefiles-vars (pull_request) Successful in 13s
nix-unit-resources-generateFiles / resources-generateFiles (pull_request) Successful in 23s
nixosConfigurations-operator-combined / operator-combined (pull_request) Successful in 22s
nixosConfigurations-operator-mastodon / operator-mastodon (pull_request) Successful in 16s
nixosConfigurations-operator-peertube / operator-peertube (pull_request) Successful in 16s
nix-unit-resources-otel / resources-otel (pull_request) Successful in 29s
nixosConfigurations-operator-pixelfed / operator-pixelfed (pull_request) Successful in 15s
nix-unit-resources-secrets / resources-secrets (pull_request) Successful in 20s
checks-contracts-ldap-lldap / contracts-ldap-lldap (pull_request) Successful in 12s
nixosConfigurations-operator-smtp / operator-smtp (pull_request) Successful in 14s
nixosConfigurations-operator-valkey / operator-valkey (pull_request) Successful in 12s
checks-contracts-ldap-openldap / contracts-ldap-openldap (pull_request) Successful in 10s
Nix flake completeness check / _complete (pull_request) Successful in 2m1s
checks-contracts-oidc-dex / contracts-oidc-dex (pull_request) Successful in 10s
checks-contracts-redis-valkey / contracts-redis-valkey (pull_request) Successful in 10s
checks-contracts-s3-minio / contracts-s3-minio (pull_request) Successful in 9s
checks-contracts-smtp-maddy / contracts-smtp-maddy (pull_request) Successful in 9s
checks-contracts-smtp-opensmtpd / contracts-smtp-opensmtpd (pull_request) Successful in 9s
checks-contracts-ssl-self-signed / contracts-ssl-self-signed (pull_request) Successful in 9s
checks-contracts-streamingbackup-hardcoded / contracts-streamingbackup-hardcoded (pull_request) Successful in 9s
checks-contracts-systemd-openbaod / contracts-systemd-openbaod (pull_request) Successful in 9s
checks-panel-docs / panel-docs (pull_request) Successful in 6s
checks-resources-secrets-agenix / resources-secrets-agenix (pull_request) Successful in 9s
checks-test-monitoring-storage / test-monitoring-storage (pull_request) Successful in 9s
checks-test-otel-wiring / test-otel-wiring (pull_request) Successful in 10s
checks-test-valkey-service / test-valkey-service (pull_request) Successful in 9s
checks-treefmt / treefmt (pull_request) Successful in 10s
flake-show / flake-show (pull_request) Successful in 4m58s
checks-integrations-spire-incus / integrations-spire-incus (pull_request) Successful in 5m53s
checks-deployment-tf-incus-hosts / deployment-tf-incus-hosts (pull_request) Successful in 6m30s
checks-core-docs / core-docs (pull_request) Successful in 9m28s
checks-integrations-octodns / integrations-octodns (pull_request) Successful in 28s
checks-test-netbox-service / test-netbox-service (pull_request) Successful in 19s
checks-deployment-tf-hosts / deployment-tf-hosts (pull_request) Failing after 32m6s
checks-deployment-ssh-hosts / deployment-ssh-hosts (pull_request) Failing after 38m16s
checks-apps-api / apps-api (pull_request) Successful in 48m21s
checks-apps-tf-incus / apps-tf-incus (pull_request) Successful in 51m51s
checks-deployment-tf-hosts-bootstrap / deployment-tf-hosts-bootstrap (pull_request) Failing after 55m33s
checks-apps-tf / apps-tf (pull_request) Failing after 1h31m36s
2026-07-02 15:24:17 +02:00
Compare
kiara force-pushed bootstrap-order from 5662a1eeb2
Some checks failed
checks-contracts-chaining / contracts-chaining (pull_request) Successful in 12s
checks-contracts-postgresql / contracts-postgresql (pull_request) Successful in 12s
nixosConfigurations-dev-forgejo / dev-forgejo (pull_request) Successful in 23s
nixosConfigurations-dev-forgejo-runner / dev-forgejo-runner (pull_request) Successful in 23s
nixosConfigurations-hosting-provider-api / hosting-provider-api (pull_request) Successful in 24s
nixosConfigurations-hosting-provider-authelia / hosting-provider-authelia (pull_request) Successful in 27s
checks-deployment-nixos-hosts / deployment-nixos-hosts (pull_request) Successful in 34s
checks-contracts-cross-node / contracts-cross-node (pull_request) Successful in 22s
nixosConfigurations-hosting-provider-bind / hosting-provider-bind (pull_request) Successful in 26s
nixosConfigurations-hosting-provider-garage / hosting-provider-garage (pull_request) Successful in 20s
nixosConfigurations-hosting-provider-incus / hosting-provider-incus (pull_request) Successful in 19s
checks-integrations-octodns / integrations-octodns (pull_request) Successful in 47s
nixosConfigurations-hosting-provider-monitoring / hosting-provider-monitoring (pull_request) Successful in 18s
checks-contracts-filebackup-hardcoded-file-backup / contracts-filebackup-hardcoded-file-backup (pull_request) Successful in 21s
nixosConfigurations-hosting-provider-lldap / hosting-provider-lldap (pull_request) Successful in 23s
nixosConfigurations-hosting-provider-netbox / hosting-provider-netbox (pull_request) Successful in 20s
checks-test-mastodon-service / test-mastodon-service (pull_request) Successful in 55s
checks-test-peertube-service / test-peertube-service (pull_request) Successful in 57s
checks-integrations-openbao-pki / integrations-openbao-pki (pull_request) Successful in 1m1s
nixosConfigurations-hosting-provider-openbao / hosting-provider-openbao (pull_request) Successful in 16s
checks-contracts-postgresql-rotation / contracts-postgresql-rotation (pull_request) Successful in 1m6s
nixosConfigurations-hosting-provider-otel-collector / hosting-provider-otel-collector (pull_request) Successful in 16s
checks-test-netbox-service / test-netbox-service (pull_request) Successful in 33s
checks-contracts-filesecrets-hardcoded-secret / contracts-filesecrets-hardcoded-secret (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-panel / hosting-provider-panel (pull_request) Successful in 19s
nixosConfigurations-hosting-provider-spire / hosting-provider-spire (pull_request) Successful in 18s
checks-test-ldap-engine / test-ldap-engine (pull_request) Successful in 14s
nixosConfigurations-hosting-provider-postgresql / hosting-provider-postgresql (pull_request) Successful in 25s
nixosConfigurations-hosting-provider-terraform-backend / hosting-provider-terraform-backend (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-valkey / hosting-provider-valkey (pull_request) Successful in 20s
checks-contracts-generatefiles-vars-openbao / contracts-generatefiles-vars-openbao (pull_request) Successful in 15s
devShells-default / default (pull_request) Successful in 25s
nixosConfigurations-hosting-provider-windmill / hosting-provider-windmill (pull_request) Successful in 20s
nixosConfigurations-operator-authelia / operator-authelia (pull_request) Successful in 18s
checks-integrations-spire-openbao / integrations-spire-openbao (pull_request) Failing after 1m27s
nix-unit-effects-common-lib / effects-common-lib (pull_request) Successful in 10s
nixosConfigurations-operator-mastodon / operator-mastodon (pull_request) Successful in 17s
checks-contracts-generatefiles-vars / contracts-generatefiles-vars (pull_request) Successful in 14s
nixosConfigurations-operator-lldap / operator-lldap (pull_request) Successful in 18s
nix-unit-contracts-lib / contracts-lib (pull_request) Successful in 24s
checks-test-pixelfed-service / test-pixelfed-service (pull_request) Successful in 46s
nixosConfigurations-operator-combined / operator-combined (pull_request) Successful in 26s
nixosConfigurations-operator-peertube / operator-peertube (pull_request) Successful in 14s
nixosConfigurations-operator-pixelfed / operator-pixelfed (pull_request) Successful in 14s
checks-contracts-ldap-lldap / contracts-ldap-lldap (pull_request) Successful in 13s
nixosConfigurations-operator-valkey / operator-valkey (pull_request) Successful in 15s
nixosConfigurations-operator-smtp / operator-smtp (pull_request) Successful in 16s
nix-unit-effects-tf-common-conversion / effects-tf-common-conversion (pull_request) Successful in 22s
nix-unit-lib-data-model / lib-data-model (pull_request) Successful in 23s
nix-unit-lib-function / lib-function (pull_request) Successful in 23s
checks-contracts-ldap-openldap / contracts-ldap-openldap (pull_request) Successful in 13s
nix-unit-lib-renames-for-source / lib-renames-for-source (pull_request) Successful in 9s
nix-unit-resources-garage-forward-compat / resources-garage-forward-compat (pull_request) Successful in 9s
Nix flake completeness check / _complete (pull_request) Successful in 2m25s
checks-contracts-oidc-dex / contracts-oidc-dex (pull_request) Successful in 14s
nix-unit-lib-lib / lib-lib (pull_request) Successful in 25s
checks-contracts-redis-valkey / contracts-redis-valkey (pull_request) Successful in 16s
nix-unit-resources-redis-port / resources-redis-port (pull_request) Successful in 10s
nix-unit-resources-generateFiles / resources-generateFiles (pull_request) Successful in 27s
checks-contracts-s3-minio / contracts-s3-minio (pull_request) Successful in 17s
nix-unit-resources-otel / resources-otel (pull_request) Successful in 36s
checks-contracts-smtp-maddy / contracts-smtp-maddy (pull_request) Successful in 13s
checks-contracts-smtp-opensmtpd / contracts-smtp-opensmtpd (pull_request) Successful in 13s
nix-unit-resources-secrets / resources-secrets (pull_request) Successful in 21s
checks-contracts-ssl-self-signed / contracts-ssl-self-signed (pull_request) Successful in 12s
checks-contracts-streamingbackup-hardcoded / contracts-streamingbackup-hardcoded (pull_request) Successful in 12s
checks-deployment-tf-self-state-reachable / deployment-tf-self-state-reachable (pull_request) Successful in 10s
checks-contracts-systemd-openbaod / contracts-systemd-openbaod (pull_request) Successful in 15s
checks-panel-docs / panel-docs (pull_request) Successful in 8s
checks-resources-secrets-agenix / resources-secrets-agenix (pull_request) Successful in 12s
checks-test-monitoring-storage / test-monitoring-storage (pull_request) Successful in 13s
checks-test-otel-wiring / test-otel-wiring (pull_request) Successful in 12s
checks-treefmt / treefmt (pull_request) Successful in 13s
checks-test-valkey-service / test-valkey-service (pull_request) Failing after 1m21s
flake-show / flake-show (pull_request) Successful in 5m39s
checks-deployment-tf-incus-hosts / deployment-tf-incus-hosts (pull_request) Successful in 7m16s
checks-core-docs / core-docs (pull_request) Successful in 9m37s
checks-deployment-tf-hosts-bootstrap / deployment-tf-hosts-bootstrap (pull_request) Failing after 19m13s
checks-integrations-spire-incus / integrations-spire-incus (pull_request) Successful in 15m23s
checks-deployment-tf-hosts / deployment-tf-hosts (pull_request) Failing after 33m38s
checks-deployment-ssh-hosts / deployment-ssh-hosts (pull_request) Failing after 38m31s
checks-apps-api / apps-api (pull_request) Successful in 46m35s
checks-apps-tf-incus / apps-tf-incus (pull_request) Successful in 46m54s
checks-apps-panel / apps-panel (pull_request) Successful in 51m56s
checks-apps-tf / apps-tf (pull_request) Failing after 1h2m40s
to 08bba42251
All checks were successful
checks-contracts-postgresql / contracts-postgresql (pull_request) Successful in 12s
checks-integrations-openbao-pki / integrations-openbao-pki (pull_request) Successful in 14s
checks-contracts-postgresql-rotation / contracts-postgresql-rotation (pull_request) Successful in 16s
nixosConfigurations-dev-forgejo-runner / dev-forgejo-runner (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-api / hosting-provider-api (pull_request) Successful in 16s
nixosConfigurations-dev-forgejo / dev-forgejo (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-bind / hosting-provider-bind (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-authelia / hosting-provider-authelia (pull_request) Successful in 17s
checks-contracts-chaining / contracts-chaining (pull_request) Successful in 13s
checks-test-ldap-engine / test-ldap-engine (pull_request) Successful in 12s
checks-deployment-nixos-hosts / deployment-nixos-hosts (pull_request) Successful in 31s
nixosConfigurations-hosting-provider-garage / hosting-provider-garage (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-incus / hosting-provider-incus (pull_request) Successful in 15s
devShells-default / default (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-monitoring / hosting-provider-monitoring (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-netbox / hosting-provider-netbox (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-lldap / hosting-provider-lldap (pull_request) Successful in 19s
checks-contracts-cross-node / contracts-cross-node (pull_request) Successful in 15s
nix-unit-effects-common-lib / effects-common-lib (pull_request) Successful in 10s
nixosConfigurations-hosting-provider-openbao / hosting-provider-openbao (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-otel-collector / hosting-provider-otel-collector (pull_request) Successful in 15s
nix-unit-contracts-lib / contracts-lib (pull_request) Successful in 20s
nixosConfigurations-hosting-provider-panel / hosting-provider-panel (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-smtp / hosting-provider-smtp (pull_request) Successful in 17s
checks-contracts-filebackup-hardcoded-file-backup / contracts-filebackup-hardcoded-file-backup (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-postgresql / hosting-provider-postgresql (pull_request) Successful in 20s
nixosConfigurations-hosting-provider-spire / hosting-provider-spire (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-terraform-backend / hosting-provider-terraform-backend (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-valkey / hosting-provider-valkey (pull_request) Successful in 14s
nix-unit-effects-tf-common-conversion / effects-tf-common-conversion (pull_request) Successful in 22s
nix-unit-lib-data-model / lib-data-model (pull_request) Successful in 20s
nixosConfigurations-hosting-provider-windmill / hosting-provider-windmill (pull_request) Successful in 15s
checks-contracts-filesecrets-hardcoded-secret / contracts-filesecrets-hardcoded-secret (pull_request) Successful in 12s
checks-test-peertube-service / test-peertube-service (pull_request) Successful in 44s
nixosConfigurations-operator-authelia / operator-authelia (pull_request) Successful in 14s
nixosConfigurations-operator-lldap / operator-lldap (pull_request) Successful in 15s
nix-unit-lib-function / lib-function (pull_request) Successful in 9s
nix-unit-lib-lib / lib-lib (pull_request) Successful in 9s
nixosConfigurations-operator-mastodon / operator-mastodon (pull_request) Successful in 14s
nixosConfigurations-operator-combined / operator-combined (pull_request) Successful in 21s
checks-contracts-generatefiles-vars-openbao / contracts-generatefiles-vars-openbao (pull_request) Successful in 13s
nixosConfigurations-operator-peertube / operator-peertube (pull_request) Successful in 17s
nix-unit-lib-renames-for-source / lib-renames-for-source (pull_request) Successful in 8s
nix-unit-resources-garage-forward-compat / resources-garage-forward-compat (pull_request) Successful in 9s
nixosConfigurations-operator-pixelfed / operator-pixelfed (pull_request) Successful in 16s
nixosConfigurations-operator-smtp / operator-smtp (pull_request) Successful in 15s
checks-integrations-spire-openbao / integrations-spire-openbao (pull_request) Successful in 1m24s
checks-contracts-generatefiles-vars / contracts-generatefiles-vars (pull_request) Successful in 11s
nixosConfigurations-operator-valkey / operator-valkey (pull_request) Successful in 13s
checks-contracts-ldap-lldap / contracts-ldap-lldap (pull_request) Successful in 12s
nix-unit-resources-generateFiles / resources-generateFiles (pull_request) Successful in 21s
checks-test-pixelfed-service / test-pixelfed-service (pull_request) Successful in 38s
nix-unit-resources-redis-port / resources-redis-port (pull_request) Successful in 21s
nix-unit-resources-otel / resources-otel (pull_request) Successful in 28s
checks-contracts-ldap-openldap / contracts-ldap-openldap (pull_request) Successful in 11s
Nix flake completeness check / _complete (pull_request) Successful in 2m7s
nix-unit-resources-secrets / resources-secrets (pull_request) Successful in 16s
checks-contracts-oidc-dex / contracts-oidc-dex (pull_request) Successful in 10s
checks-contracts-redis-valkey / contracts-redis-valkey (pull_request) Successful in 9s
checks-contracts-s3-minio / contracts-s3-minio (pull_request) Successful in 9s
checks-contracts-smtp-maddy / contracts-smtp-maddy (pull_request) Successful in 10s
checks-contracts-smtp-opensmtpd / contracts-smtp-opensmtpd (pull_request) Successful in 10s
checks-contracts-ssl-self-signed / contracts-ssl-self-signed (pull_request) Successful in 10s
checks-contracts-streamingbackup-hardcoded / contracts-streamingbackup-hardcoded (pull_request) Successful in 11s
checks-contracts-systemd-openbaod / contracts-systemd-openbaod (pull_request) Successful in 10s
checks-deployment-tf-self-state-reachable / deployment-tf-self-state-reachable (pull_request) Successful in 5s
checks-panel-docs / panel-docs (pull_request) Successful in 7s
checks-resources-secrets-agenix / resources-secrets-agenix (pull_request) Successful in 12s
checks-test-monitoring-storage / test-monitoring-storage (pull_request) Successful in 10s
checks-test-mastodon-service / test-mastodon-service (pull_request) Successful in 3m0s
checks-test-otel-wiring / test-otel-wiring (pull_request) Successful in 11s
checks-treefmt / treefmt (pull_request) Successful in 13s
checks-test-valkey-service / test-valkey-service (pull_request) Successful in 1m9s
checks-deployment-tf-incus-hosts / deployment-tf-incus-hosts (pull_request) Successful in 6m4s
flake-show / flake-show (pull_request) Successful in 3m54s
checks-integrations-octodns / integrations-octodns (pull_request) Successful in 28s
checks-test-netbox-service / test-netbox-service (pull_request) Successful in 20s
checks-core-docs / core-docs (pull_request) Successful in 7m54s
checks-deployment-tf-hosts / deployment-tf-hosts (pull_request) Successful in 8m35s
checks-deployment-ssh-hosts / deployment-ssh-hosts (pull_request) Successful in 15m13s
checks-deployment-tf-hosts-bootstrap / deployment-tf-hosts-bootstrap (pull_request) Successful in 33m47s
checks-integrations-spire-incus / integrations-spire-incus (pull_request) Successful in 9m6s
checks-apps-api / apps-api (pull_request) Successful in 43m25s
checks-apps-tf-incus / apps-tf-incus (pull_request) Successful in 47m0s
checks-apps-tf / apps-tf (pull_request) Successful in 23m24s
2026-07-03 09:16:47 +02:00
Compare
kiara changed title from WIP: Graceful bootstrap of the hosting-provider TF backend (#336, #882) to Graceful bootstrap of the hosting-provider TF backend (#336, #882) 2026-07-03 12:06:09 +02:00
kiara changed title from Graceful bootstrap of the hosting-provider TF backend (#336, #882) to Graceful fresh-provider bootstrap ladder (#336, #882) 2026-07-03 12:23:40 +02:00
@ -76,0 +104,4 @@
"vars"
];
default = "agenix";
};
Author
Owner

handle routing thru the contracts system - no provider should be special-based in the resource, which should essentially act as a provider-agnostic wrapper over the fileSecrets contract

handle routing thru the contracts system - no provider should be special-based in the resource, which should essentially act as a provider-agnostic wrapper over the `fileSecrets` contract
kiara marked this conversation as resolved
@ -109,2 +109,4 @@
expected = "/run/agenix/forgejo-runner_forgejo-runner-token";
};
# Every secret defaults to the `agenix` provider (#882/#493 Stage 6 keeps the
Author
Owner

heck no they shouldn't, agenix goes against our goal to eliminate all hard-coding to ensure anyone could fork the code and run it without needing any special access - if anything agenix should therefore be more opt-in than any of our other providers still

heck no they shouldn't, agenix goes against our goal to eliminate all hard-coding to ensure anyone could fork the code and run it without needing any special access - if anything agenix should therefore be more opt-in than any of our other providers still
kiara marked this conversation as resolved
@ -209,0 +249,4 @@
port = bundleFetchPort;
}
];
locations."= /${bundleFileName}".root = bundleWebRoot;
Author
Owner

are there security implications to publicly serving this?

are there security implications to publicly serving this?
kiara marked this conversation as resolved
@ -0,0 +6,4 @@
operator must supply it -- there is no earlier link to derive it from).
The bootstrap ladder brings a fresh provider up along
`incus -> terraform-backend -> openbao -> valkey -> spire -> netbox`, climbing a
Author
Owner

is there stuff that might depend on garage or postgresql as well? would those also require special consideration here? and what of our monitoring nodes?

is there stuff that might depend on garage or postgresql as well? would those also require special consideration here? and what of our monitoring nodes?
@ -0,0 +26,4 @@
| Seed | Where | Why irreducible |
| -------------------------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Operator SSH access to the bare host | the deploy runner's SSH agent/key | The very first link: incus is stood up over SSH (`hosting-provider-ssh-incus`) before any of the ladder exists. Nothing precedes it. |
| OpenBao unseal key (`manual-key` nodes only) | `/var/lib/openbao-init/init.json` (0400), `/var/lib/openbao-init/root-token` | `openbao-init` generates these on first boot and they gate all of openbao's contents. Under `unsealMethod = "manual-key"` (the default) the plaintext unseal key persists to disk as the single load-bearing local seed. It is **reducible on a TPM node** via `unsealMethod = "tpm-sealed"` (see the reducible table) -- irreducible only where no usable TPM exists. The root token stays on disk either way, but it is rendered durably into openbao's own KV downstream rather than escrowed out of band. |
Author
Owner

The root token stays on disk either way

should it, or is this an unnecessary security risk?

> The root token stays on disk either way should it, or is this an unnecessary security risk?
kiara marked this conversation as resolved
@ -0,0 +28,4 @@
| Operator SSH access to the bare host | the deploy runner's SSH agent/key | The very first link: incus is stood up over SSH (`hosting-provider-ssh-incus`) before any of the ladder exists. Nothing precedes it. |
| OpenBao unseal key (`manual-key` nodes only) | `/var/lib/openbao-init/init.json` (0400), `/var/lib/openbao-init/root-token` | `openbao-init` generates these on first boot and they gate all of openbao's contents. Under `unsealMethod = "manual-key"` (the default) the plaintext unseal key persists to disk as the single load-bearing local seed. It is **reducible on a TPM node** via `unsealMethod = "tpm-sealed"` (see the reducible table) -- irreducible only where no usable TPM exists. The root token stays on disk either way, but it is rendered durably into openbao's own KV downstream rather than escrowed out of band. |
| agenix recipient public keys | `keys/` (`contributors`, `cd`, per-system) | The operator controls decryption authority for any `.age`-sourced secret. A fresh external team either owns these recipients or routes those secrets to the `vars` provider instead (see the agenix->vars migration below). |
| Deployment SSH key (`api-ssh-key`) | `src/resources/secrets/api-ssh-key.age` | The key the API/deployer uses to reach target nodes. It authorizes the deploy itself, so it cannot be sourced from a service the deploy brings up. Stays agenix. |
Author
Owner

could this not be generated as well?

could this not be generated as well?
kiara marked this conversation as resolved
@ -0,0 +25,4 @@
| Seed | Where | Why irreducible |
| -------------------------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Operator SSH access to the bare host | the deploy runner's SSH agent/key | The very first link: incus is stood up over SSH (`hosting-provider-ssh-incus`) before any of the ladder exists. Nothing precedes it. |
Author
Owner

right, we should like implement a live USB effect to reduce this

right, we should like implement a live USB effect to reduce this
kiara marked this conversation as resolved
@ -0,0 +27,4 @@
| -------------------------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Operator SSH access to the bare host | the deploy runner's SSH agent/key | The very first link: incus is stood up over SSH (`hosting-provider-ssh-incus`) before any of the ladder exists. Nothing precedes it. |
| OpenBao unseal key (`manual-key` nodes only) | `/var/lib/openbao-init/init.json` (0400), `/var/lib/openbao-init/root-token` | `openbao-init` generates these on first boot and they gate all of openbao's contents. Under `unsealMethod = "manual-key"` (the default) the plaintext unseal key persists to disk as the single load-bearing local seed. It is **reducible on a TPM node** via `unsealMethod = "tpm-sealed"` (see the reducible table) -- irreducible only where no usable TPM exists. The root token stays on disk either way, but it is rendered durably into openbao's own KV downstream rather than escrowed out of band. |
| agenix recipient public keys | `keys/` (`contributors`, `cd`, per-system) | The operator controls decryption authority for any `.age`-sourced secret. A fresh external team either owns these recipients or routes those secrets to the `vars` provider instead (see the agenix->vars migration below). |
Author
Owner

yes, this needs to move to env vars / TF state sooner or later

yes, this needs to move to env vars / TF state sooner or later
kiara marked this conversation as resolved
@ -0,0 +38,4 @@
| Former seed | Mechanism | Stage |
| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- |
| `terraform-backend` HTTP state backend | local-then-migrate under `BOOTSTRAP=1` (`bootstrap-apply.sh`) | 1 |
| `KMS_KEY_FILE` (terraform-backend) | `generateFiles` (`openssl rand -base64 32`) bridged into openbao KV via `vars`; `generate-vars` seeds it on first boot, `openbao-agent-default` renders it back durably -- the "migrate the boot-generated key into openbao, then read it back" self-heal | 6 (structurally already in place) |
Author
Owner

what does this KMS_KEY_FILE workaround even buy us? if we need to fall back to local back-end until this one is available anyway, then might we not as well have things migrate to this only once it's good already, rather than introducing such additional steps that buy us (iiuc) little?

what does this `KMS_KEY_FILE` workaround even buy us? if we need to fall back to local back-end until this one is available anyway, then might we not as well have things migrate to this only once it's good already, rather than introducing such additional steps that buy us (iiuc) little?
kiara marked this conversation as resolved
@ -0,0 +39,4 @@
| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- |
| `terraform-backend` HTTP state backend | local-then-migrate under `BOOTSTRAP=1` (`bootstrap-apply.sh`) | 1 |
| `KMS_KEY_FILE` (terraform-backend) | `generateFiles` (`openssl rand -base64 32`) bridged into openbao KV via `vars`; `generate-vars` seeds it on first boot, `openbao-agent-default` renders it back durably -- the "migrate the boot-generated key into openbao, then read it back" self-heal | 6 (structurally already in place) |
| OpenBao unseal key (on a TPM node) | `unsealMethod = "tpm-sealed"`: `openbao-init` seals the `bao operator init` unseal key to the node's (v)TPM (`tpm2_create`/`load`/`unseal` under a persistent primary), writing only inert `tpm-sealed.pub`/`.priv` and stripping every plaintext key field from `init.json`; auto-unseals from the TPM on every boot. Reuses the same vTPM SPIRE attests against (`spiffe-tpm`/#633). `manual-key` stays the default for TPM-less nodes. | 2 |
Author
Owner

are these temp workarounds, or just initial setup? cuz, does spire even have dependencies? if not, might we not as well only start bothering with openbao (and whatever needs it) once that one is good already? or, differently put, if these are workarounds, what would they buy us concretely?

are these temp workarounds, or just initial setup? cuz, does spire even have dependencies? if not, might we not as well only start bothering with openbao (and whatever needs it) once that one is good already? or, differently put, if these _are_ workarounds, what would they buy us concretely?
kiara marked this conversation as resolved
@ -0,0 +63,4 @@
The `.age` secrets under `src/resources/secrets/` are all **dev-group** and
pre-date the ladder -- the forgejo host _is_ the CI runner that later brings
openbao/SPIRE online, so its own bootstrap secrets cannot be sourced from a
service it has not deployed yet. They stay agenix by necessity, not by omission.
Author
Owner

wait this bootstrap process so far was just about group hosting-provider still right, even if deployed from there? cuz the dev group i imagine might need its own bootstrap process still, even if it might be able to reuse stuff from our current scope.

wait this bootstrap process so far was just about group hosting-provider still right, even if deployed from there? cuz the dev group i imagine might need its own bootstrap process still, even if it might be able to reuse stuff from our current scope.
kiara marked this conversation as resolved
@ -0,0 +67,4 @@
To let an **external** team deploy over SSH without owning Fediversity agenix
recipients, the `secrets` resource now exposes a per-secret `provider` choice
(`src/resources/secrets/default.nix`):
Author
Owner

did it not already, thru the contracts mechanism?

did it not already, thru the contracts mechanism?
kiara marked this conversation as resolved
@ -0,0 +94,4 @@
fetches in the self-fetch oneshots, and the irreducible floor in `keys/` +
`openbao-init`). The irreducible rows above are the real, minimal seed set --
three unconditional (operator SSH access, agenix recipients, deployment SSH key)
plus the openbao unseal key on TPM-less nodes; everything else the ladder derives. Keeping the catalog here -- next to the ladder
Author
Owner

shouldn't we just assert TPM? cuz does like KMS_SECRET_FILE even offer security benefits over just {sw,v}tpm? if not, why bother special-casing things?

shouldn't we just assert TPM? cuz does like `KMS_SECRET_FILE` even offer security benefits over just {sw,v}tpm? if not, why bother special-casing things?
kiara marked this conversation as resolved
@ -0,0 +52,4 @@
`BOOTSTRAP=1`:
```bash
BOOTSTRAP=1 nix run .#hosting-provider-tf-incus-all
Author
Owner

as-is this would create incus-ception, no? cuz then wouldn't it like make more sense to split out incus to some new like hypervisor group, even if this were to technically break the semantic boundary of 'who is this node meant for'?

as-is this would create incus-ception, no? cuz then wouldn't it like make more sense to split out incus to some new like `hypervisor` group, even if this were to technically break the semantic boundary of 'who is this node meant for'?
kiara marked this conversation as resolved
@ -0,0 +41,4 @@
(5 starts / 10s), so after a few retries they settle into `failed` rather than
looping forever. Once the rest of the ladder is deployed (step 1 brings up
openbao + spire), converge them with either a redeploy
(`nix run .#hosting-provider-ssh-incus` again) or, on the incus host:
Author
Owner

redeploy to incus node to reload its services should be mentioned at its actual position in the process (in bootstrap-full-ladder.md?) if it wasn't yet

redeploy to incus node to reload its services should be mentioned at its actual position in the process (in `bootstrap-full-ladder.md`?) if it wasn't yet
kiara marked this conversation as resolved
@ -0,0 +53,4 @@
```bash
BOOTSTRAP=1 nix run .#hosting-provider-tf-incus-all
```
Author
Owner

this bootstrap command fails to explain how to e.g. connect to the incus (relevant env vars)

this bootstrap command fails to explain how to e.g. connect to the incus (relevant env vars)
kiara marked this conversation as resolved
@ -0,0 +69,4 @@
If the backend node never comes up within `BOOTSTRAP_MIGRATE_TIMEOUT`
(default 1800s), the run **fails** rather than silently leaving state local --
so the operator sees the real problem. The local apply is persisted, so simply
Author
Owner

some mentions of 'operator' in this document seem to use the dictionary description, potentially bringing some confusion as we use this term in another sense in our project as well (to describe the person using the hosting provider's front-end to deploy applications for them to use), while these instances seem to instead describe the hosting provider

some mentions of 'operator' in this document seem to use the dictionary description, potentially bringing some confusion as we use this term in another sense in our project as well (to describe the person using the hosting provider's front-end to deploy applications for _them_ to use), while these instances seem to instead describe the hosting provider
kiara marked this conversation as resolved
@ -0,0 +1,355 @@
# Full fresh-provider bootstrap ladder (#882, #493, #515)
Author
Owner

while this speaks of a full bootstrap ladder, what of the internal-TLS bootstrap mentioned in #1119 for openbao and incus (if not our other internal nodes that have use for it)?

while this speaks of a full bootstrap ladder, what of the internal-TLS bootstrap mentioned in #1119 for openbao and incus (if not our other internal nodes that have use for it)?
kiara marked this conversation as resolved
@ -0,0 +29,4 @@
TF-state backends).
2. **Secret-provenance chicken-and-egg** (#493) -- a workload needs a secret
(valkey password, netbox token, KMS key) that is _supposed_ to come from
Author
Owner

huh, weren't we using netbox just to allocate public IP addresses? that's why that one was part of the bootstrapping problem (so i think we got more challenges there than two)

huh, weren't we using netbox just to allocate public IP addresses? that's why that one was part of the bootstrapping problem (so i think we got more challenges there than two)
kiara marked this conversation as resolved
@ -0,0 +73,4 @@
## Stage 1 -- terraform-backend (DONE)
Local-then-migrate under `BOOTSTRAP=1`. See `notes/bootstrap.md`. The KMS key is
Author
Owner

use an actual relative link

use an actual relative link
kiara marked this conversation as resolved
@ -0,0 +83,4 @@
**Current:** `openbao-init.service` runs `bao operator init` on first boot,
writes unseal key + root token to `/var/lib/openbao-init/`, unseals. Single-node
SQLite. Works on a fresh single node with no gap.
Author
Owner

didn't our nodes include postgres and garage as well? shouldn't we use any of those over sqlite, at least once the bootstrap has settled?

didn't our nodes include postgres and garage as well? shouldn't we use any of those over sqlite, at least once the bootstrap has settled?
@ -0,0 +15,4 @@
deploy without owning Fediversity-team secrets.
This note is the _design_. Each stage below is a separable PR; they are ordered
by dependency, not by priority. Only the terraform-backend stage is done today.
Author
Owner

this should be updated to reflect the current status - we did implement more since.

this should be updated to reflect the current status - we did implement more since.
Author
Owner

if all are indeed done then i'm not sure we even still need to track progress in this document per item.

if all are indeed done then i'm not sure we even still need to track progress in this document per item.
kiara marked this conversation as resolved
kiara force-pushed bootstrap-order from 08bba42251
All checks were successful
checks-contracts-postgresql / contracts-postgresql (pull_request) Successful in 12s
checks-integrations-openbao-pki / integrations-openbao-pki (pull_request) Successful in 14s
checks-contracts-postgresql-rotation / contracts-postgresql-rotation (pull_request) Successful in 16s
nixosConfigurations-dev-forgejo-runner / dev-forgejo-runner (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-api / hosting-provider-api (pull_request) Successful in 16s
nixosConfigurations-dev-forgejo / dev-forgejo (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-bind / hosting-provider-bind (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-authelia / hosting-provider-authelia (pull_request) Successful in 17s
checks-contracts-chaining / contracts-chaining (pull_request) Successful in 13s
checks-test-ldap-engine / test-ldap-engine (pull_request) Successful in 12s
checks-deployment-nixos-hosts / deployment-nixos-hosts (pull_request) Successful in 31s
nixosConfigurations-hosting-provider-garage / hosting-provider-garage (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-incus / hosting-provider-incus (pull_request) Successful in 15s
devShells-default / default (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-monitoring / hosting-provider-monitoring (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-netbox / hosting-provider-netbox (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-lldap / hosting-provider-lldap (pull_request) Successful in 19s
checks-contracts-cross-node / contracts-cross-node (pull_request) Successful in 15s
nix-unit-effects-common-lib / effects-common-lib (pull_request) Successful in 10s
nixosConfigurations-hosting-provider-openbao / hosting-provider-openbao (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-otel-collector / hosting-provider-otel-collector (pull_request) Successful in 15s
nix-unit-contracts-lib / contracts-lib (pull_request) Successful in 20s
nixosConfigurations-hosting-provider-panel / hosting-provider-panel (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-smtp / hosting-provider-smtp (pull_request) Successful in 17s
checks-contracts-filebackup-hardcoded-file-backup / contracts-filebackup-hardcoded-file-backup (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-postgresql / hosting-provider-postgresql (pull_request) Successful in 20s
nixosConfigurations-hosting-provider-spire / hosting-provider-spire (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-terraform-backend / hosting-provider-terraform-backend (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-valkey / hosting-provider-valkey (pull_request) Successful in 14s
nix-unit-effects-tf-common-conversion / effects-tf-common-conversion (pull_request) Successful in 22s
nix-unit-lib-data-model / lib-data-model (pull_request) Successful in 20s
nixosConfigurations-hosting-provider-windmill / hosting-provider-windmill (pull_request) Successful in 15s
checks-contracts-filesecrets-hardcoded-secret / contracts-filesecrets-hardcoded-secret (pull_request) Successful in 12s
checks-test-peertube-service / test-peertube-service (pull_request) Successful in 44s
nixosConfigurations-operator-authelia / operator-authelia (pull_request) Successful in 14s
nixosConfigurations-operator-lldap / operator-lldap (pull_request) Successful in 15s
nix-unit-lib-function / lib-function (pull_request) Successful in 9s
nix-unit-lib-lib / lib-lib (pull_request) Successful in 9s
nixosConfigurations-operator-mastodon / operator-mastodon (pull_request) Successful in 14s
nixosConfigurations-operator-combined / operator-combined (pull_request) Successful in 21s
checks-contracts-generatefiles-vars-openbao / contracts-generatefiles-vars-openbao (pull_request) Successful in 13s
nixosConfigurations-operator-peertube / operator-peertube (pull_request) Successful in 17s
nix-unit-lib-renames-for-source / lib-renames-for-source (pull_request) Successful in 8s
nix-unit-resources-garage-forward-compat / resources-garage-forward-compat (pull_request) Successful in 9s
nixosConfigurations-operator-pixelfed / operator-pixelfed (pull_request) Successful in 16s
nixosConfigurations-operator-smtp / operator-smtp (pull_request) Successful in 15s
checks-integrations-spire-openbao / integrations-spire-openbao (pull_request) Successful in 1m24s
checks-contracts-generatefiles-vars / contracts-generatefiles-vars (pull_request) Successful in 11s
nixosConfigurations-operator-valkey / operator-valkey (pull_request) Successful in 13s
checks-contracts-ldap-lldap / contracts-ldap-lldap (pull_request) Successful in 12s
nix-unit-resources-generateFiles / resources-generateFiles (pull_request) Successful in 21s
checks-test-pixelfed-service / test-pixelfed-service (pull_request) Successful in 38s
nix-unit-resources-redis-port / resources-redis-port (pull_request) Successful in 21s
nix-unit-resources-otel / resources-otel (pull_request) Successful in 28s
checks-contracts-ldap-openldap / contracts-ldap-openldap (pull_request) Successful in 11s
Nix flake completeness check / _complete (pull_request) Successful in 2m7s
nix-unit-resources-secrets / resources-secrets (pull_request) Successful in 16s
checks-contracts-oidc-dex / contracts-oidc-dex (pull_request) Successful in 10s
checks-contracts-redis-valkey / contracts-redis-valkey (pull_request) Successful in 9s
checks-contracts-s3-minio / contracts-s3-minio (pull_request) Successful in 9s
checks-contracts-smtp-maddy / contracts-smtp-maddy (pull_request) Successful in 10s
checks-contracts-smtp-opensmtpd / contracts-smtp-opensmtpd (pull_request) Successful in 10s
checks-contracts-ssl-self-signed / contracts-ssl-self-signed (pull_request) Successful in 10s
checks-contracts-streamingbackup-hardcoded / contracts-streamingbackup-hardcoded (pull_request) Successful in 11s
checks-contracts-systemd-openbaod / contracts-systemd-openbaod (pull_request) Successful in 10s
checks-deployment-tf-self-state-reachable / deployment-tf-self-state-reachable (pull_request) Successful in 5s
checks-panel-docs / panel-docs (pull_request) Successful in 7s
checks-resources-secrets-agenix / resources-secrets-agenix (pull_request) Successful in 12s
checks-test-monitoring-storage / test-monitoring-storage (pull_request) Successful in 10s
checks-test-mastodon-service / test-mastodon-service (pull_request) Successful in 3m0s
checks-test-otel-wiring / test-otel-wiring (pull_request) Successful in 11s
checks-treefmt / treefmt (pull_request) Successful in 13s
checks-test-valkey-service / test-valkey-service (pull_request) Successful in 1m9s
checks-deployment-tf-incus-hosts / deployment-tf-incus-hosts (pull_request) Successful in 6m4s
flake-show / flake-show (pull_request) Successful in 3m54s
checks-integrations-octodns / integrations-octodns (pull_request) Successful in 28s
checks-test-netbox-service / test-netbox-service (pull_request) Successful in 20s
checks-core-docs / core-docs (pull_request) Successful in 7m54s
checks-deployment-tf-hosts / deployment-tf-hosts (pull_request) Successful in 8m35s
checks-deployment-ssh-hosts / deployment-ssh-hosts (pull_request) Successful in 15m13s
checks-deployment-tf-hosts-bootstrap / deployment-tf-hosts-bootstrap (pull_request) Successful in 33m47s
checks-integrations-spire-incus / integrations-spire-incus (pull_request) Successful in 9m6s
checks-apps-api / apps-api (pull_request) Successful in 43m25s
checks-apps-tf-incus / apps-tf-incus (pull_request) Successful in 47m0s
checks-apps-tf / apps-tf (pull_request) Successful in 23m24s
to d3f7162788
Some checks failed
checks-contracts-chaining / contracts-chaining (pull_request) Successful in 12s
checks-contracts-postgresql / contracts-postgresql (pull_request) Successful in 14s
nixosConfigurations-dev-forgejo-runner / dev-forgejo-runner (pull_request) Successful in 24s
nixosConfigurations-hosting-provider-bind / hosting-provider-bind (pull_request) Successful in 26s
nixosConfigurations-hosting-provider-api / hosting-provider-api (pull_request) Successful in 27s
nixosConfigurations-dev-forgejo / dev-forgejo (pull_request) Successful in 27s
nixosConfigurations-hosting-provider-authelia / hosting-provider-authelia (pull_request) Successful in 27s
checks-contracts-cross-node / contracts-cross-node (pull_request) Successful in 19s
checks-deployment-nixos-hosts / deployment-nixos-hosts (pull_request) Successful in 33s
nixosConfigurations-hosting-provider-incus / hosting-provider-incus (pull_request) Failing after 3s
nixosConfigurations-hosting-provider-garage / hosting-provider-garage (pull_request) Successful in 15s
checks-integrations-octodns / integrations-octodns (pull_request) Successful in 45s
nixosConfigurations-hosting-provider-monitoring / hosting-provider-monitoring (pull_request) Successful in 18s
checks-contracts-filebackup-hardcoded-file-backup / contracts-filebackup-hardcoded-file-backup (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-netbox / hosting-provider-netbox (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-lldap / hosting-provider-lldap (pull_request) Successful in 21s
nixosConfigurations-hosting-provider-openbao / hosting-provider-openbao (pull_request) Successful in 17s
checks-test-mastodon-service / test-mastodon-service (pull_request) Successful in 54s
checks-integrations-openbao-pki / integrations-openbao-pki (pull_request) Successful in 53s
checks-contracts-postgresql-rotation / contracts-postgresql-rotation (pull_request) Successful in 57s
nixosConfigurations-hosting-provider-otel-collector / hosting-provider-otel-collector (pull_request) Successful in 14s
checks-contracts-filesecrets-hardcoded-secret / contracts-filesecrets-hardcoded-secret (pull_request) Successful in 12s
checks-test-ldap-engine / test-ldap-engine (pull_request) Successful in 13s
nixosConfigurations-hosting-provider-panel / hosting-provider-panel (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-smtp / hosting-provider-smtp (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-spire / hosting-provider-spire (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-postgresql / hosting-provider-postgresql (pull_request) Successful in 21s
nixosConfigurations-hosting-provider-terraform-backend / hosting-provider-terraform-backend (pull_request) Successful in 15s
devShells-default / default (pull_request) Successful in 19s
checks-contracts-generatefiles-vars-openbao / contracts-generatefiles-vars-openbao (pull_request) Successful in 12s
nixosConfigurations-hosting-provider-valkey / hosting-provider-valkey (pull_request) Successful in 13s
nixosConfigurations-hosting-provider-windmill / hosting-provider-windmill (pull_request) Successful in 14s
nixosConfigurations-operator-authelia / operator-authelia (pull_request) Successful in 15s
checks-contracts-generatefiles-vars / contracts-generatefiles-vars (pull_request) Successful in 12s
nixosConfigurations-operator-lldap / operator-lldap (pull_request) Successful in 15s
nixosConfigurations-operator-combined / operator-combined (pull_request) Successful in 23s
nixosConfigurations-operator-mastodon / operator-mastodon (pull_request) Successful in 14s
nixosConfigurations-operator-pixelfed / operator-pixelfed (pull_request) Successful in 13s
nixosConfigurations-operator-peertube / operator-peertube (pull_request) Successful in 15s
checks-contracts-ldap-lldap / contracts-ldap-lldap (pull_request) Successful in 11s
Nix flake completeness check / _complete (pull_request) Failing after 1m46s
checks-integrations-spire-openbao / integrations-spire-openbao (pull_request) Successful in 1m28s
nixosConfigurations-operator-smtp / operator-smtp (pull_request) Successful in 12s
nixosConfigurations-operator-valkey / operator-valkey (pull_request) Successful in 12s
nix-unit-effects-common-lib / effects-common-lib (pull_request) Successful in 35s
checks-contracts-ldap-openldap / contracts-ldap-openldap (pull_request) Successful in 10s
nix-unit-contracts-lib / contracts-lib (pull_request) Successful in 45s
checks-contracts-oidc-dex / contracts-oidc-dex (pull_request) Successful in 11s
checks-contracts-redis-valkey / contracts-redis-valkey (pull_request) Successful in 9s
checks-contracts-s3-minio / contracts-s3-minio (pull_request) Successful in 9s
nix-unit-lib-data-model / lib-data-model (pull_request) Successful in 17s
nix-unit-lib-function / lib-function (pull_request) Successful in 17s
checks-contracts-smtp-maddy / contracts-smtp-maddy (pull_request) Successful in 9s
checks-contracts-smtp-opensmtpd / contracts-smtp-opensmtpd (pull_request) Successful in 10s
nix-unit-lib-renames-for-source / lib-renames-for-source (pull_request) Successful in 6s
nix-unit-lib-lib / lib-lib (pull_request) Successful in 8s
checks-contracts-ssl-self-signed / contracts-ssl-self-signed (pull_request) Successful in 10s
nix-unit-resources-garage-forward-compat / resources-garage-forward-compat (pull_request) Successful in 6s
nix-unit-effects-tf-common-conversion / effects-tf-common-conversion (pull_request) Successful in 42s
checks-contracts-streamingbackup-hardcoded / contracts-streamingbackup-hardcoded (pull_request) Successful in 9s
checks-contracts-systemd-openbaod / contracts-systemd-openbaod (pull_request) Successful in 9s
checks-deployment-tf-self-state-reachable / deployment-tf-self-state-reachable (pull_request) Successful in 5s
nix-unit-resources-generateFiles / resources-generateFiles (pull_request) Successful in 17s
checks-panel-docs / panel-docs (pull_request) Successful in 6s
checks-resources-secrets-agenix / resources-secrets-agenix (pull_request) Successful in 10s
nix-unit-resources-redis-port / resources-redis-port (pull_request) Successful in 16s
nix-unit-resources-otel / resources-otel (pull_request) Successful in 22s
nix-unit-resources-secrets / resources-secrets (pull_request) Successful in 14s
checks-test-monitoring-storage / test-monitoring-storage (pull_request) Successful in 9s
checks-test-otel-wiring / test-otel-wiring (pull_request) Successful in 10s
checks-treefmt / treefmt (pull_request) Successful in 11s
checks-test-pixelfed-service / test-pixelfed-service (pull_request) Successful in 3m37s
checks-test-peertube-service / test-peertube-service (pull_request) Successful in 3m37s
checks-test-valkey-service / test-valkey-service (pull_request) Successful in 1m0s
flake-show / flake-show (pull_request) Successful in 4m46s
checks-deployment-tf-incus-hosts / deployment-tf-incus-hosts (pull_request) Successful in 6m9s
checks-core-docs / core-docs (pull_request) Successful in 8m35s
checks-apps-api / apps-api (pull_request) Has been cancelled
checks-apps-tf-incus / apps-tf-incus (pull_request) Has been cancelled
checks-apps-tf / apps-tf (pull_request) Has been cancelled
checks-deployment-ssh-hosts / deployment-ssh-hosts (pull_request) Has been cancelled
checks-deployment-tf-hosts / deployment-tf-hosts (pull_request) Has been cancelled
checks-deployment-tf-hosts-bootstrap / deployment-tf-hosts-bootstrap (pull_request) Has been cancelled
checks-integrations-spire-incus / integrations-spire-incus (pull_request) Has been cancelled
checks-test-netbox-service / test-netbox-service (pull_request) Has been cancelled
2026-07-04 11:30:20 +02:00
Compare
@ -0,0 +57,4 @@
inherit domain;
applications = lib.mapAttrs (_: _: { enable = true; }) machines.application;
};
applications = [ ../../applications/hosting-provider ];
Author
Owner

this new group could just get its own dir there

this new group could just get its own dir there
kiara marked this conversation as resolved
@ -0,0 +90,4 @@
| agenix recipient public keys | `keys/` (`contributors`, `cd`, per-system) | The admin controls decryption authority for any `.age`-sourced secret. Only the **human-team** recipients (`contributors`, `cd`) are truly irreducible -- they are the trust root, so "generating" them would defeat the point (nothing an outside deploy generates is an authority the admin controls). But the recipient set does not have to be a checked-in `keys/` seed: it should move into deploy-time **env-vars / TF-state** the deployer already holds (see "Intended reductions"), so a fresh external team supplies its own recipients at deploy time rather than editing the tree. The **per-system** host keys under `keys/` are moreover _generatable_ at provisioning (a fresh host key minted on the node, its public half registered in the same apply), so they are not an admin seed on the incus path at all. Failing either, a secret that carries no admin-controlled authority can be produced through `generateFiles` -> openbao instead (see the migration note below). |
| Deployment SSH key (`api-ssh-key`) | `src/resources/secrets/api-ssh-key.age` | The key the API/deployer uses to reach target nodes. It authorizes the deploy itself, so it cannot be sourced from a service the deploy brings up -- but it need not be a checked-in `.age` file: the deployer could **generate** the keypair at deploy time and push the public half onto the target nodes' `authorized_keys` in the same apply (nothing about the deploy identity requires a long-lived pre-shared key), reducing it from a stored seed to a per-deploy ephemeral. Tracked under "Intended reductions"; until then it stays agenix. |
### Intended reductions (tracked, not yet done)
Author
Owner

these we may note as potential follow-ups in the PR

these we may note as potential follow-ups in the PR
@ -0,0 +234,4 @@
is issued by a `pki/issue` call, which needs the node's SPIRE SVID, which needs
the trust root -- so a PKI cert can only appear once the node is already up the
spire rung. That is fine because both listeners degrade gracefully to
self-signed + trust-on-first-use in the gap:
Author
Owner

both todo

both todo
@ -342,3 +343,4 @@
zone = mkZone [
machines.application
machines.ancilliary
(import ./hypervisor.nix { inherit lib; }).machines.application
Author
Owner

let's say the hypervisor group got a new node proxmox (not actually deployed): would it then try to add that to the zone as well somehow?
given that would not be the intent, might there be a better way to handle this - taken into account one could potentially deploy the hosting-provider group to any of potentially multiple such hypervisors?

let's say the hypervisor group got a new node `proxmox` (not actually deployed): would it then try to add that to the zone as well somehow? given that would not be the intent, might there be a better way to handle this - taken into account one could potentially deploy the `hosting-provider` group to any of potentially multiple such hypervisors?
kiara force-pushed bootstrap-order from 8902171496
Some checks failed
checks-contracts-postgresql-rotation / contracts-postgresql-rotation (pull_request) Failing after 6s
checks-integrations-openbao-pki / integrations-openbao-pki (pull_request) Failing after 6s
checks-integrations-spire-incus / integrations-spire-incus (pull_request) Failing after 6s
checks-contracts-chaining / contracts-chaining (pull_request) Successful in 10s
checks-integrations-spire-openbao / integrations-spire-openbao (pull_request) Failing after 6s
checks-contracts-postgresql / contracts-postgresql (pull_request) Successful in 11s
nixosConfigurations-dev-forgejo-runner / dev-forgejo-runner (pull_request) Successful in 20s
nixosConfigurations-dev-forgejo / dev-forgejo (pull_request) Successful in 24s
checks-test-ldap-engine / test-ldap-engine (pull_request) Successful in 19s
nixosConfigurations-hosting-provider-bind / hosting-provider-bind (pull_request) Successful in 24s
nixosConfigurations-hosting-provider-api / hosting-provider-api (pull_request) Successful in 25s
checks-contracts-cross-node / contracts-cross-node (pull_request) Successful in 20s
nixosConfigurations-hosting-provider-authelia / hosting-provider-authelia (pull_request) Successful in 26s
checks-deployment-nixos-hosts / deployment-nixos-hosts (pull_request) Successful in 32s
devShells-default / default (pull_request) Successful in 23s
nixosConfigurations-hosting-provider-garage / hosting-provider-garage (pull_request) Successful in 15s
checks-integrations-octodns / integrations-octodns (pull_request) Successful in 41s
nixosConfigurations-hosting-provider-monitoring / hosting-provider-monitoring (pull_request) Successful in 15s
checks-contracts-filebackup-hardcoded-file-backup / contracts-filebackup-hardcoded-file-backup (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-lldap / hosting-provider-lldap (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-netbox / hosting-provider-netbox (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-openbao / hosting-provider-openbao (pull_request) Successful in 16s
checks-test-pixelfed-service / test-pixelfed-service (pull_request) Successful in 48s
checks-test-mastodon-service / test-mastodon-service (pull_request) Successful in 49s
checks-test-peertube-service / test-peertube-service (pull_request) Successful in 49s
Nix flake completeness check / _complete (pull_request) Failing after 54s
nixosConfigurations-hosting-provider-otel-collector / hosting-provider-otel-collector (pull_request) Successful in 14s
checks-contracts-filesecrets-hardcoded-secret / contracts-filesecrets-hardcoded-secret (pull_request) Successful in 13s
checks-test-netbox-service / test-netbox-service (pull_request) Successful in 29s
nixosConfigurations-hosting-provider-smtp / hosting-provider-smtp (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-panel / hosting-provider-panel (pull_request) Successful in 20s
checks-contracts-generatefiles-vars-openbao / contracts-generatefiles-vars-openbao (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-spire / hosting-provider-spire (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-postgresql / hosting-provider-postgresql (pull_request) Successful in 22s
nix-unit-contracts-lib / contracts-lib (pull_request) Successful in 57s
checks-contracts-generatefiles-vars / contracts-generatefiles-vars (pull_request) Successful in 12s
nixosConfigurations-hosting-provider-terraform-backend / hosting-provider-terraform-backend (pull_request) Successful in 16s
nix-unit-effects-tf-common-conversion / effects-tf-common-conversion (pull_request) Successful in 41s
nix-unit-effects-common-lib / effects-common-lib (pull_request) Successful in 50s
nixosConfigurations-hosting-provider-valkey / hosting-provider-valkey (pull_request) Successful in 14s
checks-contracts-ldap-lldap / contracts-ldap-lldap (pull_request) Successful in 11s
nixosConfigurations-hosting-provider-windmill / hosting-provider-windmill (pull_request) Successful in 14s
nixosConfigurations-hypervisor-incus / hypervisor-incus (pull_request) Successful in 12s
nixosConfigurations-operator-authelia / operator-authelia (pull_request) Successful in 13s
checks-contracts-ldap-openldap / contracts-ldap-openldap (pull_request) Successful in 10s
nix-unit-lib-data-model / lib-data-model (pull_request) Successful in 19s
nixosConfigurations-operator-lldap / operator-lldap (pull_request) Successful in 11s
checks-contracts-oidc-dex / contracts-oidc-dex (pull_request) Successful in 11s
nixosConfigurations-operator-combined / operator-combined (pull_request) Successful in 18s
nixosConfigurations-operator-mastodon / operator-mastodon (pull_request) Successful in 12s
nix-unit-lib-function / lib-function (pull_request) Successful in 17s
nixosConfigurations-operator-pixelfed / operator-pixelfed (pull_request) Successful in 12s
nixosConfigurations-operator-peertube / operator-peertube (pull_request) Successful in 13s
checks-contracts-redis-valkey / contracts-redis-valkey (pull_request) Successful in 10s
nix-unit-lib-renames-for-source / lib-renames-for-source (pull_request) Successful in 7s
nix-unit-lib-lib / lib-lib (pull_request) Successful in 18s
nix-unit-resources-garage-forward-compat / resources-garage-forward-compat (pull_request) Successful in 7s
nixosConfigurations-operator-smtp / operator-smtp (pull_request) Successful in 11s
checks-contracts-s3-minio / contracts-s3-minio (pull_request) Successful in 10s
nixosConfigurations-operator-valkey / operator-valkey (pull_request) Successful in 11s
checks-contracts-smtp-maddy / contracts-smtp-maddy (pull_request) Successful in 10s
nix-unit-resources-redis-port / resources-redis-port (pull_request) Successful in 7s
checks-contracts-smtp-opensmtpd / contracts-smtp-opensmtpd (pull_request) Successful in 9s
nix-unit-resources-generateFiles / resources-generateFiles (pull_request) Successful in 17s
checks-contracts-ssl-self-signed / contracts-ssl-self-signed (pull_request) Successful in 10s
checks-contracts-streamingbackup-hardcoded / contracts-streamingbackup-hardcoded (pull_request) Successful in 9s
nix-unit-resources-otel / resources-otel (pull_request) Successful in 23s
nix-unit-resources-secrets / resources-secrets (pull_request) Successful in 16s
checks-deployment-tf-self-state-reachable / deployment-tf-self-state-reachable (pull_request) Successful in 5s
checks-contracts-systemd-openbaod / contracts-systemd-openbaod (pull_request) Successful in 9s
checks-panel-docs / panel-docs (pull_request) Successful in 6s
checks-resources-secrets-agenix / resources-secrets-agenix (pull_request) Successful in 9s
checks-test-monitoring-storage / test-monitoring-storage (pull_request) Successful in 9s
checks-test-otel-wiring / test-otel-wiring (pull_request) Successful in 9s
checks-test-valkey-service / test-valkey-service (pull_request) Successful in 9s
checks-treefmt / treefmt (pull_request) Successful in 10s
flake-show / flake-show (pull_request) Successful in 4m30s
checks-deployment-tf-incus-hosts / deployment-tf-incus-hosts (pull_request) Successful in 5m44s
checks-core-docs / core-docs (pull_request) Successful in 8m5s
checks-deployment-tf-hosts / deployment-tf-hosts (pull_request) Successful in 11m5s
checks-deployment-ssh-hosts / deployment-ssh-hosts (pull_request) Failing after 16m58s
checks-deployment-tf-hosts-bootstrap / deployment-tf-hosts-bootstrap (pull_request) Successful in 27m58s
checks-apps-api / apps-api (pull_request) Successful in 43m40s
checks-apps-tf-incus / apps-tf-incus (pull_request) Successful in 45m57s
checks-apps-tf / apps-tf (pull_request) Successful in 1h2m59s
to 6cddad8f5a
Some checks failed
checks-contracts-chaining / contracts-chaining (pull_request) Successful in 11s
checks-contracts-postgresql / contracts-postgresql (pull_request) Successful in 10s
nixosConfigurations-dev-forgejo-runner / dev-forgejo-runner (pull_request) Successful in 21s
nixosConfigurations-dev-forgejo / dev-forgejo (pull_request) Successful in 23s
nixosConfigurations-hosting-provider-api / hosting-provider-api (pull_request) Successful in 25s
nixosConfigurations-hosting-provider-bind / hosting-provider-bind (pull_request) Successful in 23s
nixosConfigurations-hosting-provider-authelia / hosting-provider-authelia (pull_request) Successful in 26s
checks-contracts-cross-node / contracts-cross-node (pull_request) Successful in 20s
checks-deployment-nixos-hosts / deployment-nixos-hosts (pull_request) Successful in 32s
nixosConfigurations-hosting-provider-garage / hosting-provider-garage (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-monitoring / hosting-provider-monitoring (pull_request) Successful in 17s
checks-contracts-filebackup-hardcoded-file-backup / contracts-filebackup-hardcoded-file-backup (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-netbox / hosting-provider-netbox (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-lldap / hosting-provider-lldap (pull_request) Successful in 23s
nixosConfigurations-hosting-provider-openbao / hosting-provider-openbao (pull_request) Successful in 18s
checks-test-pixelfed-service / test-pixelfed-service (pull_request) Successful in 49s
checks-test-mastodon-service / test-mastodon-service (pull_request) Successful in 53s
checks-test-peertube-service / test-peertube-service (pull_request) Successful in 52s
checks-contracts-postgresql-rotation / contracts-postgresql-rotation (pull_request) Failing after 1m1s
nixosConfigurations-hosting-provider-otel-collector / hosting-provider-otel-collector (pull_request) Successful in 16s
checks-integrations-openbao-pki / integrations-openbao-pki (pull_request) Failing after 59s
checks-contracts-filesecrets-hardcoded-secret / contracts-filesecrets-hardcoded-secret (pull_request) Successful in 13s
nixosConfigurations-hosting-provider-panel / hosting-provider-panel (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-spire / hosting-provider-spire (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-smtp / hosting-provider-smtp (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-postgresql / hosting-provider-postgresql (pull_request) Successful in 22s
checks-test-ldap-engine / test-ldap-engine (pull_request) Successful in 14s
checks-integrations-spire-openbao / integrations-spire-openbao (pull_request) Failing after 1m3s
checks-contracts-generatefiles-vars-openbao / contracts-generatefiles-vars-openbao (pull_request) Successful in 13s
nixosConfigurations-hosting-provider-terraform-backend / hosting-provider-terraform-backend (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-valkey / hosting-provider-valkey (pull_request) Successful in 15s
devShells-default / default (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-windmill / hosting-provider-windmill (pull_request) Successful in 14s
nixosConfigurations-hypervisor-incus / hypervisor-incus (pull_request) Successful in 13s
checks-contracts-generatefiles-vars / contracts-generatefiles-vars (pull_request) Successful in 12s
nixosConfigurations-operator-authelia / operator-authelia (pull_request) Successful in 14s
nix-unit-effects-tf-common-conversion / effects-tf-common-conversion (pull_request) Successful in 11s
nix-unit-contracts-lib / contracts-lib (pull_request) Successful in 19s
nixosConfigurations-operator-lldap / operator-lldap (pull_request) Successful in 14s
nix-unit-effects-common-lib / effects-common-lib (pull_request) Successful in 19s
nixosConfigurations-operator-combined / operator-combined (pull_request) Successful in 21s
checks-contracts-ldap-lldap / contracts-ldap-lldap (pull_request) Successful in 10s
nixosConfigurations-operator-mastodon / operator-mastodon (pull_request) Successful in 15s
nixosConfigurations-operator-peertube / operator-peertube (pull_request) Successful in 14s
nixosConfigurations-operator-pixelfed / operator-pixelfed (pull_request) Successful in 12s
nixosConfigurations-operator-smtp / operator-smtp (pull_request) Successful in 12s
checks-contracts-ldap-openldap / contracts-ldap-openldap (pull_request) Successful in 10s
nixosConfigurations-operator-valkey / operator-valkey (pull_request) Successful in 11s
nix-unit-lib-data-model / lib-data-model (pull_request) Successful in 19s
nix-unit-lib-function / lib-function (pull_request) Successful in 19s
nix-unit-lib-lib / lib-lib (pull_request) Successful in 18s
nix-unit-lib-renames-for-source / lib-renames-for-source (pull_request) Successful in 6s
checks-contracts-oidc-dex / contracts-oidc-dex (pull_request) Successful in 10s
nix-unit-resources-garage-forward-compat / resources-garage-forward-compat (pull_request) Successful in 6s
Nix flake completeness check / _complete (pull_request) Successful in 2m5s
nix-unit-resources-redis-port / resources-redis-port (pull_request) Successful in 7s
checks-contracts-redis-valkey / contracts-redis-valkey (pull_request) Successful in 10s
checks-contracts-s3-minio / contracts-s3-minio (pull_request) Successful in 9s
nix-unit-resources-generateFiles / resources-generateFiles (pull_request) Successful in 17s
checks-contracts-smtp-maddy / contracts-smtp-maddy (pull_request) Successful in 10s
nix-unit-resources-otel / resources-otel (pull_request) Successful in 21s
checks-contracts-smtp-opensmtpd / contracts-smtp-opensmtpd (pull_request) Successful in 9s
nix-unit-resources-secrets / resources-secrets (pull_request) Successful in 17s
checks-contracts-ssl-self-signed / contracts-ssl-self-signed (pull_request) Successful in 10s
checks-contracts-streamingbackup-hardcoded / contracts-streamingbackup-hardcoded (pull_request) Successful in 10s
checks-deployment-tf-self-state-reachable / deployment-tf-self-state-reachable (pull_request) Successful in 5s
checks-contracts-systemd-openbaod / contracts-systemd-openbaod (pull_request) Successful in 10s
checks-panel-docs / panel-docs (pull_request) Successful in 6s
checks-resources-secrets-agenix / resources-secrets-agenix (pull_request) Successful in 10s
checks-test-monitoring-storage / test-monitoring-storage (pull_request) Successful in 9s
checks-test-otel-wiring / test-otel-wiring (pull_request) Successful in 10s
checks-test-valkey-service / test-valkey-service (pull_request) Successful in 9s
checks-treefmt / treefmt (pull_request) Successful in 11s
flake-show / flake-show (pull_request) Successful in 4m48s
checks-integrations-spire-incus / integrations-spire-incus (pull_request) Failing after 5m38s
checks-integrations-octodns / integrations-octodns (pull_request) Successful in 27s
checks-deployment-tf-incus-hosts / deployment-tf-incus-hosts (pull_request) Successful in 6m32s
checks-test-netbox-service / test-netbox-service (pull_request) Successful in 19s
checks-core-docs / core-docs (pull_request) Successful in 8m33s
checks-deployment-tf-hosts / deployment-tf-hosts (pull_request) Successful in 11m13s
checks-deployment-ssh-hosts / deployment-ssh-hosts (pull_request) Successful in 18m18s
checks-deployment-tf-hosts-bootstrap / deployment-tf-hosts-bootstrap (pull_request) Successful in 27m51s
checks-apps-tf / apps-tf (pull_request) Has been cancelled
checks-apps-api / apps-api (pull_request) Has been cancelled
checks-apps-tf-incus / apps-tf-incus (pull_request) Has been cancelled
2026-07-04 21:55:03 +02:00
Compare
kiara force-pushed bootstrap-order from a7083eecf9
Some checks failed
checks-contracts-postgresql / contracts-postgresql (pull_request) Successful in 13s
checks-contracts-chaining / contracts-chaining (pull_request) Successful in 14s
checks-contracts-postgresql-rotation / contracts-postgresql-rotation (pull_request) Successful in 19s
checks-integrations-openbao-pki / integrations-openbao-pki (pull_request) Successful in 19s
nixosConfigurations-dev-forgejo-runner / dev-forgejo-runner (pull_request) Successful in 22s
nixosConfigurations-hosting-provider-api / hosting-provider-api (pull_request) Successful in 23s
nixosConfigurations-dev-forgejo / dev-forgejo (pull_request) Successful in 24s
nixosConfigurations-hosting-provider-bind / hosting-provider-bind (pull_request) Successful in 25s
nixosConfigurations-hosting-provider-authelia / hosting-provider-authelia (pull_request) Successful in 27s
checks-contracts-cross-node / contracts-cross-node (pull_request) Successful in 20s
checks-deployment-nixos-hosts / deployment-nixos-hosts (pull_request) Successful in 35s
checks-integrations-spire-openbao / integrations-spire-openbao (pull_request) Successful in 23s
checks-test-ldap-engine / test-ldap-engine (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-garage / hosting-provider-garage (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-monitoring / hosting-provider-monitoring (pull_request) Successful in 17s
devShells-default / default (pull_request) Successful in 24s
checks-integrations-octodns / integrations-octodns (pull_request) Successful in 44s
nixosConfigurations-hosting-provider-openbao / hosting-provider-openbao (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-netbox / hosting-provider-netbox (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-lldap / hosting-provider-lldap (pull_request) Successful in 23s
checks-contracts-filebackup-hardcoded-file-backup / contracts-filebackup-hardcoded-file-backup (pull_request) Successful in 17s
checks-test-pixelfed-service / test-pixelfed-service (pull_request) Successful in 51s
checks-test-mastodon-service / test-mastodon-service (pull_request) Successful in 52s
checks-test-peertube-service / test-peertube-service (pull_request) Successful in 54s
nix-unit-effects-tf-common-conversion / effects-tf-common-conversion (pull_request) Successful in 11s
nix-unit-contracts-lib / contracts-lib (pull_request) Successful in 21s
nix-unit-effects-common-lib / effects-common-lib (pull_request) Successful in 21s
nixosConfigurations-hosting-provider-panel / hosting-provider-panel (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-otel-collector / hosting-provider-otel-collector (pull_request) Successful in 16s
checks-contracts-filesecrets-hardcoded-secret / contracts-filesecrets-hardcoded-secret (pull_request) Successful in 13s
checks-test-netbox-service / test-netbox-service (pull_request) Successful in 32s
nixosConfigurations-hosting-provider-spire / hosting-provider-spire (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-smtp / hosting-provider-smtp (pull_request) Successful in 20s
nixosConfigurations-hosting-provider-postgresql / hosting-provider-postgresql (pull_request) Successful in 24s
nixosConfigurations-hosting-provider-terraform-backend / hosting-provider-terraform-backend (pull_request) Successful in 19s
nixosConfigurations-hosting-provider-valkey / hosting-provider-valkey (pull_request) Successful in 19s
checks-contracts-generatefiles-vars-openbao / contracts-generatefiles-vars-openbao (pull_request) Successful in 15s
nix-unit-lib-data-model / lib-data-model (pull_request) Successful in 25s
nix-unit-lib-function / lib-function (pull_request) Successful in 27s
nix-unit-lib-lib / lib-lib (pull_request) Successful in 26s
nixosConfigurations-hosting-provider-windmill / hosting-provider-windmill (pull_request) Successful in 18s
nixosConfigurations-hypervisor-incus / hypervisor-incus (pull_request) Successful in 18s
nixosConfigurations-operator-authelia / operator-authelia (pull_request) Successful in 17s
nix-unit-lib-renames-for-source / lib-renames-for-source (pull_request) Successful in 8s
checks-contracts-generatefiles-vars / contracts-generatefiles-vars (pull_request) Successful in 13s
nix-unit-resources-garage-forward-compat / resources-garage-forward-compat (pull_request) Successful in 9s
nixosConfigurations-operator-lldap / operator-lldap (pull_request) Successful in 16s
nixosConfigurations-operator-mastodon / operator-mastodon (pull_request) Successful in 16s
nixosConfigurations-operator-peertube / operator-peertube (pull_request) Successful in 16s
nix-unit-resources-redis-port / resources-redis-port (pull_request) Successful in 8s
nixosConfigurations-operator-combined / operator-combined (pull_request) Successful in 24s
nixosConfigurations-operator-pixelfed / operator-pixelfed (pull_request) Successful in 14s
checks-contracts-ldap-lldap / contracts-ldap-lldap (pull_request) Successful in 10s
nix-unit-resources-generateFiles / resources-generateFiles (pull_request) Successful in 22s
nixosConfigurations-operator-smtp / operator-smtp (pull_request) Successful in 18s
nixosConfigurations-operator-valkey / operator-valkey (pull_request) Successful in 16s
checks-contracts-ldap-openldap / contracts-ldap-openldap (pull_request) Successful in 14s
nix-unit-resources-otel / resources-otel (pull_request) Successful in 31s
nix-unit-resources-secrets / resources-secrets (pull_request) Successful in 21s
checks-contracts-oidc-dex / contracts-oidc-dex (pull_request) Successful in 14s
Nix flake completeness check / _complete (pull_request) Successful in 2m22s
checks-contracts-redis-valkey / contracts-redis-valkey (pull_request) Successful in 10s
checks-contracts-s3-minio / contracts-s3-minio (pull_request) Successful in 11s
checks-contracts-smtp-maddy / contracts-smtp-maddy (pull_request) Successful in 11s
checks-contracts-smtp-opensmtpd / contracts-smtp-opensmtpd (pull_request) Successful in 12s
checks-contracts-ssl-self-signed / contracts-ssl-self-signed (pull_request) Successful in 11s
checks-contracts-streamingbackup-hardcoded / contracts-streamingbackup-hardcoded (pull_request) Successful in 10s
checks-deployment-tf-self-state-reachable / deployment-tf-self-state-reachable (pull_request) Successful in 6s
checks-contracts-systemd-openbaod / contracts-systemd-openbaod (pull_request) Successful in 12s
checks-panel-docs / panel-docs (pull_request) Successful in 8s
checks-resources-secrets-agenix / resources-secrets-agenix (pull_request) Successful in 12s
checks-test-monitoring-storage / test-monitoring-storage (pull_request) Successful in 12s
checks-test-otel-wiring / test-otel-wiring (pull_request) Successful in 12s
checks-test-valkey-service / test-valkey-service (pull_request) Successful in 11s
checks-treefmt / treefmt (pull_request) Successful in 12s
flake-show / flake-show (pull_request) Successful in 5m30s
checks-integrations-spire-incus / integrations-spire-incus (pull_request) Successful in 6m7s
checks-deployment-tf-incus-hosts / deployment-tf-incus-hosts (pull_request) Successful in 6m33s
checks-core-docs / core-docs (pull_request) Successful in 9m32s
checks-deployment-tf-hosts / deployment-tf-hosts (pull_request) Successful in 11m46s
checks-deployment-ssh-hosts / deployment-ssh-hosts (pull_request) Successful in 19m45s
checks-deployment-tf-hosts-bootstrap / deployment-tf-hosts-bootstrap (pull_request) Successful in 22m49s
checks-apps-tf-incus / apps-tf-incus (pull_request) Has been cancelled
checks-apps-api / apps-api (pull_request) Has been cancelled
checks-apps-tf / apps-tf (pull_request) Has been cancelled
to df913f332d
All checks were successful
checks-contracts-postgresql / contracts-postgresql (pull_request) Successful in 11s
checks-contracts-chaining / contracts-chaining (pull_request) Successful in 14s
checks-contracts-postgresql-rotation / contracts-postgresql-rotation (pull_request) Successful in 18s
nixosConfigurations-dev-forgejo-runner / dev-forgejo-runner (pull_request) Successful in 20s
checks-integrations-openbao-pki / integrations-openbao-pki (pull_request) Successful in 21s
nixosConfigurations-dev-forgejo / dev-forgejo (pull_request) Successful in 20s
nixosConfigurations-hosting-provider-api / hosting-provider-api (pull_request) Successful in 24s
nixosConfigurations-hosting-provider-bind / hosting-provider-bind (pull_request) Successful in 23s
nixosConfigurations-hosting-provider-authelia / hosting-provider-authelia (pull_request) Successful in 25s
checks-contracts-cross-node / contracts-cross-node (pull_request) Successful in 20s
checks-test-ldap-engine / test-ldap-engine (pull_request) Successful in 17s
checks-integrations-spire-openbao / integrations-spire-openbao (pull_request) Successful in 23s
checks-deployment-nixos-hosts / deployment-nixos-hosts (pull_request) Successful in 36s
nixosConfigurations-hosting-provider-garage / hosting-provider-garage (pull_request) Successful in 17s
nixosConfigurations-hosting-provider-lldap / hosting-provider-lldap (pull_request) Successful in 21s
nixosConfigurations-hosting-provider-monitoring / hosting-provider-monitoring (pull_request) Successful in 18s
devShells-default / default (pull_request) Successful in 23s
checks-integrations-octodns / integrations-octodns (pull_request) Successful in 44s
nixosConfigurations-hosting-provider-netbox / hosting-provider-netbox (pull_request) Successful in 18s
nixosConfigurations-hosting-provider-openbao / hosting-provider-openbao (pull_request) Successful in 16s
checks-test-mastodon-service / test-mastodon-service (pull_request) Successful in 48s
checks-contracts-filebackup-hardcoded-file-backup / contracts-filebackup-hardcoded-file-backup (pull_request) Successful in 18s
checks-test-pixelfed-service / test-pixelfed-service (pull_request) Successful in 52s
checks-test-peertube-service / test-peertube-service (pull_request) Successful in 53s
nixosConfigurations-hosting-provider-otel-collector / hosting-provider-otel-collector (pull_request) Successful in 13s
nixosConfigurations-hosting-provider-panel / hosting-provider-panel (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-smtp / hosting-provider-smtp (pull_request) Successful in 15s
nixosConfigurations-hosting-provider-spire / hosting-provider-spire (pull_request) Successful in 14s
checks-contracts-filesecrets-hardcoded-secret / contracts-filesecrets-hardcoded-secret (pull_request) Successful in 12s
checks-test-netbox-service / test-netbox-service (pull_request) Successful in 29s
nixosConfigurations-hosting-provider-postgresql / hosting-provider-postgresql (pull_request) Successful in 21s
nix-unit-effects-common-lib / effects-common-lib (pull_request) Successful in 31s
nix-unit-effects-tf-common-conversion / effects-tf-common-conversion (pull_request) Successful in 21s
nix-unit-contracts-lib / contracts-lib (pull_request) Successful in 36s
nixosConfigurations-hosting-provider-terraform-backend / hosting-provider-terraform-backend (pull_request) Successful in 15s
checks-contracts-generatefiles-vars-openbao / contracts-generatefiles-vars-openbao (pull_request) Successful in 13s
nixosConfigurations-hosting-provider-valkey / hosting-provider-valkey (pull_request) Successful in 16s
nixosConfigurations-hosting-provider-windmill / hosting-provider-windmill (pull_request) Successful in 17s
nixosConfigurations-hypervisor-incus / hypervisor-incus (pull_request) Successful in 17s
nixosConfigurations-operator-authelia / operator-authelia (pull_request) Successful in 18s
checks-contracts-generatefiles-vars / contracts-generatefiles-vars (pull_request) Successful in 14s
nix-unit-lib-data-model / lib-data-model (pull_request) Successful in 24s
nix-unit-lib-function / lib-function (pull_request) Successful in 25s
nix-unit-lib-lib / lib-lib (pull_request) Successful in 24s
nixosConfigurations-operator-lldap / operator-lldap (pull_request) Successful in 21s
nixosConfigurations-operator-mastodon / operator-mastodon (pull_request) Successful in 20s
nixosConfigurations-operator-combined / operator-combined (pull_request) Successful in 26s
nixosConfigurations-operator-peertube / operator-peertube (pull_request) Successful in 21s
nix-unit-lib-renames-for-source / lib-renames-for-source (pull_request) Successful in 9s
nix-unit-resources-garage-forward-compat / resources-garage-forward-compat (pull_request) Successful in 8s
nixosConfigurations-operator-pixelfed / operator-pixelfed (pull_request) Successful in 18s
checks-contracts-ldap-lldap / contracts-ldap-lldap (pull_request) Successful in 14s
nix-unit-resources-redis-port / resources-redis-port (pull_request) Successful in 7s
nixosConfigurations-operator-valkey / operator-valkey (pull_request) Successful in 14s
nixosConfigurations-operator-smtp / operator-smtp (pull_request) Successful in 14s
nix-unit-resources-generateFiles / resources-generateFiles (pull_request) Successful in 22s
checks-contracts-ldap-openldap / contracts-ldap-openldap (pull_request) Successful in 12s
nix-unit-resources-otel / resources-otel (pull_request) Successful in 30s
Nix flake completeness check / _complete (pull_request) Successful in 2m19s
nix-unit-resources-secrets / resources-secrets (pull_request) Successful in 24s
checks-contracts-oidc-dex / contracts-oidc-dex (pull_request) Successful in 16s
checks-contracts-redis-valkey / contracts-redis-valkey (pull_request) Successful in 11s
checks-contracts-s3-minio / contracts-s3-minio (pull_request) Successful in 12s
checks-contracts-smtp-maddy / contracts-smtp-maddy (pull_request) Successful in 11s
checks-contracts-smtp-opensmtpd / contracts-smtp-opensmtpd (pull_request) Successful in 11s
checks-contracts-ssl-self-signed / contracts-ssl-self-signed (pull_request) Successful in 12s
checks-contracts-streamingbackup-hardcoded / contracts-streamingbackup-hardcoded (pull_request) Successful in 11s
checks-deployment-tf-self-state-reachable / deployment-tf-self-state-reachable (pull_request) Successful in 6s
checks-contracts-systemd-openbaod / contracts-systemd-openbaod (pull_request) Successful in 11s
checks-panel-docs / panel-docs (pull_request) Successful in 8s
checks-resources-secrets-agenix / resources-secrets-agenix (pull_request) Successful in 11s
checks-test-monitoring-storage / test-monitoring-storage (pull_request) Successful in 12s
checks-test-otel-wiring / test-otel-wiring (pull_request) Successful in 12s
checks-test-valkey-service / test-valkey-service (pull_request) Successful in 12s
checks-treefmt / treefmt (pull_request) Successful in 14s
flake-show / flake-show (pull_request) Successful in 5m39s
checks-deployment-tf-incus-hosts / deployment-tf-incus-hosts (pull_request) Successful in 6m52s
checks-integrations-spire-incus / integrations-spire-incus (pull_request) Successful in 5m30s
checks-core-docs / core-docs (pull_request) Successful in 9m47s
checks-deployment-tf-hosts / deployment-tf-hosts (pull_request) Successful in 12m0s
checks-deployment-ssh-hosts / deployment-ssh-hosts (pull_request) Successful in 17m10s
checks-deployment-tf-hosts-bootstrap / deployment-tf-hosts-bootstrap (pull_request) Successful in 23m1s
checks-apps-api / apps-api (pull_request) Successful in 46m49s
checks-apps-tf-incus / apps-tf-incus (pull_request) Successful in 48m49s
checks-apps-tf / apps-tf (pull_request) Successful in 1h8m16s
2026-07-04 22:57:25 +02:00
Compare
kiara merged commit f95b82f850 into main 2026-07-05 09:31:17 +02:00
kiara deleted branch bootstrap-order 2026-07-05 09:31:18 +02:00
Sign in to join this conversation.
No reviewers
fediversity/developers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
fediversity/fediversity!1172
No description provided.