LXC Containers
Five Ubuntu 24.04 LXC containers, each assigned to a developer with their own Claude Code instance, tmux session, and Docker support.
Container Inventory
| Container | Developer | SSH Alias | Port | Internal IP | DNS | Web Terminal |
|---|---|---|---|---|---|---|
| chasclaude | Chas (primary) | ssh chasclaude |
2211 | 10.0.3.11 | chas.ipnoelp.io | term.ipnoelp.io/chasclaude/ |
| infoclaude | Chas (secondary) | ssh infoclaude |
2212 | 10.0.3.12 | info.ipnoelp.io | term.ipnoelp.io/infoclaude/ |
| seanclaude | Sean | ssh seanclaude |
2213 | 10.0.3.13 | (direct IP) | term.ipnoelp.io/seanclaude/ |
| jazclaude | Jaz | ssh jazclaude |
2214 | 10.0.3.14 | jaz.ipnoelp.io | term.ipnoelp.io/jazclaude/ |
| managerclaude | Shared | ssh managerclaude |
2215 | 10.0.3.15 | mgr.ipnoelp.io | term.ipnoelp.io/managerclaude/ |
Standard Toolchain (all containers)
| Category | Software |
|---|---|
| OS | Ubuntu 24.04 LTS |
| Runtime | Node.js 22, Python 3.12 |
| Containers | Docker 29.2.1 (via LXC nesting) |
| AI | Claude Code (latest) |
| Terminal | tmux 3.4, mosh |
| Version Control | git, gh (GitHub CLI) |
| Shell | bash with color-coded tmux status bar |
Claude Code Skills (13 total)
Located in ~/.claude/commands/ on each container. Source: OmelasAI/claude-skills.
| Category | Skills |
|---|---|
| Session | /start, /pause, /end |
| Git | /status, /commit, /push, /pull, /branch |
| Operations | /incident, /deploy, /sync |
| Documentation | /audit |
| Setup | /new-project |
Container Configuration
LXC Storage
Containers are stored on NVMe at /data/lxc/ (configured via /etc/lxc/lxc.conf).
Networking
- Bridge:
lxcbr0(10.0.3.0/24) - Gateway: 10.0.3.1 (host)
- DHCP: dnsmasq on bridge
- NAT: iptables MASQUERADE for internet access
- Port forwarding: DNAT rules in
/etc/rc.local
Docker-in-LXC
Each container has LXC nesting enabled:
- AppArmor: unconfined
- cgroup mounts: passed through
- Allows running Docker containers inside LXC containers
Login Gateway
Each container has .login-gateway.sh providing a color-coded banner and menu:
[1]Launch Claude Code[2]Drop to terminal[q]Disconnect
Color-Coded tmux
Each machine has a unique tmux status bar color for visual identification:
| Machine | Color |
|---|---|
| chasclaude | Cyan |
| infoclaude | Green |
| seanclaude | Yellow |
| jazclaude | Magenta |
| managerclaude | White |
| laptop | Blue |
| ser8 | Orange |
Claude Net MCP
Each container has Claude Net MCP configured with direct HTTP to 10.0.3.1:3500 (the hub on the host). This enables inter-instance messaging without SSH tunneling.
Session Logging
tmux sessions are logged to /var/log/claude-sessions/ for audit and recovery.
Access Methods
SSH (primary)
ssh chasclaude # Uses DNS hostname + port from ~/.ssh/config
ssh infoclaude
ssh seanclaude
ssh jazclaude
ssh managerclaude
Mosh (mobile-friendly)
mosh chasclaude # UDP-based, handles network changes gracefully
Each container has 10 Mosh UDP ports allocated (60011-60060 range).
Web Terminal (browser-based)
Via https://term.ipnoelp.io — authenticated by Cloudflare Access (Google OAuth, @omelasai.com). See the Web Terminals page for details.
Admin access (from host)
ssh ovh5 "sudo lxc-attach -n chasclaude -- <command>"
Use lxc-attach for admin tasks rather than SSH to individual containers.
Auto-Approve Permissions
All containers have these Claude Code permissions pre-configured:
Bash(*)— Shell commandsRead(*)— File readingEdit(*)— File editingWrite(*)— File writingGlob(*)— File pattern matchingGrep(*)— Content searching