# Headscale / Headscale UI sur QNAP — finalisation

## Ce qui a déjà été déployé

Stack Portainer : `headscale-test`

Services :
- `headscale`
- `headscale-ui`
- `headscale-init`

Chemins NAS :
- `/share/ZFS24_DATA/docker/headscale-test/config`
- `/share/ZFS24_DATA/docker/headscale-test/data`

Ports de test actuels :
- API Headscale : `192.168.1.150:8086`
- Metrics : `192.168.1.150:9096`
- UI HTTP : `192.168.1.150:18087`
- UI HTTPS auto-signé : `192.168.1.150:18447`
- gRPC : `192.168.1.150:50443`

Domaine cible configuré dans `config.yaml` :
- `https://hs.nucleon.fr`

Base domain MagicDNS de test :
- `internal.hs.nucleon.fr`

## Important

`headscale-ui` doit idéalement être servi **sur le même sous-domaine que Headscale**, typiquement :
- `https://hs.nucleon.fr/` → Headscale
- `https://hs.nucleon.fr/web` → Headscale UI

Sinon il faudra gérer CORS proprement au reverse proxy.

---

## Étapes restantes pour finaliser l'installation

### 1) Créer le sous-domaine DNS

Créer un enregistrement DNS pour :
- `hs.nucleon.fr`

Il doit pointer vers l'IP publique qui arrive sur ton reverse proxy.

---

### 2) Mettre en place le reverse proxy HTTPS

Objectif : exposer **le même host** pour Headscale et l'UI.

Routing recommandé :
- `/web` → `http://headscale-ui:8080`
- `/` → `http://headscale:8080`

Si tu le fais via SWAG/Nginx Proxy Manager/Caddy, garde bien cette logique de **même sous-domaine**.

### Exemple logique de proxy

- `https://hs.nucleon.fr/web` → UI
- `https://hs.nucleon.fr` → API Headscale

Sans ça, l'UI peut afficher des erreurs de preflight / CORS.

---

### 3) Vérifier la conf Headscale

Fichier actuel :
- `/share/ZFS24_DATA/docker/headscale-test/config/config.yaml`

Points déjà posés :
- `server_url: https://hs.nucleon.fr`
- SQLite locale
- MagicDNS activé
- ACL de test très ouverte
- DERP public Tailscale utilisé pour commencer

À ajuster plus tard si besoin :
- DNS interne personnalisé
- OIDC / SSO
- DERP perso
- ACL plus stricte

---

### 4) Créer le premier user / namespace

Dans le conteneur `headscale`, créer ton premier user.

Exemple logique :
- user principal : `christophe`

Commande type à exécuter dans le conteneur :

```bash
headscale users create christophe
headscale users list
```

---

### 5) Générer une API key pour l'UI

Headscale UI a besoin d'une API key Headscale.

Commande type :

```bash
headscale apikeys create
```

Ensuite, dans Headscale UI :
- renseigner l'URL du serveur : `https://hs.nucleon.fr`
- coller l'API key générée

Tant que le reverse proxy n'est pas proprement en place, l'UI peut être capricieuse.

---

### 6) Générer des preauth keys pour connecter les machines

Pour enregistrer une machine dans Headscale :

```bash
headscale preauthkeys create --user christophe --reusable --expiration 24h
```

Selon le besoin, tu peux faire :
- des clés temporaires
- des clés réutilisables
- des clés taggées

---

### 7) Reconfigurer les clients Tailscale vers Headscale

Sur chaque machine, il faudra connecter le client Tailscale à ton serveur Headscale.

Principe :
- se déconnecter proprement si besoin
- se reconnecter avec ton login server Headscale
- utiliser une preauth key quand nécessaire

Le point clé côté client sera ton serveur :
- `https://hs.nucleon.fr`

---

### 8) Vérifier la remontée des nodes

Après connexion des clients :

```bash
headscale nodes list
```

Vérifier :
- IPs attribuées
- nom des machines
- routes annoncées
- statut en ligne

---

### 9) Durcir les ACL

La policy actuelle est volontairement permissive pour les tests :
- tout le monde peut parler à tout le monde

Fichier :
- `/share/ZFS24_DATA/docker/headscale-test/config/acl.hujson`

Avant passage en production, définir :
- users
- tags
- groupes
- accès par rôle
- restrictions SSH
- accès subnet routers / exit nodes

---

### 10) Préparer la migration depuis Tailscale

Avant remplacement complet, valider :
- connexion d'au moins 2-3 machines
- DNS interne
- accès entre machines
- subnet router si besoin
- exit node si besoin
- stabilité mobile
- performance générale

Migration prudente recommandée :
1. Monter Headscale en parallèle
2. Tester avec quelques machines
3. Reproduire les usages critiques
4. Basculer progressivement
5. Couper Tailscale quand tout est validé

---

## Remarques d'architecture

Pour les tests, le choix Docker/QNAP est bon.

Mon avis :
- **pour tester** → stack Docker dédiée sur le QNAP, très bien
- **plus tard** → on pourra décider si ça reste autonome ou si on le rattache à une stack plus globale

Je penche plutôt pour **le laisser séparé** d'OpenClaw :
- responsabilités plus claires
- moins de couplage
- maintenance plus simple
- migration / rollback plus propres

---

## Checklist courte

- [ ] DNS `hs.nucleon.fr`
- [ ] Reverse proxy HTTPS même host pour `/` et `/web`
- [ ] Création user `christophe`
- [ ] Génération API key UI
- [ ] Connexion UI
- [ ] Génération preauth keys
- [ ] Connexion des premières machines
- [ ] Validation réseau
- [ ] Durcissement ACL
- [ ] Migration progressive hors Tailscale
