docs(lxc102): Docker + Portainer + Docker Sandboxes (sbx)
Documentează LXC 102 și depanarea erorii "500: failed to run sandbox container" la crearea sandbox-urilor opencode: build docker-sbx pentru Ubuntu 26.04 instalat pe Debian 13 (libsailor.so cere GLIBC_2.43), userul work lipsă din grupul kvm și /usr/sbin absent din PATH (mkfs.ext4 pentru snapshotter-ul erofs). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,7 @@ ROMFASTSQL is an infrastructure and database management project for ROMFAST, fea
|
|||||||
proxmox/ # Main infrastructure documentation
|
proxmox/ # Main infrastructure documentation
|
||||||
├── README.md # Master index - START HERE
|
├── README.md # Master index - START HERE
|
||||||
├── cluster/ # Proxmox cluster, UPS, storage management
|
├── cluster/ # Proxmox cluster, UPS, storage management
|
||||||
|
├── lxc102-docker/ # Docker + Portainer + Docker Sandboxes (sbx)
|
||||||
├── lxc104-flowise/ # AI Chatbot (Flowise on port 3000)
|
├── lxc104-flowise/ # AI Chatbot (Flowise on port 3000)
|
||||||
├── lxc108-oracle/ # Oracle XE 21c/18c Database (port 1521/1522)
|
├── lxc108-oracle/ # Oracle XE 21c/18c Database (port 1521/1522)
|
||||||
├── lxc110-moltbot/ # MoltBot AI Telegram Bot
|
├── lxc110-moltbot/ # MoltBot AI Telegram Bot
|
||||||
@@ -42,6 +43,7 @@ input/ # Oracle DMP files for import
|
|||||||
- **Oracle database setup**: `proxmox/lxc108-oracle/README.md`
|
- **Oracle database setup**: `proxmox/lxc108-oracle/README.md`
|
||||||
- **Migration orchestration**: `proxmox/lxc108-oracle/migration/00-MASTER-MIGRATION.sh`
|
- **Migration orchestration**: `proxmox/lxc108-oracle/migration/00-MASTER-MIGRATION.sh`
|
||||||
- **Chatbot architecture**: `proxmox/lxc104-flowise/docs/prd.md`
|
- **Chatbot architecture**: `proxmox/lxc104-flowise/docs/prd.md`
|
||||||
|
- **Docker Sandboxes (sbx) — agenți AI izolați**: `proxmox/lxc102-docker/README.md`
|
||||||
- **Disaster recovery**: `proxmox/vm109-windows-dr/README.md`
|
- **Disaster recovery**: `proxmox/vm109-windows-dr/README.md`
|
||||||
- **ROA Windows setup scripts (XE/SE 21c)**: `proxmox/lxc108-oracle/roa-windows-setup/README.md`
|
- **ROA Windows setup scripts (XE/SE 21c)**: `proxmox/lxc108-oracle/roa-windows-setup/README.md`
|
||||||
- **VM 302 test environment for ROA setup**: `proxmox/vm302-oracle-test/README.md`
|
- **VM 302 test environment for ROA setup**: `proxmox/vm302-oracle-test/README.md`
|
||||||
@@ -91,6 +93,7 @@ proxmox/vm109-windows-dr/scripts/oracle-backup-monitor-proxmox.sh
|
|||||||
| Oracle XE 18c | 10.0.20.121 | 1522 | Export compatibility (TSTZ 31) |
|
| Oracle XE 18c | 10.0.20.121 | 1522 | Export compatibility (TSTZ 31) |
|
||||||
| Flowise | 10.0.20.161 | 3000 | Chatbot UI |
|
| Flowise | 10.0.20.161 | 3000 | Chatbot UI |
|
||||||
| Gitea | 10.0.20.165 | 3000 | Git server |
|
| Gitea | 10.0.20.165 | 3000 | Git server |
|
||||||
|
| Docker + Portainer + sbx | 10.0.20.113 | 9000/9443 | Docker host, sandbox-uri agenți AI |
|
||||||
| Claude Agent | 10.0.20.171 | 22 | Development (also via Tailscale: 100.95.55.51) |
|
| Claude Agent | 10.0.20.171 | 22 | Development (also via Tailscale: 100.95.55.51) |
|
||||||
| MoltBot | 10.0.20.173 | 22 | AI Telegram Bot (also via Tailscale: 100.120.119.70) |
|
| MoltBot | 10.0.20.173 | 22 | AI Telegram Bot (also via Tailscale: 100.120.119.70) |
|
||||||
| Primary Oracle | 10.0.20.36 | 1521 | Windows production |
|
| Primary Oracle | 10.0.20.36 | 1521 | Windows production |
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ proxmox/
|
|||||||
├── lxc101-minecraft/ # LXC 101 - Minecraft (Crafty Controller 4)
|
├── lxc101-minecraft/ # LXC 101 - Minecraft (Crafty Controller 4)
|
||||||
│ └── README.md # Servere Minecraft, gestionare Java, cum actualizezi versiunea
|
│ └── README.md # Servere Minecraft, gestionare Java, cum actualizezi versiunea
|
||||||
│
|
│
|
||||||
|
├── lxc102-docker/ # LXC 102 - Docker + Portainer + Docker Sandboxes (sbx)
|
||||||
|
│ └── README.md # Componente, comenzi sbx, depanare "failed to run sandbox container"
|
||||||
|
│
|
||||||
├── lxc103-dokploy/ # LXC 103 - Dokploy + Traefik (Deployment Platform)
|
├── lxc103-dokploy/ # LXC 103 - Dokploy + Traefik (Deployment Platform)
|
||||||
│ ├── README.md # Configurare, arhitectură, workflow deploy
|
│ ├── README.md # Configurare, arhitectură, workflow deploy
|
||||||
│ └── docs/
|
│ └── docs/
|
||||||
@@ -147,6 +150,31 @@ ssh root@10.0.20.201 "pct exec 106 -- docker logs gitea --tail 50"
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### LXC 102 - Docker + Portainer + Docker Sandboxes
|
||||||
|
**Director:** `lxc102-docker/`
|
||||||
|
**IP:** 10.0.20.113 | **Host:** pvemini
|
||||||
|
|
||||||
|
| Fișier | Descriere |
|
||||||
|
|--------|-----------|
|
||||||
|
| `README.md` | Componente, comenzi `sbx`, depanare erori la creare sandbox |
|
||||||
|
|
||||||
|
**Rol:** Host Docker general (Portainer) + rulare agenți AI (opencode, Claude Code) izolați în microVM prin `sbx`.
|
||||||
|
|
||||||
|
**Quick Start:**
|
||||||
|
```bash
|
||||||
|
# Docker
|
||||||
|
ssh root@10.0.20.201 "pct exec 102 -- docker ps"
|
||||||
|
|
||||||
|
# sbx — se rulează DOAR ca userul work
|
||||||
|
ssh root@10.0.20.201 "pct exec 102 -- su - work -c 'sbx ls'"
|
||||||
|
```
|
||||||
|
|
||||||
|
> La orice eroare `500: failed to run sandbox container`, cauza reală e în
|
||||||
|
> `/home/work/.local/state/sandboxes/sandboxes/sandboxd/daemon.log` (`sbx diagnose` trece oricum).
|
||||||
|
> Vezi secțiunea de depanare din `lxc102-docker/README.md`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### LXC 103 - Dokploy + Traefik (Deployment Platform)
|
### LXC 103 - Dokploy + Traefik (Deployment Platform)
|
||||||
**Director:** `lxc103-dokploy/`
|
**Director:** `lxc103-dokploy/`
|
||||||
**IP:** 10.0.20.167 | **Host:** pvemini
|
**IP:** 10.0.20.167 | **Host:** pvemini
|
||||||
@@ -379,6 +407,7 @@ ssh root@10.0.20.201 "qm snapshot 302 pre-test --description 'Before ROA test'"
|
|||||||
|------|------|-----|----------|--------------|
|
|------|------|-----|----------|--------------|
|
||||||
| 100 | portainer | 10.0.20.170 | Docker Management (Remote Node) | `cluster/README.md` |
|
| 100 | portainer | 10.0.20.170 | Docker Management (Remote Node) | `cluster/README.md` |
|
||||||
| **101** | **minecraft** | **10.0.20.162** | **Minecraft (Crafty Controller 4)** | **`lxc101-minecraft/`** |
|
| **101** | **minecraft** | **10.0.20.162** | **Minecraft (Crafty Controller 4)** | **`lxc101-minecraft/`** |
|
||||||
|
| **102** | **docker.romfast.ro** | **10.0.20.113** | **Docker + Portainer + Docker Sandboxes (sbx)** | **`lxc102-docker/`** |
|
||||||
| **103** | **dokploy** | **10.0.20.167** | **Dokploy + Traefik (App Deployment)** | **`lxc103-dokploy/`** |
|
| **103** | **dokploy** | **10.0.20.167** | **Dokploy + Traefik (App Deployment)** | **`lxc103-dokploy/`** |
|
||||||
| **104** | **flowise** | **10.0.20.161** | **Flowise AI (Chatbot Maria)** | **`lxc104-flowise/`** |
|
| **104** | **flowise** | **10.0.20.161** | **Flowise AI (Chatbot Maria)** | **`lxc104-flowise/`** |
|
||||||
| **106** | **gitea** | **10.0.20.165** | **Git Server** | **`lxc106-gitea/`** |
|
| **106** | **gitea** | **10.0.20.165** | **Git Server** | **`lxc106-gitea/`** |
|
||||||
@@ -446,6 +475,11 @@ ssh root@10.0.20.201 "qm snapshot 302 pre-test --description 'Before ROA test'"
|
|||||||
- **Deploy pdf-qr-app** → `lxc103-dokploy/docs/pdf-qr-app.md`
|
- **Deploy pdf-qr-app** → `lxc103-dokploy/docs/pdf-qr-app.md`
|
||||||
- **Arhitectură domenii** → `vm201-windows/docs/vm201-dokploy-infrastructure.md`
|
- **Arhitectură domenii** → `vm201-windows/docs/vm201-dokploy-infrastructure.md`
|
||||||
|
|
||||||
|
### Docker Sandboxes (LXC 102)
|
||||||
|
- **Rulez opencode / Claude Code izolat** → `lxc102-docker/README.md` → "Comenzi uzuale"
|
||||||
|
- **Eroare "failed to run sandbox container"** → `lxc102-docker/README.md` → "Depanare"
|
||||||
|
- **Actualizez pachetul `docker-sbx`** → `lxc102-docker/README.md` → "De reținut pentru viitor" (folosește build-ul `~noble`)
|
||||||
|
|
||||||
### MoltBot AI (LXC 110)
|
### MoltBot AI (LXC 110)
|
||||||
- **Configurare și comenzi** → `lxc110-moltbot/README.md`
|
- **Configurare și comenzi** → `lxc110-moltbot/README.md`
|
||||||
- **Terminal UI** → `ssh -t moltbot@10.0.20.173 "clawdbot tui"`
|
- **Terminal UI** → `ssh -t moltbot@10.0.20.173 "clawdbot tui"`
|
||||||
|
|||||||
150
proxmox/lxc102-docker/README.md
Normal file
150
proxmox/lxc102-docker/README.md
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
# LXC 102 - Docker + Portainer + Docker Sandboxes (sbx)
|
||||||
|
|
||||||
|
**Director:** `proxmox/lxc102-docker/`
|
||||||
|
**VMID:** 102
|
||||||
|
**IP intern:** 10.0.20.113 | **Tailscale:** 100.73.147.55
|
||||||
|
**Host Proxmox:** pvemini (10.0.20.201)
|
||||||
|
**Rol:** Host Docker general + Portainer + rulare agenți AI (opencode, Claude Code) izolați în Docker Sandboxes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Informații Container
|
||||||
|
|
||||||
|
| Parametru | Valoare |
|
||||||
|
|-----------|---------|
|
||||||
|
| VMID | 102 |
|
||||||
|
| Hostname | docker.romfast.ro |
|
||||||
|
| IP intern | 10.0.20.113 |
|
||||||
|
| Host Proxmox | pvemini |
|
||||||
|
| Storage | local-zfs (30GB) |
|
||||||
|
| RAM | 4GB (swap 512MB) |
|
||||||
|
| CPU | 4 cores |
|
||||||
|
| OS | Debian 13 (trixie) |
|
||||||
|
| Features | `nesting=1,fuse=1` |
|
||||||
|
| onboot | da |
|
||||||
|
| Creat cu | community-scripts ProxmoxVE — Docker LXC |
|
||||||
|
|
||||||
|
Containerul are bind-mount pentru `/dev/kvm` (`lxc.mount.entry: /dev/kvm dev/kvm none bind,optional,create=file`)
|
||||||
|
— **obligatoriu** pentru microVM-ul folosit de sbx.
|
||||||
|
|
||||||
|
## Componente
|
||||||
|
|
||||||
|
| Componentă | Versiune | Note |
|
||||||
|
|------------|----------|------|
|
||||||
|
| Docker Engine | 29.6.x | dockerd de sistem (root) |
|
||||||
|
| Portainer CE | latest | container `portainer`, porturi 9000 / 9443 |
|
||||||
|
| Docker Sandboxes (`sbx`) | 0.37.1 | pachet `docker-sbx`, daemon per-user |
|
||||||
|
|
||||||
|
> Atenție: LXC **100** este un container separat, tot numit `portainer`. Portainer-ul activ folosit rulează în LXC 102.
|
||||||
|
|
||||||
|
**User de lucru pentru sbx:** `work` (uid 1000). Daemonul `sandboxd` pornește automat per-user la prima comandă `sbx`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Comenzi uzuale
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Acces
|
||||||
|
ssh root@10.0.20.201 "pct exec 102 -- bash"
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
ssh root@10.0.20.201 "pct exec 102 -- docker ps"
|
||||||
|
|
||||||
|
# sbx (întotdeauna ca user work, NU ca root)
|
||||||
|
ssh root@10.0.20.201 "pct exec 102 -- su - work -c 'sbx ls'"
|
||||||
|
ssh root@10.0.20.201 "pct exec 102 -- su - work -c 'sbx diagnose'"
|
||||||
|
|
||||||
|
# Creare sandbox + atașare (interactiv, din shell-ul lui work)
|
||||||
|
sbx create opencode /cale/proiect
|
||||||
|
sbx run --name <sandbox>
|
||||||
|
sbx tui # dashboard interactiv
|
||||||
|
sbx rm -f <sandbox>
|
||||||
|
|
||||||
|
# Daemon
|
||||||
|
sbx daemon status
|
||||||
|
sbx daemon stop
|
||||||
|
```
|
||||||
|
|
||||||
|
**Log daemon (prima oprire când ceva nu merge):**
|
||||||
|
`/home/work/.local/state/sandboxes/sandboxes/sandboxd/daemon.log`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cum funcționează sbx (relevant pentru depanare)
|
||||||
|
|
||||||
|
`sbx` **nu** folosește dockerd-ul de sistem. Are propriul containerd embedded, per-user, care pornește
|
||||||
|
fiecare sandbox într-un **microVM** (runtime `nerdbox`, shim `/usr/libexec/containerd-shim-nerdbox-v1`,
|
||||||
|
VMM în `/usr/libexec/lib/libsailor.so`). De aici rezultă trei dependențe de mediu care nu sunt evidente:
|
||||||
|
|
||||||
|
1. acces read/write la `/dev/kvm` pentru userul care rulează sbx;
|
||||||
|
2. `mkfs.ext4` (din `/usr/sbin`) în PATH — snapshotter-ul erofs formatează layer-ul rw;
|
||||||
|
3. un build al pachetului compatibil cu glibc-ul din container.
|
||||||
|
|
||||||
|
Erorile din TUI sunt mereu generice (`500 Internal Server Error: failed to run sandbox container`).
|
||||||
|
**Cauza reală e doar în `daemon.log`.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Depanare: "failed to run sandbox container" (rezolvat 2026-07-30)
|
||||||
|
|
||||||
|
La primul sandbox opencode, TUI-ul returna:
|
||||||
|
|
||||||
|
```
|
||||||
|
Failed to create sandbox: create local sandbox: create sandbox via POST /sandbox:
|
||||||
|
request failed: 500 Internal Server Error: failed to run sandbox container
|
||||||
|
```
|
||||||
|
|
||||||
|
`sbx diagnose` trecea toate cele 9 verificări — nu ajută la acest tip de eroare. Din `daemon.log` au rezultat
|
||||||
|
trei probleme suprapuse, care se manifestau una după alta:
|
||||||
|
|
||||||
|
| # | Eroare în daemon.log | Cauză | Fix |
|
||||||
|
|---|----------------------|-------|-----|
|
||||||
|
| 1 | `creating ephemeral volume for "/var/lib/docker": unknown volume driver: block` | VMM nefuncțional (vezi #3); driver-ul `block` e oferit de runtime-ul microVM | rezolvat de #3 |
|
||||||
|
| 2 | `mkfs.ext4 failed: exec: "mkfs.ext4": executable file not found in $PATH` | Debian nu pune `/usr/sbin` în PATH pentru useri non-root | adăugat `/usr/sbin` în PATH-ul lui `work` |
|
||||||
|
| 3 | `failed to create shim task: ttrpc: closed` + `libsailor.so: version GLIBC_2.43 not found` | era instalat build-ul **Ubuntu 26.04 (resolute)** pe Debian 13 (glibc 2.41) | reinstalat build-ul **noble** (glibc 2.39) |
|
||||||
|
|
||||||
|
În plus, userul `work` **nu era în grupul `kvm`**, deci shim-ul microVM nu putea deschide `/dev/kvm`.
|
||||||
|
|
||||||
|
### Fix aplicat
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. build-ul corect: repo-ul Docker pentru Debian NU publică docker-sbx, doar cel de Ubuntu.
|
||||||
|
# Pe Debian 13 (glibc 2.41) se folosește build-ul noble (glibc 2.39), NU resolute (cere glibc 2.43).
|
||||||
|
curl -fsSLO https://download.docker.com/linux/ubuntu/dists/noble/pool/stable/amd64/docker-sbx_0.37.1-1~ubuntu.24.04~noble_amd64.deb
|
||||||
|
apt-get install -y --allow-downgrades ./docker-sbx_0.37.1-1~ubuntu.24.04~noble_amd64.deb
|
||||||
|
|
||||||
|
# 2. acces la KVM (necesită re-login pentru user work)
|
||||||
|
usermod -aG kvm work
|
||||||
|
|
||||||
|
# 3. mkfs.ext4 în PATH — adăugat în /home/work/.profile
|
||||||
|
PATH="/usr/local/sbin:/usr/sbin:/sbin:$PATH"
|
||||||
|
```
|
||||||
|
|
||||||
|
Verificare finală: `sbx create opencode .` → sandbox `running`, iar în interior `docker version` returnează
|
||||||
|
29.6.1 (deci merge și varianta docker-in-docker a template-ului).
|
||||||
|
|
||||||
|
### De reținut pentru viitor
|
||||||
|
|
||||||
|
- **Pachetul nu se actualizează cu `apt upgrade`** — nu provine dintr-un repo configurat. La update, descarcă
|
||||||
|
manual varianta `~noble`. Dacă iei din greșeală `~resolute`, sandbox-urile se rup din nou identic.
|
||||||
|
- Dacă apare orice eroare 500 la creare: citește `daemon.log`, nu `sbx diagnose`.
|
||||||
|
- Verificări rapide de mediu:
|
||||||
|
```bash
|
||||||
|
su - work -c 'test -w /dev/kvm && echo KVM_OK; command -v mkfs.ext4; ldd /usr/libexec/lib/libsailor.so | grep "not found"'
|
||||||
|
```
|
||||||
|
Toate trei trebuie să fie OK / fără output la ultima.
|
||||||
|
- Există și un daemon `sbx` vechi rulând ca **root** (rămas de la instalarea inițială, binar șters, ~590MB RSS).
|
||||||
|
Poate fi oprit cu `sbx daemon stop` ca root. Recomandat: sbx se folosește **doar** din userul `work`.
|
||||||
|
- Sandbox-urile pot ieși în rețea doar prin proxy-ul sbx, către host-uri permise de politică (`sbx policy`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fișiere și căi importante
|
||||||
|
|
||||||
|
| Cale | Conținut |
|
||||||
|
|------|----------|
|
||||||
|
| `/home/work/.local/state/sandboxes/sandboxes/sandboxd/daemon.log` | log daemon sbx (sursa de adevăr la erori) |
|
||||||
|
| `/home/work/.local/state/sandboxes/sandboxes/sandboxd/sandboxd.sock` | socket daemon |
|
||||||
|
| `/usr/libexec/containerd-shim-nerdbox-v1` | shim microVM |
|
||||||
|
| `/usr/libexec/lib/libsailor.so` | bibliotecă VMM (sensibilă la versiunea de glibc) |
|
||||||
|
| `/home/work/.profile` | conține fix-ul de PATH pentru `mkfs.ext4` |
|
||||||
Reference in New Issue
Block a user