diff --git a/CLAUDE.md b/CLAUDE.md index 2ec93e4..e34cf79 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -45,6 +45,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` +- **Care chatbot e care (trei „Maria", doi boți de Discord, două punți WhatsApp pe același număr)**: `docs/chatboti-si-punti.md` - **Docker Sandboxes (sbx) — agenți AI izolați**: `proxmox/lxc102-docker/README.md` - **Punte Discord → Claude Code (comandă LXC 171 de pe telefon, dintr-un guild privat)**: `proxmox/lxc171-claude-agent/discord-bridge/README.md` - **Dashboard de control al punții Discord (stare, restart, orfani, confirmări; https://claude-agent.tailf7372d.ts.net/claude)**: `proxmox/lxc171-claude-agent/discord-bridge/dashboard/README.md` diff --git a/docs/chatboti-si-punti.md b/docs/chatboti-si-punti.md new file mode 100644 index 0000000..9d72ef8 --- /dev/null +++ b/docs/chatboti-si-punti.md @@ -0,0 +1,158 @@ +# Chatboții și punțile de mesagerie — care e care + +Există **trei lucruri numite „Maria"**, **doi boți pe Discord** și **două punți WhatsApp +legate la același număr de telefon**. Documentul ăsta spune care e care, unde rulează și +cum verifici, în 30 de secunde, cu care vorbești de fapt. + +> **De ce există documentul:** pe 2026-08-31 s-a pierdut aproape o oră de diagnostic +> fiindcă Maria de pe WhatsApp răspundea, dar toate verificările se făceau pe containerul +> greșit. Pe LXC 171 totul părea rupt (niciun LLM, WhatsApp neasociat, log fără +> activitate) — răspunsurile veneau de pe LXC 104. + +**Verificat live pe 2026-08-31.** Stările (`connected`, ce serviciu rulează) se schimbă; +topologia, nu. + +--- + +## Tabelul scurt + +| Cine | Unde rulează | Canal | Model | Sursa de cunoștințe | +|---|---|---|---|---| +| **Maria pe Flowise** | LXC 104, `flowise.service`, port 3000 | web (prin ngrok) | configurat în chatflow | chatflow Flowise + docstore propriu | +| **Maria WhatsApp — instanța vie** | LXC 104, `maria-whatsapp-*.service` | WhatsApp, nr. 40723197939 | `llama-qwen35` local (Qwen3.5-2B-Q4, port 8091) | `rag_index.json` propriu, mic | +| **Maria WhatsApp — versiunea din git** | LXC 171, `maria-*.service` | WhatsApp (**neasociat**) | același LLM, prin rețea | depozit sincronizat din Google Drive | +| **Echo (MoltBot)** | LXC 110, `echo-core.service` | Telegram + WhatsApp + Discord | Claude Opus 4.5 (API) | proiectele lui, roa2web | +| **Puntea Discord → Claude Code** | LXC 171, `claude-discord.service` | Discord (guild privat) | Sonnet/Opus, per fir | tot `/workspace`, acces SSH la cluster | + +Cele două Marii de WhatsApp rulează **același cod**, din surse diferite. Vezi mai jos. + +--- + +## Cele trei Marii + +### 1. Maria pe Flowise — chatbot web + +LXC 104 (`10.0.20.161`), `flowise.service` pe portul 3000, expus public prin +`ngrok.service` la `https://mutual-special-koala.ngrok-free.app`. + +Chatflow-ul e definit în interfața Flowise; memoria e Buffer Window (ultimele 5 schimburi). +Sursa versionată a chatflow-ului: `vfp_roaauto/COMUN/utile/chatbot/`. + +Detalii: [`proxmox/lxc104-flowise/README.md`](../proxmox/lxc104-flowise/README.md). + +### 2. Maria WhatsApp + RAG — instanța care răspunde acum + +**LXC 104**, `/root/maria-whatsapp-bridge/` — **în afara git-ului**. + +| Serviciu | Ce face | +|---|---| +| `maria-whatsapp-bridge.service` | punte Baileys (Node), port 8099 | +| `maria-whatsapp-consumer.service` | `consumer.py` — citește mesaje, caută în RAG, întreabă LLM-ul | +| `llama-qwen35.service` | `llama.cpp` cu `Qwen3.5-2B-Q4_K_M`, API compatibil OpenAI pe **8091** | +| `ollama.service` | embeddings, port 11434 | + +Legată la **+40723197939**, în modul self-chat: îi scrii ție însuți pe WhatsApp și ea +răspunde în aceeași conversație, cu prefixul `[Maria]`. + +**Limitarea ei:** indexul are 24 de chunk-uri dintr-un singur fișier +(`knowledge/roaauto_instructiuni.txt`). Orice întrebare din afara subiectului roaauto +primește un răspuns inventat de model, fiindcă retrieval-ul nu are ce să găsească. + +### 3. Maria WhatsApp + RAG — versiunea din git + +**LXC 171**, cod în `proxmox/lxc171-claude-agent/maria-whatsapp-bridge/`, stare în +`~/.maria-bridge/`. Aceleași servicii, sub `systemctl --user`. + +Are tot ce s-a construit peste prototip: depozit sincronizat din Google Drive prin rclone +(11 documente, 173 de chunk-uri), suport `.xml` preferat peste `.md`, lacăt între +reindexări, dashboard de control. Foloseste LLM-ul de pe 104 prin rețea +(`LLM_URL=http://10.0.20.161:8091`) — pe 171 nu există niciun model de chat, doar +embeddings. + +**Nu e asociată la WhatsApp.** Până când e, instanța de pe 104 rămâne singura funcțională. +Migrarea e urmărită în `claude-agent/TODO.md`. + +Detalii: [`maria-whatsapp-bridge/README.md`](../proxmox/lxc171-claude-agent/maria-whatsapp-bridge/README.md). + +--- + +## Cei doi boți de Discord + +### Puntea Discord → Claude Code (LXC 171) + +`claude-discord.service`. Un fir de Discord = o sesiune Claude Code care rulează **pe +container, cu drepturile utilizatorului `claude`**: acces la `/workspace`, chei SSH, +`pct exec` pe tot clusterul. Comenzi `/new`, `/cd`, `/model`, `/status`, `/stop`, +`/cleanup`, `/permisiuni`. + +Dashboard de control: `claude-discord-dashboard.service`, port 18790, expus prin Tailscale +la `https://claude-agent.tailf7372d.ts.net/claude`. Tot de acolo se comandă și Maria. + +Detalii: [`discord-bridge/README.md`](../proxmox/lxc171-claude-agent/discord-bridge/README.md). + +### Echo Core (LXC 110) + +`echo-core.service` — bot pe Telegram, WhatsApp **și** Discord, cu Claude Opus 4.5 prin +API. Alt bot, alt scop, alt container. Dacă un mesaj de pe Discord primește un răspuns +care nu seamănă cu Claude Code, verifică dacă nu cumva a răspuns Echo. + +Detalii: [`proxmox/lxc110-moltbot/README.md`](../proxmox/lxc110-moltbot/README.md). + +--- + +## Porturi + +| Port | Container | Serviciu | +|---|---|---| +| 3000 | LXC 104 | Flowise (web, prin ngrok) | +| 4040 | LXC 104 | ngrok, interfață locală | +| 8091 | LXC 104 | `llama.cpp` / Qwen3.5-2B — **LLM-ul de răspuns al Mariei** | +| 8099 | LXC 104 | punte WhatsApp Maria (instanța vie) | +| 11434 | LXC 104 | Ollama (embeddings) | +| 8098 | LXC 110 | punte WhatsApp Echo | +| 18789 | LXC 110 | gateway clawdbot | +| 7788 / 7789 | LXC 110 | supertonic-tts / pocket-tts | +| 8099 | LXC 171 | punte WhatsApp Maria (versiunea din git) | +| 11434 | LXC 171 | Ollama (doar embeddings, fără model de chat) | +| 18790 | LXC 171 | dashboard punte Discord + Maria | + +`8099` și `11434` există pe **ambele** containere, cu conținut diferit. De aici jumătate +din confuzie — verifică întotdeauna pe ce container ești. + +--- + +## Cum afli cu cine vorbești + +```bash +# Care punte WhatsApp e conectata, si pe ce numar +ssh root@10.0.20.201 "pct exec 104 -- curl -s http://127.0.0.1:8099/status" # Maria vie +ssh root@10.0.20.171 "curl -s http://127.0.0.1:8099/status" # Maria din git +ssh root@10.0.20.200 "pct exec 110 -- curl -s http://127.0.0.1:8098/status" # Echo + +# Ce a procesat consumer-ul Mariei din git (daca e gol, nu ea a raspuns) +tail -20 ~/.maria-bridge/logs/rag.log + +# LLM-ul de raspuns +curl -s http://10.0.20.161:8091/v1/models +``` + +**Regula:** WhatsApp-ul lui Echo (LXC 110) și cel al Mariei (LXC 104) sunt legate la +**același număr**, `+40723197939`, ca dispozitive diferite ale aceluiași cont. Un mesaj +poate ajunge la ambele. Dacă primești două răspunsuri, două punți sunt active simultan. + +--- + +## Capcane + +- **„Maria" nu e un singur lucru.** Întreabă întâi: web (Flowise), WhatsApp de pe 104, + sau WhatsApp de pe 171? +- **Prototipul de pe 104 nu e în git.** Modificările făcute acolo nu se văd nicăieri și se + pierd. Codul versionat e cel de pe 171. +- **Depozitul Mariei din git e oglindă a Google Drive.** `rclone sync` șterge local ce nu + mai există în Drive; un document adăugat manual din dashboard dispare la următoarea + sincronizare. +- **Reindexarea durează ~21 de minute** pentru 173 de chunk-uri (embedding CPU-only, + ~7,3 s per chunk pe LXC 171). Nu pare blocată — chiar durează. +- **Maria nu are voie la infrastructură.** E chatbot pentru clienții ERP ROA; nimic din + `proxmox/`, niciun IP, port sau credențial nu intră în depozitul ei de documente. + Puntea Discord, în schimb, are acces la tot. Vezi `claude-agent/CLAUDE.md`. diff --git a/proxmox/lxc104-flowise/README.md b/proxmox/lxc104-flowise/README.md index 59f43f6..ddeeba8 100644 --- a/proxmox/lxc104-flowise/README.md +++ b/proxmox/lxc104-flowise/README.md @@ -1,171 +1,175 @@ -# LXC 104 - Flowise AI (Chatbot Maria) - -**Director:** `proxmox/lxc104-flowise/` -**VMID:** 104 -**IP:** 10.0.20.161 -**Host Proxmox:** pvemini -**Servicii:** Flowise AI, ngrok tunnel, Ollama (opțional) - ---- - -## Documentație Adițională - -| Fișier | Descriere | -|--------|-----------| -| `docs/prd.md` | Product Requirements Document - Chatbot Suport Tehnic | -| `docs/v1-arhitectura.md` | Arhitectură versiunea 1 (Flowise + Groq) | -| `docs/v2-arhitectura.md` | Arhitectură versiunea 2 (Claude Agent SDK) | - ---- - -## Componente - -| Componenta | Locație | IP | Port | -|------------|---------|-----|------| -| Flowise | LXC 104 | 10.0.20.161 | 3000 | -| ngrok tunnel | LXC 104 | 10.0.20.161 | - | -| Pagina chatbot | romfast.ro | - | 443 | - -## Configurare Flowise - -**Serviciu systemd**: `/etc/systemd/system/flowise.service` - -```ini -[Unit] -Description=Flowise Service -After=network.target - -[Service] -User=root -Group=root -ExecStart=/usr/bin/npx flowise start -Restart=always -Environment=PORT=3000 -Environment=FLOWISE_USERNAME=admin -Environment=FLOWISE_PASSWORD=parola28 -Environment=CORS_ORIGINS=https://www.romfast.ro,https://romfast.ro -WorkingDirectory=/root/.flowise -Environment=FLOWISE_DATABASE_PATH=/root/.flowise/database.sqlite - -[Install] -WantedBy=multi-user.target -``` - -**Comenzi utile**: -```bash -# Status -pct exec 104 -- systemctl status flowise - -# Restart -pct exec 104 -- systemctl restart flowise - -# Logs -pct exec 104 -- journalctl -u flowise -f -``` - -## Configurare ngrok - -**Configurare**: `/root/.config/ngrok/ngrok.yml` - -```yaml -version: "2" -authtoken: 2mo9quiDc23B6U3TtTqWJEleEfM_jYeD1KYe9u7njaaQMZg2 -tunnels: - web: - proto: http - addr: http://10.0.20.161:3000 - domain: mutual-special-koala.ngrok-free.app -``` - -**Serviciu systemd**: `/etc/systemd/system/ngrok.service` - -**URL public**: https://mutual-special-koala.ngrok-free.app - -**API endpoint chatbot**: -``` -POST https://mutual-special-koala.ngrok-free.app/api/v1/prediction/d4911620-07fe-41f8-adb4-f2f52d6ec766 -``` - -**Comenzi utile**: -```bash -# Status -pct exec 104 -- systemctl status ngrok - -# Restart -pct exec 104 -- systemctl restart ngrok - -# Verificare tunel activ -pct exec 104 -- curl -s http://localhost:4040/api/tunnels - -# Verificare versiune -pct exec 104 -- /usr/local/bin/ngrok --version - -# Actualizare ngrok -pct exec 104 -- /usr/local/bin/ngrok update -``` - -## Troubleshooting - -### Eroare CORS -**Simptom**: Browser-ul afișează eroare CORS când se încarcă chatbot-ul. - -**Cauza**: Flowise nu are configurată variabila `CORS_ORIGINS`. - -**Soluție**: Adaugă în `/etc/systemd/system/flowise.service`: -``` -Environment=CORS_ORIGINS=https://www.romfast.ro,https://romfast.ro -``` -Apoi: `systemctl daemon-reload && systemctl restart flowise` - -### Eroare ngrok versiune veche (ERR_NGROK_121) -**Simptom**: În logs apare: -``` -Your ngrok-agent version "3.16.0" is too old. The minimum supported agent version is "3.19.0" -``` - -**Cauza**: ngrok a fost actualizat dar serviciul nu a fost restartat. Procesul vechi continuă să ruleze. - -**Soluție**: -```bash -# Actualizare (dacă nu e deja făcută) -pct exec 104 -- /usr/local/bin/ngrok update - -# IMPORTANT: Restart după actualizare -pct exec 104 -- systemctl restart ngrok -``` - -### Verificare rapidă că totul funcționează -```bash -# Test local Flowise -pct exec 104 -- curl -s http://localhost:3000/ | head -5 - -# Test tunel ngrok -curl -s "https://mutual-special-koala.ngrok-free.app/api/v1/prediction/d4911620-07fe-41f8-adb4-f2f52d6ec766" \ - -X POST -H "Content-Type: application/json" \ - -d '{"question":"test"}' -``` - -## Pagina web - -URL: https://www.romfast.ro/chatbot_maria.html - -Pagina încarcă widget-ul Flowise care se conectează la endpoint-ul ngrok. - -## Istoric incidente - -### 2025-12-30: Chatbot nu funcționa (CORS + ngrok versiune) -- **Problemă 1**: Flowise nu avea CORS configurat -- **Problemă 2**: ngrok rula versiunea 3.16.0 (actualizată dar nerestartat din octombrie) -- **Soluție**: Adăugat CORS_ORIGINS și restart la ambele servicii - ---- - -## Legături Utile - -- **Proxmox Index:** `../README.md` -- **Cluster Info:** `../cluster/README.md` - ---- - -**Ultima actualizare:** 2026-01-27 -**Autor:** Marius Mutu +# LXC 104 - Flowise AI (Chatbot Maria) + +> **Care chatbot e care?** Exista trei lucruri numite „Maria", doi boti pe Discord si +> doua punti WhatsApp legate la acelasi numar. Inainte de a depana, citeste +> [`docs/chatboti-si-punti.md`](../../docs/chatboti-si-punti.md) — spune care instanta raspunde de fapt. + +**Director:** `proxmox/lxc104-flowise/` +**VMID:** 104 +**IP:** 10.0.20.161 +**Host Proxmox:** pvemini +**Servicii:** Flowise AI, ngrok tunnel, Ollama (opțional) + +--- + +## Documentație Adițională + +| Fișier | Descriere | +|--------|-----------| +| `docs/prd.md` | Product Requirements Document - Chatbot Suport Tehnic | +| `docs/v1-arhitectura.md` | Arhitectură versiunea 1 (Flowise + Groq) | +| `docs/v2-arhitectura.md` | Arhitectură versiunea 2 (Claude Agent SDK) | + +--- + +## Componente + +| Componenta | Locație | IP | Port | +|------------|---------|-----|------| +| Flowise | LXC 104 | 10.0.20.161 | 3000 | +| ngrok tunnel | LXC 104 | 10.0.20.161 | - | +| Pagina chatbot | romfast.ro | - | 443 | + +## Configurare Flowise + +**Serviciu systemd**: `/etc/systemd/system/flowise.service` + +```ini +[Unit] +Description=Flowise Service +After=network.target + +[Service] +User=root +Group=root +ExecStart=/usr/bin/npx flowise start +Restart=always +Environment=PORT=3000 +Environment=FLOWISE_USERNAME=admin +Environment=FLOWISE_PASSWORD=parola28 +Environment=CORS_ORIGINS=https://www.romfast.ro,https://romfast.ro +WorkingDirectory=/root/.flowise +Environment=FLOWISE_DATABASE_PATH=/root/.flowise/database.sqlite + +[Install] +WantedBy=multi-user.target +``` + +**Comenzi utile**: +```bash +# Status +pct exec 104 -- systemctl status flowise + +# Restart +pct exec 104 -- systemctl restart flowise + +# Logs +pct exec 104 -- journalctl -u flowise -f +``` + +## Configurare ngrok + +**Configurare**: `/root/.config/ngrok/ngrok.yml` + +```yaml +version: "2" +authtoken: 2mo9quiDc23B6U3TtTqWJEleEfM_jYeD1KYe9u7njaaQMZg2 +tunnels: + web: + proto: http + addr: http://10.0.20.161:3000 + domain: mutual-special-koala.ngrok-free.app +``` + +**Serviciu systemd**: `/etc/systemd/system/ngrok.service` + +**URL public**: https://mutual-special-koala.ngrok-free.app + +**API endpoint chatbot**: +``` +POST https://mutual-special-koala.ngrok-free.app/api/v1/prediction/d4911620-07fe-41f8-adb4-f2f52d6ec766 +``` + +**Comenzi utile**: +```bash +# Status +pct exec 104 -- systemctl status ngrok + +# Restart +pct exec 104 -- systemctl restart ngrok + +# Verificare tunel activ +pct exec 104 -- curl -s http://localhost:4040/api/tunnels + +# Verificare versiune +pct exec 104 -- /usr/local/bin/ngrok --version + +# Actualizare ngrok +pct exec 104 -- /usr/local/bin/ngrok update +``` + +## Troubleshooting + +### Eroare CORS +**Simptom**: Browser-ul afișează eroare CORS când se încarcă chatbot-ul. + +**Cauza**: Flowise nu are configurată variabila `CORS_ORIGINS`. + +**Soluție**: Adaugă în `/etc/systemd/system/flowise.service`: +``` +Environment=CORS_ORIGINS=https://www.romfast.ro,https://romfast.ro +``` +Apoi: `systemctl daemon-reload && systemctl restart flowise` + +### Eroare ngrok versiune veche (ERR_NGROK_121) +**Simptom**: În logs apare: +``` +Your ngrok-agent version "3.16.0" is too old. The minimum supported agent version is "3.19.0" +``` + +**Cauza**: ngrok a fost actualizat dar serviciul nu a fost restartat. Procesul vechi continuă să ruleze. + +**Soluție**: +```bash +# Actualizare (dacă nu e deja făcută) +pct exec 104 -- /usr/local/bin/ngrok update + +# IMPORTANT: Restart după actualizare +pct exec 104 -- systemctl restart ngrok +``` + +### Verificare rapidă că totul funcționează +```bash +# Test local Flowise +pct exec 104 -- curl -s http://localhost:3000/ | head -5 + +# Test tunel ngrok +curl -s "https://mutual-special-koala.ngrok-free.app/api/v1/prediction/d4911620-07fe-41f8-adb4-f2f52d6ec766" \ + -X POST -H "Content-Type: application/json" \ + -d '{"question":"test"}' +``` + +## Pagina web + +URL: https://www.romfast.ro/chatbot_maria.html + +Pagina încarcă widget-ul Flowise care se conectează la endpoint-ul ngrok. + +## Istoric incidente + +### 2025-12-30: Chatbot nu funcționa (CORS + ngrok versiune) +- **Problemă 1**: Flowise nu avea CORS configurat +- **Problemă 2**: ngrok rula versiunea 3.16.0 (actualizată dar nerestartat din octombrie) +- **Soluție**: Adăugat CORS_ORIGINS și restart la ambele servicii + +--- + +## Legături Utile + +- **Proxmox Index:** `../README.md` +- **Cluster Info:** `../cluster/README.md` + +--- + +**Ultima actualizare:** 2026-01-27 +**Autor:** Marius Mutu diff --git a/proxmox/lxc110-moltbot/README.md b/proxmox/lxc110-moltbot/README.md index 52fccc9..f2b63bf 100644 --- a/proxmox/lxc110-moltbot/README.md +++ b/proxmox/lxc110-moltbot/README.md @@ -1,447 +1,451 @@ -# LXC 110 - MoltBot (AI Chatbot) - -**Director:** `proxmox/lxc110-moltbot/` -**VMID:** 110 -**IP:** 10.0.20.173 (intern) | 100.120.119.70 (Tailscale) -**Host Proxmox:** pve1 (10.0.20.200) -**Rol:** Bot AI pentru Telegram și WhatsApp cu Claude Opus 4.5 - ---- - -## ⚠️ Status actual (verificat 2026-08-30) - -Stack-ul activ e **echo-core** (Python, `/home/moltbot/echo-core`), NU clawdbot/OpenClaw. -Servicii `systemctl --user` active: - -| Serviciu | Status | Descriere | -|----------|--------|-----------| -| `echo-core.service` | ✅ active running | Echo Core Bot (Discord + Telegram + WhatsApp), `python3 src/main.py` | -| `echo-taskboard.service` | ✅ active running | Echo Task Board API (dashboard) | -| `echo-whatsapp-bridge.service` | ✅ active running | Echo Core WhatsApp Bridge (Baileys, Node) | -| `pocket-tts.service` | ✅ active running | Pocket TTS (Kyutai) | -| `supertonic-tts.service` | ✅ active running | Supertonic TTS | -| `clawdbot-gateway.service` | ❌ not-found / dead | vechi, nu mai există ca unit | -| `openclaw-gateway` | ❌ nu există ca unit systemd | — | - -CLI-ul `openclaw` (fostul `clawdbot`) e instalat (`/usr/bin/openclaw`, v2026.2.9) dar **nu mai e -funcțional**: config-ul din `~/.openclaw/openclaw.json` a fost scris de o versiune mai nouă -(2026.2.15), iar `openclaw status` dă `gateway closed (1006 abnormal closure)` pe -`ws://127.0.0.1:18789` — gateway-ul lui nu rulează (nu mai e serviciu systemd pentru el). -Comenzile `clawdbot ...` din secțiunile de mai jos **nu mai sunt valabile** — folosește -`systemctl --user status/restart echo-core` și `journalctl --user -u echo-core -f` în loc. - -Secțiunile "MoltBot - Comenzi" / "Configurare Gateway" / "Servicii Systemd" de mai jos -documentează arhitectura veche (clawdbot/OpenClaw) — păstrate ca referință istorică, dar -nu mai reflectă ce rulează efectiv pe container. - ---- - -## Informații Container - -| Parametru | Valoare | -|-----------|---------| -| VMID | 110 | -| Hostname | moltbot | -| IP intern | 10.0.20.173 | -| IP Tailscale | 100.120.119.70 | -| Host Proxmox | pve1 (10.0.20.200) | -| User serviciu | `moltbot` | -| Parola user | `Moltbot2026!` | -| Storage | local-zfs (50GB) | -| RAM | 8GB (+ 4GB swap) | -| CPU | 6 cores | -| DNS | `10.0.20.1 1.1.1.1` (explicit, vezi mai jos) | -| OS | Ubuntu 24.04 LTS | - -## Componente Instalate - -- Ubuntu 24.04 LTS -- OpenClaw v2026.2.9 (upgraded from MoltBot/clawdbot) -- Node.js v22.22.0 (user-space) -- Bun v1.3.7 -- Tailscale (pentru SSH, fără funnel) -- UFW Firewall -- Fail2ban - -## Canale Configurate - -| Canal | Status | Detalii | -|-------|--------|---------| -| **Telegram** | ✅ ON | Bot token configurat | -| **WhatsApp** | ✅ ON | Linked la +40723197939 | - -## Model AI - -- **Provider:** Anthropic -- **Model:** claude-opus-4-5 -- **Context:** 200k tokens - -## Securitate - -| Măsură | Status | -|--------|--------| -| User dedicat (non-root) | `moltbot` | -| SSH key-only auth | Activat | -| UFW Firewall | Activat | -| Fail2ban SSH | Activat | -| Tailscale SSH | Activat | -| Sudo limitat | Doar `systemctl` | -| Linger enabled | Da (serviciu persistent) | - -### Reguli Firewall UFW - -``` -22/tcp ALLOW IN Anywhere -18789 ALLOW IN 10.0.20.0/24 (MoltBot Dashboard) -Anywhere ALLOW IN 10.0.20.0/24 (rețea locală) -Anywhere ALLOW IN 100.64.0.0/10 (Tailscale) -``` - -### Configurare Sudo - -User `moltbot` are sudo passwordless doar pentru: -- `systemctl status *` -- `systemctl start *` -- `systemctl stop *` -- `systemctl restart *` - -## Conectare - -### SSH (rețea internă) -```bash -ssh moltbot@10.0.20.173 -``` - -### SSH (Tailscale - de oriunde) -```bash -ssh moltbot@100.120.119.70 -``` - -### Acces root (pentru administrare) -```bash -ssh root@10.0.20.173 -``` - -## MoltBot - Comenzi - -### Terminal UI (TUI) -```bash -# Conectare și TUI într-o singură comandă -ssh -t moltbot@10.0.20.173 "clawdbot tui" - -# Sau conectare separată -ssh moltbot@10.0.20.173 -clawdbot tui -``` - -### Web Dashboard (via SSH Tunnel) -```bash -# Pe calculatorul local, deschide tunnel -ssh -L 18789:127.0.0.1:18789 -N moltbot@10.0.20.173 & - -# Apoi accesează în browser -# http://localhost:18789 -``` - -### Comenzi utile - -```bash -# Status complet -clawdbot status - -# Status detaliat -clawdbot status --deep - -# Verificare versiune -clawdbot --version - -# Restart gateway -clawdbot gateway restart - -# Vezi loguri live -clawdbot logs --follow - -# Verificare canale -clawdbot status --deep - -# Gestionare dispozitive (pairing) -clawdbot devices list -clawdbot devices approve -``` - -## Configurare Gateway - -| Parametru | Valoare | -|-----------|---------| -| Port | 18789 | -| Bind | loopback (doar local) | -| Auth | token + password | -| Tailscale mode | off | - -### Fișiere configurare - -| Fișier | Descriere | -|--------|-----------| -| `~/.clawdbot/clawdbot.json` | Configurare principală | -| `~/.clawdbot/logs/gateway.log` | Loguri gateway | -| `~/.clawdbot/agents/main/sessions/` | Sesiuni agent | -| `~/.clawdbot/credentials/` | Credențiale (chmod 700) | - -## Structura Directoare - -``` -/home/moltbot/ -├── .ssh/ -│ └── authorized_keys # Chei SSH pentru acces -├── .bun/ # Bun runtime -├── .local/ -│ └── share/moltbot/ -│ └── node/ # Node.js user-space -├── .clawdbot/ -│ ├── clawdbot.json # Config MoltBot -│ ├── credentials/ # Credențiale (chmod 700) -│ ├── agents/ -│ │ └── main/ -│ │ └── sessions/ # Sesiuni chat -│ └── logs/ -│ └── gateway.log # Loguri -├── clawd/ # Workspace pentru agent -└── .bashrc # PATH pentru node/bun -``` - -## Servicii Systemd - -### Gateway Service -```bash -# Status -systemctl --user status clawdbot-gateway - -# Restart -systemctl --user restart clawdbot-gateway - -# Logs -journalctl --user -u clawdbot-gateway -f -``` - -## Administrare via Proxmox - -### De pe pve1 (sau alt nod cluster) -```bash -# Status container -ssh root@10.0.20.200 "pct status 110" - -# Exec comandă -ssh root@10.0.20.200 "pct exec 110 -- " - -# Stop/Start -ssh root@10.0.20.200 "pct stop 110" -ssh root@10.0.20.200 "pct start 110" - -# Console -ssh root@10.0.20.200 "pct enter 110" -``` - -## DNS & Swap (incident 2026-07-31) - -### DNS — nu depinde de Tailscale - -Containerul **nu** avea `nameserver` în `pct config`, deci moștenea `/etc/resolv.conf` de -la host-ul pve1 — unde fișierul e scris de Tailscale și conținea doar MagicDNS -(`100.100.100.100`). Când `tailscaled` din container s-a delogat, DNS-ul a murit complet -(deși L3 era OK: `ping 8.8.8.8` funcționa) → `echo-core` în crash-loop pe -`telegram.error.TimedOut`. - -Fix aplicat — nameserver explicit: - -```bash -ssh root@10.0.20.200 "pct set 110 --nameserver '10.0.20.1 1.1.1.1'" -``` - -> **Regula de diagnostic:** la „nu mai ajunge la internet", verifică întâi -> `getent hosts api.telegram.org` și `cat /etc/resolv.conf`, **nu** ping-ul. -> Ping-ul poate merge perfect cu DNS-ul complet mort. - -### Swap — necesită zram pe host - -`swap: 4096` din `pct config` e doar o limită cgroup (`memory.swap.max`), nu un backing -store. Cât timp pve1 nu avea swap deloc, în container `free -h` arăta `Swap: 0B`. -Rezolvat prin zram pe pve1 (root-ul e pe ZFS → swapfile exclus): - -```bash -# pe pve1 (host) -apt install -y zram-tools -cat > /etc/default/zramswap <<'EOF' -ALGO=zstd -SIZE=8192 -PRIORITY=100 -EOF -systemctl restart zramswap.service -swapon --show # /dev/zram0 8G prio 100 -``` - -Verificare în container: `free -h` → `Swap: 4.0Gi`. - -### Limite de memorie pe TTS - -Serviciile user systemd rulau toate cu `MemoryMax=infinity` / `MemoryHigh=infinity`, deci -oricare putea consuma singur cei 8 GB → OOM-uri recurente (Apr 25, May 28 ×4, Jul 31), cu -victime aparent aleatorii (`dbus-daemon`, `sd-pam`) alese după `oom_score_adj`. - -Aplicat pe stiva TTS — `MemoryHigh` face throttle + reclaim în loc de kill: - -| Serviciu | RSS repaus | MemoryHigh | MemoryMax | -|----------|-----------|------------|-----------| -| `pocket-tts` | ~945 MB | 1536M | 2G | -| `supertonic-tts` | ~500 MB | 1024M | 1536M | - -Drop-in-uri: `~/.config/systemd/user/.service.d/limits.conf` - -```bash -su - moltbot -export XDG_RUNTIME_DIR=/run/user/1000 -systemctl --user show pocket-tts -p MemoryHigh,MemoryMax,MemoryCurrent -``` - -**Post-mortem complet:** `../cluster/incidents/2026-07-31-lxc110-dns-tailscale-oom.md` - -## Troubleshooting - -### OpenClaw gateway se restartează continuu (OOM kill) -```bash -# Verifică dacă este omorât de OOM killer -journalctl --user -u openclaw-gateway | grep -i oom - -# Verifică consumul de memorie -free -h -systemctl --user status openclaw-gateway - -# Verifică dacă OOM-ul e local containerului sau al host-ului -# ssh root@10.0.20.200 "cat /sys/fs/cgroup/lxc/110/memory.events" # oom_kill > 0 => local -# ssh root@10.0.20.200 "free -h; swapon --show" # zram0 8G activ? - -# Soluție: Crește RAM-ul containerului pe Proxmox (actual: 8192) -# ssh root@10.0.20.200 -# pct stop 110 -# pct set 110 --memory 12288 -# pct start 110 - -# Curăță sesiunile vechi pentru a reduce consumul -openclaw sessions clean --older-than 7d -``` - -### MoltBot gateway nu pornește -```bash -# Verifică logs -clawdbot logs --follow - -# Verifică status -clawdbot status - -# Restart -clawdbot gateway restart - -# Rulare manuală pentru debug -/usr/bin/node /usr/lib/node_modules/clawdbot/dist/entry.js gateway --port 18789 -``` - -### Gateway unreachable -```bash -# Verifică dacă portul e ocupat -ss -tlnp | grep 18789 - -# Verifică serviciul systemd -systemctl --user status clawdbot-gateway - -# Restart complet -systemctl --user restart clawdbot-gateway -``` - -### Eroare "gateway not connected" în TUI -```bash -# Gateway-ul probabil s-a oprit, restartează-l -clawdbot gateway restart -``` - -### Telegram/WhatsApp nu răspunde -```bash -# Verifică starea canalelor -clawdbot status --deep - -# Pentru Telegram, verifică token-ul -grep botToken ~/.clawdbot/clawdbot.json - -# Pentru WhatsApp, verifică link-ul -clawdbot status | grep WhatsApp -``` - -### Probleme de permisiuni -```bash -# Setează permisiunile corecte -chmod 700 ~/.clawdbot -chmod 700 ~/.clawdbot/credentials -chmod 600 ~/.clawdbot/clawdbot.json -``` - -### Tailscale nu funcționează -```bash -sudo systemctl status tailscaled -sudo tailscale status -tailscale ip -``` - -## Backup - -### Backup configurare MoltBot -```bash -# De pe mașina locală -scp -r moltbot@10.0.20.173:~/.clawdbot ./backup-moltbot-$(date +%Y%m%d)/ -``` - -### Backup complet LXC (via Proxmox) -```bash -ssh root@10.0.20.200 "vzdump 110 --storage local --compress zstd" -``` - -## Provider AI - Anthropic - -MoltBot folosește Anthropic Claude prin API key configurat în: -- Config: `~/.clawdbot/clawdbot.json` → `auth.profiles.anthropic:default` -- Credențiale: `~/.clawdbot/credentials/` - -### Monitorizare costuri -- Dashboard Anthropic: https://console.anthropic.com/settings/usage -- Sesiune curentă: ~132k/200k tokens (66%) - -## Reconfigurare (dacă e necesar) - -### Rulare wizard onboarding -```bash -clawdbot onboard -``` - -### Resetare completă -```bash -# Oprește gateway -clawdbot gateway stop - -# Backup config vechi -mv ~/.clawdbot ~/.clawdbot.backup - -# Rulează onboarding fresh -clawdbot onboard -``` - ---- - -## Legături Utile - -- **Proxmox Index:** `../README.md` -- **Documentație MoltBot:** https://docs.molt.bot -- **MoltBot oficial:** https://molt.bot -- **Ghid deployment:** https://merox.dev/blog/moltbot-proxmox-deployment/ - ---- - -**Data setup:** 2026-01-29 -**Ultima actualizare:** 2026-07-31 (host pve1, DNS explicit, zram — incident DNS/OOM) -**Autor:** Claude Code +# LXC 110 - MoltBot (AI Chatbot) + +> **Care chatbot e care?** Exista trei lucruri numite „Maria", doi boti pe Discord si +> doua punti WhatsApp legate la acelasi numar. Inainte de a depana, citeste +> [`docs/chatboti-si-punti.md`](../../docs/chatboti-si-punti.md) — spune care instanta raspunde de fapt. + +**Director:** `proxmox/lxc110-moltbot/` +**VMID:** 110 +**IP:** 10.0.20.173 (intern) | 100.120.119.70 (Tailscale) +**Host Proxmox:** pve1 (10.0.20.200) +**Rol:** Bot AI pentru Telegram și WhatsApp cu Claude Opus 4.5 + +--- + +## ⚠️ Status actual (verificat 2026-08-30) + +Stack-ul activ e **echo-core** (Python, `/home/moltbot/echo-core`), NU clawdbot/OpenClaw. +Servicii `systemctl --user` active: + +| Serviciu | Status | Descriere | +|----------|--------|-----------| +| `echo-core.service` | ✅ active running | Echo Core Bot (Discord + Telegram + WhatsApp), `python3 src/main.py` | +| `echo-taskboard.service` | ✅ active running | Echo Task Board API (dashboard) | +| `echo-whatsapp-bridge.service` | ✅ active running | Echo Core WhatsApp Bridge (Baileys, Node) | +| `pocket-tts.service` | ✅ active running | Pocket TTS (Kyutai) | +| `supertonic-tts.service` | ✅ active running | Supertonic TTS | +| `clawdbot-gateway.service` | ❌ not-found / dead | vechi, nu mai există ca unit | +| `openclaw-gateway` | ❌ nu există ca unit systemd | — | + +CLI-ul `openclaw` (fostul `clawdbot`) e instalat (`/usr/bin/openclaw`, v2026.2.9) dar **nu mai e +funcțional**: config-ul din `~/.openclaw/openclaw.json` a fost scris de o versiune mai nouă +(2026.2.15), iar `openclaw status` dă `gateway closed (1006 abnormal closure)` pe +`ws://127.0.0.1:18789` — gateway-ul lui nu rulează (nu mai e serviciu systemd pentru el). +Comenzile `clawdbot ...` din secțiunile de mai jos **nu mai sunt valabile** — folosește +`systemctl --user status/restart echo-core` și `journalctl --user -u echo-core -f` în loc. + +Secțiunile "MoltBot - Comenzi" / "Configurare Gateway" / "Servicii Systemd" de mai jos +documentează arhitectura veche (clawdbot/OpenClaw) — păstrate ca referință istorică, dar +nu mai reflectă ce rulează efectiv pe container. + +--- + +## Informații Container + +| Parametru | Valoare | +|-----------|---------| +| VMID | 110 | +| Hostname | moltbot | +| IP intern | 10.0.20.173 | +| IP Tailscale | 100.120.119.70 | +| Host Proxmox | pve1 (10.0.20.200) | +| User serviciu | `moltbot` | +| Parola user | `Moltbot2026!` | +| Storage | local-zfs (50GB) | +| RAM | 8GB (+ 4GB swap) | +| CPU | 6 cores | +| DNS | `10.0.20.1 1.1.1.1` (explicit, vezi mai jos) | +| OS | Ubuntu 24.04 LTS | + +## Componente Instalate + +- Ubuntu 24.04 LTS +- OpenClaw v2026.2.9 (upgraded from MoltBot/clawdbot) +- Node.js v22.22.0 (user-space) +- Bun v1.3.7 +- Tailscale (pentru SSH, fără funnel) +- UFW Firewall +- Fail2ban + +## Canale Configurate + +| Canal | Status | Detalii | +|-------|--------|---------| +| **Telegram** | ✅ ON | Bot token configurat | +| **WhatsApp** | ✅ ON | Linked la +40723197939 | + +## Model AI + +- **Provider:** Anthropic +- **Model:** claude-opus-4-5 +- **Context:** 200k tokens + +## Securitate + +| Măsură | Status | +|--------|--------| +| User dedicat (non-root) | `moltbot` | +| SSH key-only auth | Activat | +| UFW Firewall | Activat | +| Fail2ban SSH | Activat | +| Tailscale SSH | Activat | +| Sudo limitat | Doar `systemctl` | +| Linger enabled | Da (serviciu persistent) | + +### Reguli Firewall UFW + +``` +22/tcp ALLOW IN Anywhere +18789 ALLOW IN 10.0.20.0/24 (MoltBot Dashboard) +Anywhere ALLOW IN 10.0.20.0/24 (rețea locală) +Anywhere ALLOW IN 100.64.0.0/10 (Tailscale) +``` + +### Configurare Sudo + +User `moltbot` are sudo passwordless doar pentru: +- `systemctl status *` +- `systemctl start *` +- `systemctl stop *` +- `systemctl restart *` + +## Conectare + +### SSH (rețea internă) +```bash +ssh moltbot@10.0.20.173 +``` + +### SSH (Tailscale - de oriunde) +```bash +ssh moltbot@100.120.119.70 +``` + +### Acces root (pentru administrare) +```bash +ssh root@10.0.20.173 +``` + +## MoltBot - Comenzi + +### Terminal UI (TUI) +```bash +# Conectare și TUI într-o singură comandă +ssh -t moltbot@10.0.20.173 "clawdbot tui" + +# Sau conectare separată +ssh moltbot@10.0.20.173 +clawdbot tui +``` + +### Web Dashboard (via SSH Tunnel) +```bash +# Pe calculatorul local, deschide tunnel +ssh -L 18789:127.0.0.1:18789 -N moltbot@10.0.20.173 & + +# Apoi accesează în browser +# http://localhost:18789 +``` + +### Comenzi utile + +```bash +# Status complet +clawdbot status + +# Status detaliat +clawdbot status --deep + +# Verificare versiune +clawdbot --version + +# Restart gateway +clawdbot gateway restart + +# Vezi loguri live +clawdbot logs --follow + +# Verificare canale +clawdbot status --deep + +# Gestionare dispozitive (pairing) +clawdbot devices list +clawdbot devices approve +``` + +## Configurare Gateway + +| Parametru | Valoare | +|-----------|---------| +| Port | 18789 | +| Bind | loopback (doar local) | +| Auth | token + password | +| Tailscale mode | off | + +### Fișiere configurare + +| Fișier | Descriere | +|--------|-----------| +| `~/.clawdbot/clawdbot.json` | Configurare principală | +| `~/.clawdbot/logs/gateway.log` | Loguri gateway | +| `~/.clawdbot/agents/main/sessions/` | Sesiuni agent | +| `~/.clawdbot/credentials/` | Credențiale (chmod 700) | + +## Structura Directoare + +``` +/home/moltbot/ +├── .ssh/ +│ └── authorized_keys # Chei SSH pentru acces +├── .bun/ # Bun runtime +├── .local/ +│ └── share/moltbot/ +│ └── node/ # Node.js user-space +├── .clawdbot/ +│ ├── clawdbot.json # Config MoltBot +│ ├── credentials/ # Credențiale (chmod 700) +│ ├── agents/ +│ │ └── main/ +│ │ └── sessions/ # Sesiuni chat +│ └── logs/ +│ └── gateway.log # Loguri +├── clawd/ # Workspace pentru agent +└── .bashrc # PATH pentru node/bun +``` + +## Servicii Systemd + +### Gateway Service +```bash +# Status +systemctl --user status clawdbot-gateway + +# Restart +systemctl --user restart clawdbot-gateway + +# Logs +journalctl --user -u clawdbot-gateway -f +``` + +## Administrare via Proxmox + +### De pe pve1 (sau alt nod cluster) +```bash +# Status container +ssh root@10.0.20.200 "pct status 110" + +# Exec comandă +ssh root@10.0.20.200 "pct exec 110 -- " + +# Stop/Start +ssh root@10.0.20.200 "pct stop 110" +ssh root@10.0.20.200 "pct start 110" + +# Console +ssh root@10.0.20.200 "pct enter 110" +``` + +## DNS & Swap (incident 2026-07-31) + +### DNS — nu depinde de Tailscale + +Containerul **nu** avea `nameserver` în `pct config`, deci moștenea `/etc/resolv.conf` de +la host-ul pve1 — unde fișierul e scris de Tailscale și conținea doar MagicDNS +(`100.100.100.100`). Când `tailscaled` din container s-a delogat, DNS-ul a murit complet +(deși L3 era OK: `ping 8.8.8.8` funcționa) → `echo-core` în crash-loop pe +`telegram.error.TimedOut`. + +Fix aplicat — nameserver explicit: + +```bash +ssh root@10.0.20.200 "pct set 110 --nameserver '10.0.20.1 1.1.1.1'" +``` + +> **Regula de diagnostic:** la „nu mai ajunge la internet", verifică întâi +> `getent hosts api.telegram.org` și `cat /etc/resolv.conf`, **nu** ping-ul. +> Ping-ul poate merge perfect cu DNS-ul complet mort. + +### Swap — necesită zram pe host + +`swap: 4096` din `pct config` e doar o limită cgroup (`memory.swap.max`), nu un backing +store. Cât timp pve1 nu avea swap deloc, în container `free -h` arăta `Swap: 0B`. +Rezolvat prin zram pe pve1 (root-ul e pe ZFS → swapfile exclus): + +```bash +# pe pve1 (host) +apt install -y zram-tools +cat > /etc/default/zramswap <<'EOF' +ALGO=zstd +SIZE=8192 +PRIORITY=100 +EOF +systemctl restart zramswap.service +swapon --show # /dev/zram0 8G prio 100 +``` + +Verificare în container: `free -h` → `Swap: 4.0Gi`. + +### Limite de memorie pe TTS + +Serviciile user systemd rulau toate cu `MemoryMax=infinity` / `MemoryHigh=infinity`, deci +oricare putea consuma singur cei 8 GB → OOM-uri recurente (Apr 25, May 28 ×4, Jul 31), cu +victime aparent aleatorii (`dbus-daemon`, `sd-pam`) alese după `oom_score_adj`. + +Aplicat pe stiva TTS — `MemoryHigh` face throttle + reclaim în loc de kill: + +| Serviciu | RSS repaus | MemoryHigh | MemoryMax | +|----------|-----------|------------|-----------| +| `pocket-tts` | ~945 MB | 1536M | 2G | +| `supertonic-tts` | ~500 MB | 1024M | 1536M | + +Drop-in-uri: `~/.config/systemd/user/.service.d/limits.conf` + +```bash +su - moltbot +export XDG_RUNTIME_DIR=/run/user/1000 +systemctl --user show pocket-tts -p MemoryHigh,MemoryMax,MemoryCurrent +``` + +**Post-mortem complet:** `../cluster/incidents/2026-07-31-lxc110-dns-tailscale-oom.md` + +## Troubleshooting + +### OpenClaw gateway se restartează continuu (OOM kill) +```bash +# Verifică dacă este omorât de OOM killer +journalctl --user -u openclaw-gateway | grep -i oom + +# Verifică consumul de memorie +free -h +systemctl --user status openclaw-gateway + +# Verifică dacă OOM-ul e local containerului sau al host-ului +# ssh root@10.0.20.200 "cat /sys/fs/cgroup/lxc/110/memory.events" # oom_kill > 0 => local +# ssh root@10.0.20.200 "free -h; swapon --show" # zram0 8G activ? + +# Soluție: Crește RAM-ul containerului pe Proxmox (actual: 8192) +# ssh root@10.0.20.200 +# pct stop 110 +# pct set 110 --memory 12288 +# pct start 110 + +# Curăță sesiunile vechi pentru a reduce consumul +openclaw sessions clean --older-than 7d +``` + +### MoltBot gateway nu pornește +```bash +# Verifică logs +clawdbot logs --follow + +# Verifică status +clawdbot status + +# Restart +clawdbot gateway restart + +# Rulare manuală pentru debug +/usr/bin/node /usr/lib/node_modules/clawdbot/dist/entry.js gateway --port 18789 +``` + +### Gateway unreachable +```bash +# Verifică dacă portul e ocupat +ss -tlnp | grep 18789 + +# Verifică serviciul systemd +systemctl --user status clawdbot-gateway + +# Restart complet +systemctl --user restart clawdbot-gateway +``` + +### Eroare "gateway not connected" în TUI +```bash +# Gateway-ul probabil s-a oprit, restartează-l +clawdbot gateway restart +``` + +### Telegram/WhatsApp nu răspunde +```bash +# Verifică starea canalelor +clawdbot status --deep + +# Pentru Telegram, verifică token-ul +grep botToken ~/.clawdbot/clawdbot.json + +# Pentru WhatsApp, verifică link-ul +clawdbot status | grep WhatsApp +``` + +### Probleme de permisiuni +```bash +# Setează permisiunile corecte +chmod 700 ~/.clawdbot +chmod 700 ~/.clawdbot/credentials +chmod 600 ~/.clawdbot/clawdbot.json +``` + +### Tailscale nu funcționează +```bash +sudo systemctl status tailscaled +sudo tailscale status +tailscale ip +``` + +## Backup + +### Backup configurare MoltBot +```bash +# De pe mașina locală +scp -r moltbot@10.0.20.173:~/.clawdbot ./backup-moltbot-$(date +%Y%m%d)/ +``` + +### Backup complet LXC (via Proxmox) +```bash +ssh root@10.0.20.200 "vzdump 110 --storage local --compress zstd" +``` + +## Provider AI - Anthropic + +MoltBot folosește Anthropic Claude prin API key configurat în: +- Config: `~/.clawdbot/clawdbot.json` → `auth.profiles.anthropic:default` +- Credențiale: `~/.clawdbot/credentials/` + +### Monitorizare costuri +- Dashboard Anthropic: https://console.anthropic.com/settings/usage +- Sesiune curentă: ~132k/200k tokens (66%) + +## Reconfigurare (dacă e necesar) + +### Rulare wizard onboarding +```bash +clawdbot onboard +``` + +### Resetare completă +```bash +# Oprește gateway +clawdbot gateway stop + +# Backup config vechi +mv ~/.clawdbot ~/.clawdbot.backup + +# Rulează onboarding fresh +clawdbot onboard +``` + +--- + +## Legături Utile + +- **Proxmox Index:** `../README.md` +- **Documentație MoltBot:** https://docs.molt.bot +- **MoltBot oficial:** https://molt.bot +- **Ghid deployment:** https://merox.dev/blog/moltbot-proxmox-deployment/ + +--- + +**Data setup:** 2026-01-29 +**Ultima actualizare:** 2026-07-31 (host pve1, DNS explicit, zram — incident DNS/OOM) +**Autor:** Claude Code diff --git a/proxmox/lxc171-claude-agent/README.md b/proxmox/lxc171-claude-agent/README.md index 6cd2d32..b52a1d3 100644 --- a/proxmox/lxc171-claude-agent/README.md +++ b/proxmox/lxc171-claude-agent/README.md @@ -1,463 +1,467 @@ -# LXC 171 - Claude Agent (Development Environment) - -**Director:** `proxmox/lxc171-claude-agent/` -**VMID:** 171 -**IP:** 10.0.20.171 (intern) | 100.95.55.51 (Tailscale) -**Host Proxmox:** pvemini (10.0.20.201) -**Rol:** Mediu de dezvoltare izolat pentru Claude Code - ---- - -## Scripturi Disponibile - -| Script | Descriere | -|--------|-----------| -| `scripts/start-agent.sh` | Pornește/atașează sesiune tmux "agent" | -| `scripts/work.sh` | Meniu interactiv pentru workflow complet | -| `scripts/new-task.sh` | Creează branch nou pentru task | -| `scripts/finish-task.sh` | Finalizează task (commit + push) | -| `scripts/reap-orphans.sh` | Curăță procese vscode-server orfane + sesiuni zombie (cron, anti-OOM) | -| `discord-bridge/` | Punte Discord → Claude Code: comanzi containerul dintr-un guild privat ([README](discord-bridge/README.md)) | -| `discord-bridge/dashboard/` | Dashboard de control al punții: stare, restart, orfani, confirmări ([README](discord-bridge/dashboard/README.md)) | - ---- - -## Informații Container - -| Parametru | Valoare | -|-----------|---------| -| VMID | 171 | -| Hostname | claude-agent | -| IP intern | 10.0.20.171 | -| IP Tailscale | 100.95.55.51 | -| Host Proxmox | pvemini (10.0.20.201) | -| User | claude | -| Storage | local-zfs (32GB) | -| RAM | 16GB (swap 8GB — vezi nota OOM mai jos) | -| CPU | 4 cores | - -## Componente Instalate - -- Ubuntu 24.04 LTS -- Node.js v20.x (via nvm) -- Claude Code -- tmux -- Git (configurat pentru Gitea) -- Tailscale - -## Conectare - -### De pe calculator (rețea internă) -```bash -ssh claude@10.0.20.171 -``` - -### De pe telefon/exterior (Tailscale) -```bash -ssh claude@100.95.55.51 -``` - -### VS Code Remote SSH -Config în `~/.ssh/config`: -``` -Host claude-agent - HostName 10.0.20.171 - User claude -``` - -## Scripturi Workflow - -### start-agent.sh -Pornește sau se atașează la sesiunea tmux "agent". - -```bash -~/start-agent.sh -``` - -### work.sh (recomandat) -Meniu interactiv pentru workflow complet: -- Listează proiectele disponibile în /workspace -- Permite crearea de branch-uri noi -- Continuarea pe branch-uri existente -- Finalizare task (commit + push) -- Vizualizare branch-uri - -```bash -~/work.sh -``` - -### new-task.sh -Creează branch nou pentru un task (hardcodat pentru romfastsql). - -```bash -~/new-task.sh fix/nume-bug -``` - -### finish-task.sh -Finalizează task-ul curent (commit + push). - -```bash -~/finish-task.sh -``` - -## Workflow Complet - -### De pe telefon (JuiceSSH + Tailscale) - -1. Conectează-te la `100.95.55.51` cu user `claude` -2. Rulează: -```bash -~/start-agent.sh # pornește tmux -~/work.sh # meniu interactiv -``` -3. Alege proiectul -4. Alege acțiunea (task nou / continuă / finalizează) -5. Lucrează cu Claude Code -6. Când termini: `~/work.sh` → opțiunea 3 (finalizează) - -### De pe calculator (VS Code) - -1. VS Code → Remote SSH → `claude-agent` -2. Open Folder → `/workspace/` -3. Terminal → `source ~/.nvm/nvm.sh && claude` - -## Structura Directoare pe LXC - -``` -/home/claude/ -├── .ssh/ -│ ├── authorized_keys # Chei SSH pentru acces -│ ├── gitea_ed25519 # Cheie pentru Gitea -│ └── config # Config SSH pentru Gitea -├── .nvm/ # Node Version Manager -├── .claude/ -│ └── settings.json # Permisiuni Claude Code -├── .tmux.conf # Configurare tmux -├── start-agent.sh -> /workspace/start-agent.sh -└── work.sh -> /workspace/work.sh - -/workspace/ -├── start-agent.sh # Script pornire tmux -├── work.sh # Script workflow interactiv -├── new-task.sh # Script creare branch -├── finish-task.sh # Script finalizare task -├── CLAUDE.md # Info agent -├── SETUP-COMPLETE.md # Documentație setup -├── romfastsql/ # Proiect clonat -└── test/ # Alte proiecte -``` - -## Comenzi tmux Utile - -| Comandă | Acțiune | -|---------|---------| -| `Ctrl+A, d` | Detașare din sesiune | -| `Ctrl+A, c` | Fereastră nouă | -| `Ctrl+A, n` | Fereastră următoare | -| `Ctrl+A, p` | Fereastră anterioară | -| `Ctrl+A, [` | Mod scroll (q pentru ieșire) | -| `tmux attach -t agent` | Reatașare la sesiune | -| `tmux ls` | Listare sesiuni | - -## Git / Gitea - -### Clonare proiect nou -```bash -cd /workspace -git clone git@gitea.romfast.ro:romfast/.git -``` - -### Workflow branch-uri -```bash -git checkout main -git pull -git checkout -b feature/nume-feature -# ... lucrezi ... -git add . -git commit -m "descriere" -git push -u origin feature/nume-feature -# Creează Pull Request în Gitea -``` - -## Memorie & OOM (reaping orfane + zram) - -### Context (incident 2026-06-24) - -Containerul a generat OOM-uri repetate, izolate în cgroup-ul `/lxc/171` (NU la nivel de -host — host-ul avea memorie liberă). Cauzele combinate: - -1. **Swap fictiv:** LXC 171 are `memory: 16384` + `swap: 8192`, dar host-ul **pvemini nu - avea swap deloc** → swap-ul containerului nu era backed de nimic. La atingerea celor - 16GB se intra direct în OOM-kill, fără să poată face swap-out. Victimele tipice erau - procese mici cu `oom_score_adj` ridicat (`systemd`, `dbus-daemon`, `at-spi-bus-laun`, - `sd-pam`) din sesiunile `user@1000`. -2. **Acumulare de fond:** forks `~/.vscode-server` (servere VS Code Remote-SSH) rămase - orfane după ce conexiunea SSH moare — reparentate la init (PPID=1), vechi de zile — plus - sesiuni `systemd-logind` blocate în stare `closing`. Un spike ocazional de - Chromium/Playwright împingea totalul peste 16GB → OOM. - -### Fix 1 — zram swap pe host (pvemini) - -Root-ul pvemini e pe **ZFS**, deci **NU** se folosește swapfile (risc de deadlock). În loc, -zram (swap comprimat în RAM): - -```bash -# pe pvemini (host) -apt install -y zram-tools -cat > /etc/default/zramswap <<'EOF' -ALGO=zstd -SIZE=8192 -PRIORITY=100 -EOF -systemctl restart zramswap.service # enabled persistent la boot -zramctl; swapon --show # verificare: /dev/zram0 8G zstd -``` - -Acum cei 8GB `swap` din configul LXC 171 au backing real → vârfurile tranzitorii fac -swap-out în loc de OOM-kill instant. - -> **Același fix aplicat pe pve1 în 2026-07-31** (aceeași cauză: LXC 110 moltbot cu -> `swap: 4096` fictiv → OOM-kill în cgroup + reboot). Config identic, `SIZE=8192`. -> Vezi `../cluster/incidents/2026-07-31-lxc110-dns-tailscale-oom.md`. - -**Stare swap pe cluster (2026-07-31):** - -| Nod | Swap | Tip | -|-----|------|-----| -| pvemini | 8G | zram0 (zstd, prio 100) | -| pve1 | 8G | zram0 (zstd, prio 100) | -| pveelite | 8G | zvol `/dev/zd64` (prio -2) — swap real, nu necesită zram | - -### Fix 2 — reaping orfane (`scripts/reap-orphans.sh`, cron în 171) - -Script conservator care rulează ca root **în interiorul containerului**, la fiecare 6 ore: - -- omoară forks `~/.vscode-server` reparentate la init (PPID=1) **și** mai vechi de 24h - (conexiune SSH moartă); -- termină sesiunile `logind` în stare `closing` cu leader mort (`leader=0`). - -Exclude explicit daemonul de bază `/usr/lib/code-server` (lansat de ttyd) și procesele -Claude Code (pot fi task-uri lungi legitime). Log în `/var/log/reap-orphans.log`. - -```bash -# instalare în container (din host) -pct push 171 reap-orphans.sh /usr/local/sbin/reap-orphans.sh # sau deploy manual -pct exec 171 -- chmod +x /usr/local/sbin/reap-orphans.sh -# cron: /etc/cron.d/reap-orphans -> 0 */6 * * * root /usr/local/sbin/reap-orphans.sh - -# rulare manuală + verificare -pct exec 171 -- /usr/local/sbin/reap-orphans.sh -pct exec 171 -- tail /var/log/reap-orphans.log -``` - -> ⚠️ **NU** folosi `loginctl terminate-session` pe sesiuni `closing` care au `leader != 0` — -> acelea pot fi sesiuni VS Code remote active de lucru. Doar zombiile cu `leader=0` sunt -> sigure (asta verifică și scriptul automat). - -### Diagnostic rapid OOM - -```bash -# pe host: confirmă că OOM e în cgroup-ul containerului, nu pe host -ssh root@10.0.20.201 "journalctl -k --since '1 hour ago' | grep -iE 'oom_memcg|Killed process'" -cat /sys/fs/cgroup/lxc/171/memory.events # oom / oom_kill counters -cat /sys/fs/cgroup/lxc/171/memory.current # consum curent vs memory.max (16G) - -# în container: top consumatori + orfani + sesiuni -pct exec 171 -- bash -c "ps -eo pid,ppid,etimes,rss,comm --sort=-rss | head -20" -pct exec 171 -- loginctl list-sessions -``` - ---- - -## Troubleshooting - -### Claude Code nu pornește -```bash -source ~/.nvm/nvm.sh -which claude -claude --version -``` - -### tmux nu găsește sesiunea -```bash -tmux ls -tmux new -s agent -c /workspace -``` - -### Git clone eșuează -```bash -# Testează conexiunea SSH la Gitea -ssh -T git@gitea.romfast.ro -``` - -### Tailscale nu funcționează -```bash -sudo systemctl status tailscaled -sudo tailscale status -tailscale ip -``` - -## Instalare Claude Code pe LXC nou (de la zero) - -### 1. Creare LXC în Proxmox -```bash -# Pe Proxmox host (ex: pveelite) -pct create local:vztmpl/ubuntu-24.04-standard_24.04-2_amd64.tar.zst \ - --hostname claude-agent \ - --memory 4096 \ - --cores 2 \ - --rootfs local-zfs:32 \ - --net0 name=eth0,bridge=vmbr0,ip=dhcp \ - --features nesting=1 \ - --unprivileged 1 - -pct start -pct enter -``` - -### 2. Setup sistem (ca root în LXC) -```bash -# Update și pachete de bază -apt update && apt upgrade -y -apt install -y curl git tmux sudo - -# Creare user claude -useradd -m -s /bin/bash claude -echo "claude ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/claude -passwd claude # setează parola - -# Creare /workspace -mkdir -p /workspace -chown claude:claude /workspace -``` - -### 3. Setup user claude -```bash -su - claude - -# Instalare nvm + Node.js -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash -source ~/.bashrc -nvm install 20 -nvm use 20 -nvm alias default 20 - -# Instalare Claude Code -npm install -g @anthropic-ai/claude-code - -# Verificare -claude --version -``` - -### 4. Configurare Claude Code -```bash -mkdir -p ~/.claude -cat > ~/.claude/settings.json << 'EOF' -{ - "permissions": { - "allow": [ - "Bash(git *)", - "Bash(npm *)", - "Bash(node *)", - "Read", - "Write", - "Edit" - ], - "deny": [] - } -} -EOF -``` - -### 5. Configurare tmux -```bash -cat > ~/.tmux.conf << 'EOF' -set -g prefix C-a -unbind C-b -bind C-a send-prefix -set -g mouse on -set -g history-limit 50000 -set -g default-terminal "screen-256color" -EOF -``` - -### 6. Configurare Git + SSH pentru Gitea -```bash -# Generare cheie SSH -ssh-keygen -t ed25519 -f ~/.ssh/gitea_ed25519 -N "" - -# Config SSH -cat > ~/.ssh/config << 'EOF' -Host gitea.romfast.ro - HostName gitea.romfast.ro - User git - IdentityFile ~/.ssh/gitea_ed25519 - IdentitiesOnly yes -EOF -chmod 600 ~/.ssh/config - -# Afișează cheia publică (adaug-o în Gitea → Settings → SSH Keys) -cat ~/.ssh/gitea_ed25519.pub - -# Config Git -git config --global user.name "Claude Agent" -git config --global user.email "claude@romfast.ro" -git config --global init.defaultBranch main -``` - -### 7. Instalare scripturi workflow -```bash -cd /workspace - -# Copiază scripturile din acest repo (de pe mașina locală) -# SAU creează-le manual conform secțiunii "Scripturi Disponibile" - -# Creare symlink-uri -ln -s /workspace/start-agent.sh ~/start-agent.sh -ln -s /workspace/work.sh ~/work.sh - -chmod +x /workspace/*.sh -``` - -### 8. (Opțional) Instalare Tailscale -```bash -curl -fsSL https://tailscale.com/install.sh | sh -sudo tailscale up -# Autentifică-te cu contul Tailscale -tailscale ip # notează IP-ul -``` - -### 9. Clonare proiecte -```bash -cd /workspace -git clone git@gitea.romfast.ro:romfast/romfastsql.git -# alte proiecte... -``` - -### 10. Test final -```bash -~/start-agent.sh -# În tmux: -source ~/.nvm/nvm.sh -claude --version -~/work.sh -``` - -### Copiere rapidă scripturi (dacă ai alt LXC configurat) -```bash -# De pe mașina locală -scp proxmox/lxc171-claude-agent/scripts/*.sh claude@:/workspace/ -ssh claude@ "chmod +x /workspace/*.sh && ln -sf /workspace/start-agent.sh ~/start-agent.sh && ln -sf /workspace/work.sh ~/work.sh" -``` - ---- - -## Legături Utile - -- **Proxmox Index:** `../README.md` -- **Gitea:** https://gitea.romfast.ro - ---- - -**Data setup:** 2025-12-31 -**Ultima actualizare:** 2026-06-24 (zram swap pvemini + reap-orphans cron, anti-OOM) +# LXC 171 - Claude Agent (Development Environment) + +> **Care chatbot e care?** Exista trei lucruri numite „Maria", doi boti pe Discord si +> doua punti WhatsApp legate la acelasi numar. Inainte de a depana, citeste +> [`docs/chatboti-si-punti.md`](../../docs/chatboti-si-punti.md) — spune care instanta raspunde de fapt. + +**Director:** `proxmox/lxc171-claude-agent/` +**VMID:** 171 +**IP:** 10.0.20.171 (intern) | 100.95.55.51 (Tailscale) +**Host Proxmox:** pvemini (10.0.20.201) +**Rol:** Mediu de dezvoltare izolat pentru Claude Code + +--- + +## Scripturi Disponibile + +| Script | Descriere | +|--------|-----------| +| `scripts/start-agent.sh` | Pornește/atașează sesiune tmux "agent" | +| `scripts/work.sh` | Meniu interactiv pentru workflow complet | +| `scripts/new-task.sh` | Creează branch nou pentru task | +| `scripts/finish-task.sh` | Finalizează task (commit + push) | +| `scripts/reap-orphans.sh` | Curăță procese vscode-server orfane + sesiuni zombie (cron, anti-OOM) | +| `discord-bridge/` | Punte Discord → Claude Code: comanzi containerul dintr-un guild privat ([README](discord-bridge/README.md)) | +| `discord-bridge/dashboard/` | Dashboard de control al punții: stare, restart, orfani, confirmări ([README](discord-bridge/dashboard/README.md)) | + +--- + +## Informații Container + +| Parametru | Valoare | +|-----------|---------| +| VMID | 171 | +| Hostname | claude-agent | +| IP intern | 10.0.20.171 | +| IP Tailscale | 100.95.55.51 | +| Host Proxmox | pvemini (10.0.20.201) | +| User | claude | +| Storage | local-zfs (32GB) | +| RAM | 16GB (swap 8GB — vezi nota OOM mai jos) | +| CPU | 4 cores | + +## Componente Instalate + +- Ubuntu 24.04 LTS +- Node.js v20.x (via nvm) +- Claude Code +- tmux +- Git (configurat pentru Gitea) +- Tailscale + +## Conectare + +### De pe calculator (rețea internă) +```bash +ssh claude@10.0.20.171 +``` + +### De pe telefon/exterior (Tailscale) +```bash +ssh claude@100.95.55.51 +``` + +### VS Code Remote SSH +Config în `~/.ssh/config`: +``` +Host claude-agent + HostName 10.0.20.171 + User claude +``` + +## Scripturi Workflow + +### start-agent.sh +Pornește sau se atașează la sesiunea tmux "agent". + +```bash +~/start-agent.sh +``` + +### work.sh (recomandat) +Meniu interactiv pentru workflow complet: +- Listează proiectele disponibile în /workspace +- Permite crearea de branch-uri noi +- Continuarea pe branch-uri existente +- Finalizare task (commit + push) +- Vizualizare branch-uri + +```bash +~/work.sh +``` + +### new-task.sh +Creează branch nou pentru un task (hardcodat pentru romfastsql). + +```bash +~/new-task.sh fix/nume-bug +``` + +### finish-task.sh +Finalizează task-ul curent (commit + push). + +```bash +~/finish-task.sh +``` + +## Workflow Complet + +### De pe telefon (JuiceSSH + Tailscale) + +1. Conectează-te la `100.95.55.51` cu user `claude` +2. Rulează: +```bash +~/start-agent.sh # pornește tmux +~/work.sh # meniu interactiv +``` +3. Alege proiectul +4. Alege acțiunea (task nou / continuă / finalizează) +5. Lucrează cu Claude Code +6. Când termini: `~/work.sh` → opțiunea 3 (finalizează) + +### De pe calculator (VS Code) + +1. VS Code → Remote SSH → `claude-agent` +2. Open Folder → `/workspace/` +3. Terminal → `source ~/.nvm/nvm.sh && claude` + +## Structura Directoare pe LXC + +``` +/home/claude/ +├── .ssh/ +│ ├── authorized_keys # Chei SSH pentru acces +│ ├── gitea_ed25519 # Cheie pentru Gitea +│ └── config # Config SSH pentru Gitea +├── .nvm/ # Node Version Manager +├── .claude/ +│ └── settings.json # Permisiuni Claude Code +├── .tmux.conf # Configurare tmux +├── start-agent.sh -> /workspace/start-agent.sh +└── work.sh -> /workspace/work.sh + +/workspace/ +├── start-agent.sh # Script pornire tmux +├── work.sh # Script workflow interactiv +├── new-task.sh # Script creare branch +├── finish-task.sh # Script finalizare task +├── CLAUDE.md # Info agent +├── SETUP-COMPLETE.md # Documentație setup +├── romfastsql/ # Proiect clonat +└── test/ # Alte proiecte +``` + +## Comenzi tmux Utile + +| Comandă | Acțiune | +|---------|---------| +| `Ctrl+A, d` | Detașare din sesiune | +| `Ctrl+A, c` | Fereastră nouă | +| `Ctrl+A, n` | Fereastră următoare | +| `Ctrl+A, p` | Fereastră anterioară | +| `Ctrl+A, [` | Mod scroll (q pentru ieșire) | +| `tmux attach -t agent` | Reatașare la sesiune | +| `tmux ls` | Listare sesiuni | + +## Git / Gitea + +### Clonare proiect nou +```bash +cd /workspace +git clone git@gitea.romfast.ro:romfast/.git +``` + +### Workflow branch-uri +```bash +git checkout main +git pull +git checkout -b feature/nume-feature +# ... lucrezi ... +git add . +git commit -m "descriere" +git push -u origin feature/nume-feature +# Creează Pull Request în Gitea +``` + +## Memorie & OOM (reaping orfane + zram) + +### Context (incident 2026-06-24) + +Containerul a generat OOM-uri repetate, izolate în cgroup-ul `/lxc/171` (NU la nivel de +host — host-ul avea memorie liberă). Cauzele combinate: + +1. **Swap fictiv:** LXC 171 are `memory: 16384` + `swap: 8192`, dar host-ul **pvemini nu + avea swap deloc** → swap-ul containerului nu era backed de nimic. La atingerea celor + 16GB se intra direct în OOM-kill, fără să poată face swap-out. Victimele tipice erau + procese mici cu `oom_score_adj` ridicat (`systemd`, `dbus-daemon`, `at-spi-bus-laun`, + `sd-pam`) din sesiunile `user@1000`. +2. **Acumulare de fond:** forks `~/.vscode-server` (servere VS Code Remote-SSH) rămase + orfane după ce conexiunea SSH moare — reparentate la init (PPID=1), vechi de zile — plus + sesiuni `systemd-logind` blocate în stare `closing`. Un spike ocazional de + Chromium/Playwright împingea totalul peste 16GB → OOM. + +### Fix 1 — zram swap pe host (pvemini) + +Root-ul pvemini e pe **ZFS**, deci **NU** se folosește swapfile (risc de deadlock). În loc, +zram (swap comprimat în RAM): + +```bash +# pe pvemini (host) +apt install -y zram-tools +cat > /etc/default/zramswap <<'EOF' +ALGO=zstd +SIZE=8192 +PRIORITY=100 +EOF +systemctl restart zramswap.service # enabled persistent la boot +zramctl; swapon --show # verificare: /dev/zram0 8G zstd +``` + +Acum cei 8GB `swap` din configul LXC 171 au backing real → vârfurile tranzitorii fac +swap-out în loc de OOM-kill instant. + +> **Același fix aplicat pe pve1 în 2026-07-31** (aceeași cauză: LXC 110 moltbot cu +> `swap: 4096` fictiv → OOM-kill în cgroup + reboot). Config identic, `SIZE=8192`. +> Vezi `../cluster/incidents/2026-07-31-lxc110-dns-tailscale-oom.md`. + +**Stare swap pe cluster (2026-07-31):** + +| Nod | Swap | Tip | +|-----|------|-----| +| pvemini | 8G | zram0 (zstd, prio 100) | +| pve1 | 8G | zram0 (zstd, prio 100) | +| pveelite | 8G | zvol `/dev/zd64` (prio -2) — swap real, nu necesită zram | + +### Fix 2 — reaping orfane (`scripts/reap-orphans.sh`, cron în 171) + +Script conservator care rulează ca root **în interiorul containerului**, la fiecare 6 ore: + +- omoară forks `~/.vscode-server` reparentate la init (PPID=1) **și** mai vechi de 24h + (conexiune SSH moartă); +- termină sesiunile `logind` în stare `closing` cu leader mort (`leader=0`). + +Exclude explicit daemonul de bază `/usr/lib/code-server` (lansat de ttyd) și procesele +Claude Code (pot fi task-uri lungi legitime). Log în `/var/log/reap-orphans.log`. + +```bash +# instalare în container (din host) +pct push 171 reap-orphans.sh /usr/local/sbin/reap-orphans.sh # sau deploy manual +pct exec 171 -- chmod +x /usr/local/sbin/reap-orphans.sh +# cron: /etc/cron.d/reap-orphans -> 0 */6 * * * root /usr/local/sbin/reap-orphans.sh + +# rulare manuală + verificare +pct exec 171 -- /usr/local/sbin/reap-orphans.sh +pct exec 171 -- tail /var/log/reap-orphans.log +``` + +> ⚠️ **NU** folosi `loginctl terminate-session` pe sesiuni `closing` care au `leader != 0` — +> acelea pot fi sesiuni VS Code remote active de lucru. Doar zombiile cu `leader=0` sunt +> sigure (asta verifică și scriptul automat). + +### Diagnostic rapid OOM + +```bash +# pe host: confirmă că OOM e în cgroup-ul containerului, nu pe host +ssh root@10.0.20.201 "journalctl -k --since '1 hour ago' | grep -iE 'oom_memcg|Killed process'" +cat /sys/fs/cgroup/lxc/171/memory.events # oom / oom_kill counters +cat /sys/fs/cgroup/lxc/171/memory.current # consum curent vs memory.max (16G) + +# în container: top consumatori + orfani + sesiuni +pct exec 171 -- bash -c "ps -eo pid,ppid,etimes,rss,comm --sort=-rss | head -20" +pct exec 171 -- loginctl list-sessions +``` + +--- + +## Troubleshooting + +### Claude Code nu pornește +```bash +source ~/.nvm/nvm.sh +which claude +claude --version +``` + +### tmux nu găsește sesiunea +```bash +tmux ls +tmux new -s agent -c /workspace +``` + +### Git clone eșuează +```bash +# Testează conexiunea SSH la Gitea +ssh -T git@gitea.romfast.ro +``` + +### Tailscale nu funcționează +```bash +sudo systemctl status tailscaled +sudo tailscale status +tailscale ip +``` + +## Instalare Claude Code pe LXC nou (de la zero) + +### 1. Creare LXC în Proxmox +```bash +# Pe Proxmox host (ex: pveelite) +pct create local:vztmpl/ubuntu-24.04-standard_24.04-2_amd64.tar.zst \ + --hostname claude-agent \ + --memory 4096 \ + --cores 2 \ + --rootfs local-zfs:32 \ + --net0 name=eth0,bridge=vmbr0,ip=dhcp \ + --features nesting=1 \ + --unprivileged 1 + +pct start +pct enter +``` + +### 2. Setup sistem (ca root în LXC) +```bash +# Update și pachete de bază +apt update && apt upgrade -y +apt install -y curl git tmux sudo + +# Creare user claude +useradd -m -s /bin/bash claude +echo "claude ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/claude +passwd claude # setează parola + +# Creare /workspace +mkdir -p /workspace +chown claude:claude /workspace +``` + +### 3. Setup user claude +```bash +su - claude + +# Instalare nvm + Node.js +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash +source ~/.bashrc +nvm install 20 +nvm use 20 +nvm alias default 20 + +# Instalare Claude Code +npm install -g @anthropic-ai/claude-code + +# Verificare +claude --version +``` + +### 4. Configurare Claude Code +```bash +mkdir -p ~/.claude +cat > ~/.claude/settings.json << 'EOF' +{ + "permissions": { + "allow": [ + "Bash(git *)", + "Bash(npm *)", + "Bash(node *)", + "Read", + "Write", + "Edit" + ], + "deny": [] + } +} +EOF +``` + +### 5. Configurare tmux +```bash +cat > ~/.tmux.conf << 'EOF' +set -g prefix C-a +unbind C-b +bind C-a send-prefix +set -g mouse on +set -g history-limit 50000 +set -g default-terminal "screen-256color" +EOF +``` + +### 6. Configurare Git + SSH pentru Gitea +```bash +# Generare cheie SSH +ssh-keygen -t ed25519 -f ~/.ssh/gitea_ed25519 -N "" + +# Config SSH +cat > ~/.ssh/config << 'EOF' +Host gitea.romfast.ro + HostName gitea.romfast.ro + User git + IdentityFile ~/.ssh/gitea_ed25519 + IdentitiesOnly yes +EOF +chmod 600 ~/.ssh/config + +# Afișează cheia publică (adaug-o în Gitea → Settings → SSH Keys) +cat ~/.ssh/gitea_ed25519.pub + +# Config Git +git config --global user.name "Claude Agent" +git config --global user.email "claude@romfast.ro" +git config --global init.defaultBranch main +``` + +### 7. Instalare scripturi workflow +```bash +cd /workspace + +# Copiază scripturile din acest repo (de pe mașina locală) +# SAU creează-le manual conform secțiunii "Scripturi Disponibile" + +# Creare symlink-uri +ln -s /workspace/start-agent.sh ~/start-agent.sh +ln -s /workspace/work.sh ~/work.sh + +chmod +x /workspace/*.sh +``` + +### 8. (Opțional) Instalare Tailscale +```bash +curl -fsSL https://tailscale.com/install.sh | sh +sudo tailscale up +# Autentifică-te cu contul Tailscale +tailscale ip # notează IP-ul +``` + +### 9. Clonare proiecte +```bash +cd /workspace +git clone git@gitea.romfast.ro:romfast/romfastsql.git +# alte proiecte... +``` + +### 10. Test final +```bash +~/start-agent.sh +# În tmux: +source ~/.nvm/nvm.sh +claude --version +~/work.sh +``` + +### Copiere rapidă scripturi (dacă ai alt LXC configurat) +```bash +# De pe mașina locală +scp proxmox/lxc171-claude-agent/scripts/*.sh claude@:/workspace/ +ssh claude@ "chmod +x /workspace/*.sh && ln -sf /workspace/start-agent.sh ~/start-agent.sh && ln -sf /workspace/work.sh ~/work.sh" +``` + +--- + +## Legături Utile + +- **Proxmox Index:** `../README.md` +- **Gitea:** https://gitea.romfast.ro + +--- + +**Data setup:** 2025-12-31 +**Ultima actualizare:** 2026-06-24 (zram swap pvemini + reap-orphans cron, anti-OOM) diff --git a/proxmox/lxc171-claude-agent/discord-bridge/README.md b/proxmox/lxc171-claude-agent/discord-bridge/README.md index 90b5db0..62cc1a4 100644 --- a/proxmox/lxc171-claude-agent/discord-bridge/README.md +++ b/proxmox/lxc171-claude-agent/discord-bridge/README.md @@ -1,5 +1,9 @@ # Punte Discord -> Claude Code (LXC 171) +> **Care chatbot e care?** Exista trei lucruri numite „Maria", doi boti pe Discord si +> doua punti WhatsApp legate la acelasi numar. Inainte de a depana, citeste +> [`docs/chatboti-si-punti.md`](../../../docs/chatboti-si-punti.md) — spune care instanta raspunde de fapt. + Un bot Discord subtire care duce mesajele dintr-un guild privat catre CLI-ul `claude` care ruleaza pe containerul de dezvoltare **LXC 171 (claude-agent, 10.0.20.171)**, si aduce raspunsurile inapoi. Practic: acelasi Claude Code cu care lucrezi in terminal, diff --git a/proxmox/lxc171-claude-agent/maria-whatsapp-bridge/README.md b/proxmox/lxc171-claude-agent/maria-whatsapp-bridge/README.md index 2562426..0ff64ec 100644 --- a/proxmox/lxc171-claude-agent/maria-whatsapp-bridge/README.md +++ b/proxmox/lxc171-claude-agent/maria-whatsapp-bridge/README.md @@ -1,5 +1,9 @@ # Punte WhatsApp + RAG pentru Maria (LXC 171) +> **Care chatbot e care?** Exista trei lucruri numite „Maria", doi boti pe Discord si +> doua punti WhatsApp legate la acelasi numar. Inainte de a depana, citeste +> [`docs/chatboti-si-punti.md`](../../../docs/chatboti-si-punti.md) — spune care instanta raspunde de fapt. + Bot de suport ROA pe WhatsApp: puntea WhatsApp (Baileys) primeste mesajele, consumer-ul RAG raspunde folosind DOAR informatiile dintr-un depozit de documente indexat cu embeddings (Ollama). Controlul (start/stop/restart,