Skip to content

Reference

Spec reference

Every field of the Isoloom spec (isoloom.yml), version 1: networks, reach, inputs, machines, services, implementations, checks and targets.

A spec is one YAML file at the root of a project: isoloom.yml (isoloom.yaml also works, but not both). Unknown fields are errors, so a typo never passes silently.

Top level

version: 1                 # required, the format version
name: invoice-portal       # required, kebab-case
networks: { … }            # required, at least one
reach: [ … ]               # optional, traffic allowed between networks
inputs: [ … ]              # optional, launch-time values
machines: { … }            # required, at least one
checks: [ … ]              # optional, black-box checks
targets: [ … ]             # optional, narrows the derived targets
FieldTypeNotes
versionintegerMust be 1.
namestringKebab-case: lowercase letters, digits, dashes.
networksmapNetwork name → network. Names are DNS labels.
reachlistAllowed traffic between networks; see below.
inputslistUPPER_SNAKE_CASE names of values provided at launch.
machinesmapMachine name → machine, in start order. Names are DNS labels.
checkslistPaths of check scripts in the project.
targetslistSubset of the derived targets to keep.

Networks

networks:
  dmz:      { cidr: 10.30.10.0/24 }
  internal: { cidr: 10.30.20.0/24, internet: false }
FieldTypeDefaultNotes
cidrstringA network address inside 10.0.0.0/8, sized /24 to /29. Networks can't overlap.
internetbooltrueWhether machines on it may reach the internet.
gatewaystringA machine that routes this network with its own rules (an edge firewall). It must be on the network at the gateway address. See Networks and gateways.

Addresses stay inside 10.0.0.0/8 because Docker's default pools and most home networks use 172.16.0.0/12 and 192.168.0.0/16. On every network, .1 is reserved for the gateway (only the network's gateway machine may take it) and the last address (e.g. .254) for the router.

Reach

Machines on the same network always reach each other. Between networks, everything is blocked except what reach: allows:

reach:
  - { from: access, to: dmz }                         # every port
  - { from: dmz, to: internal, ports: [8080, 5432] }  # only these ports
FieldTypeNotes
from, tostringNetwork names. Must differ.
portslist of integersEmpty means every port.

Each target enforces these rules with its own mechanism; see Networks and gateways.

Inputs

inputs: [API_URL, LAUNCH_TOKEN]

Names of values a runner provides at launch. A machine receives only the inputs it lists.

Machines

machines:
  web:
    networks: { app: 31 }
    services: [{ port: 8080, name: portal, http: true }]
    inputs: [API_URL]
    resources: { cpus: 2, memory_mb: 2048, disk_gb: 20 }
    depends_on: [database]
    docker: { build: build/web }
    vm: { os: debian-12, provision: [provision/web.sh] }
FieldTypeNotes
networksmapNetwork name → last octet of the machine's address on it. At least one.
serviceslistWhat answers on the machine; see below.
inputslistRange inputs this machine receives. Each must be declared at the top level.
resourcesobjectcpus, memory_mb, disk_gb. Defaults: 1 CPU, 1024 MB, 20 GB.
depends_onlistMachines that must answer before this one starts. They need at least one service. No cycles.
accessboolThe machine a user lands on. At most one. May have no implementation.
dockerobjectContainer implementation.
vmobjectVM implementation.

Every machine except the access machine needs at least one implementation.

Services

FieldTypeNotes
portinteger1 to 65535, unique on the machine.
namestringOptional label.
httpboolWhether it speaks HTTP (used by tools that open it in a browser).

docker:

FieldTypeNotes
imagestringA published image.
buildstringA build folder in the project.
initlistOne-shot jobs (scripts or folders) that run before the machine counts as ready, e.g. seeding a database.

Use exactly one of image and build.

vm:

FieldTypeNotes
osstringOne of debian-12, ubuntu-24.04, kali, windows-server-2022, windows-11. Each target maps it to its own image.
provisionlistSteps run inside the VM, in order: shell scripts, Ansible playbooks, PowerShell. Required except on the access machine.

Checks

checks:
  - checks/portal-answers.sh
  - checks/internal-is-blocked.sh

Scripts run on the environment's networks. See Checks.

Targets

targets: [docker, vagrant]

Keeps only these of the derived targets. Values: docker, hosted, cloud-docker, vagrant, proxmox, cloud-vm, ludus. See Targets.