clawdie-ai/docs/public/architecture/bastille.md

127 lines
3.2 KiB
Markdown
Raw Normal View History

---
title: "Bastille on FreeBSD 15"
---
2026-03-08 09:18:35 +01:00
Clawdie uses Bastille as the host-side jail manager for its Warden runtime on
FreeBSD.
2026-03-08 09:18:35 +01:00
## Host Assumptions
2026-03-08 09:18:35 +01:00
- FreeBSD 15 host
- ZFS root pool
2026-03-08 09:18:35 +01:00
- Bastille installed from packages
- `warden0` bridge on `10.0.0.1/24`
- host-side orchestration, not an operator jail
2026-03-08 09:18:35 +01:00
## Recommendation
2026-03-08 09:18:35 +01:00
Keep Bastille boring and explicit:
2026-03-08 09:18:35 +01:00
- bootstrap `15.0-RELEASE`
- keep the stock Bastille layout
- use `warden0` as the canonical bridge name
- use `10.0.0.0/24` as the default internal jail subnet
- create persistent service jails as thick VNET jails
- create workers as thin jails from the current profile logic
2026-03-08 09:18:35 +01:00
## Bootstrap
```sh
pkg install -y bastille
2026-03-08 09:18:35 +01:00
bastille bootstrap -p 15.0-RELEASE
```
## Canonical Service Jails
2026-03-08 09:18:35 +01:00
Default fixed service slots:
2026-03-08 09:18:35 +01:00
- `db` on `<subnet>.3`
- `cms` on `<subnet>.4`
- `llama-cpp` on `<subnet>.5` (llama-server, embeddings)
- `git` on `<subnet>.6`
2026-03-08 09:18:35 +01:00
The operator controlplane is not a jail in the current model. It runs on the
FreeBSD host and is published at `ai.<internal_base>`.
Example bring-up for the default install:
```sh
bastille create -T -B -g <subnet>.1 db 15.0-RELEASE <subnet>.3/24 warden0
bastille create -T -B -g <subnet>.1 cms 15.0-RELEASE <subnet>.4/24 warden0
bastille create -T -B -g <subnet>.1 git 15.0-RELEASE <subnet>.6/24 warden0
```
Apply internal hostnames after creation:
2026-03-08 09:18:35 +01:00
```sh
bastille config cms set host.hostname cms.home.arpa
bastille config git set host.hostname git.home.arpa
2026-03-08 09:18:35 +01:00
```
## Worker Bring-Up
2026-03-08 09:18:35 +01:00
Workers are derived from `AGENT_NAME` and start in the high range:
2026-03-09 14:03:25 +01:00
- default worker: `10.0.0.101`
- future networked workers continue upward from there
2026-03-09 14:03:25 +01:00
Use the setup path rather than hand-writing worker create commands:
2026-03-08 09:18:35 +01:00
```sh
just setup -- --step jails --create
2026-03-08 09:18:35 +01:00
```
## Networking
2026-03-08 09:18:35 +01:00
The intended host-side network is:
2026-03-08 09:18:35 +01:00
- bridge: `warden0`
- gateway: `10.0.0.1`
- jailed subnet: `10.0.0.0/24`
2026-03-09 14:03:25 +01:00
If a VNET jail comes up without a `default` route, treat that as a provisioning
defect and fix the create command rather than applying ad hoc routes later.
2026-03-09 14:03:25 +01:00
## Packages and Roles
2026-03-08 09:18:35 +01:00
Current setup steps own the jail bootstrap contract:
2026-03-08 09:18:35 +01:00
- `db` installs PostgreSQL + pgvector
- `git` installs plain git storage
- `cms` installs nginx and the Astro/Starlight web baseline; optional Strapi
content/bootstrap remains internal and deployment-specific
2026-03-08 09:18:35 +01:00
Do not bootstrap a separate operator jail. The FreeBSD host is the operator
surface.
2026-03-08 09:18:35 +01:00
## ZFS Layout
With the default Bastille + Clawdie settings, datasets should live under a
project prefix such as:
```text
zroot/clawdie-runtime/jails
zroot/clawdie-runtime/releases
zroot/clawdie-runtime/templates
```
## Snapshots
Snapshot persistent service jails before risky changes, for example:
```sh
zfs snapshot zroot/clawdie-runtime/jails/clawdie-db@pre-schema-14.mar.2026-1200
zfs snapshot zroot/clawdie-runtime/jails/clawdie-cms@pre-strapi-14.mar.2026-1230
2026-03-08 09:18:35 +01:00
```
Use user-facing snapshot names in `DD.mmm.YYYY-HHMM` format.
2026-03-08 11:00:52 +01:00
## Current Direction
2026-03-08 11:00:52 +01:00
- host orchestrator on FreeBSD
- Bastille-managed service and worker jails
- no dedicated operator jail in the active model
- shared internal surfaces named by role: `ai`, `cms`, `git`
- public web serving delegated to the `cms` jail instead of host nginx ownership