agentos LXC
Overview
| Property |
Value |
| Hostname |
agentos |
| IP Address |
192.168.0.71 (DHCP) |
| VMID |
113 |
| OS |
Debian GNU/Linux 12 (bookworm) |
| CPU |
2 cores |
| RAM |
4 GB |
| Disk |
20 GB (local-lvm) |
| Features |
nesting=1, keyctl=1 (Docker-in-LXC) |
| Purpose |
Background "agentic OS" layer - Hermes Agent + Odysseus |
Running Services
| Service |
Description |
| Hermes Agent (native) |
Background agent - cron, memory, Telegram gateway, delegate-to-claude-code skill |
| Odysseus (Docker Compose) |
Web workspace UI at /opt/odysseus, port 7000, reverse-proxied at https://agentos.lan |
| chromadb, searxng, ntfy |
Odysseus bundled sidecar services (loopback-only) |
Model Routing
- Nobara Ollama (
http://192.168.0.100:11434, model qwen3:8b) - primary, free, local
- DeepSeek API (
deepseek-v4-flash) - fallback when Nobara is off (fallback_providers in ~/.hermes/config.yaml)
- LXC 109 Claude Code (via the
delegate-to-claude-code skill and restricted SSH, /usr/local/bin/hermes-claude-code.sh) - deliberate delegation only, not part of the failover chain
Hermes config notes: model.provider: custom, model.context_length: 65536 and
model.ollama_num_ctx: 65536 (Hermes requires a 64K+ window; it passes num_ctx
to Ollama itself), agent.reasoning_effort: none (Ollama's qwen3 rejects
OpenAI-style think levels).
Security
- SSH key
hermes-to-109 (on this host) can only invoke the wrapper script on
LXC 109, only from this host's IP (from= lock in authorized_keys,
verified by attempting the connection from another host) - no interactive
shell, no other commands
- The wrapper caps task length, sanitizes and logs every invocation to
/var/log/hermes-delegate.log on LXC 109, and runs Claude Code with
scripts/hermes-delegate-settings.json plus --setting-sources "" (so the
interactive session's broad permissions never apply): no arbitrary shell
(only git add/commit/status/log/diff allowed; other commands fail closed
in headless mode), no network tools, file writes scoped to /root/homelab
- Telegram gateway uses DM-pairing - unknown senders get a pairing code, not a response
- Hermes dangerous-command approvals:
approvals.mode: manual, approvals.cron_mode: deny
Management
- Provisioned manually via
pct create on pve
- Komodo-integrated: native Periphery agent (systemd, reverse-connect as "LXC 113"); the
odysseus stack is registered in files_on_host mode (/opt/odysseus, docker-compose.yml) - status, logs, and redeploy from the Komodo UI, host resource alerts included
- Odysseus updates stay manual by design:
git pull in /opt/odysseus, then redeploy via Komodo (no auto-pull from the third-party upstream repo)
- Homepage tiles: Odysseus (site monitor) and Hermes (ping) in the Automation group
- Hermes updates via
hermes update
- Odysseus admin login: user
admin, password in Vaultwarden