feat(discord-bridge): dashboard publicat in tailnet prin tailscale serve

https://claude-agent.tailf7372d.ts.net/punte — acelasi tipar ca /echo de pe
moltbot: procesul ramane legat de 127.0.0.1, tailscaled il proxeaza si pune HTTPS.

Montarea sub prefix a cerut doua schimbari:

- toate URL-urile din pagini sunt acum relative, fiindca --set-path TAIE prefixul
  inainte de a proxa (serverul vede /api/status, browserul cere /punte/api/status).
  DASHBOARD_PREFIX ramane necesar doar pentru redirectul de login, si e acceptat
  si intact pe intrare, ca sa mearga si curl direct pe localhost.
- adresa fara slash final (/punte) primeste 301 catre /punte/: altfel URL-urile
  relative s-ar rezolva la radacina hostului, unde proxy-ul nu trimite nimic
  incoace, si panoul ar arata gol fara nicio eroare vizibila.

ops/install.sh configureaza serve-ul daca sudo permite; altfel spune comanda.
Sase teste noi pentru montarea sub prefix (31 in total pe dashboard).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B29CApsP1JkSdjYaGaHpE7
This commit is contained in:
Claude Agent
2026-08-30 13:27:59 +00:00
parent 57867672f2
commit dd7fa28fa5
9 changed files with 173 additions and 34 deletions

View File

@@ -6,7 +6,8 @@ de server (stdlib `http.server`, zero dependinte), aceiasi tokeni de design, ace
tipar de endpoint-uri ca in `handlers/eco.py`.
```
http://127.0.0.1:18790
https://claude-agent.tailf7372d.ts.net/punte <- din tailnet, ca /echo la moltbot
http://127.0.0.1:18790 <- local / prin tunel SSH
```
## Ce arata si ce poate face
@@ -97,15 +98,43 @@ systemctl --user enable --now claude-discord-dashboard
```
Setari optionale in `~/.claude-discord/env`: `DASHBOARD_BIND` (implicit `127.0.0.1`),
`DASHBOARD_PORT` (implicit `18790`).
`DASHBOARD_PORT` (implicit `18790`), `DASHBOARD_PREFIX` (implicit gol; `/punte` cand e
publicat prin `tailscale serve --set-path`).
## Acces
Fiind legat de localhost, se ajunge la el prin tunel SSH — la fel ca la dashboard-ul
lui echo:
### Prin Tailscale (recomandat)
Exact tiparul de la echo (`https://moltbot.tailf7372d.ts.net/echo/`): procesul ramane
legat de `127.0.0.1`, iar `tailscaled` e singurul care ajunge la el si il publica in
tailnet, cu HTTPS si certificat de la Tailscale.
```bash
sudo tailscale serve --bg --set-path /punte http://127.0.0.1:18790
tailscale serve status
```
```
https://claude-agent.tailf7372d.ts.net/punte
```
Vizibil doar in tailnet (`tailnet only`) — nu e `funnel`, deci nu iese in internet.
Configuratia e persistata de `tailscaled`, deci supravietuieste repornirilor.
**Montarea sub prefix**, cele doua capcane si cum sunt rezolvate:
- `tailscale serve --set-path` **taie** prefixul inainte de a proxa, deci serverul
vede `/api/status`, nu `/punte/api/status`. Toate URL-urile din pagini sunt
**relative**, deci merg la orice prefix, fara sa stie de el. `DASHBOARD_PREFIX`
e nevoie doar pentru redirecturi si e acceptat si intact pe intrare (`curl`
direct pe localhost cu `/punte/...` functioneaza).
- adresa **fara slash final** (`/punte`) ar rezolva `api/status` la radacina
hostului, unde proxy-ul nu mai trimite nimic incoace; de aceea forma fara slash
primeste un 301 catre `/punte/`.
### Prin tunel SSH
```bash
# de pe statia de lucru (direct sau prin Tailscale: 100.95.55.51)
ssh -L 18790:127.0.0.1:18790 -N claude@10.0.20.171 &
# apoi http://localhost:18790
```
@@ -119,7 +148,8 @@ cd proxmox/lxc171-claude-agent/discord-bridge
python3 -m pytest tests/test_dashboard.py -q
```
25 de teste, fara retea si fara `systemctl` real (dublura inregistreaza apelurile).
31 de teste, fara retea si fara `systemctl` real (dublura inregistreaza apelurile).
Acopera autentificarea, faptul ca unitatea nu poate fi aleasa din cerere, blocajul pe
tur in zbor si trecerea cu `force`, traversarea de cale in `request_id`, `state.json`
corupt si verificarea de regresie pentru `deny(ssh)`.
corupt, montarea sub prefix (cu si fara slash final) si verificarea de regresie
pentru `deny(ssh)`.