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.1.1/24in the repo registry example- 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.1.0/24as the default internal jail subnet example - keep jails thin by default
- keep only the optional
dbjail thick
Bootstrap
Section titled “Bootstrap”pkg install -y bastillebastille bootstrap -p 15.0-RELEASECanonical Service Jails
Section titled “Canonical Service Jails”Default fixed service slots:
giton<subnet>.2cmson<subnet>.3llama-cppon<subnet>.4(llama-server, embeddings)dbon<subnet>.5
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 -B -g <subnet>.1 git 15.0-RELEASE <subnet>.2/24 warden0bastille create -B -g <subnet>.1 cms 15.0-RELEASE <subnet>.3/24 warden0bastille create -T -B -g <subnet>.1 db 15.0-RELEASE <subnet>.5/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 service-owned execution environments and start in the high range:
- default worker:
10.0.1.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.1.1 - jailed subnet:
10.0.1.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.
Thick vs thin
Section titled “Thick vs thin”Clawdie keeps jails thin by default.
- thin jails share the Bastille release tree and save disk space
- the optional
dbjail stays thick because the database is long-lived state and we want its base lifecycle to stay explicit
Thin jails do not automatically follow host patchlevels. They follow the Bastille release tree they are mounted from. Updating the FreeBSD host alone does not refresh that release tree.
In practice, coordinated updates need two steps:
- update the host
- update the Bastille release tree and then refresh or rebuild the affected jails
Repo helper:
sudo just system-updateThis runs the current-release patch path for the host, refreshes the Bastille
release tree, updates thin jails, and updates the optional db jail when
DB_RUNTIME=jail.
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