# Rapport d’intervention — Accès distant kView INVESTOR via Tailscale

**Date :** 21–22 juillet 2026  
**Machine serveur :** `guillaumes-mac-mini`  
**Client principal :** `GN-LENOVO`  
**URL fonctionnelle :**

```text
http://guillaumes-mac-mini.tail668295.ts.net:8000/investors
```

## Symptôme initial

L’accès à kView INVESTOR depuis les appareils du tailnet échouait. Sur iPhone, Chrome téléchargeait un fichier vide portant le nom du slug (`investors`) au lieu d’afficher l’application.

Le serveur local fonctionnait correctement via :

```text
http://127.0.0.1:8000
```

## Cause racine

Deux comportements ont été confondus.

### 1. Le mapping Tailscale était un forwarding TCP brut

```text
100.80.95.73:8000 → 127.0.0.1:8000
```

Dans la sortie Tailscale, le libellé trompeur `TLS over TCP` signifie TCP brut, et non terminaison TLS.

Les essais en `https://` produisant `wrong version number` étaient donc normaux : le handshake TLS était transmis à Caddy, qui attendait du HTTP.

### 2. Le Caddyfile filtrait les requêtes selon leur Host

Le Caddyfile utilisait cette adresse de site :

```caddy
http://127.0.0.1:8000 {
```

Cette adresse ne limitait pas seulement l’écoute : elle filtrait également les requêtes selon leur en-tête `Host`.

Résultat :

- `Host: 127.0.0.1:8000` → Laravel répondait correctement.
- `Host: 100.80.95.73:8000` ou `guillaumes-mac-mini.tail668295.ts.net:8000` → aucune route Caddy ne correspondait.
- Caddy renvoyait `HTTP 200` avec un corps vide, que Chrome iOS interprétait comme un téléchargement.

## Correctif appliqué

Modification minimale de `/opt/homebrew/etc/Caddyfile` :

```diff
-http://127.0.0.1:8000 {
+http://:8000 {
     bind 127.0.0.1
```

Le point important est que la directive suivante a été conservée :

```caddy
bind 127.0.0.1
```

Caddy reste donc exclusivement lié au loopback et ne rentre pas en collision avec `tailscaled`.

Les commentaires du Caddyfile ont également été corrigés pour documenter le forwarding TCP brut et la nécessité d’accepter les Host Tailscale.

## Configuration Tailscale actuelle

```bash
tailscale serve --bg --yes --tcp=8000 tcp://127.0.0.1:8000
```

État JSON attendu :

```json
{
  "TCP": {
    "8000": {
      "TCPForward": "127.0.0.1:8000"
    }
  }
}
```

Il ne doit pas y avoir de champ `TerminateTLS` dans la configuration actuelle.

## Validation effectuée

- Caddyfile validé avec succès.
- Caddy rechargé à chaud via son API d’administration.
- Aucun redémarrage ou changement de PHP-FPM.
- Les sessions `screen` suivantes sont toujours actives :

```text
kview_investor-caddy
kview_investor-php-fpm
```

Test final :

```text
GET /investors
→ 302 vers /login
→ HTTP 200
→ Content-Type: text/html; charset=utf-8
→ 5 561 octets
```

L’accès a ensuite été confirmé fonctionnel depuis l’iPhone.

## Points de diagnostic secondaires

- `tailscale serve get-config --all` vide est normal : cette commande concerne les nouveaux Tailscale Services, pas la configuration Serve locale du nœud.
- `CertDomains: null` signifie que les certificats HTTPS Tailscale ne sont actuellement pas activés.
- Un essai temporaire en `--tls-terminated-tcp` a donc produit `TLS internal error`. Ce mode a été supprimé.
- Le daemon `tailscaled` a été redémarré pendant le diagnostic, sans perte de connectivité persistante.
- Version Tailscale installée lors de l’intervention : `1.98.8`. La version `1.98.9` était disponible.
- Le Lenovo `GN-LENOVO` était en ligne à l’adresse `100.89.92.122`, avec un ping Tailscale direct d’environ 13 ms.

## Sauvegardes disponibles

```text
/tmp/tailscale-serve-status-before.txt
/tmp/tailscale-status-before.json
/tmp/tailscaled-log-before.txt
/tmp/Caddyfile-before-tailnet-host-fix
```

Les fichiers sous `/tmp` peuvent disparaître lors d’un redémarrage ou d’un nettoyage système.

## Précautions futures

- Ne pas remettre l’adresse Caddy à `http://127.0.0.1:8000`, sinon les Host Tailscale seront de nouveau rejetés.
- Ne pas supprimer ou élargir `bind 127.0.0.1`.
- Continuer d’utiliser `http://` avec le mapping TCP actuel.
- Pour passer réellement en HTTPS, activer d’abord **HTTPS Certificates** dans l’Admin Console Tailscale et vérifier que `CertDomains` contient le FQDN du Mac avant d’activer une terminaison TLS.
