{"slug": "vibebin-code-and-host-with-incus-containers-on-your-vps-server", "title": "Vibebin – code and host with incus containers on your VPS/server", "summary": "Vibebin, a new Incus/LXC-based platform for self-hosting persistent AI coding agent sandboxes, has been released, enabling users to create and host vibe-coded apps on a single VPS or server. The platform, which is 99.9% vibe-coded on the exe.dev platform using Shelley Web AI Coding Agent and Claude Opus 4.5, includes Caddy reverse proxy, direct SSH routing, and pre-installed AI coding tools such as opencode, nanocode, claude-code, and shelley. It supports Ubuntu 24.04 LTS and Debian 13 containers and is designed for efficient operation on KVM, VMware, Xen, Hyper-V, and other hypervisors.", "body_md": "An Incus/LXC-based platform for self-hosting persistent AI coding agent sandboxes with Caddy reverse proxy and direct SSH routing to containers (suitable for VS Code remote ssh).\n\nCreate and host your vibe-coded apps on a single VPS/server.\n\n**Vibebin TUI Manager** - Container detail view with quick actions:\n\n**AI Tools Admin Web App** - Toggle AI coding tools on/off:\n\n**AI Tools Admin Web App** - One-click update for all tools:\n\nThis project is 99.9% vibe-coded on the [exe.dev](https://exe.dev/i/rlWM5HS3J26ONAE) platform using their Shelley Web AI Coding Agent and Claude Opus 4.5.\nTake that as you will.\n*Note* that the above exe.dev URL is a referral link for a free 30 day trial if you register. If you convert to a paid plan, both you and I will receive a one-time $50 in extra Shelley credits.\n\nWith that said, I am a huge proponent of the exe.dev platform, and if you can, you should definitely try it out and use their service. The love and care for that project/service is extremely evident... AND it is incredibly awesome (and I think it's in its infancy stages, so should only get better).\n\nThis is a very new project. Feel free to test and experiment but it's likely to have bugs and may not be ready for production. Use at your own risk.\n\nThis project provides the infrastructure to self-host your own AI coding environment on virtually any Linux server -- a VPS, cloud VM (EC2, GCP, Azure), or dedicated hardware. Because it uses **Incus/LXC** (container-based virtualization rather than nested VMs), it runs efficiently on KVM, VMware, Xen, Hyper-V, and most other hypervisors.\n\nEach container is a fully persistent Linux sandbox running **Ubuntu 24.04 LTS (Noble)** or **Debian 13 (Trixie)**, with:\n\n,[opencode](https://github.com/anomalyco/opencode),[nanocode](https://github.com/nanogpt-community/nanocode), and[Claude Code](https://github.com/anthropics/claude-code)- AI coding agents with terminal and web UI interfaces[Shelley](https://github.com/boldsoftware/shelley)**AI coding web UI** accessible via HTTPS at`code.yourdomain.com`\n\n(Basic Auth protected)**AI Tools Admin** web app at`admin.code.yourdomain.com`\n\nfor managing AI coding tools**Your app/site** accessible via HTTPS at`yourdomain.com`\n\n**SSH access** for direct terminal access to your sandbox (VS Code Remote SSH compatible)**Persistent filesystem** that survives container restarts**Pre-installed development tools**: Docker, Go, Node.js, Bun, Deno, uv\n\n**AI-assisted development**: Use opencode/nanocode/claude-code/shelley as your AI pair programmer with full system access** Vibe coding**: Spin up isolated sandboxes for experimental projects** App/site hosting**: Deploy and iterate on web applications** Learning environments**: Safe, isolated Linux environments for experimentation** CI/CD sandboxes**: Temporary or persistent build environments\n\n| Component | Purpose |\n|---|---|\nIncus (LXC) |\nContainer runtime - lightweight, persistent Linux containers |\nCaddy |\nReverse proxy with automatic HTTPS (Let's Encrypt) |\nSSHPiper |\nSSH routing - access any container via `ssh -p 2222 container-name@host` |\nSQLite |\nLocal database for container metadata (`/var/lib/vibebin/containers.db` ) |\nUbuntu/Debian |\nNative Incus images (user choice during creation) |\nopencode |\nOpen source AI coding agent with terminal and web UI |\nnanocode |\nNanoGPT-powered AI coding agent (fork of opencode) |\nshelley |\nAI coding web agent from Bold Software |\nclaude-code |\nAnthropic's CLI coding agent |\n\nThis project installs **opencode**, **nanocode**, **claude-code**, and **shelley** in each container:\n\n[OpenCode](https://github.com/anomalyco/opencode) is a 100% open source AI coding agent that works with multiple LLM providers:\n\n- Anthropic (Claude)\n- OpenAI (GPT)\n- Google (Gemini)\n- OpenCode Zen\n- Local models via custom endpoints\n\n[NanoCode](https://github.com/nanogpt-community/nanocode) is a fork of OpenCode configured to work with [NanoGPT](https://nano-gpt.com/subscription/hGfwRWc9) as the default provider. It includes:\n\n- Automatic model loading from NanoGPT API\n- Built-in NanoGPT MCP server\n- Interleaved thinking for reasoning models\n\n[NanoGPT subscription](https://nano-gpt.com/subscription/hGfwRWc9) is $8/month for 60,000 requests across all open models - an excellent value that works great with NanoCode.\n\n**Note:** The nanocode web UI requires LLM configuration before it will work. SSH into the container and run `nanocode`\n\n(CLI mode) first to configure your LLM provider/API keys.\n\nDisclosure: The NanoGPT link is an affiliate link.\n\n[Claude Code](https://github.com/anthropics/claude-code) is Anthropic's official CLI coding agent:\n\n- CLI only (no web UI)\n- Requires Anthropic API key (\n`ANTHROPIC_API_KEY`\n\nenvironment variable) - Supports Claude models with agentic coding capabilities\n- Run with\n`claude`\n\ncommand in terminal\n\n**Note:** Claude Code is CLI-only and is not managed via the admin.code web UI. Use it directly in the terminal.\n\n[Shelley](https://github.com/boldsoftware/shelley) is a powerful AI web agent from Bold Software:\n\n- Web-based UI only (no CLI mode)\n- Support for multiple LLM providers via environment variables (Anthropic, OpenAI, Gemini, Fireworks)\n- Custom model configuration available within the web UI\n- Ctrl/Cmd-K to start a new conversation or add custom models\n- Runs on port 9999 like the other AI tools\n\n**Note:** Before starting Shelley, add your API keys to `~/.shelley_env`\n\n. Custom models can be configured in Shelley's web UI, but doing so switches to \"custom model mode\" and the env var models will no longer be shown.\n\nAll AI Coding tools support terminal/web UI modes with the exception of Shelley (web UI only) and Claude Code (CLI only). OpenCode, NanoCode, and Shelley support configuring LLM providers from within their web UIs.\n\nThrough the webUIs on OpenCode/NanoCode, adding NanoGPT as the provider is seamless! With Shelley, you just need to add a custom model and set it up with the same concept as shown [here](https://docs.nano-gpt.com/integrations/openhands). See the NanoGPT [integrations](https://docs.nano-gpt.com/integrations/claude-code) page for setting up NanoGPT with various coding agents.\n\n`vibebin`\n\n- Interactive TUI for container management`vibebin_sync_daemon`\n\n- Background service for config synchronization (auto-heals Caddy routes on restart)`containers.db`\n\n- SQLite database storing container metadata (at`/var/lib/vibebin/containers.db`\n\n)\n\n**Fresh/minimal Linux installation**: Ubuntu 22.04+ or Debian 12+ (amd64 or arm64)** VPS or VM**: Works on most virtualization platforms (KVM, VMware, Xen, EC2, GCP, Azure, etc.)** Memory**: Minimum 4GB RAM; 8GB+ recommended for best performance** Disk**: Minimum 70GB; 100GB+ recommended for multiple containers and project data** Go 1.21+**: Required to build the tools (see Quick Start for installation)** A domain name**with DNS you control** A regular user with sudo access**(avoid running as root)\n\nAny KVM-based VPS will work well with vibebin. Here are some recommended options:\n\n**HostBRR** - Budget-friendly with excellent performance:\n\n[HostBRR Epyc Turin VPS](https://my.hostbrr.com/order/main/packages/BF2025/?group_id=74&a=MTA4OTY=)- AMD Epyc Turin processors, great price/performance[HostBRR Threadripper Performance VPS](https://my.hostbrr.com/order/main/packages/BF2025/?group_id=72&a=MTA4OTY=)- High-performance Threadripper line\n\n**Netcup** - German provider with reliable infrastructure:\n\n[Netcup VPS](https://www.netcup.com/en/?ref=75646)- Recommend RS1000 (8GB RAM) or RS2000 (16GB RAM) for vibebin workloads\n\n**OVHcloud** - Large European provider with competitive pricing:\n\n[OVHcloud VPS](https://www.ovhcloud.com/en/vps/vps-8gb/)- Recommend 8GB or 12GB VPS; larger options (24GB, 48GB) available at excellent prices if needed\n\n**Oracle Cloud Infrastructure (OCI)** - Free tier available:\n\n[OCI Always Free Resources](https://docs.oracle.com/en-us/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm)- Includes free ARM-based VMs (up to 4 OCPUs, 24GB RAM) that work well with vibebin\n\nDisclosure: The HostBRR and Netcup links above are affiliate links.\n\nComplete these security steps **before** installing vibebin.\n\nEnsure your host SSH is properly secured in `/etc/ssh/sshd_config`\n\n:\n\n```\nPermitRootLogin no\nPasswordAuthentication no\n```\n\nRestart SSH after changes: `sudo systemctl restart sshd`\n\nIf you want to use UFW firewall, install and configure it with the required rules:\n\n```\n# Install UFW\nsudo apt update && sudo apt install -y ufw\n\n# Allow required ports (SSH must be allowed before enabling!)\nsudo ufw allow 22/tcp      # Host SSH\nsudo ufw allow 80/tcp      # HTTP (Caddy)\nsudo ufw allow 443/tcp     # HTTPS (Caddy)\nsudo ufw allow 2222/tcp    # SSHPiper (container SSH)\n\n# Enable UFW\nsudo ufw enable\nsudo systemctl enable ufw\n```\n\nAfter the first vibebin run (which installs Incus), add the bridge rules for container networking:\n\n```\n# Allow Incus bridge traffic (run after vibebin installs Incus)\nsudo ufw allow in on incusbr0\nsudo ufw route allow in on incusbr0\nsudo ufw route allow out on incusbr0\n```\n\nNote:UFW is enabled at boot automatically after`ufw enable`\n\n. Verify status with`sudo ufw status verbose`\n\n.\n\nFor additional protection against brute-force attacks, you can install fail2ban. By default, fail2ban protects the host SSH daemon (sshd). The [docs/fail2ban.md](/jgbrwn/vibebin/blob/main/docs/fail2ban.md) guide extends this with Caddy and SSHPiper protection.\n\nNote:Install fail2banafterthe initial vibebin run so that Caddy and SSHPiper are already in place.\n\nAll administrative tasks should be performed as a regular user with `sudo`\n\nprivileges, not as root directly.\n\n```\n# Install essential tools\nsudo apt update && sudo apt install -y wget curl git jq htop tmux\n\n# Ubuntu/Debian - install from official Go downloads\nwget https://go.dev/dl/go1.23.5.linux-amd64.tar.gz\nsudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.23.5.linux-amd64.tar.gz\necho 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc\nsource ~/.bashrc\n\n# Verify installation\ngo version\n```\n\nNote: For ARM64 systems, use`go1.23.5.linux-arm64.tar.gz`\n\ninstead. Check[https://go.dev/dl/]for the latest version.\n\nUse the install script for a one-liner install or upgrade:\n\n```\ncurl -fsSL https://raw.githubusercontent.com/jgbrwn/vibebin/main/install-upgrade.sh | bash\n```\n\nThe script automatically:\n\n- Clones and builds the project\n- Installs binaries to\n`/usr/local/bin/`\n\n- Detects fresh install vs upgrade\n- Handles the\n`vibebin-sync`\n\nservice accordingly\n\nIf you prefer to build manually:\n\n```\n# Clone and build\ngit clone https://github.com/jgbrwn/vibebin.git\ncd vibebin\ngo build -o vibebin vibebin.go\ngo build -o vibebin_sync_daemon vibebin_sync_daemon.go\n\n# Install binaries\nsudo cp vibebin vibebin_sync_daemon /usr/local/bin/\n# This auto-installs Incus, Caddy, and SSHPiper\nsudo vibebin\n```\n\nSee the [SSHPiper Manual Setup](#%EF%B8%8F-required-sshpiper-manual-setup-after-first-run) section below.\n\n```\nsudo vibebin\n```\n\nThe creation wizard will guide you through:\n\n- Enter domain name\n- Select base image (Ubuntu or Debian)\n- Configure DNS (optional auto-creation via Cloudflare/deSEC)\n- Set app port\n- Provide SSH public key\n- Set basic auth credentials for web UI protection\n\nThe first run automatically installs:\n\n**Incus 6.20+** from Zabbly stable repository**Caddy** web server with automatic HTTPS**SSHPiper** SSH routing proxy\n\nDuring container creation, the following is automatically installed:\n\n**Development Tools:**\n\n**Docker**(via official get.docker.com script)** Go**(latest version, architecture auto-detected)** Node.js**(latest LTS via NodeSource)** Bun**(JavaScript runtime and package manager)** Deno**(JavaScript/TypeScript runtime)** uv**(Python package manager from Astral)** GitHub CLI**(`gh`\n\n) for GitHub operations**Build tools**(build-essential, make, etc.)\n\n**AI Coding Agents:**\n\n**opencode**(open source AI coding agent)** nanocode**(NanoGPT-powered AI coding agent)** claude-code**(Anthropic's CLI coding agent)** shelley**(AI web agent from Bold Software)\n\n**System Utilities:**\n\n**Editors**: neovim, mc (Midnight Commander)** Terminal multiplexers**: screen, tmux, byobu** Monitoring**: htop, atop, btop, iotop, ncdu** Networking**: dnsutils, net-tools, socat, lftp, ncftp** Search**: ripgrep, sqlite3** Media**: imagemagick, ffmpeg** Fonts**: emoji support (fonts-noto-color-emoji, fonts-symbola)- And many more development and debugging utilities\n\n**Configuration:**\n\n**Project directory**(`~/projects`\n\nfor AI coding tool workspaces)**Custom MOTD**(shows container info, URLs, and tool versions on SSH login)** Passwordless sudo**for the container user** Ping without sudo**(CAP_NET_RAW capability)\n\n**Before creating containers**, verify SSHPiper is running:\n\n```\n# Check SSHPiper status (should be active)\nsudo systemctl status sshpiperd\n\n# If not running, start it\nsudo systemctl enable --now sshpiperd\n```\n\nSSHPiper listens on **port 2222** for container SSH access. Host SSH remains on port 22.\n\n```\nsudo vibebin\n```\n\n**List View:**\n\n`n`\n\n- Create new container`Enter`\n\n- View container details`d`\n\n- Delete container`u`\n\n- Show untracked containers (import existing)`D`\n\n- Manage DNS API tokens (Cloudflare/deSEC)`i`\n\n- View Incus logs`l`\n\n- View sync daemon logs`q`\n\n- Quit\n\n**Detail View:**\n\n`s`\n\n- Start/Stop container`r`\n\n- Restart container`p`\n\n- Change app port`a`\n\n- Change auth credentials`S`\n\n- Snapshot management`u`\n\n- Update AI coding tools (opencode/nanocode/claude-code/shelley)`Esc`\n\n- Back to list\n\n**Snapshot View:**\n\n`n`\n\n- Create new snapshot`Enter/r`\n\n- Restore selected snapshot`d`\n\n- Delete selected snapshot`↑/↓`\n\nor`j/k`\n\n- Navigate snapshots`Esc`\n\n- Back to container details\n\n**Native Incus Images**: Choose Ubuntu 24.04 LTS or Debian 13** Persistent Sandboxes**: Full filesystem persistence across restarts** Boot Behavior**: Containers respect their last state on host reboot** Resource Monitoring**: Live CPU and memory usage in TUI** Untracked Import**: Detect and adopt existing Incus containers** Snapshots**: Create, restore, and delete container snapshots\n\n**Automatic HTTPS**: Caddy handles Let's Encrypt certificates** Reverse Proxy**: Each container gets`https://domain.com`\n\n→ Container's app (port 8000, configurable)**SSH Routing**: SSHPiper on port 2222 enables`ssh -p 2222 container-name@host`\n\naccess**Auto DNS**: Cloudflare and deSEC API integration (tokens saved securely for reuse)\n\n**opencode**: Open source, supports multiple LLM providers** nanocode**: NanoGPT-optimized fork with built-in features** claude-code**: Anthropic's official CLI agent (CLI only)** shelley**: AI web agent with full coding capabilities** Easy Configuration**: All tools prompt for API keys on first run** Web UI Access**: Start opencode, nanocode, or shelley in serve mode on port 9999\n\nAfter creating a container, SSH in and run any of the tools. A project directory is pre-created at `~/projects`\n\nfor your coding workspaces.\n\n```\n# SSH to your container\nssh -p 2222 container-name@host.example.com\n\n# cd to projects directory first\ncd ~/projects\n\n# Run opencode\nopencode\n\n# Or run nanocode\nnanocode\n\n# Or run claude-code\nclaude\n```\n\nAll tools will prompt you to configure your LLM provider and API key on first run. Note that Shelley is web-only (no CLI mode) and Claude Code is CLI-only (no web UI).\n\nTo access the AI coding agent via web browser:\n\n```\n# SSH to your container\nssh -p 2222 container-name@host.example.com\n```\n\n**opencode** (cd to project directory first):\n\n```\ncd ~/projects\nscreen -S code\nopencode serve --port 9999 --hostname 0.0.0.0\n```\n\n**nanocode** (cd to project directory first):\n\n```\ncd ~/projects\nscreen -S code\nnanocode serve --port 9999 --hostname 0.0.0.0\n```\n\nNote:nanocode web UI requires LLM configuration first. Run`nanocode`\n\n(CLI) to configure your provider/API keys before starting the web UI.\n\n**shelley** (web UI only - no CLI mode):\n\n```\ncd ~/projects\nscreen -S code\nstart-shelley.sh 2>&1 | tee -a ~/.shelley.log\n```\n\nNote:Before starting Shelley, add your API keys to`~/.shelley_env`\n\n. Custom models can be configured in Shelley's web UI, but doing so switches to \"custom model mode\" and the env var models will no longer be shown.\n\nThen access via `https://code.yourdomain.com`\n\n(protected by Basic Auth credentials you set during container creation).\n\nPress `Ctrl+A, D`\n\nto detach from screen. Reattach with `screen -x code`\n\n.\n\nNote: Only one web UI can run on port 9999 at a time. Stop the current one before starting another.\n\nEach container includes an **AI Tools Admin** web app accessible at `https://admin.code.yourdomain.com`\n\n. This provides:\n\n**MANAGE View:**\n\n- Toggle AI coding tools (OpenCode, NanoCode, Shelley) on/off\n- Only one tool can run at a time on port 9999\n- View real-time output logs\n- Links to App URL and Code UI\n- DNS health check indicators\n\n**UPDATE View:**\n\n- One-click update for all three AI tools\n- Automatically stops running processes before updating\n- Shows live progress of updates\n\nThe admin app runs as a systemd service (`admin-app`\n\n) and is protected by the same Basic Auth credentials as the Code UI.\n\nNote: For Shelley, ensure your API keys are configured in`~/.shelley_env`\n\nbefore starting.\n\nFrom the container detail view in the TUI, press `u`\n\nto update opencode, nanocode, claude-code, and shelley to their latest versions.\n\n```\nssh -p 2222 container-name@host.example.com\n# You'll be logged in as 'ubuntu' (or 'debian') with sudo access\nssh user@host.example.com\n```\n\nFor HTTPS to work, DNS must point to the host server:\n\n`domain.com`\n\n→ Host IP`code.domain.com`\n\n→ Host IP (for AI coding web UI)`admin.code.domain.com`\n\n→ Host IP (for AI tools admin app)\n\nCaddy will automatically obtain Let's Encrypt certificates for both domains.\n\n```\n                              Internet\n                                 │\n                    ┌────────────┴────────────┐\n                    │                         │\n                    ▼                         ▼\n              HTTPS (:443)         SSH (:2222 via SSHPiper)\n                    │                         │\n┌───────────────────▼─────────────────────▼─────────────────┐\n│                         Host System                          │\n├─────────────────────────────────────────────────────────────┤\n│                                                               │\n│  ┌─────────────┐           ┌─────────────┐                    │\n│  │    Caddy    │           │  SSHPiper   │                    │\n│  │  (reverse   │           │  (SSH       │                    │\n│  │   proxy)    │           │   router)   │                    │\n│  └──────┬──────┘           └──────┬──────┘                    │\n│         │                         │                           │\n│         │    Routes by domain     │    Routes by username     │\n│         ▼                         ▼                           │\n│  ┌─────────────────────────────────────────────────────┐     │\n│  │                    Incus (LXC)                       │     │\n│  │                                                      │     │\n│  │  ┌─────────────────┐  ┌─────────────────┐              │     │\n│  │  │ Container      │  │ Container      │    ...       │     │\n│  │  │ (Ubuntu/Debian)│  │ (Ubuntu/Debian)│              │     │\n│  │  │                │  │                │              │     │\n│  │  │  ┌───────────┐ │  │  ┌───────────┐ │              │     │\n│  │  │  │ AI Coding │ │  │  │ AI Coding │ │              │     │\n│  │  │  │ Tool UI   │ │  │  │ Tool UI   │ │              │     │\n│  │  │  │  (:9999)  │ │  │  │  (:9999)  │ │              │     │\n│  │  │  └───────────┘ │  │  └───────────┘ │              │     │\n│  │  │  ┌───────────┐ │  │  ┌───────────┐ │              │     │\n│  │  │  │admin.code │ │  │  │admin.code │ │              │     │\n│  │  │  │  (:8099)  │ │  │  │  (:8099)  │ │              │     │\n│  │  │  └───────────┘ │  │  └───────────┘ │              │     │\n│  │  │  ┌───────────┐ │  │  ┌───────────┐ │              │     │\n│  │  │  │ Your App  │ │  │  │ Your App  │ │              │     │\n│  │  │  │  (:8000)  │ │  │  │  (:8000)  │ │              │     │\n│  │  │  └───────────┘ │  │  └───────────┘ │              │     │\n│  │  └─────────────────┘  └─────────────────┘              │     │\n│  └─────────────────────────────────────────────────────┘     │\n│                                                               │\n│  ┌───────────────────┐                                        │\n│  │  vibebin        │  TUI for container management            │\n│  │  (this tool)     │  - Create/delete containers              │\n│  │                  │  - Configure domains & auth              │\n│  └───────────────────┘                                         │\n│                                                               │\n└─────────────────────────────────────────────────────────────┘\n```\n\n**HTTPS requests** to`myapp.example.com`\n\n→ Caddy → Container's app (port 8000)**HTTPS requests** to`code.myapp.example.com`\n\n→ Caddy (with Basic Auth) → AI coding web UI (port 9999)**SSH connections** to port 2222 as`myapp-example-com@host`\n\n→ SSHPiper → Container's SSH as`ubuntu`\n\n/`debian`\n\nRoutes are managed via Caddy's Admin API (localhost:2019), not config files:\n\n- Routes use\n`@id`\n\nfor identification (e.g.,`container-name-app`\n\n,`container-name-code`\n\n) - Changes are atomic and immediate (no reload required)\n**Self-healing**: The`vibebin-sync`\n\nservice monitors Caddy routes and automatically restores them if the server restarts, Caddy restarts, or routes are otherwise modified/removed- Query current routes:\n`curl http://localhost:2019/config/apps/http/servers/srv0/routes`\n\nContainers use Incus's default \"last-state\" behavior (by not setting `boot.autostart`\n\n):\n\n- Running containers will restart when the host reboots\n- Stopped containers will stay stopped\n\nIncus automatically tracks each container's power state and restores it when the daemon starts.\n\nSnapshots allow you to save and restore the complete state of a container.\n\nFrom the container detail view, press `S`\n\nto access snapshot management, then `n`\n\nto create.\n\n**Before risky changes**: Snapshot before major updates or experiments** Known-good states**: Save working configurations you can restore to** Quick rollback**: Instantly revert if something breaks\n\nNote: Snapshots are stored by Incus and consume disk space. Delete old snapshots to free space.\n\n**Container won't start:**\n\n```\njournalctl -u incus -f\nincus info container-name\n```\n\n**Caddy certificate errors:**\n\n- Ensure DNS is configured and pointing to host IP before creating container\n- Check Caddy logs:\n`journalctl -u caddy -f`\n\n- Check current routes:\n`curl -s http://localhost:2019/config/apps/http/servers/srv0/routes | jq .`\n\n**SSH to containers not working:**\n\n- Verify SSHPiper is running:\n`systemctl status sshpiperd`\n\n- Ensure you're using port 2222:\n`ssh -p 2222 container-name@host`\n\n- Verify upstream config:\n`cat /var/lib/sshpiper/container-name/sshpiper_upstream`\n\n**AI coding tools not working:**\n\n- SSH to the container and run\n`opencode`\n\n,`nanocode`\n\n, or`claude`\n\ninteractively, or`start-shelley.sh`\n\nfor Shelley web UI - All tools will prompt for API key configuration on first run\n- Check tool versions:\n`opencode --version`\n\n,`nanocode --version`\n\n,`claude --version`\n\n,`shelley version`\n\n**Sync daemon issues:**\n\n```\njournalctl -u vibebin-sync -f\n```\n\nYou can use subdomains for your containers:\n\n`app.example.com`\n\n- works correctly`staging.app.example.com`\n\n- works correctly`my-app.example.com`\n\n- works correctly\n\nDomains with two-part TLDs (like `.co.uk`\n\n, `.com.au`\n\n) are **not fully supported**\nfor automatic DNS creation. The zone detection assumes a single-part TLD.\n\nFor example:\n\n- ✅\n`app.example.com`\n\n→ zone:`example.com`\n\n(correct) - ❌\n`app.example.co.uk`\n\n→ zone:`co.uk`\n\n(incorrect, should be`example.co.uk`\n\n)\n\n**Workaround**: For two-part TLDs, select \"No\" for auto DNS creation and\nconfigure DNS records manually.\n\nEach container created by vibebin is fully isolated by default:\n\n- Each container has its own complete, persistent filesystem (Ubuntu 24.04 or Debian 13)\n- Containers cannot access each other's filesystems\n- Uses Incus/LXC which provides OS-level virtualization with separate root filesystems\n- Data persists across container restarts\n\n- Each container gets its own private IP on an internal bridge network (typically\n`10.x.x.x`\n\n) - Containers can communicate with each other by default as they are on the same bridge network on the host\n- All external access is routed through:\n**Caddy**(HTTPS reverse proxy) for web traffic** SSHPiper**(port 2222) for SSH access\n\n- Each container only exposes what's explicitly configured (by default this is: app port/8000 (configurable), code UI port/9999, admin.code/8099)\n\n- Containers use Linux namespaces (PID, network, mount, user, etc.)\n- Processes in one container cannot see or interact with processes in another\n- Each container has its own init system and process tree\n\n`security.nesting=true`\n\nis enabled to allow Docker-in-container (useful for development). This is standard for development environments but worth noting for security-sensitive deployments.\n\nIf you run 3 containers (app1.example.com, app2.example.com, app3.example.com):\n\n- Each has its own isolated Linux environment\n- Each has its own AI tools installation (opencode, nanocode, claude-code, shelley)\n- An agent in app1 cannot access files or processes in app2 or app3\n- They share the host's resources (CPU, RAM) but are otherwise independent\n\nIt's essentially like having separate lightweight VMs, but with much lower overhead than full virtualization.\n\nCurrently, this implementation uses the **Incus DIR storage driver** for proof of concept. The DIR driver uses basic filesystem-level storage and is:\n\n- Simple to set up (no additional dependencies)\n- Compatible with any filesystem\n**Slow for snapshots**(full copy-on-write not available)\n\n**Planned**: During the dependencies/installation phase, users will be able to choose between:\n\n| Driver | Pros | Cons |\n|---|---|---|\nDIR |\nSimple, works everywhere | Slow snapshots, no CoW |\nBtrfs |\nFast snapshots, CoW, compression | Requires Btrfs filesystem |\nZFS |\nFast snapshots, CoW, excellent features | Requires significant RAM (1GB+ per TB of storage) |\n\nBtrfs and ZFS provide instant snapshots via copy-on-write, making them much more suitable for production use.\n\nThis project is licensed under the MIT License. See [LICENSE](/jgbrwn/vibebin/blob/main/LICENSE) for details.\n\n**opencode**:[anomalyco/opencode](https://github.com/anomalyco/opencode)- MIT License** nanocode**:[nanogpt-community/nanocode](https://github.com/nanogpt-community/nanocode)- Fork of opencode** claude-code**:[anthropics/claude-code](https://github.com/anthropics/claude-code)- Apache License 2.0** shelley**:[boldsoftware/shelley](https://github.com/boldsoftware/shelley)- Apache License 2.0** Incus**:[linuxcontainers/incus](https://github.com/lxc/incus)- Apache 2.0 License** Caddy**:[caddyserver/caddy](https://github.com/caddyserver/caddy)- Apache 2.0 License** SSHPiper**:[tg123/sshpiper](https://github.com/tg123/sshpiper)- MIT License", "url": "https://wpnews.pro/news/vibebin-code-and-host-with-incus-containers-on-your-vps-server", "canonical_source": "https://GitHub.com/jgbrwn/vibebin", "published_at": "2026-08-11 00:20:13+00:00", "updated_at": "2026-08-11 00:40:27.058816+00:00", "lang": "en", "topics": ["ai-tools", "ai-agents", "developer-tools", "ai-infrastructure"], "entities": ["Vibebin", "Incus", "LXC", "Caddy", "exe.dev", "Shelley", "Claude Opus 4.5", "opencode"], "alternates": {"html": "https://wpnews.pro/news/vibebin-code-and-host-with-incus-containers-on-your-vps-server", "markdown": "https://wpnews.pro/news/vibebin-code-and-host-with-incus-containers-on-your-vps-server.md", "text": "https://wpnews.pro/news/vibebin-code-and-host-with-incus-containers-on-your-vps-server.txt", "jsonld": "https://wpnews.pro/news/vibebin-code-and-host-with-incus-containers-on-your-vps-server.jsonld"}}