diff --git a/CLAUDE.md b/CLAUDE.md index 76cc8db..267fed0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -16,6 +16,7 @@ ROMFASTSQL is an infrastructure and database management project for ROMFAST, fea proxmox/ # Main infrastructure documentation ├── README.md # Master index - START HERE ├── cluster/ # Proxmox cluster, UPS, storage management +├── lxc102-docker/ # Docker + Portainer + Docker Sandboxes (sbx) ├── lxc104-flowise/ # AI Chatbot (Flowise on port 3000) ├── lxc108-oracle/ # Oracle XE 21c/18c Database (port 1521/1522) ├── lxc110-moltbot/ # MoltBot AI Telegram Bot @@ -42,6 +43,7 @@ input/ # Oracle DMP files for import - **Oracle database setup**: `proxmox/lxc108-oracle/README.md` - **Migration orchestration**: `proxmox/lxc108-oracle/migration/00-MASTER-MIGRATION.sh` - **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` - **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` @@ -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) | | Flowise | 10.0.20.161 | 3000 | Chatbot UI | | 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) | | 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 | diff --git a/proxmox/README.md b/proxmox/README.md index 30a637a..973851d 100644 --- a/proxmox/README.md +++ b/proxmox/README.md @@ -20,6 +20,9 @@ proxmox/ ├── lxc101-minecraft/ # LXC 101 - Minecraft (Crafty Controller 4) │ └── 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) │ ├── README.md # Configurare, arhitectură, workflow deploy │ └── 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) **Director:** `lxc103-dokploy/` **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` | | **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/`** | | **104** | **flowise** | **10.0.20.161** | **Flowise AI (Chatbot Maria)** | **`lxc104-flowise/`** | | **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` - **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) - **Configurare și comenzi** → `lxc110-moltbot/README.md` - **Terminal UI** → `ssh -t moltbot@10.0.20.173 "clawdbot tui"` diff --git a/proxmox/lxc102-docker/README.md b/proxmox/lxc102-docker/README.md new file mode 100644 index 0000000..1cdddca --- /dev/null +++ b/proxmox/lxc102-docker/README.md @@ -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 +sbx tui # dashboard interactiv +sbx rm -f + +# 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` |