Skip to content
infra Artifact [5d75a7d6dc]
Login

Artifact [5d75a7d6dc]

Artifact 5d75a7d6dca4739d7f921fdb2196a0493968cbd8dced5f45d54e5d4d6862ec0a:

Wiki page [Home] by dmestas on 2026-03-15 20:41:02.
D 2026-03-15T20:41:02.438
L Home
N text/x-markdown
P 4b56535044165eaf78dbc2a402aae50408aeae598ce791fe5abd009f3dc39018
U dmestas
W 3778
# 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)
- [NATS Server — Docker Image](NATS Server — Docker Image)

---

## 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                   Container image (24 MB, tested)
  docker-entrypoint.sh         Entrypoint — renders config, starts server
  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 9039f58355a8d504d452411befe179a8