Skip to content

Dev Environment (LXC 131)

Dedicated remote development LXC running code-server with Claude Code CLI and all MCP servers. Provides a browser-based VS Code experience with full Claude Code integration, accessible from anywhere.

Overview

Property Value
LXC ID 131
IP 192.168.1.131
Pool apps-pool (sde)
Disk 20G
Memory 4096MB
URL https://dev.eva-00.network
Auth PocketID OIDC via oauth2-proxy
Vault path secret/code-server-dev

Architecture

Browser (anywhere) -> dev.eva-00.network -> Caddy (105) -> oauth2-proxy (:4180) -> code-server (:8443)
VS Code Desktop    -> SSH [email protected] -> same filesystem
  • code-server runs in Docker (linuxserver image) for the web IDE
  • Claude Code CLI, MCP servers, and repos live on the LXC filesystem
  • The terminal in code-server runs on the LXC host, giving direct access to claude CLI

Access Methods

Browser (from anywhere)

  1. Navigate to https://dev.eva-00.network
  2. Authenticate via PocketID
  3. Open the terminal panel (`Ctrl+``)
  4. Run claude for a Claude Code session

VS Code Desktop (from home / VPN)

  1. SSH config on Mac:
    Host dev
      HostName 192.168.1.131
      User root
    
  2. VS Code: Remote-SSH -> Connect to dev
  3. Open /opt/code-server/workspace/ as workspace
  4. Use the integrated terminal for claude CLI

Folder Layout

/opt/
├── code-server/           # Docker service
│   ├── docker-compose.yml
│   ├── .env
│   ├── config/            # VS Code settings, extensions
│   └── workspace/         # Repos (mounted as /workspace in container)
│       ├── chizuru-v2/
│       ├── homelab-docs/
│       ├── homelab-notes/
│       └── .mcp.json
├── alloy/                 # Monitoring
└── mcp-servers/           # MCP server binaries
    ├── gitea-mcp          # Forgejo MCP (Go binary)
    ├── mcp-grafana        # Grafana MCP (Go binary)
    ├── proxmox-plus/      # Proxmox MCP (Python venv)
    └── mediabot-mcp/      # Mediabot MCP (Python venv)
/root/.claude/
└── settings.json          # Claude Code CLI config

MCP Servers

All 5 MCP servers run on the LXC, connecting to the same homelab services as the Mac setup:

Server Binary Config location
proxmox-plus /opt/mcp-servers/proxmox-plus/.venv/bin/python /root/.claude/settings.json
forgejo /opt/mcp-servers/gitea-mcp /root/.claude/settings.json + .mcp.json
grafana /opt/mcp-servers/mcp-grafana /root/.claude/settings.json + .mcp.json
karakeep npx @karakeep/mcp /root/.claude/settings.json + .mcp.json
mediabot /opt/mcp-servers/mediabot-mcp/run.sh /root/.claude/settings.json + .mcp.json

Tokens are injected by the Ansible playbook from Vault. The same tokens used on the Mac are reused here.

Repo Management

Repos are cloned into /opt/code-server/workspace/ from Forgejo. Git operations work normally:

cd /opt/code-server/workspace/chizuru-v2
git pull
# ... make changes ...
git add -A && git commit -m "message"
git push

Repos are configured with the claude bot account for push access.

To add a new repo:

cd /opt/code-server/workspace
git clone https://claude:<token>@git.eva-00.network/holo/<repo>.git
cd <repo>
git config user.name "claude"
git config user.email "[email protected]"

IaC

File Purpose
ansible/playbooks/dev.yml Main deployment playbook
ansible/playbooks/create-lxc.yml -e target_lxc=dev LXC creation
.forgejo/workflows/dev.yml CI/CD workflow
services/code-server-dev/docker-compose.yml Docker compose
ansible/inventory/hosts.yml (dev entry) LXC parameters

Backup

  • LXC rootfs backed up weekly via PBS (non-critical job)
  • Repos are in Forgejo — git push is the primary sync mechanism
  • VS Code config (/opt/code-server/config/) and Claude memory (/root/.claude/) backed up with rootfs
  • Full rebuild from scratch: create-lxc.yml + dev.yml (repos need re-clone or PBS restore)