From ab9dbef9988ee7ae674ec9bf8ac5cc6b16720781 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Sun, 13 Sep 2026 10:19:06 +0000 Subject: [PATCH] docs: infrastructura din dashboard si /infra, acces agenti pe statia de birou si 10.0.20.36 Lantul de pornire nou: JuiceSSH -> 10.0.20.36 -> C:\wolcluster.bat. Cheia moltbot in docs/chei-publice. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01KddsXCqEbKMhdFJDYbAsx8 --- CLAUDE.md | 2 + docs/acces-agenti-windows-birou-server36.md | 56 ++++++++++++++ docs/chei-publice/moltbot-lxc110.pub | 1 + .../docs/oprire-planificata-cluster.md | 45 +++++++++++ proxmox/cluster/ups/README.md | 7 ++ .../discord-bridge/dashboard/README.md | 76 ++++++++++++++++++- 6 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 docs/acces-agenti-windows-birou-server36.md create mode 100644 docs/chei-publice/moltbot-lxc110.pub diff --git a/CLAUDE.md b/CLAUDE.md index 2d00e47..e740158 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -49,6 +49,7 @@ input/ # Oracle DMP files for import - **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` +- **Infrastructură din dashboard și Discord (`/infra`): stare cluster, oprire/pornire, UPS, DR VM 109, failover backup Oracle**: `proxmox/lxc171-claude-agent/discord-bridge/dashboard/README.md#tab-infrastructură` - **Supliment GLM (Z.AI) pentru plafonul săptămânal Max 5x — analiză de consum, cifre și mecanism verificat**: `docs/supliment-glm-zai.md` - **Disaster recovery**: `proxmox/vm109-windows-dr/README.md` - **Instalare/migrare Oracle — care director se folosește**: `proxmox/lxc108-oracle/docs/instalare-si-migrare-oracle.md` @@ -61,6 +62,7 @@ input/ # Oracle DMP files for import - **VM 302 test environment for ROA setup**: `proxmox/vm302-oracle-test/README.md` - **Diagnostic spațiu Oracle la clienți (job zilnic + emailuri)**: `docs/diagnostic-spatiu-clienti.md` - **Monitorizare UPS pe serverul Oracle de producție 10.0.20.36 (înlocuiește ViewPower)**: `docs/ups-server36-monitorizare.md` +- **Cu ce useri intră agenții (LXC 171, moltbot) pe stația de birou și pe serverul 10.0.20.36; WoL pentru cluster (`C:\wolcluster.bat`)**: `docs/acces-agenti-windows-birou-server36.md` - **Acces SSH la clienți cu chei publice (angajați noi)**: `docs/acces-ssh-chei-angajati.md` - **Acces administrativ la server client prin Tailscale + SSH (fără forward pe router)**: `docs/acces-client-tailscale-ssh.md` - **Conectarea unui container headless la Google Drive prin rclone (fără cont de serviciu)**: `docs/rclone-google-drive-headless.md` diff --git a/docs/acces-agenti-windows-birou-server36.md b/docs/acces-agenti-windows-birou-server36.md new file mode 100644 index 0000000..a267567 --- /dev/null +++ b/docs/acces-agenti-windows-birou-server36.md @@ -0,0 +1,56 @@ +# Cu ce useri intră agenții pe stația de birou și pe serverul 10.0.20.36 + +Pentru agentul Claude de pe LXC 171 (dashboard și puntea Discord) și pentru botul de pe LXC 110 +(moltbot/echo). Verificat pe 2026-09-13. + +## Cheile publice ale agenților + +| Agent | Unde e cheia privată | Cheie publică (în repo) | Amprentă | +|-------|-------------------|--------------------|----------| +| Claude, LXC 171 | `claude@10.0.20.171:~/.ssh/id_ed25519` | `docs/chei-publice/claude-agent-lxc171.pub` | `SHA256:5D7y0lTqWKf6e2agUK0Nol+duxoipPYb3y6Rhk4nXtw` | +| echo, LXC 110 moltbot | `moltbot@10.0.20.173:~/.ssh/id_ed25519` | `docs/chei-publice/moltbot-lxc110.pub` | `SHA256:78cKGdM3NM19PFKDMIM2T666pK8+h8xmjaCsywBsSxU` | +| deploy roa2web (LXC 171) | `claude@10.0.20.171:~/.ssh/roa2web_deploy` | — | — | + +## LENOVO-AIO-BIROU: 10.0.20.144, Tailscale `100.86.46.43` + +| User Windows | Port | Server SSH | Cheie autorizată | Drepturi | Comandă (de pe LXC 171) | +|--------------|------|------------|------------------|----------|--------------------------| +| `mmari` | 22 | OpenSSH nativ | `claude-agent-lxc171.pub` în `C:\Users\mmari\.ssh\authorized_keys` | userul lui Marius | `ssh mmari@10.0.20.144` | + +- Stația e de obicei oprită. Se trezește cu Wake-on-LAN (MAC `E4-A8-DF-97-2E-5C`), vezi + [acces-statie-birou-de-la-distanta.md](acces-statie-birou-de-la-distanta.md). Tot de acolo + se poate trezi și de pe .36, cu `C:\wolmarius.bat`. +- Shell-ul e PowerShell: comenzile se separă cu `;`, nu cu `&&`. +- Cheia moltbot **nu** e autorizată aici. + +## CARAPETRU-ROA (ROA-CARAPETRU2): 10.0.20.36, server Oracle de producție + +Serverul SSH e Bitvise SSH Server, pe portul **22122** (portul 22 nu răspunde). + +| User | Tip în Bitvise | Cheie autorizată | Drepturi Windows | Alias `~/.ssh/config` pe LXC 171 | +|------|----------------|------------------|------------------|-----------------------------------| +| `Administrator` | cont Windows | `claude-agent-lxc171.pub`, `moltbot-lxc110.pub` | administrator complet | `ssh oracle-prod-admin` | +| `romfast` | cont virtual (rulează ca `ROA-CARAPETRU2\BvSsh_VirtualUsers`) | `roa2web_deploy` | nu poate scrie în `C:\`; poate scrie doar în `C:\Users\BvSsh_VirtualUsers\` | `ssh roa2web-prod` | +| `dr-failover` | configurat de scripturile DR (neverificat 2026-09-13) | root de pe pvemini/pveelite (neverificat) | folosit de `failover-dr-to-pvemini.sh` pentru `D:\rman_backup\transfer_backups.ps1` | — (se folosește doar de pe noduri) | + +- **Moltbot → .36:** merge din 2026-09-13, cu `sudo -u moltbot ssh -p 22122 Administrator@10.0.20.36`. + Bitvise permite doar IP-urile trecute în listă. Un IP care lipsește primește + `kex_exchange_identification: Connection reset by peer` înainte de banner, deci înainte să se + verifice cheile. Remediul e să adaugi IP-ul în lista Bitvise (*Advanced settings → Access + control → Client connection rules*); 10.0.20.173 a fost adăugat. +- Cu `Administrator`, orice comandă trece ca acțiune pe producție. Puntea Discord cere + confirmare pe hostul `oracle-prod`. +- Toți userii virtuali Bitvise folosesc același cont Windows. Un drept dat pe `BvSsh_VirtualUsers` + îl primesc toți. + +### Fișiere de mentenanță pe .36 + +| Fișier | Ce face | +|--------|---------| +| `C:\WakeMeOnLan.exe` + `C:\WakeMeOnLan.cfg` | NirSoft WakeMeOnLan. În `.cfg` sunt și nodurile pve1/pvemini/pveelite (MAC și IP), deci `/wakeup ` merge pentru ele. | +| `C:\wolmarius.bat` | trezește stația de birou (10.0.20.144) | +| `C:\wolcluster.bat` | trezește cele 3 noduri Proxmox (.200, .201, .202), apoi face ping spre pvemini 90 s | + +Test fără efecte: pe un nod pornit, ascultă cu `tcpdump -ni vmbr0 udp port 40000`, apoi rulează +`c:\WakeMeOnLan.exe /wakeup ` pe .36. Trebuie să apară un pachet UDP de 102 octeți spre +10.0.20.255:40000, care conține MAC-ul nodului. diff --git a/docs/chei-publice/moltbot-lxc110.pub b/docs/chei-publice/moltbot-lxc110.pub new file mode 100644 index 0000000..0d0a27e --- /dev/null +++ b/docs/chei-publice/moltbot-lxc110.pub @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO8ULMGdacgLrW3YhNb3+bsUsP60LdEohwNPgpiRAdSE echo@moltbot diff --git a/proxmox/cluster/docs/oprire-planificata-cluster.md b/proxmox/cluster/docs/oprire-planificata-cluster.md index addd5de..4b5379a 100644 --- a/proxmox/cluster/docs/oprire-planificata-cluster.md +++ b/proxmox/cluster/docs/oprire-planificata-cluster.md @@ -8,6 +8,51 @@ mutare rack, mentenanță UPS, intervenții la switch. **Autor:** Claude Code · **Ultima verificare pe cluster live:** 2026-08-29 +--- + +## Varianta cea mai rapidă — din dashboard sau Discord `/infra` + +De preferat variantei de mai jos (stație de admin), pentru o oprire/pornire +simplă, fără lucrări la insula `10.10.10.0/24` sau la switch: + +1. **Oprire:** tab Infrastructură → *Oprește* (sau Discord `/infra + actiune:oprire`, confirmare). Rulează `cluster-shutdown.sh --allow-on-node + --yes` pe **pvemini**, lansat detașat prin `systemd-run` (vezi + [dashboard/README.md § Tab Infrastructură](../../lxc171-claude-agent/discord-bridge/dashboard/README.md#tab-infrastructur%C4%83)). + CT 171 (claude-agent) **rămâne pornit** — moare odată cu pvemini la + poweroff, iar `ha: shutdown_policy=freeze` îl repornește la revenirea + nodului. La final se postează (și se încearcă fixarea) în Discord un mesaj + cu instrucțiunile de pornire de mai jos + un email către + `mmarius28@gmail.com`. +2. **Pornire, când revine curentul:** + - JuiceSSH (prin Tailscale) → `10.0.20.36:22122` → rulează `C:\wolcluster.bat` + (vezi [docs/acces-agenti-windows-birou-server36.md](../../../docs/acces-agenti-windows-birou-server36.md) + pentru accesul pe .36 și alias-ul ssh `oracle-prod-admin` folosit și de + acțiunea `wol` din dashboard). + - Așteaptă mesajul „Cluster sus" în Discord (postat automat de + `infra_boot_check` când clusterul are iar cvorum, dar crontab-ul e încă + în mentenanță). + - Apasă *Pornește guest-urile* (buton pe mesajul din Discord, sau tab + Infrastructură → *Pornește*) — rulează `cluster-startup.sh + --allow-on-node --yes` pe pvemini. +3. **Dacă CT 171 nu revine** (dashboard/bot nu mai răspund după poweroff): + `ssh root@10.0.20.201 /opt/scripts/cluster-startup.sh --allow-on-node --yes` +4. **Fallback dacă WoL nu merge:** `wolmarius.bat` (de pe .36) trezește + stația de birou, apoi `wake-cluster.ps1` de acolo. + +`cluster-shutdown.sh`/`cluster-startup.sh` au acum flag-ul `--allow-on-node`, +care le permite să ruleze *pe* un nod (pvemini) în loc de pe stația de admin — +guard-ul care le blochează pe un nod Proxmox e condiționat de acest flag; CT +171 rămâne exclus din lista de oprire explicită (`KEEP_RUNNING=171`) și din +verificările de la pasul 7/8. Restul procedurii (varianta de pe stația de +admin, PowerShell/Bash, fără `--allow-on-node`) rămâne valabilă neschimbată — +vezi mai jos. + +tmux e acum instalat pe toate cele 3 noduri, pentru rulări manuale lungi din +consolă (nu e folosit de `--allow-on-node`, care lansează prin `systemd-run`). + +--- + > **Atenție, s-a schimbat ceva important pe 2026-08-29.** Clusterul are acum o rețea > dedicată, `10.10.10.0/24` („insula"), pe un switch separat — vezi > [switch 2.5G dedicat nodurilor](switch-2.5g-dedicat-noduri.md). De ea atârnă diff --git a/proxmox/cluster/ups/README.md b/proxmox/cluster/ups/README.md index fb3d1fc..afb1a2a 100644 --- a/proxmox/cluster/ups/README.md +++ b/proxmox/cluster/ups/README.md @@ -425,6 +425,13 @@ ssh root@10.0.20.201 "systemctl restart nut-server nut-monitor" ### Parole +**Notă (2026-09-13):** `ups-monthly-test.sh` și `ups-shutdown-cluster.sh` nu +mai au parola scrisă în script — o citesc din `/etc/nut/ups-shutdown.conf` +(`root:root`, `600`) la rulare. Parola rămâne însă neschimbată și e încă +prezentă în clar în `upsd.users`, `upsmon.conf` și în câteva docs din acest +director — mutarea a fost doar cosmetică pentru cele două scripturi; +**rotirea parolei efective nu s-a făcut**. + **IMPORTANT:** Schimbă parolele default! ```bash diff --git a/proxmox/lxc171-claude-agent/discord-bridge/dashboard/README.md b/proxmox/lxc171-claude-agent/discord-bridge/dashboard/README.md index 7b43468..6422b34 100644 --- a/proxmox/lxc171-claude-agent/discord-bridge/dashboard/README.md +++ b/proxmox/lxc171-claude-agent/discord-bridge/dashboard/README.md @@ -124,7 +124,81 @@ Inapoi la token: scoate `DASHBOARD_AUTH=off` din `~/.claude-discord/env` si reporneste serviciul. Doar `off`, `none`, `0` si `false` scot login-ul; orice alta valoare il pastreaza. -## Instalare +## Tab Infrastructură + +Al treilea tab (lângă Punte și Maria), aceeași logică folosită și de comanda +Discord `/infra` — un singur registru de acțiuni, `infra_actions.py`, cu doi +consumatori. + +### Registrul de acțiuni — `infra_actions.py` + +`ACTIONS: dict[str, dict]` e sursa unică de adevăr: id, `label`/`desc`, `host` +(`local`/`pvemini`/`pveelite`/`vm109`/`oracle-prod-admin`), `cmd`/`dry` (comanda +reală și, dacă există, varianta `--dry-run`), `job` (True → lansată prin +`systemd-run`, detașată; False → ssh sincron, timeout 120s), `confirm` (cere +confirmare explicită în UI/Discord) și `pre` (text descriptiv al precondiției). +Adăugarea unei acțiuni noi înseamnă o singură intrare aici — dashboard-ul și +botul o preiau automat (dashboard prin id, bot prin `app_commands.choices` +generat din `ACTIONS`). + +Funcțiile publice: `status(fresh=False)` (stare cluster, cache 30s), `check(id, +st, dry_run)` (precondiții, funcție pură), `run(id, dry_run)`, `stop(id)`, +`log_tail(id, n=60)`, `maintenance_pending(st)`, `post_startup_instructions()`. + +### Rute dashboard + +| Metodă | Rută | Ce face | +|---|---|---| +| GET | `/api/infra/status?fresh=1` | `infra_actions.status()`; `fresh=1` ocolește cache-ul de 30s | +| GET | `/api/infra/log?id=&n=` | ultimele linii din jurnalul acțiunii (`log_tail`) | +| POST | `/api/infra/run` | `{"id": "...", "dry_run": bool}` → `infra_actions.run()` | +| POST | `/api/infra/stop` | `{"id": "..."}` → oprește job-ul systemd-run al acțiunii | + +Fiecare `run`/`stop` scrie o linie în `infra.log` (`[actiune] infra +dry=, cerut de `) — identitatea vine din antetul Tailscale, ca la +restul dashboard-ului. **Citirea de stare ocolește `security/infra`** (ssh +direct, read-only, ca să nu umple jurnalul de acțiuni la fiecare 30 de +secunde); **acțiunile** trec toate prin `security/infra ""`, deci +apar în `infra.log` cu jurnalizarea obișnuită a wrapper-ului. + +### Joburi lungi — `systemd-run` pe nod, nu tmux + +tmux nu e instalat pe niciun nod Proxmox, așa că o acțiune cu `job: True` +pornește prin `security/infra "systemd-run --unit=infra- --collect +... /bin/bash -c ''"` — detașată de conexiunea ssh, cu stdout/stderr +redirectate în `/var/log/infra-actions/-.log`. `status()` +listează job-urile active (`systemctl list-units 'infra-*'`) și jurnalele +recente din acel director; tab-ul Infra le arată într-un banner cu buton +Jurnal (poll la 3s) și Oprește (`systemctl stop infra-`). + +### Precondiții + +Fiecare acțiune reală (nu `stare`/`sarcini`) are o precondiție verificată de +`check()` înainte de executare — de exemplu `oprire` cere cele 3 noduri +online + cvorum + niciun job activ; `backup-pe-pvemini` cere pveelite offline +și failover-ul încă neactiv. Un `run()` cu precondiția nefăcută întoarce +`412` fără să atingă rețeaua. `status()` include deja rezultatul `check()` +pentru fiecare id (`actions: {id: {ok, reason}}`), ca butoanele să se +dezactiveze direct din prima cerere de stare. + +### Fără oprire UPS reală + +Acțiunea `ups-simulare` rulează scriptul de shutdown la panică UPS cu +`--dry-run --force` — nimic nu se oprește cu adevărat. Nu există în registru +nicio acțiune care să declanșeze un test de baterie cu oprire efectivă a +clusterului; `ups-test` (testul lunar) descarcă bateria controlat, dar nu +oprește noduri. + +### Permisiunea Discord „Pin Messages" — momentan lipsă + +La `oprire` (nu în dry-run), `post_startup_instructions()` postează mesajul cu +instrucțiunile de pornire în primul canal configurat și încearcă să-l fixeze +(pin). Botul **nu are** azi permisiunea `Pin Messages` pe canal: mesajul se +postează oricum, dar `PUT .../pins/` întoarce 403, iar eșecul devine doar +un `warning` în răspunsul acțiunii (nu blochează oprirea). De dat botului +permisiunea `Pin Messages` pe canalul respectiv ca fixarea să funcționeze. + +### Instalare `ops/install.sh` face totul (leaga unitul, genereaza `DASHBOARD_TOKEN` daca lipseste, porneste serviciul). Manual: