Files
clawmates/.gitignore
T
Omar SobhandClaude Opus 5 869c3adcb7
deploy / test (push) Successful in 5m39s
deploy / build (push) Successful in 7m28s
fix(missions): egress from a subnet of their own, so the host can police it
docs/MISSION-EGRESS.md measured that a mission container reaches the entire
tailnet and SSH on its own host, and left the remediation unapplied. Applying
it on 2026-09-18 found why five iptables lines were never going to be enough:
missions egressed from clawmates_edge, the SERVER's network, and the server
needs the tailnet — Beszel on architect, Ollama for the local backend, the
node daemons for exec-test and node-placed terminals. A tailnet drop scoped to
172.23/16 cut the server off from architect:8090 inside a minute.

Missions now egress from clawmates_missions, 172.25.0.0/16, pinned so the
firewall can name it and declared in both compose files with the same shape
edge has. Compose v1 does not create a network no service uses, so on gw-04
it was created by hand with compose's own labels; the server's attach failure
message now says to check for it. core is unchanged: the door and API are
still reached over 172.20.

The policy itself (/usr/local/sbin/clawmates-egress.sh on gw-04, systemd unit
+ drop-ins on docker and tailscaled) lives in mangle/PREROUTING with
--ctstate NEW. Two earlier placements failed measurably: filter/FORWARD loses
to tailscaled re-inserting ts-forward above it on every restart, and
raw/PREROUTING runs before conntrack, so it dropped the server's replies to
tailnet clients and took the API off 100.102.112.85:8088. Verified from the
mission subnet (tailnet, host ssh, link-local blocked; public and core open),
from edge (tailnet open, ssh blocked), and inbound from tank; and proved to
survive restarting both daemons.

Also: deploy/compose/docker-compose.override.yml is tracked now. It holds the
fixes for the five local bring-up gaps and every credential in it is a
${VAR:?} reference, and it had lived on one laptop that lost a volume this
week.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01WZb5A2kfVfjpdwSochkuHz
2026-09-18 11:06:03 -05:00

34 lines
1.1 KiB
Plaintext

/target
**/node_modules
frontend/.next
frontend/out
frontend/coverage
frontend/playwright-report
frontend/test-results
.env
.env.local
*.log
.DS_Store
data/
token.key
# Hosted node-agent binaries (built + baked into the frontend image, not committed)
frontend/public/dl/
# Local env backups. `.env` is already ignored above, but a timestamped or
# suffixed copy of it is not — and these hold real credentials (subscription
# OAuth token, forge PAT, DB password). Ignore every variant, not just the
# exact name.
.env.bak*
*.env.bak*
deploy/compose/.env.*
# Local-only compose override. NOT for prod or the air-gapped install: it
# rebinds published ports to loopback, enables the login bypass, and points the
# runtime at MacBook-specific paths. docker-compose picks this file up
# automatically, so committing it would silently reconfigure anyone who runs
# deploy/compose.
# deploy/compose/docker-compose.override.yml is TRACKED as of 2026-09-18: it
# holds the fixes for the five local bring-up gaps and every credential in it is
# a ${VAR:?} reference into .env. It lived only on one laptop until then.