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:
@@ -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`
|
||||||
|
|||||||
56
docs/acces-agenti-windows-birou-server36.md
Normal file
56
docs/acces-agenti-windows-birou-server36.md
Normal 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.
|
||||||
1
docs/chei-publice/moltbot-lxc110.pub
Normal file
1
docs/chei-publice/moltbot-lxc110.pub
Normal file
@@ -0,0 +1 @@
|
|||||||
|
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO8ULMGdacgLrW3YhNb3+bsUsP60LdEohwNPgpiRAdSE echo@moltbot
|
||||||
@@ -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ă
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user