Git-driven automation for secure, self-reliant infrastructure.
Find a file
codex f3e8bf3ab4
All checks were successful
CI Smoke / source-contract (push) Successful in 11s
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
fix(workplans): qualify ad-hoc identifiers with the repository prefix
`ADHOC-YYYY-MM-DD` is unique per date but not per repository, so any two repos
opening an ad-hoc on the same day collide. The 2026-08-26 fleet projection
reset refused 9 records for exactly this reason.

Canon (work-record-types_v0.1, CUST-WP-0066) settled the form as
`{PREFIX}-WP-ADHOC-YYYY-MM-DD`, filename unchanged, and grandfathered existing
ids on the condition they are never *silently* re-derived. This is the explicit
migration that clause allows for.

The hub id is derived from the record id, so a changed id is a different
record: stale state_hub_*_id fields are dropped and fix-consistency re-derives.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 2583210@bnt-lap001
Assistant-Session: f2bff2d5-e9b2-4338-92ca-10282a927006
2026-08-28 00:28:23 +02:00
.claude/rules docs: workplan-first agent guidance prose (CUST-WP-0055 T04 batch 3) 2026-07-08 17:15:30 +02:00
.forgejo/workflows Implement governed S1 backup recovery loop 2026-08-23 13:13:13 +02:00
.githooks Implement reproducible S1 handoff contracts 2026-08-23 12:02:23 +02:00
ansible Prepare governed S1 offsite upload 2026-08-23 14:11:00 +02:00
capabilities/playbooks Add playbook capability declaration for bootstrap 2026-05-22 14:49:29 +02:00
cloudinit feat(relocate): receive cloudinit and railiance-plan-host from railiance-cluster 2026-03-10 00:34:50 +01:00
contrib chore(rename): railiance-hosts → railiance-infra 2026-03-10 00:34:18 +01:00
docs Prepare governed S1 offsite upload 2026-08-23 14:11:00 +02:00
goss Implement reproducible S1 handoff contracts 2026-08-23 12:02:23 +02:00
history Document actual infrastructure scope and intent gaps 2026-08-23 10:45:02 +02:00
hosteurope added information on nydus dependency 2026-03-08 22:55:38 +01:00
infra/forgejo-restore-drill RAIL-HO-WP-0005-T09: Forgejo backup/restore drill assets and evidence 2026-07-04 11:26:50 +02:00
inventory Implement reproducible S1 handoff contracts 2026-08-23 12:02:23 +02:00
keys security: add admin ssh key 2025-09-14 00:39:03 +02:00
registry Draft capability entry (reuse-surface REUSE-WP-0017-T04, cohort 3) 2026-07-06 19:50:53 +02:00
reports chore: Goss verification reports 2026-03-09T164529Z 2026-03-09 16:45:29 +00:00
reviews Review attended login containment fix 2026-08-23 01:39:09 +02:00
schemas Implement reproducible S1 handoff contracts 2026-08-23 12:02:23 +02:00
scripts Prepare governed S1 offsite upload 2026-08-23 14:11:00 +02:00
secrets security: added encrypted hetzner api token 2025-09-13 22:23:24 +00:00
spec Prepare governed S1 offsite upload 2026-08-23 14:11:00 +02:00
state-hub-inbox Define S1 reef rollout handoff 2026-07-25 15:13:41 +02:00
terraform/hetzner Implement reproducible S1 handoff contracts 2026-08-23 12:02:23 +02:00
tests Prepare governed S1 offsite upload 2026-08-23 14:11:00 +02:00
tools Implement governed S1 backup recovery loop 2026-08-23 13:13:13 +02:00
workplans fix(workplans): qualify ad-hoc identifiers with the repository prefix 2026-08-28 00:28:23 +02:00
.custodian-brief.md chore(consistency): sync task status from DB [auto] 2026-08-25 17:46:17 +02:00
.gitignore Make S1 handoff read-only by default 2026-08-23 12:41:23 +02:00
.repo-classification.yaml Add .repo-classification.yaml (CUST-WP-0050 T11 agent first-pass) 2026-06-22 17:47:41 +02:00
.sops.yaml Implement reproducible S1 handoff contracts 2026-08-23 12:02:23 +02:00
AGENTS.md docs(agents): repoint remote State Hub URL to the in-cluster address 2026-08-25 00:21:48 +02:00
CLAUDE.md Normalize agent instructions and workplan frontmatter (STATE-WP-0067) 2026-06-22 23:16:28 +02:00
INTENT.md Add self-coherent INTENT.md 2026-05-21 01:50:08 +02:00
LICENSE Adopt Target Revenue Source License V1C1 (org-wide preliminary rollout) 2026-07-30 00:53:42 +02:00
Makefile Prepare governed S1 offsite upload 2026-08-23 14:11:00 +02:00
README.md Make S1 handoff read-only by default 2026-08-23 12:41:23 +02:00
sbom-tools.yaml chore(sbom): add system-level tool manifest for railiance-infra 2026-03-18 18:35:20 +01:00
SCOPE.md Make S1 handoff read-only by default 2026-08-23 12:41:23 +02:00
WORK-RECORDS.md chore(registrar): assign State Hub identifiers 2026-08-25 17:46:22 +02:00

railiance-infra

Tagline: Git-driven automation for secure, self-reliant servers.

railiance-infra is the canonical S1 ownership repo for the Railiance infrastructure substrate. It manages two adopted Host Europe servers through source-backed inventory, Ansible convergence, and recurring Goss verification. A separate Terraform and cloud-init path provisions only records explicitly declared as provider-managed Hetzner resources. Selected provider material lives in-repo encrypted with SOPS/age; host convergence does not distribute the private age key.

Future reef-* repos will model purpose-bound substrate boundaries such as reef-railiance or reef-ops-workstations, but the source-backed S1 inventory, hardening baseline, and OS convergence facts stay here.

Quickstart

  1. Clone Repo: clone the repo
  2. Prerequisites: terraform >= 1.7, ansible >= 2.16, age, sops.
  3. Secrets Management: Generate master key (age), provide it to sops and provide your SSH key.
  4. Setup Provider: Create account, select payment option, establish API token.
  5. Provisioning: Validate inventory; plan/apply only provider-managed Hetzner records. Adopted Host Europe records are never Terraform resources.
  6. Convergence: Setup security and tooling with ansible.

🚀 0. Clone Repo

First, clone this repository to your workstation:

git clone https://<your-gitea-host>/coulomb/railiance-infra.git
cd railiance-infra

📦 1. Prerequisites

To use railiance-infra, make sure you have the following tools installed on your workstation:

Example installation (Ubuntu/Debian)

# System tools
sudo apt update
sudo apt install -y git make ansible

# Terraform
sudo apt install -y wget unzip
wget https://releases.hashicorp.com/terraform/1.9.5/terraform_1.9.5_linux_amd64.zip
unzip terraform_1.9.5_linux_amd64.zip
sudo mv terraform /usr/local/bin/

# age 
sudo apt install age 

# SOPS Get the latest release (example: v3.10.2 — check GitHub for updates)
wget https://github.com/getsops/sops/releases/download/v3.10.2/sops_3.10.2_amd64.deb
sudo apt install ./sops_3.10.2_amd64.deb

🔑 2. Secrets Management

Generate Age Masterkey and establish SOPS

This project uses SOPS with age for secret encryption.
To set up your own key and configure SOPS, follow the guide here:

➡️ Managing Age Keys

SSH Access Preparations

Learn how to add your SSH key and test connectivity after provisioning:

➡️ SSH Access & Connectivity Test

TL;DR

  • put your public key into keys/admin_ssh.pub

💻 3. Setup Provider

You need register an account and set it up for API access:

  • register
  • choose payment method
  • generate api-key
  • store api-key in secrets safely

🚀 4. Provisioning

How to declare hosts and bring them up on Hetzner:

➡️ Provisioning Servers

TL;DR

  • Run make validate-inventory after editing inventory/servers.yaml.
  • Put Hetzner-only fields under provisioning on a lifecycle_mode: provider-managed record.
  • Review make tf-plan; an apply additionally requires APPROVE_TF_APPLY=YES.
  • One-shot helper: scripts/hcloud_new_server.sh --type ... --region ....

💻 5. Convergence

For adopted or newly provisioned servers, railiance-infra uses Ansible to converge hosts into a secure, baseline state.
This includes admin user setup, SSH hardening, firewall rules, essential tooling, and secret handling.

📖 See the full guide here: Convergence Documentation

Routine make verify and make s1-handoff runs are read-only on managed hosts. Updating the installed Goss surface is deliberately separate and requires an exact APPROVE_VERIFY_REFRESH value; see Server Verification.