Gunnar

nordisk/holger-ui

docs/tailscale-access.md

# Ansluta till holger-konsolen över Tailscale

Konsolen körs på Henriks ThinkPad och exponeras **bara inom tailnätet**
(`tailscale serve`, inte Funnel) — den är alltså inte nåbar från internet, och
det finns ingen publik URL. För att nå den måste din maskin vara en nod i
samma tailnet.

**URL:** <https://henrik-thinkpad-t14s-gen-6.tail4eceda.ts.net>

---

## Steg 1 — Henrik ger åtkomst (görs en gång)

Välj **en** av två vägar i Tailscale-admin (<https://login.tailscale.com/admin>):

**A. Dela bara den här maskinen** (minst behörighet, rekommenderas)
1. *Machines* → `henrik-thinkpad-t14s-gen-6` → **Share…**
2. Ange Rickards e-post → skicka delningslänken.
3. Rickard öppnar länken och accepterar; maskinen dyker upp i hans egen
   tailnet-lista som en delad nod. Han får åtkomst till den maskinen, inget
   annat i tailnätet.

**B. Bjuda in till tailnätet** (om Rickard ska nå fler tjänster)
1. *Users* → **Invite external user** → Rickards e-post.
2. Kontrollera att tailnätets ACL släpper fram hans nod till port 443 på
   `henrik-thinkpad-t14s-gen-6`.

## Steg 2 — Rickard installerar och loggar in

```bash
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
```

(macOS/Windows: hämta klienten från <https://tailscale.com/download> och logga
in i appen.) Logga in med det konto inbjudan/delningen gick till.

Kontrollera att maskinen syns:

```bash
tailscale status | grep henrik-thinkpad
```

## Steg 3 — Öppna konsolen

<https://henrik-thinkpad-t14s-gen-6.tail4eceda.ts.net>

Certifikatet är utfärdat av Tailscale för `.ts.net` — inga varningar ska dyka
upp. **Använd värdnamnet, inte IP-adressen**: certifikatet gäller namnet, så
`https://100.121.38.43` ger en certvarning.

Du bör se en topbar med `ok · holger v0.6.9 (…)` och en översikt med fyra kort.

## Steg 4 — Logga in för att kunna skriva

Läsning (bläddra, söka, ladda ner, se SBOM/properties) fungerar **utan**
inloggning — topbaren visar då `anonymous · reader`. Skrivning (upload,
promote, properties, SBOM-attach) kräver en bearer-token:

1. Gå till **Account** i menyn.
2. Klistra in token i fältet *Bearer token* → **Log in**.
3. Topbaren ska nu visa ditt subject och din roll, t.ex. `console-admin · admin`
   — det är serverns svar, inte klientens gissning.

> Henrik skickar token separat (den ligger i en 0600-fil på maskinen och står
> aldrig i det här dokumentet). Token lever bara i fliken (sessionStorage) och
> försvinner när du stänger den eller trycker Log out.

---

## Om det inte funkar

| Symptom | Trolig orsak | Åtgärd |
|---|---|---|
| Namnet slår inte upp | MagicDNS av, eller noden inte accepterad | `tailscale status` — syns maskinen? Acceptera delningen. |
| Timeout / ingen kontakt | Laptopen sover eller är offline | Den är en **bärbar dator** — be Henrik väcka den. `tailscale ping henrik-thinkpad-t14s-gen-6` visar om noden svarar. |
| Sidan laddar men är tom | WASM-bundeln blockeras eller är halvladdad | Hårdladda (Ctrl+Shift+R). Kvarstår det: be Henrik köra `cargo xtask verify-chain`. |
| `503` eller `502` | nginx uppe men holger-servern nere | Henrik: `systemctl --user status holger-server holger-console` |
| Certifikatvarning | Du använde IP i stället för värdnamnet | Använd `https://henrik-thinkpad-t14s-gen-6.tail4eceda.ts.net` |
| Skrivningar nekas med "authentication required" | Ingen token, eller fel roll | Logga in på **Account**. Rollen sätts av servern (RBAC), inte av konsolen. |

Henrik kan verifiera hela kedjan utifrån med:

```bash
cd ~/holger-ui && cargo xtask verify-chain
```

Den kontrollerar båda tjänsterna, tailscale-konfigurationen, SPA-fallbacken,
gRPC-dörren, skrivgrinden och CSP-headern — nio kontroller, alla ska vara `OK`.