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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KddsXCqEbKMhdFJDYbAsx8
This commit is contained in:
Claude Agent
2026-09-13 10:19:06 +00:00
parent c87fa06b55
commit ab9dbef998
6 changed files with 186 additions and 1 deletions

View File

@@ -49,6 +49,7 @@ input/ # Oracle DMP files for import
- **Docker Sandboxes (sbx) — agenți AI izolați**: `proxmox/lxc102-docker/README.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` - **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` - **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` - **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` - **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` - **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` - **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` - **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` - **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 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` - **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` - **Conectarea unui container headless la Google Drive prin rclone (fără cont de serviciu)**: `docs/rclone-google-drive-headless.md`

View File

@@ -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 <IP>` 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 <IP>` pe .36. Trebuie să apară un pachet UDP de 102 octeți spre
10.0.20.255:40000, care conține MAC-ul nodului.

View File

@@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO8ULMGdacgLrW3YhNb3+bsUsP60LdEohwNPgpiRAdSE echo@moltbot

View File

@@ -8,6 +8,51 @@ mutare rack, mentenanță UPS, intervenții la switch.
**Autor:** Claude Code · **Ultima verificare pe cluster live:** 2026-08-29 **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 > **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 > 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ă > [switch 2.5G dedicat nodurilor](switch-2.5g-dedicat-noduri.md). De ea atârnă

View File

@@ -425,6 +425,13 @@ ssh root@10.0.20.201 "systemctl restart nut-server nut-monitor"
### Parole ### 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! **IMPORTANT:** Schimbă parolele default!
```bash ```bash

View File

@@ -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 reporneste serviciul. Doar `off`, `none`, `0` si `false` scot login-ul; orice alta
valoare il pastreaza. 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=<action>&n=<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 <id>
dry=<bool>, cerut de <who>`) — 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 <host> "<cmd>"`, 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 <host> "systemd-run --unit=infra-<id> --collect
... /bin/bash -c '<cmd>'"` — detașată de conexiunea ssh, cu stdout/stderr
redirectate în `/var/log/infra-actions/<id>-<timestamp>.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-<id>`).
### 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/<id>` î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, `ops/install.sh` face totul (leaga unitul, genereaza `DASHBOARD_TOKEN` daca lipseste,
porneste serviciul). Manual: porneste serviciul). Manual: