.
D 2026-03-15T20:27:27.531
L Home
N text/x-markdown
P b4556452228fbac8b81163f131dfaf2c52dc6641c3d10e6f9ce5c46e1c7a20e5
U dmestas
W 3640
# infra
Infrastructure-as-code for `vps-nbg1` (Hetzner, Ubuntu 24.04 LTS, arm64).
This repo contains install scripts, config templates, and documentation for all
services running on the VPS. Each service is self-contained under its own directory
with idempotent install scripts.
---
## Services
``` pikchr
# Top band: Internet / Cloudflare
right
CF: box "Cloudflare" color white fill 0x2a4a6b width 5.8 height 0.45 rad 4px
# VPS outline
VPS: box width 5.8 height 3.8 rad 8px at CF.s + (0, -2.35) fill 0xfafaf0
# Fossil stack (left third)
down
CFD: box "cloudflared" color white fill 0x5b4a8a width 1.4 height 0.4 rad 4px \
at VPS.nw + (0.9, -0.5)
arrow from CFD.s down 0.15 color 0x888888
CDY: box "Caddy :8090" color white fill 0x5b4a8a width 1.4 height 0.4 rad 4px
arrow from CDY.s down 0.15 color 0x888888
FSL: box "Fossil :8081" color white fill 0x3a6b3a width 1.4 height 0.4 rad 4px
text "edgesync" at FSL.s + (0, -0.18) small
text "go-libfossil, infra" at FSL.s + (0, -0.35) small
# NATS stack (right third)
NT: box "nats-server :4222" color white fill 0x2a4a8a width 1.7 height 0.4 rad 4px \
at VPS.ne + (-1.0, -0.5)
arrow from NT.s down 0.15 color 0x888888
JS: box "JetStream" color white fill 0x2a4a8a width 1.7 height 0.4 rad 4px
arrow from JS.s down 0.15 color 0x888888
ES: box "EDGESYNC" fill 0xddeeff width 1.5 height 0.35 rad 4px at JS.s + (0, -0.38)
box "GO_LIBFOSSIL" fill 0xddeeff width 1.5 height 0.35 rad 4px at ES.s + (0, -0.45)
# Coolify (centre)
box "Coolify :8000" fill 0xfff0cc width 1.4 height 0.4 rad 4px at VPS.n + (0, -0.7)
box "excalidraw" fill 0xfff0cc width 1.4 height 0.4 rad 4px at VPS.n + (0, -1.25)
# Arrows from Cloudflare down
arrow from CF.s + (-1.9, 0) down 0.1 color white thick
text "fossil." small at CF.s + (-1.9, -0.2)
arrow from CF.s + (1.9, 0) down 0.1 color white thick
text "sync. :4222" small at CF.s + (1.9, -0.2)
```
| Service | Directory | Endpoint |
|---------|-----------|---------|
| **NATS Server** | `nats/` | `tls://sync.craftdesign.group:4222` |
| Fossil SCM | *(managed separately)* | `https://fossil.craftdesign.group/` |
| Coolify | *(managed separately)* | `http://localhost:8000` |
---
## NATS Documentation
- [NATS Server — Setup & Architecture](NATS Server — Setup & Architecture)
- [NATS Server — Operations Runbook](NATS Server — Operations Runbook)
---
## Repository Layout
```
nats/
install.sh Phase 1 — binary, user, dirs, TLS cert, systemd unit
bootstrap-creds.sh Phase 2 — nsc operator/accounts/users, .creds files
start.sh Phase 3 — render config, start service, copy JWTs
provision-streams.sh Phase 4 — create JetStream streams
nats-server.conf.template Config template (envsubst vars: OPERATOR_JWT, SYS_ACCOUNT_KEY)
nats.service Systemd unit
Dockerfile Future: containerised deployment
creds/ *.creds files (fossil-ignored, not committed)
docs/
superpowers/
specs/ Design documents
plans/ Implementation plans
```
---
## Quickstart — Re-installing NATS
```sh
cd ~/Projects/infra
export NATS_VERSION=2.10.22
sudo --preserve-env=NATS_VERSION bash nats/install.sh # Phase 1 (root)
bash nats/bootstrap-creds.sh # Phase 2 (dmestas)
sudo bash nats/start.sh # Phase 3 (root)
bash nats/provision-streams.sh # Phase 4 (dmestas)
```
Z d1b00584de5a092ff809b6b8e7f89492