[{"data":1,"prerenderedAt":287},["ShallowReactive",2],{"seo-verification":3,"blog-self-host-headscale-tailscale-vps-ma-fr":6,"promo-bar-likely":286},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-self-host-headscale-tailscale-vps-ma-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":226,"ctaBody":227,"ctaButton":228,"ctaUrl":229,"relatedPosts":230},164,"self-host-headscale-tailscale-vps",{"fr":10,"en":12,"ar":13,"es":14},"self-host-headscale-on-a-vps-your-own-tailscale-control-server","استضافة-headscale-على-vps-خادم-تحكم-tailscale-خاص-بك","auto-alojar-headscale-en-un-vps-servidor-tailscale","Héberger Headscale sur un VPS : serveur de contrôle Tailscale","Remplacez le serveur de contrôle cloud de Tailscale par Headscale sur votre VPS : utilisateurs illimités, maillage WireGuard complet, magic DNS et ACL, sans SaaS.",19,2,false,"2026-07-05T00:00:00+00:00","2026-11-08T01:13:12+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},8,"Sécurité & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-headscale-tailscale-vps-poster.svg",{"categorySlug":34,"appSlug":35},"reseau","headscale","L’offre gratuite de Tailscale (Personal) s’arrête à 6 utilisateurs, le plan Standard se facture ensuite par siège, et dans tous les cas la carte de votre réseau est stockée dans le cloud de Tailscale. Headscale (BSD-3-Clause, plus de 45 000 étoiles sur GitHub) est un remplaçant open source direct du serveur de coordination Tailscale — déployez-le sur votre VPS et continuez à utiliser les clients Tailscale officiels sur chaque appareil. Votre équipe se connecte via des tunnels WireGuard zero-trust, du magic DNS et un contrôle d’accès basé sur des ACL, le tout auto-hébergé et sans limite.\n\nCe guide couvre l’installation (Docker ou paquet `.deb`), le reverse proxy HTTPS, la vérification du maillage, la bascule d’une équipe déjà sur Tailscale, le calcul du seuil de rentabilité et ce que Headscale ne sait pas faire.",[38,42,56,59,66,91,94,109,112,116,119,131,134,146,149,164,167,208,211,218],{"type":39,"title":40,"body":41},"h2","Pourquoi auto-héberger le serveur de contrôle","Tailscale est un logiciel exceptionnel — les performances de WireGuard, des clients multiplateformes, un magic DNS qui fonctionne du premier coup. Il ne transporte pourtant pas votre trafic : les paquets WireGuard circulent directement d’un nœud à l’autre, chiffrés de bout en bout. Ce qui tourne dans le cloud de Tailscale, c’est le plan de contrôle — le serveur de coordination qui échange les clés publiques, fait se découvrir les pairs, attribue les adresses `100.x.y.z`, publie les noms MagicDNS, distribue les ACL et la carte des relais DERP. Sans lui, les nœuds ne se trouvent pas. Headscale réimplémente ce serveur de coordination en Go open source, avec le même protocole, pour que vous puissiez le faire tourner sur votre propre infrastructure : vos clients Tailscale ne changent que d’URL de connexion.\n\nAu-delà du plafond de 6 utilisateurs de l’offre gratuite, la principale raison de l’auto-héberger est la résidence des données : le plan de contrôle sait quelles machines sont sur votre réseau, leurs IP, leurs noms et vos politiques d’ACL. Faire tourner Headscale signifie que ces informations restent sur votre VPS — et non dans le cloud de quelqu’un d’autre — et que votre réseau ne dépend plus d’une décision tarifaire ou d’une panne chez un tiers.",{"type":43,"title":44,"items":45},"ul","Ce que Headscale auto-hébergé vous apporte",[46,47,48,49,50,51,52,53,54,55],"Utilisateurs et appareils sans plafond : aucune limite imposé par le logiciel, pas de tarification par siège — votre réseau maillé grandit avec votre équipe, borné seulement par les ressources du VPS.","Les clients Tailscale officiels partout : Linux, macOS, Windows, iOS, Android — aucun fork maison ni client alternatif requis.","Tunnels WireGuard pair à pair : Headscale ne gère que l’échange de clés et la distribution des ACL ; tout le trafic réel circule directement en WireGuard entre les pairs.","Magic DNS : résolvez chaque nœud de votre réseau maillé par son nom d’hôte (`poste.mesh.votre-domaine.com`) sans modifier votre DNS public.","Politiques HuJSON : le même format de fichier de politique que Tailscale, avec les ACL et les Grants — définissez quels utilisateurs et quels appareils peuvent accéder à quels services.","Prise en charge des relais DERP : utilisez la carte DERP publique de Tailscale pour la traversée de NAT, ou activez le serveur DERP intégré à Headscale pour garder aussi les relais chez vous.","API et CLI headscale : créez des utilisateurs, émettez des clés de pré-authentification et gérez les nœuds par programmation.","Enregistrement sans compte tailscale.com : vos collaborateurs rejoignent le réseau avec une clé que vous générez, ou via le fournisseur OpenID Connect que vous utilisez déjà (Keycloak, Authelia, Google Workspace…).","Sous-réseaux, exit nodes, Taildrop et Tailscale SSH : les fonctions de base de Tailscale sont prises en charge par le serveur.","Moins de 50 Mo de RAM au repos — tourne confortablement sur un VPS de 1 Go aux côtés d’autres charges de travail.",{"type":39,"title":57,"body":58},"Prérequis","Un VPS avec au moins 1 vCPU et 512 Mo de RAM (1 Go laisse de la marge au système) sous Ubuntu 22.04 ou plus récent, ou Debian 12 ou plus récent — ce sont les distributions que visent les paquets officiels. Pour la voie Docker, installez Docker et Docker Compose v2. Une IP publique est nécessaire ; une configuration double pile IPv4 + IPv6 est recommandée.\n\nUn nom de domaine pointant vers le VPS est **requis** : les clients Tailscale se connectent au serveur de contrôle par URL, et le projet recommande fortement de servir Headscale en HTTPS sur le port 443, le client Tailscale supposant ce port dans certaines situations. Prévoyez un sous-domaine pour le serveur (`vpn.votre-domaine.com`) et un autre, distinct, pour les noms MagicDNS (`mesh.votre-domaine.com`) : Headscale refuse que le domaine MagicDNS soit celui de `server_url`.",{"type":43,"title":60,"items":61},"Les ports à ouvrir sur le VPS",[62,63,64,65],"TCP 443 : obligatoire. C’est par HTTPS que les clients s’enregistrent et reçoivent la carte du réseau ; c’est le seul port indispensable au serveur de coordination.","TCP 80 : uniquement pour la validation Let’s Encrypt HTTP-01 et la redirection vers HTTPS.","UDP 3478 : uniquement si vous activez le serveur DERP intégré, qui en a besoin pour STUN. Avec la carte DERP publique de Tailscale, inutile de l’ouvrir.","TCP 8080 (Headscale), 9090 (métriques) et 50443 (gRPC) : à laisser sur `127.0.0.1`. Le reverse proxy parle à 8080 en local ; n’exposez jamais l’interface d’administration gRPC sans en avoir besoin.",{"type":67,"title":68,"steps":69},"steps","Déployer Headscale avec Docker Compose",[70,73,76,79,82,85,88],{"title":71,"body":72},"Rédiger le fichier Compose","La stack ne compte qu’un seul service : l’image officielle `docker.io\u002Fheadscale\u002Fheadscale:0.29.7`, dernière version stable au 7 novembre 2026, lancée avec la commande `serve`. Headscale garde tout — clés, base de données, enregistrements des nœuds — dans deux dossiers de l’hôte : la configuration, montée en lecture seule sur `\u002Fetc\u002Fheadscale`, et les données, sur `\u002Fvar\u002Flib\u002Fheadscale`. Aucun service externe de base de données ou de cache n’est nécessaire ; SQLite est intégré.\n\n```bash\nmkdir -p \u002Fopt\u002Fheadscale\u002Fconfig \u002Fopt\u002Fheadscale\u002Flib\ncat > \u002Fopt\u002Fheadscale\u002Fcompose.yaml \u003C\u003C'EOF'\nservices:\n  headscale:\n    image: docker.io\u002Fheadscale\u002Fheadscale:0.29.7\n    container_name: headscale\n    restart: unless-stopped\n    read_only: true\n    tmpfs:\n      - \u002Fvar\u002Frun\u002Fheadscale\n    ports:\n      - \"127.0.0.1:8080:8080\"\n    volumes:\n      - \u002Fopt\u002Fheadscale\u002Fconfig:\u002Fetc\u002Fheadscale:ro\n      - \u002Fopt\u002Fheadscale\u002Flib:\u002Fvar\u002Flib\u002Fheadscale\n    command: serve\n    healthcheck:\n      test: [\"CMD\", \"headscale\", \"health\"]\nEOF\n```\n\nLe port n’est publié que sur `127.0.0.1` : c’est le reverse proxy qui fera face à Internet.",{"title":74,"body":75},"Générer la configuration","Partez du fichier d’exemple de la version exacte que vous déployez, puis ne modifiez que les clés ci-dessous. `server_url` est l’URL HTTPS à laquelle vos clients Tailscale se connecteront ; `listen_addr` doit écouter sur `0.0.0.0` à l’intérieur du conteneur. La base se déclare sous `database` (`type: sqlite`). Seule la clé noise reste à indiquer : Headscale la génère au premier démarrage si le fichier n’existe pas.\n\n```bash\ncurl -Lo \u002Fopt\u002Fheadscale\u002Fconfig\u002Fconfig.yaml \\\n  https:\u002F\u002Fraw.githubusercontent.com\u002Fjuanfont\u002Fheadscale\u002Fv0.29.7\u002Fconfig-example.yaml\n```\n\n```yaml\nserver_url: https:\u002F\u002Fvpn.votre-domaine.com\nlisten_addr: 0.0.0.0:8080\nnoise:\n  private_key_path: \u002Fvar\u002Flib\u002Fheadscale\u002Fnoise_private.key\ndatabase:\n  type: sqlite\n  sqlite:\n    path: \u002Fvar\u002Flib\u002Fheadscale\u002Fdb.sqlite\ndns:\n  magic_dns: true\n  base_domain: mesh.votre-domaine.com\n```\n\nSur ServOrbit, le job de provisioning écrit `config.yaml` à partir de votre domaine automatiquement.",{"title":77,"body":78},"Démarrer le conteneur et vérifier","Lancez `docker compose up -d` depuis `\u002Fopt\u002Fheadscale`. Headscale génère sa clé noise, puis se met à écouter sur le port 8080. Vérifiez l’endpoint de santé : `curl -s http:\u002F\u002F127.0.0.1:8080\u002Fhealth` doit renvoyer `{\"status\":\"pass\"}`. L’image est construite sur une base distroless, sans shell, mais la CLI headscale s’appelle directement : `docker exec headscale headscale version` confirme la version en cours d’exécution, et `docker logs --follow headscale` affiche les journaux.",{"title":80,"body":81},"Créer un utilisateur et générer une clé d’authentification","Headscale organise les appareils en « utilisateurs » (auparavant appelés namespaces). Créez-en un, puis relevez son identifiant numérique : l’option `--user` de `preauthkeys create` attend cet ID, pas le nom.\n\n```bash\ndocker exec headscale headscale users create myteam\ndocker exec headscale headscale users list\ndocker exec headscale headscale preauthkeys create --user 1 --reusable --expiration 24h\n```\n\nSans `--reusable`, la clé ne sert qu’une fois, et sans `--expiration` elle expire au bout d’une heure. Copiez la clé affichée — vous l’utiliserez pour enregistrer chaque appareil.",{"title":83,"body":84},"Enregistrer un appareil","Sur n’importe quel appareil disposant du client Tailscale officiel, pointez-le vers votre instance Headscale : `tailscale up --login-server https:\u002F\u002Fvpn.votre-domaine.com --authkey \u003Cvotre-clé-preauth>`. L’appareil apparaît dans la liste des nœuds de Headscale en quelques secondes : `docker exec headscale headscale nodes list`. Sans clé, le client ouvre une page qui affiche un identifiant d’authentification ; approuvez-le côté serveur avec `docker exec headscale headscale auth register --user myteam --auth-id \u003CAUTH_ID>`. Une fois enregistrés, les appareils communiquent par leur IP de maillage (`100.64.x.y`) ou par leur nom d’hôte magic DNS.",{"title":86,"body":87},"Définir les politiques de contrôle d’accès","Tant qu’aucune politique n’est chargée, Headscale laisse passer tout le trafic entre les nœuds — acceptable pour une petite équipe de confiance, pas dès que postes de développeurs, prestataires et serveurs de production cohabitent. Créez `\u002Fopt\u002Fheadscale\u002Fconfig\u002Fpolicy.hujson` et déclarez-le dans `config.yaml` sous `policy.path: \u002Fetc\u002Fheadscale\u002Fpolicy.hujson`. Headscale utilise le même format HuJSON que Tailscale : définissez des groupes d’utilisateurs, étiquetez les appareils comme serveurs ou postes de travail, et écrivez des règles précisant quels groupes peuvent atteindre quels ports. Le projet recommande les Grants plutôt que les ACL, que Tailscale considère comme historiques. Validez le fichier avec `headscale policy check --file \u003Cfichier>`, puis rechargez : la politique n’est relue qu’au rechargement (`docker kill --signal=HUP headscale`, ou `systemctl reload headscale` en natif). Versionnez ce fichier dans un dépôt Git privé pour garder l’historique des accès.",{"title":89,"body":90},"Se connecter la première fois","Headscale n’a pas d’interface web ni de compte : c’est le serveur de contrôle de votre réseau privé, piloté en ligne de commande. En SSH : `docker exec -it headscale headscale users create monuser`, puis la clé avec `preauthkeys create --user \u003CID> --reusable --expiration 24h`, et raccordez vos machines avec `tailscale up --login-server https:\u002F\u002F\u003Cvotre-domaine> --authkey \u003Cclé>`. Les applications graphiques savent aussi viser un serveur personnalisé : sur macOS, Option + clic sur l’icône Tailscale, menu Debug, puis `Custom Login Server` ; sur iOS, `Use custom coordination server` dans le menu de connexion ; sur Android, `Use an alternate server` ; sur Windows, `tailscale login --login-server` dans PowerShell.",{"type":39,"title":92,"body":93},"Sans Docker : le paquet .deb officiel","Le projet publie des paquets `.deb` pour Debian et Ubuntu, et les recommande sur ces distributions : ils créent l’utilisateur système `headscale`, posent une configuration par défaut et installent l’unité systemd. C’est la voie la plus simple si Headscale est seul sur son VPS ou si vous préférez un service natif à un conteneur. Les commandes de gestion sont les mêmes que plus haut, sans le préfixe `docker exec headscale`.",{"type":67,"title":95,"steps":96},"Installer Headscale avec le paquet .deb",[97,100,103,106],{"title":98,"body":99},"Télécharger et installer le paquet","Récupérez le paquet de la version voulue sur la page des releases GitHub, pour votre architecture (`amd64` ou `arm64`), et installez-le avec `apt`, qui résout les dépendances :\n\n```bash\nHEADSCALE_VERSION=\"0.29.7\"\nHEADSCALE_ARCH=\"amd64\"\nwget --output-document=headscale.deb \\\n  \"https:\u002F\u002Fgithub.com\u002Fjuanfont\u002Fheadscale\u002Freleases\u002Fdownload\u002Fv${HEADSCALE_VERSION}\u002Fheadscale_${HEADSCALE_VERSION}_linux_${HEADSCALE_ARCH}.deb\"\nsudo apt install .\u002Fheadscale.deb\n```\n\nVérifiez ensuite : `headscale version` doit afficher `0.29.7`.",{"title":101,"body":102},"Adapter la configuration","Le paquet dépose la configuration dans `\u002Fetc\u002Fheadscale\u002Fconfig.yaml` et un exemple à jour dans `\u002Fusr\u002Fshare\u002Fdoc\u002Fheadscale\u002Fexamples\u002Fconfig-example.yaml`. Modifiez les mêmes clés que pour Docker (`server_url`, `database`, `dns.base_domain`), mais gardez `listen_addr: 127.0.0.1:8080` : le service tourne sur l’hôte, seul le reverse proxy doit l’atteindre. Les données vivent dans `\u002Fvar\u002Flib\u002Fheadscale`.",{"title":104,"body":105},"Redémarrer et vérifier le service","Relancez le service pour qu’il relise la configuration, puis contrôlez son état et ses journaux :\n\n```bash\nsudo systemctl restart headscale\nsudo systemctl status headscale\nsudo journalctl -u headscale -f\n```\n\nLa sortie doit afficher `Active: active (running)`. Au premier démarrage, les erreurs les plus fréquentes sont une `server_url` sans schéma `https:\u002F\u002F` et un domaine MagicDNS identique à celui du serveur.",{"title":107,"body":108},"Utiliser la CLI sans être root","La CLI parle au service par le socket Unix `\u002Fvar\u002Frun\u002Fheadscale\u002Fheadscale.sock`, accessible par défaut au seul utilisateur `headscale` et à root. Passez par `sudo`, exécutez les commandes en tant qu’utilisateur `headscale`, ou ajoutez votre compte au groupe `headscale`. Vérifiez l’accès avec `headscale users list`.",{"type":39,"title":110,"body":111},"Exposer Headscale en HTTPS derrière Nginx","Les clients Tailscale parlent à Headscale avec leur propre protocole, transporté par une connexion WebSocket ouverte en POST, dont l’en-tête `Upgrade` vaut `tailscale-control-protocol`. Le reverse proxy doit donc relayer les en-têtes `Upgrade` et `Connection` tels quels et ne pas mettre les réponses en tampon. La configuration ci-dessous suit l’exemple de la documentation du projet ; obtenez d’abord le certificat avec certbot (`certbot certonly --nginx -d vpn.votre-domaine.com`).\n\n```nginx\nmap $http_upgrade $connection_upgrade {\n  default keep-alive;\n  ''      close;\n}\n\nserver {\n  listen 80;\n  server_name vpn.votre-domaine.com;\n  location = \u002Fgenerate_204 { return 204; }\n  location \u002F { return 301 https:\u002F\u002F$server_name$request_uri; }\n}\n\nserver {\n  listen 443 ssl;\n  http2 on;\n  server_name vpn.votre-domaine.com;\n  ssl_certificate     \u002Fetc\u002Fletsencrypt\u002Flive\u002Fvpn.votre-domaine.com\u002Ffullchain.pem;\n  ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fvpn.votre-domaine.com\u002Fprivkey.pem;\n\n  location \u002F {\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection $connection_upgrade;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    proxy_buffering off;\n    proxy_pass http:\u002F\u002F127.0.0.1:8080;\n  }\n}\n```\n\nLaissez `tls_cert_path` et `tls_key_path` vides dans `config.yaml` : Nginx termine TLS, et l’avertissement `listening without TLS` au démarrage est alors attendu. Pour que les journaux de Headscale montrent la vraie IP des clients, déclarez le proxy comme source de confiance. En installation native, la boucle locale suffit ; en Docker, ajoutez aussi le réseau du pont Docker (`docker network inspect`), car le conteneur voit arriver le proxy depuis sa passerelle :\n\n```yaml\ntrusted_proxies:\n  - 127.0.0.1\u002F32\n  - ::1\u002F128\n```\n\nCaddy fonctionne aussi, avec un simple `reverse_proxy 127.0.0.1:8080`. En revanche, le proxy de Cloudflare et Cloudflare Tunnel ne sont pas pris en charge, faute de gérer les WebSocket en POST : l’enregistrement DNS du serveur doit rester en mode DNS seulement.",{"type":113,"title":114,"body":115},"tip","Associer Headscale à Authelia pour un accès réseau protégé par MFA","Headscale gère le contrôle d’accès au niveau réseau (quelles IP peuvent communiquer avec quels pairs), mais il n’applique pas d’authentification au niveau applicatif. Associez-le à \u003Ca href=\"\u002Fblog\u002Fself-host-authelia-vps\">Authelia sur le même VPS\u003C\u002Fa> : faites passer vos services internes (accessibles uniquement via le maillage) par la couche forward-auth d’Authelia. Les utilisateurs doivent valider un MFA pour accéder aux services, même une fois sur le maillage — de la défense en profondeur pour les charges sensibles.",{"type":39,"title":117,"body":118},"Vérifier que les nœuds se voient","Un nœud listé par `headscale nodes list` prouve seulement qu’il a joint le serveur de coordination. Avant d’y faire passer du trafic réel, vérifiez le chemin de bout en bout depuis les clients eux-mêmes.",{"type":67,"title":120,"steps":121},"Contrôler le maillage depuis un client",[122,125,128],{"title":123,"body":124},"Lire l’état du réseau","Sur un nœud enregistré, lancez `tailscale status`. La commande liste les pairs avec leur IP de maillage, leur nom et le type de liaison : `direct` signifie que le tunnel WireGuard est établi sans intermédiaire, `relay` qu’il passe par un relais DERP — fonctionnel, mais avec une latence plus élevée.",{"title":126,"body":127},"Tester la connectivité","Relevez l’IP d’un pair dans `tailscale status`, puis `ping 100.64.0.2`, ou mieux `tailscale ping \u003Cnom-du-nœud>`, qui indique si la réponse arrive en direct ou par un relais. Si le pair est listé mais ne répond pas, `tailscale netcheck` mesure la latence vers chaque région DERP et signale un UDP sortant filtré.",{"title":129,"body":130},"Tester la résolution MagicDNS","Avec `dns.magic_dns: true`, chaque nœud répond à son nom court et à son nom complet : `ping nom-du-noeud` ou `ping nom-du-noeud.mesh.votre-domaine.com`. Aucun enregistrement DNS public n’est nécessaire pour ces noms internes. Si la résolution échoue, `tailscale dns status` montre la configuration DNS que le client a reçue du serveur.",{"type":39,"title":132,"body":133},"Cas d’usage : SSH entre VPS sans exposer le port 22","Une fois vos VPS de développement et de production enregistrés sur le même maillage, SSH n’a plus besoin d’écouter sur l’interface publique : la connexion passe par l’adresse de maillage, dans le tunnel WireGuard. Gardez un accès console ouvert chez votre fournisseur avant de toucher au pare-feu, au cas où une règle vous enfermerait dehors.",{"type":67,"title":135,"steps":136},"Restreindre SSH au réseau maillé",[137,140,143],{"title":138,"body":139},"Repérer l’interface et l’adresse de maillage","Sur chaque VPS, le client Tailscale crée l’interface `tailscale0`. `tailscale ip -4` affiche l’adresse de maillage de la machine ; notez celle du serveur de production, par exemple `100.64.0.3`.",{"title":141,"body":142},"N’autoriser SSH que par tailscale0","Sur le VPS de production, autorisez SSH sur l’interface de maillage avant de le refuser ailleurs — UFW applique la première règle qui correspond :\n\n```bash\nufw allow in on tailscale0 to any port 22 proto tcp\nufw deny 22\u002Ftcp\nufw enable\nufw status verbose\n```\n\nLe port 22 n’est plus joignable depuis Internet, mais reste ouvert à tous les nœuds du maillage autorisés par votre politique.",{"title":144,"body":145},"Se connecter par le maillage","Depuis le VPS de développement ou votre poste enregistré, connectez-vous par l’IP ou le nom MagicDNS : `ssh utilisateur@100.64.0.3` ou `ssh utilisateur@vps-prod.mesh.votre-domaine.com`. Tout transite dans le tunnel chiffré ; restreignez ensuite dans la politique Headscale quels groupes peuvent atteindre le port 22 de ce serveur.",{"type":39,"title":147,"body":148},"Migrer une équipe déjà sur Tailscale","La bascule ne demande aucune réinstallation : le client officiel accepte l’option `--login-server`, et il suffit de le déconnecter de l’ancien réseau puis de le reconnecter à votre serveur. Chaque machine est coupée quelques secondes pendant l’opération. Comme votre serveur attribue lui-même les adresses `100.x` et les noms MagicDNS, prévoyez de mettre à jour les scripts, règles de pare-feu et fichiers de configuration qui citent les anciennes.",{"type":67,"title":150,"steps":151},"Basculer les clients vers Headscale",[152,155,158,161],{"title":153,"body":154},"Reprendre la politique d’accès","Copiez le fichier de politique de votre tailnet depuis l’éditeur Access controls de la console Tailscale et repartez-en : le format HuJSON est le même. Contrôlez-le avec `headscale policy check` avant la bascule — certaines fonctions, comme les IP sets, ne sont pas prises en charge, et seul un sous-ensemble des autogroups existe.",{"title":156,"body":157},"Déconnecter puis reconnecter chaque client","Sur Linux ou en ligne de commande, enchaînez la déconnexion et la reconnexion avec une clé de pré-authentification :\n\n```bash\ntailscale logout\ntailscale up --login-server https:\u002F\u002Fvpn.votre-domaine.com --authkey \u003CPREAUTHKEY>\n```\n\nSur macOS, iOS, Android et Windows, déconnectez le compte dans l’application, puis ajoutez le serveur personnalisé comme décrit plus haut.",{"title":159,"body":160},"Commencer par les machines de test","Basculez d’abord un poste et un serveur de test, vérifiez `tailscale status` et la résolution des noms, puis les machines de développement et, en dernier, la production. Tant que des machines restent de l’autre côté, les deux réseaux ne se voient pas : planifiez la bascule d’un service et de ses clients dans la même fenêtre.",{"title":162,"body":163},"Fermer ou rétrograder le compte Tailscale","Une fois tous les nœuds migrés et vérifiés, fermez le tailnet ou repassez sur le plan Personal si vous gardez un usage personnel. Générez une nouvelle clé de pré-authentification pour les prochains enregistrements plutôt que de garder indéfiniment celle de la migration.",{"type":39,"title":165,"body":166},"Headscale vs Tailscale Cloud","Tailscale Cloud reste la voie la plus simple pour les petites équipes : aucun serveur à maintenir, des mises à jour automatiques, une facturation intégrée — et le plan Personal reste gratuit jusqu’à 6 utilisateurs. Au-delà, le plan Standard est affiché à 8 $ par utilisateur et par mois sur la grille entrée en vigueur le 8 avril 2026 : 40 $ par mois pour cinq personnes, 80 $ pour dix. Headscale coûte le prix du VPS, quel que soit l’effectif — sur ServOrbit, le VPS Solo (2 vCPU \u002F 4 GB) à 99 DH\u002Fmois suffit pour des dizaines de nœuds — plus le temps d’exploitation : mises à jour, sauvegardes, surveillance.\n\nHeadscale prend donc tout son sens au-delà de 6 utilisateurs, lorsque la résidence des données impose de garder la topologie de votre réseau hors des serveurs tiers, ou lorsque vous voulez une auditabilité complète de vos logs de coordination. Les clients sont identiques — passer de Tailscale Cloud à Headscale revient à relancer `tailscale up --login-server` sur chaque appareil.",{"type":168,"title":169,"headers":170,"rows":175},"comparison","Tailscale Personal, Tailscale Standard et Headscale",[171,172,173,174],"Critère","Tailscale Personal","Tailscale Standard","Headscale sur VPS",[176,181,186,188,192,196,200,204],[177,178,179,180],"Prix","Gratuit","8 $ par utilisateur et par mois","Le coût du VPS",[182,183,184,185],"Utilisateurs","Jusqu’à 6","Sans plafond","Aucune limite logicielle",[187,184,184,185],"Appareils des utilisateurs",[189,190,190,191],"Serveur de coordination","Cloud Tailscale","Votre VPS, sous votre contrôle",[193,194,194,195],"Client","Client Tailscale officiel","Client Tailscale officiel (`--login-server`)",[197,198,198,199],"MagicDNS, ACL, Grants","Oui","Oui, sur votre propre domaine",[201,202,202,203],"Funnel et Serve","Proposés par Tailscale","Non pris en charge",[205,206,206,207],"Maintenance","Nulle (service managé)","Mises à jour, sauvegardes, surveillance",{"type":39,"title":209,"body":210},"Ce que Headscale ne remplace pas","Headscale implémente le serveur de coordination, pas toute la plateforme commerciale. Sa propre documentation liste ce qui manque : Tailscale Funnel (publier un service local sur Internet), Tailscale Serve (le partager dans le tailnet par un proxy local) et les journaux de flux réseau ne sont pas pris en charge ; les groupes OIDC ne peuvent pas servir dans les ACL. Il n’y a pas non plus de console web officielle : tout passe par la CLI ou l’API. Si votre usage se limite à la connectivité maillée, à MagicDNS, aux politiques d’accès, aux sous-réseaux et aux exit nodes, Headscale couvre le besoin ; si vous utilisez activement Funnel ou Serve, pesez ces fonctions face à l’économie avant de migrer — ou regardez \u003Ca href=\"\u002Fblog\u002Fdeployer-netbird-controle-vpn-mesh-vps\">NetBird\u003C\u002Fa>, qui auto-héberge aussi son interface d’administration.",{"type":43,"title":212,"items":213},"Sauvegardes et mises à jour",[214,215,216,217],"Sauvegardez avant chaque mise à jour : Headscale applique ses migrations de base au démarrage de la nouvelle version. Arrêtez le service, copiez la configuration et les données, puis relancez : `cd \u002Fopt\u002Fheadscale && docker compose stop`, `cp -aR \u002Fopt\u002Fheadscale \u002Fopt\u002Fheadscale.backup-$(date +%Y%m%d%H%M%S)`, `docker compose up -d`.","Le dossier de données contient `db.sqlite` et `noise_private.key` : perdre cette clé change l’identité du serveur et oblige tous les nœuds à se réenregistrer. Copiez-le aussi hors du VPS, par exemple vers un stockage objet.","Montez de version en version : le projet impose de passer par chaque version mineure stable (par exemple `0.27` puis `0.28` puis `0.29`), toujours dans son dernier correctif, sans en sauter.","Lisez la note de version sur GitHub avant chaque mise à jour : elle signale les changements cassants de configuration. Comparez ensuite votre `config.yaml` au fichier d’exemple de la nouvelle version.",{"type":43,"title":219,"items":220},"Dépannage : les erreurs les plus fréquentes",[221,222,223,224,225],"Le client n’arrive pas à s’enregistrer : vérifiez que `https:\u002F\u002Fvpn.votre-domaine.com\u002Fhealth` répond depuis l’extérieur, que `server_url` correspond exactement au domaine du certificat, et que le proxy relaie bien les en-têtes `Upgrade` et `Connection`.","Connexions en `relay` au lieu de `direct` : un NAT strict ou un pare-feu bloque l’UDP entre les deux nœuds. Lancez `tailscale netcheck` des deux côtés pour voir ce qui est filtré ; le trafic passe quand même, par les relais DERP.","Nœud listé `offline` : le client a joint le serveur mais ne maintient pas la session. Vérifiez `systemctl status tailscaled` et `journalctl -u tailscaled` sur le nœud ; un pare-feu local qui coupe les connexions sortantes est la cause la plus courante.","Headscale refuse de démarrer après une mise à jour : une clé de configuration a été renommée ou retirée. Le journal la nomme ; reportez-vous au fichier d’exemple de la version installée.","MagicDNS ne résout pas : contrôlez que `dns.magic_dns` est à `true` et que `dns.base_domain` diffère du domaine de `server_url`, puis reconnectez le client pour qu’il récupère la nouvelle configuration DNS.","Déployez Headscale sur votre VPS en un clic","Auto-hébergez votre serveur de contrôle Tailscale avec des utilisateurs illimités et sans dépendance au cloud. ServOrbit provisionne une instance Headscale prête à l’emploi — configuration générée, HTTPS prêt, première clé d’authentification affichée dans la sortie du job.","Déployer Headscale","\u002Fvps-cloud?template=headscale",[231,249,268],{"id":232,"slug":233,"slugs":234,"title":238,"excerpt":239,"readTime":240,"views":18,"isPinned":19,"noindex":19,"publishedAt":241,"updatedAt":21,"category":242,"categories":243,"featuredImage":30,"bgImage":31,"posterImage":245,"relatedSolution":246},141,"installer-wireguard-vps",{"fr":233,"en":235,"ar":236,"es":237},"wireguard-on-a-vps-a-fast-lean-and-private-vpn","wireguard-على-خادم-vps-شبكة-vpn-سريعة-ومبسطة-وخاصة","wireguard-en-un-vps-vpn-rapido-y-privado","WireGuard sur VPS : VPN rapide, sobre et privé","Déployez WireGuard sur VPS ServOrbit : tunnels rapides, configuration lisible, QR codes clients et accès distant privé.",7,"2026-02-04T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[244],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Finstaller-wireguard-vps-poster.svg",{"categorySlug":247,"appSlug":248},"securite","wireguard-server",{"id":250,"slug":251,"slugs":252,"title":256,"excerpt":257,"readTime":258,"views":259,"isPinned":19,"noindex":19,"publishedAt":260,"updatedAt":261,"category":262,"categories":263,"featuredImage":30,"bgImage":31,"posterImage":265,"relatedSolution":266},162,"self-host-authelia-vps",{"fr":251,"en":253,"ar":254,"es":255},"self-host-authelia-on-a-vps-mfa-and-sso-for-your-whole-stack","استضافة-authelia-على-vps-مصادقة-ثنائية-ودخول-موحد-لمنظومتك","alojar-authelia-en-un-vps","Héberger Authelia sur un VPS : MFA et SSO pour toute la stack","Déployer Authelia sur VPS avec Docker Compose : TOTP, WebAuthn\u002Fpasskey, OIDC, migration LLDAP, monitoring Prometheus et comparaison avec Authentik.",10,4,"2026-07-04T00:00:00+00:00","2026-09-24T12:27:51+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[264],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-authelia-vps-poster.svg",{"categorySlug":27,"appSlug":267},"authelia",{"id":269,"slug":270,"slugs":271,"title":275,"excerpt":276,"readTime":23,"views":277,"isPinned":19,"noindex":19,"publishedAt":278,"updatedAt":279,"category":280,"categories":281,"featuredImage":30,"bgImage":31,"posterImage":283,"relatedSolution":284},140,"installer-openvpn-serveur-vps",{"fr":270,"en":272,"ar":273,"es":274},"openvpn-on-a-vps-private-controlled-remote-access","openvpn-على-خادم-vps-وصول-عن-بعد-خاص-ومضبوط","openvpn-en-un-vps-acceso-remoto-privado","OpenVPN sur VPS : installation, sécurité et dépannage","Installez OpenVPN Server sur votre VPS : prérequis, Easy-RSA, server.conf, profils .ovpn, fail2ban, ufw et dépannage des erreurs courantes.",0,"2026-02-05T00:00:00+00:00","2026-09-30T11:20:33+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[282],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Finstaller-openvpn-serveur-vps-poster.svg",{"categorySlug":247,"appSlug":285},"openvpn-server",true,1794270790184]