Federation member registry, relay configuration, and auto-deployment for FadianRoam.
Secrets are encrypted with SOPS + AGE. Config changes auto-deploy to all federation proxies via GitHub Actions.
members/ # One YAML per Site (SOPS-encrypted shared_secret)
federations/ # One YAML per Federation Relay proxy
scripts/ # Config generation and deployment
.sops.yaml # SOPS encryption rules
- Open an Issue → "Join as FadianRoam Site"
- Fill in your realm, WireGuard public key, location, etc.
- Governance Committee reviews and approves
- Admin generates your
shared_secret, creates your member YAML, encrypts and pushes - CI/CD auto-deploys to all federation proxies
- You receive your shared secret and MGMT VPN config securely
- Open an Issue → "Deploy New Federation Proxy"
- Prepare your server: install FreeRADIUS, WireGuard, SOPS, AGE
- Add the CI/CD SSH public key to your deploy user:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBt/emqI0l/a2bfWwDiEoHiAZJaHeAoKnLjf/Z5gm7Ew fadianroam-federation-deploy - Generate AGE key:
mkdir -p /etc/sops && age-keygen -o /etc/sops/age-key.txt - Submit the Issue with your server SSH host/port, AGE public key, and country
- Admin adds your federation YAML, updates
.sops.yamlwith your AGE key, and adds your host to the CI/CD workflow
# Generate shared secret
SECRET=$(openssl rand -hex 24)
# Create member file
cat > members/<realm>.yml << EOF
member:
name: "..."
realm: "<realm>"
contact: "..."
joined: "$(date +%Y-%m-%d)"
network:
type: "bgp"
mgmt_ip: "172.172.10.XX"
wg_pubkey: "..."
asn: XXXXX
radius:
port: 1812
shared_secret: "$SECRET"
eap_methods:
- "EAP-TTLS/PAP"
location:
city: "..."
country: "XX"
EOF
# Encrypt and push
sops encrypt -i members/<realm>.yml
git add members/<realm>.yml && git commit -m "update" && git push- Add YAML to
federations/<name>.yml - Add AGE public key to
.sops.yaml(comma-separated with existing keys) - Re-encrypt all members:
for f in members/*.yml; do sops rotate -i "$f"; done - Add host to
matrix.includein.github/workflows/deploy.yml - Commit and push