89.244.90.255 appeared in the live allowlist mid-session. Verified legitimate: SSH pubkey auth as tegwick from that address on 2026-08-02, and UFW BLOCK entries on 6443 immediately before it was granted. Now declared. Both stale grants are deleted from the live host, so the security goal of T02 is met and the live 6443 allowlist matches the declaration exactly. Full convergence deliberately held: --check reports 11 changes, mostly unrelated to the firewall, including MemoryMax=1500M on user-1000.slice which could OOM running agent workloads, plus an sshd restart. That is a separate decision, and the base role has no tags so convergence cannot be scoped to UFW alone. Records both follow-ons. The allowlist drifting again by hand during the session that was fixing allowlist drift is now recorded as the strongest argument for T04, removing the API from the public internet. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|---|---|---|
| .claude/rules | ||
| .forgejo/workflows | ||
| .githooks | ||
| ansible | ||
| capabilities/playbooks | ||
| cloudinit | ||
| contrib | ||
| docs | ||
| goss | ||
| hosteurope | ||
| infra/forgejo-restore-drill | ||
| inventory | ||
| keys | ||
| registry | ||
| reports | ||
| scripts | ||
| secrets | ||
| spec | ||
| state-hub-inbox | ||
| terraform/hetzner | ||
| tools | ||
| workplans | ||
| .custodian-brief.md | ||
| .gitignore | ||
| .repo-classification.yaml | ||
| .sops.yaml | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| INTENT.md | ||
| LICENSE | ||
| Makefile | ||
| README.md | ||
| sbom-tools.yaml | ||
| SCOPE.md | ||
| WORK-RECORDS.md | ||
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 provisions and manages servers on HostEurope and
Hetzner Cloud entirely from Git. It combines Terraform for lifecycle
management, cloud-init for first-boot configuration, and Ansible for
convergence. All secrets live in-repo encrypted with SOPS and are unlocked
with your single age master key (which you keep in your password manager).
The minimal server registry in inventory/servers.yaml is the source of truth.
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
- Clone Repo: clone the repo
- Prerequisites: terraform >= 1.7, ansible >= 2.16, age, sops.
- Secrets Management: Generate master key (age), provide it to sops and provide your SSH key.
- Setup Provider: Create account, select payment option, establish API token.
- Provisioning: Plan and apply
inventory/servers.yamlto add hosts with terraform. - 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:
- Git → for version control
- age → for key management and encryption (Install guide)
- SOPS → for managing encrypted secrets (SOPS GitHub)
- Terraform → for provisioning infrastructure (Terraform Downloads)
- Ansible → for server configuration (Ansible Installation Guide)
- Make → to run the included
Makefiletasks
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:
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:
TL;DR
- Define servers in inventory/servers.yaml (name, region, type, image, ssh_user, labels/role).
- Provision with make tf-apply (or make apply to also run Ansible).
- One-shot helper: scripts/hcloud_new_server.sh --type ... --region ....
💻 5. Convergence
After provisioning a server with Terraform, 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