@@ -123,8 +123,8 @@ ODEK_SUPPRESS_SANDBOX_WARNING=1
123123# ODEK_MODEL=gpt-4o
124124# ODEK_BASE_URL=https://api.openai.com/v1
125125
126- # Anthropic:
127- # ODEK_MODEL=claude-opus -4-1
126+ # Anthropic (OpenAI-compatible endpoint; matches the claude-sonnet-4 profile) :
127+ # ODEK_MODEL=claude-sonnet -4-5
128128# ODEK_BASE_URL=https://api.anthropic.com/v1
129129```
130130
@@ -196,8 +196,10 @@ configurable.
196196```
197197
198198> ⚠️ ** Godmode gives the agent free rein inside the container.** Only use it with a
199- > throwaway container, ideally with ` network_mode: none ` (see below) or a restricted
200- > network, and never mount sensitive host paths or the Docker socket.
199+ > throwaway container, never mount sensitive host paths or the Docker socket, and keep
200+ > the only writable mount scoped to ` ./workspace ` . (The container still needs outbound
201+ > network to reach the LLM API — see the notes under §6 — so isolation comes from the
202+ > container boundary, not from cutting the network.)
201203
202204---
203205
@@ -224,14 +226,14 @@ services:
224226 - ./config.restricted.json:/home/odek/.odek/config.json:ro
225227 restart : " no"
226228
227- # ── Godmode (all permissions) — non-interactive, sealed container ──
229+ # ── Godmode (all permissions) — non-interactive, disposable container ──
228230 odek-godmode :
229231 profiles : ["godmode"]
230232 build : .
231233 image : odek:local
232234 env_file : .env
233- # No published ports. No network unless you need it (see notes).
234- network_mode : " none "
235+ # No published ports (no inbound needed). Outbound networking stays on —
236+ # Odek must reach the LLM provider API to run.
235237 command : ["serve", "--addr", "0.0.0.0:8080", "--no-sandbox"]
236238 volumes :
237239 - ./workspace:/workspace
@@ -248,8 +250,11 @@ Notes:
248250- The Web UI binds to `0.0.0.0:8080` *inside* the container; the `ports` mapping exposes
249251 it only on the host's `127.0.0.1`. Use a reverse proxy (Caddy/nginx) if you need remote
250252 access.
251- - The Godmode service has `network_mode : " none" ` so the agent cannot reach the network.
252- Remove that line (or set a restricted network) if the task genuinely needs egress.
253+ - **Don't use `network_mode: "none"`.** Odek calls the LLM provider over the network every
254+ turn, so a no‑network container can't run at all. The container's isolation comes from
255+ the boundary itself, the non‑root user, and mounting only `./workspace`. To restrict the
256+ *agent's own* egress while still letting Odek reach the model, put it on a network behind
257+ an allowlisting egress proxy (advanced — out of scope here).
253258
254259---
255260
@@ -301,7 +306,7 @@ docker compose run --rm -it \
301306
302307# # 8. Running — Godmode (all permissions)
303308
304- No prompts, no human in the loop. Best for sealed, disposable containers.
309+ No prompts, no human in the loop. Best for disposable containers.
305310
306311# ## One‑shot task
307312
@@ -315,9 +320,10 @@ docker compose --profile godmode run --rm odek-godmode \
315320The trailing `run "<task>"` overrides the service's default `command:` (`serve`). No
316321` --no-sandbox` is needed — `run` is unsandboxed by default.
317322
318- Every command the agent issues runs immediately. Because `network_mode : " none" ` is set,
319- nothing can leave the container; everything is confined to ` ./workspace` on your host (the
320- only writable mount) and the container's ephemeral filesystem.
323+ Every command the agent issues runs immediately. The blast radius is the container : the
324+ only writable host mount is `./workspace`, everything else is the container's ephemeral
325+ filesystem, and it runs as a non‑root user. (The container does have outbound network —
326+ Odek needs it to reach the LLM — so this is isolation by *boundary*, not by airgap.)
321327
322328# ## Long‑running / Web UI
323329
@@ -327,9 +333,9 @@ If you want the Web UI in Godmode too (e.g. a personal automation box):
327333docker compose --profile godmode up --build
328334` ` `
329335
330- Then add a port mapping to the `odek-godmode` service and remove `network_mode : none` if
331- the agent needs the network. **Only do this on a trusted host** — in Godmode the UI grants
332- unrestricted command execution inside the container.
336+ Then add a `ports:` mapping to the `odek-godmode` service so you can reach the UI. **Only
337+ do this on a trusted host** — in Godmode the UI grants unrestricted command execution
338+ inside the container.
333339
334340---
335341
@@ -387,7 +393,9 @@ global `action` → built‑in defaults. The `blocked` class is always denied re
387393 SSH keys, cloud credentials, or `/var/run/docker.sock`.
388394- ✅ Keep the Web UI bound to `127.0.0.1` on the host; front it with an authenticated
389395 reverse proxy for any remote access.
390- - ✅ Prefer `network_mode : " none" ` (or a tightly scoped network) — especially for Godmode.
396+ - ✅ Remember the container needs **outbound** network for the LLM API, so `network_mode :
397+ none` isn't an option. To fence the agent's *own* egress, use a firewalled network or an
398+ allowlisting egress proxy rather than relying on Docker's network mode.
391399- ✅ Treat **Godmode containers as disposable** : ` --rm` , no persistent secrets beyond the
392400 injected API key, throwaway `workspace/`.
393401- ✅ Keep `.env` out of version control.
@@ -462,7 +470,7 @@ restarts. No `ports` are needed.
462470 - odek-tg-state:/home/odek/.odek
463471 restart: unless-stopped
464472
465- # ── Telegram bot — Godmode (no prompts; sealed container) ──
473+ # ── Telegram bot — Godmode (no prompts; disposable container) ──
466474 odek-telegram-godmode:
467475 profiles: ["telegram-godmode"]
468476 build: .
@@ -498,7 +506,7 @@ Message your bot: `/start`, then try a task. When the agent hits a `prompt`‑cl
498506you'll get an inline keyboard — tap **Approve**, **Deny**, or **Trust** (trust = allow that
499507risk class for the rest of the session).
500508
501- **Godmode** (no prompts — only on a trusted host, ideally with restricted egress ):
509+ **Godmode** (no prompts — only on a trusted host):
502510
503511` ` ` bash
504512docker compose --profile telegram-godmode up --build -d
0 commit comments