Bastille on FreeBSD 15
Clawdie uses Bastille as the host-side jail manager for its Warden runtime on FreeBSD.
Host Assumptions
Section titled “Host Assumptions”- FreeBSD 15 host
- ZFS root pool
- Bastille installed from packages
warden0bridge on10.0.0.1/24- host-side orchestration, not an operator jail
Recommendation
Section titled “Recommendation”Keep Bastille boring and explicit:
- bootstrap
15.0-RELEASE - keep the stock Bastille layout
- use
warden0as the canonical bridge name - use
10.0.0.0/24as the default internal jail subnet - create persistent service jails as thick VNET jails
- create workers as thin jails from the current profile logic
Bootstrap
Section titled “Bootstrap”pkg install -y bastillebastille bootstrap -p 15.0-RELEASECanonical Service Jails
Section titled “Canonical Service Jails”Default fixed service slots:
dbon<subnet>.3cmson<subnet>.4llama-cppon<subnet>.5(llama-server, embeddings)giton<subnet>.6
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:
bastille create -T -B -g <subnet>.1 db 15.0-RELEASE <subnet>.3/24 warden0bastille create -T -B -g <subnet>.1 cms 15.0-RELEASE <subnet>.4/24 warden0bastille create -T -B -g <subnet>.1 git 15.0-RELEASE <subnet>.6/24 warden0Apply internal hostnames after creation:
bastille config cms set host.hostname cms.home.arpabastille config git set host.hostname git.home.arpaWorker Bring-Up
Section titled “Worker Bring-Up”Workers are derived from AGENT_NAME and start in the high range:
- default worker:
10.0.0.101 - future networked workers continue upward from there
Use the setup path rather than hand-writing worker create commands:
just setup -- --step jails --createNetworking
Section titled “Networking”The intended host-side network is:
- bridge:
warden0 - gateway:
10.0.0.1 - jailed subnet:
10.0.0.0/24
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.
Packages and Roles
Section titled “Packages and Roles”Current setup steps own the jail bootstrap contract:
dbinstalls PostgreSQL + pgvectorgitinstalls plain git storagecmsinstalls nginx and the Astro/Starlight web baseline; optional Strapi content/bootstrap remains internal and deployment-specific
Do not bootstrap a separate operator jail. The FreeBSD host is the operator surface.
ZFS Layout
Section titled “ZFS Layout”With the default Bastille + Clawdie settings, datasets should live under a project prefix such as:
zroot/clawdie-runtime/jailszroot/clawdie-runtime/releaseszroot/clawdie-runtime/templatesSnapshots
Section titled “Snapshots”Snapshot persistent service jails before risky changes, for example:
zfs snapshot zroot/clawdie-runtime/jails/clawdie-db@pre-schema-14.mar.2026-1200zfs snapshot zroot/clawdie-runtime/jails/clawdie-cms@pre-strapi-14.mar.2026-1230Use user-facing snapshot names in DD.mmm.YYYY-HHMM format.
Current Direction
Section titled “Current Direction”- 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
cmsjail instead of host nginx ownership