npx skills add https://github.com/getcolors/agent-network --skill package-agent-network-redSKILL.md
NetBird Agent Network on Vultr or DigitalOcean
A Red workflow that turns one colors.yml into a running Agent Network
demo: OpenTofu for the machine, its provider firewall and two Cloudflare records
(the base name and its wildcard); Ansible for Traefik, the combined
netbird-server, the dashboard in agent-network-only mode, the NetBird
reverse proxy in private mode, the control plane (provider, guardrail,
policy, global limit), and the isolated agent container.
The demo's claim: the agent has no internet path — two independent boundaries, an internal Docker network and DOCKER-USER rules — and its only route to an LLM is the keyless agent-network endpoint over the WireGuard tunnel, where every request carries the peer's identity, passes the policy, and is metered. Convergence proves the claim (positive and negative space both) or fails.
Compute providers
provider-compute selects vultr or digitalocean; each provider has its own
credential and its own provider-scoped keys, and the keys of the other
provider are ignored, so one colors.yml can carry both.
| Provider | Credential | Keys |
|---|---|---|
vultr |
COLORS_PAR_VULTR_API_KEY |
vultr-region, vultr-plan, vultr-os-id, vultr-ssh-sources, vultr-http-sources, vultr-stun-sources |
digitalocean |
COLORS_PAR_DO_TOKEN |
digitalocean-region, digitalocean-size, digitalocean-image, digitalocean-ssh-sources, digitalocean-http-sources, digitalocean-stun-sources |
The provider firewall is the same rule set on both: 22 from the SSH sources,
80 and 443 from the HTTP sources, STUN over UDP from the STUN sources, nothing
else. On DigitalOcean the droplet joins the region's default VPC, discovered
at plan time; digitalocean-vpc-uuid and digitalocean-vpc-cidr are
refused, because this package creates and pins no VPC. <provider>-name is
optional and defaults to the profile. Keygen mode (the package owns
~/.ssh/<profile> when <provider>-ssh-keys is absent) works on both
providers.
Switching providers is a rebuild, never an apply. A profile whose state
already holds a machine refuses a create or delete under a different
provider-compute — set it back, delete, then switch.
Verbs
./red build # render .colors/<profile>/ — no provider calls, no credentials
./red create --dry-run # walk the workflow, skip every side effect
./red create # converge for real
./red delete # guarded; needs a one-run override
Exit code 2 is validation or usage failure and lists every problem at once. The
launcher walks up from the working directory to find colors.yml.
Before you converge
- The hostname and its wildcard must be free in the Cloudflare zone. The DNS stage creates both and never adopts a foreign record.
- Five credentials must be set in
.envrc.private— the selected compute provider's, Cloudflare's, the two R2 keys and the Anthropic key; seereferences/configuration.md. Never exportCOLORS_PAR_PROFILE. - A deliberately fake
COLORS_PAR_ANTHROPIC_API_KEYis a supported mode: the acceptance suite then expects Anthropic's own 401 relayed through the proxy, which still proves isolation, tunnel, policy and key injection while never producing a billable completion. Swap in a real key and re-run create to upgrade the demo to real completions.
Disposability
This deployment is disposable by design: no backups, and recovery is a
guarded delete followed by create. The endpoint hostname and every peer
identity are regenerated by the next create; nothing on the box is worth
outliving it.
Operating
agent-network-status, agent-network-smoke, agent-network-bootstrap on
the host. The dashboard admin password is generated on the host:
/etc/agent-network/secrets/admin_password.
Rules
colors.ymlis the only file to edit..colors/is generated: never edit it, read it as source, or commit it.- Credentials are
COLORS_PAR_<UPPER_SNAKE_KEY>variables in the gitignored.envrc.private, never incolors.ymlor documentation. - Never weaken
compute-prevent-destroyin committed desired state. - The installed launcher is a copy, not a symlink. After
npx skills update -p, copy.agents/skills/package-agent-network-red/redover the root./red.