···61613. Add a deploy workflow to the app repo
62626363See `modules/nixos/services/cachet.nix` for a minimal example.
6464+6565+## Machine health checks
6666+6767+Machines with Tailscale enabled automatically expose their hostname for reachability checks in the services manifest via `atelier.machine.tailscaleHost`. This defaults to `networking.hostName` when `services.tailscale.enable` is true.
+36-4
docs/src/services/README.md
···11# Services
2233-All services run on **terebithia** (Oracle Cloud aarch64) behind Caddy with Cloudflare DNS TLS.
33+Services are grouped by machine in the services manifest. Machines with Tailscale enabled automatically expose their hostname for reachability checks via `atelier.machine.tailscaleHost`.
44+55+## Machines
4655-## mkService-based
77+| Machine | Platform | Tailscale |
88+|---------|----------|-----------|
99+| terebithia | Oracle Cloud aarch64 | `terebithia` |
1010+| moonlark | — | — |
1111+| prattle | — | — |
1212+1313+## terebithia
1414+1515+All services run behind Caddy with Cloudflare DNS TLS.
1616+1717+### mkService-based
618719| Service | Domain | Port | Runtime | Description |
820|---------|--------|------|---------|-------------|
···1527| traverse | traverse.dunkirk.sh | 4173 | bun | Code walkthrough diagram server |
1628| cedarlogic | cedarlogic.dunkirk.sh | 3100 | custom | Circuit simulator |
17291818-## Multi-instance
3030+### Multi-instance
19312032| Service | Domain | Port | Description |
2133|---------|--------|------|-------------|
2234| emojibot-hackclub | hc.emojibot.dunkirk.sh | 3002 | Emojibot for Hack Club |
2335| emojibot-df1317 | df.emojibot.dunkirk.sh | 3005 | Emojibot for df1317 |
24362525-## Custom / external
3737+### Custom / external
26382739| Service | Domain | Description |
2840|---------|--------|-------------|
···3244| spindle | spindle.dunkirk.sh | Tangled CI |
3345| battleship-arena | battleship.dunkirk.sh | Battleship game server |
3446| n8n | n8n.dunkirk.sh | Workflow automation |
4747+4848+## Services manifest
4949+5050+The manifest is now grouped by machine. Evaluate with:
5151+5252+```sh
5353+nix eval --json .#services-manifest
5454+```
5555+5656+Output shape:
5757+5858+```json
5959+{
6060+ "terebithia": {
6161+ "hostname": "terebithia",
6262+ "tailscale_host": "terebithia",
6363+ "services": [{ "name": "cachet", "health_url": "https://cachet.dunkirk.sh/health", ... }]
6464+ }
6565+}
6666+```
35673668## Architecture
3769
+2-2
docs/src/services/cedarlogic.md
···25252626## Build step
27272828-Unlike other services, cedarlogic runs a build during deploy:
2828+On initial scaffold, cedarlogic installs deps and builds:
29293030```
3131bun install → parse-gates → bun run build (Vite)
3232```
33333434-The build has a 120s timeout to accommodate Vite compilation.
3434+Subsequent deploys handle their own build via the deploy workflow. The build has a 120s timeout to accommodate Vite compilation.
+2
docs/src/services/emojibot.md
···2020 channel = "C02T3CU03T3";
2121 repository = "https://github.com/taciturnaxolotl/emojibot";
2222 secretsFile = config.age.secrets."emojibot/hackclub".path;
2323+ healthUrl = "https://hc.emojibot.dunkirk.sh/health";
2324 };
2425};
2526```
···3334| `repository` | string | `"https://github.com/taciturnaxolotl/emojibot"` | Git repo URL |
3435| `workspace` | string or null | `null` | Slack workspace name (for identification) |
3536| `channel` | string or null | `null` | Slack channel ID |
3737+| `healthUrl` | string or null | `null` | Health check URL for monitoring |
36383739## Current instances
3840