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

@@ -334,3 +334,50 @@ def test_ruta_necunoscuta(server):
server.login()
assert server.call("/api/nope")[0] == 404
assert server.call("/api/nope", {})[0] == 404
# --- montare sub prefix (tailscale serve --set-path) ------------------------
@pytest.fixture()
def server_cu_prefix(server, state_dir):
"""Acelasi server, dar cu DASHBOARD_PREFIX=/punte in env."""
(state_dir / "env").write_text(
"DASHBOARD_TOKEN=secret-de-test\nDASHBOARD_PREFIX=/punte\n", encoding="utf-8")
config.reload(state_dir)
return server
def test_prefixul_e_normalizat():
assert api.strip_prefix("/api/status") == "/api/status"
def test_rutele_merg_si_cu_prefix_si_fara(server_cu_prefix):
"""Proxy-ul taie prefixul, dar `curl` direct pe localhost nu — merg ambele."""
server_cu_prefix.login()
assert server_cu_prefix.call("/api/status")[0] == 200
assert server_cu_prefix.call("/punte/api/status")[0] == 200
def test_prefixul_gol_nu_taie_nimic(server):
server.login()
assert server.call("/api/status")[0] == 200
assert server.call("/punte/api/status")[0] == 404
def test_redirect_de_login_pastreaza_prefixul(server_cu_prefix):
"""Un `/login.html` absolut ar arunca browserul in radacina hostului."""
status, _, resp = server_cu_prefix.call("/punte/")
assert status == 200
assert resp.url.endswith("/punte/login.html")
def test_calea_fara_slash_final_e_redirectionata(server_cu_prefix):
"""`/punte` fara slash ar rezolva `api/status` la radacina hostului."""
_, _, resp = server_cu_prefix.call("/punte")
assert resp.url.endswith("/punte/login.html")
def test_static_servit_si_sub_prefix(server_cu_prefix):
server_cu_prefix.login()
status, data, _ = server_cu_prefix.call("/punte/static/app.css")
assert status == 200 and ".card" in data["_html"]