لماذا تستضيف خادم التحكم ذاتيًا
إن Tailscale برمجية استثنائية — أداء WireGuard، وعملاء متعددو المنصات، وmagic DNS يعمل من المحاولة الأولى. لكنه لا ينقل حركة مرورك: تنتقل حزم WireGuard مباشرة من عقدة إلى أخرى، مشفّرة من طرف إلى طرف. أما ما يعمل في سحابة Tailscale فهو مستوى التحكم — خادم التنسيق الذي يتبادل المفاتيح العامة، ويُعرّف النظراء ببعضهم، ويوزّع عناوين 100.x.y.z، وينشر أسماء MagicDNS، ويوزّع قوائم ACL وخريطة مرحّلات DERP. ومن دونه لا تجد العُقد بعضها. يعيد Headscale بناء خادم التنسيق هذا بلغة Go مفتوحة المصدر وبالبروتوكول نفسه، لتشغّله على بنيتك التحتية الخاصة: لا يتغير لدى عملاء Tailscale سوى عنوان تسجيل الدخول.
إلى جانب سقف الطبقة المجانية البالغ 6 مستخدمين، فإن السبب الرئيسي للاستضافة الذاتية هو موطن البيانات: يعرف مستوى التحكم أي الأجهزة على شبكتك، وعناوين IP الخاصة بها، وأسماءها، وسياسات ACL لديك. تشغيل Headscale يعني أن هذه المعلومات تبقى على خادم VPS الخاص بك — لا في سحابة طرف آخر — وأن شبكتك لم تعد رهينة قرار تسعير أو عطل لدى جهة خارجية.
ما الذي يمنحك إياه Headscale المُستضاف ذاتيًا
- مستخدمون وأجهزة دون حدود: لا سقف يفرضه البرنامج ولا تسعير لكل مقعد — تنمو شبكتك المتشابكة مع فريقك، ولا يحدّها سوى موارد خادم VPS.
- عملاء Tailscale الرسميون في كل مكان: Linux وmacOS وWindows وiOS وAndroid — دون حاجة إلى نسخة مُفرّعة أو عميل بديل.
- أنفاق WireGuard من نظير إلى نظير: يتولى Headscale تبادل المفاتيح وتوزيع ACL فقط؛ أما حركة المرور الفعلية فتمر مباشرة عبر WireGuard بين النظراء.
- Magic DNS: اعثر على كل عقدة في شبكتك عبر اسم مضيفها (
laptop.mesh.yourdomain.com) دون تعديل DNS العام. - سياسات بصيغة HuJSON: صيغة ملف السياسة نفسها المستخدمة في Tailscale، مع ACL وGrants — حدّد أي المستخدمين والأجهزة يصلون إلى أي الخدمات.
- دعم مرحّلات DERP: استخدم خريطة DERP العامة لـ Tailscale لاجتياز NAT، أو فعّل خادم DERP المدمج في Headscale لتبقى المرحّلات لديك أيضًا.
- واجهة API وسطر أوامر headscale: أنشئ المستخدمين، وأصدر مفاتيح المصادقة المسبقة، وأدر العُقد برمجيًا.
- تسجيل دون حساب على tailscale.com: ينضم زملاؤك إلى الشبكة بمفتاح تولّده أنت، أو عبر مزوّد OpenID Connect الذي تستخدمه أصلًا (Keycloak وAuthelia وGoogle Workspace…).
- الشبكات الفرعية وexit nodes وTaildrop وTailscale SSH: يدعم الخادم الوظائف الأساسية لـ Tailscale.
- أقل من 50 MB من الذاكرة في وضع الخمول — يعمل بأريحية على خادم VPS بسعة 1 GB إلى جانب أحمال عمل أخرى.
المتطلبات
خادم VPS بمعالج افتراضي واحد على الأقل و512 MB من الذاكرة (تترك 1 GB هامشًا للنظام) يعمل بنظام Ubuntu 22.04 أو أحدث، أو Debian 12 أو أحدث — وهي التوزيعات التي تستهدفها الحزم الرسمية. لمسار Docker، ثبّت Docker وDocker Compose v2. يلزم عنوان IP عام، ويُوصى بإعداد مزدوج IPv4 + IPv6.
اسم نطاق يشير إلى الخادم مطلوب: يتصل عملاء Tailscale بخادم التحكم عبر عنوان URL، ويوصي المشروع بشدة بتقديم Headscale عبر HTTPS على المنفذ 443، إذ يفترض عميل Tailscale هذا المنفذ في بعض الحالات. خصّص نطاقًا فرعيًا للخادم (vpn.yourdomain.com) وآخر مختلفًا لأسماء MagicDNS (mesh.yourdomain.com): يرفض Headscale أن يكون نطاق MagicDNS هو نطاق server_url نفسه.
المنافذ الواجب فتحها على الخادم
- TCP 443: إلزامي. عبره يسجّل العملاء أنفسهم ويستلمون خريطة الشبكة؛ وهو المنفذ الوحيد الذي لا غنى عنه لخادم التنسيق.
- TCP 80: فقط للتحقق من Let's Encrypt عبر HTTP-01 وللتحويل إلى HTTPS.
- UDP 3478: فقط إذا فعّلت خادم DERP المدمج، الذي يحتاجه لـ STUN. مع خريطة DERP العامة لـ Tailscale لا داعي لفتحه.
- TCP 8080 (Headscale) و9090 (المقاييس) و50443 (gRPC): أبقها على
127.0.0.1. يتحدث الوكيل العكسي إلى 8080 محليًا، ولا تكشف واجهة إدارة gRPC أبدًا ما لم تحتج إليها.
انشر Headscale باستخدام Docker Compose
اكتب ملف Compose
تتكون الحزمة من خدمة واحدة: الصورة الرسمية
docker.io/headscale/headscale:0.29.7، آخر إصدار مستقر في 7 نوفمبر 2026، تُشغَّل بالأمرserve. يحفظ Headscale كل شيء — المفاتيح وقاعدة البيانات وسجلات العُقد — في مجلدين على المضيف: التهيئة، مُحمّلة للقراءة فقط على/etc/headscale، والبيانات على/var/lib/headscale. لا حاجة إلى قاعدة بيانات خارجية أو خدمة تخزين مؤقت؛ فـ SQLite مدمج.mkdir -p /opt/headscale/config /opt/headscale/lib cat > /opt/headscale/compose.yaml <<'EOF' services: headscale: image: docker.io/headscale/headscale:0.29.7 container_name: headscale restart: unless-stopped read_only: true tmpfs: - /var/run/headscale ports: - "127.0.0.1:8080:8080" volumes: - /opt/headscale/config:/etc/headscale:ro - /opt/headscale/lib:/var/lib/headscale command: serve healthcheck: test: ["CMD", "headscale", "health"] EOFلا يُنشر المنفذ إلا على
127.0.0.1: الوكيل العكسي هو الذي يواجه الإنترنت.ولّد التهيئة
ابدأ من ملف المثال الخاص بالإصدار الذي تنشره بالضبط، ولا تغيّر سوى المفاتيح أدناه.
server_urlهو عنوان HTTPS الذي سيتصل به عملاء Tailscale؛ ويجب أن يستمعlisten_addrعلى0.0.0.0داخل الحاوية. تُعرَّف قاعدة البيانات تحتdatabase(type: sqlite). لا يبقى إلا مسار مفتاح noise: يولّده Headscale عند أول تشغيل إن لم يكن الملف موجودًا.curl -Lo /opt/headscale/config/config.yaml \ https://raw.githubusercontent.com/juanfont/headscale/v0.29.7/config-example.yamlserver_url: https://vpn.yourdomain.com listen_addr: 0.0.0.0:8080 noise: private_key_path: /var/lib/headscale/noise_private.key database: type: sqlite sqlite: path: /var/lib/headscale/db.sqlite dns: magic_dns: true base_domain: mesh.yourdomain.comفي ServOrbit، تكتب مهمة التوفير ملف
config.yamlمن نطاقك تلقائيًا.شغّل الحاوية وتحقق
شغّل
docker compose up -dمن/opt/headscale. يولّد Headscale مفتاح noise ثم يبدأ الاستماع على المنفذ 8080. تحقق من نقطة نهاية الصحة: ينبغي أن يُعيدcurl -s http://127.0.0.1:8080/healthالقيمة{"status":"pass"}. الصورة مبنية على أساس distroless بلا صدفة أوامر، لكن سطر أوامر headscale يُستدعى مباشرة: يؤكدdocker exec headscale headscale versionالإصدار الجاري، ويعرضdocker logs --follow headscaleالسجلات.أنشئ مستخدمًا وولّد مفتاح مصادقة
ينظّم Headscale الأجهزة في «مستخدمين» (كانوا يُسمّون سابقًا namespaces). أنشئ واحدًا ثم دوّن معرّفه الرقمي: يتوقع الخيار
--userفيpreauthkeys createهذا المعرّف لا الاسم.docker exec headscale headscale users create myteam docker exec headscale headscale users list docker exec headscale headscale preauthkeys create --user 1 --reusable --expiration 24hمن دون
--reusableلا يصلح المفتاح إلا مرة واحدة، ومن دون--expirationتنتهي صلاحيته بعد ساعة. انسخ المفتاح المعروض — ستستخدمه لتسجيل كل جهاز.سجّل جهازًا
على أي جهاز مثبّت عليه عميل Tailscale الرسمي، وجّهه إلى نسخة Headscale الخاصة بك:
tailscale up --login-server https://vpn.yourdomain.com --authkey <your-preauth-key>. يظهر الجهاز في قائمة عُقد Headscale خلال ثوانٍ:docker exec headscale headscale nodes list. من دون مفتاح، يفتح العميل صفحة تعرض معرّف مصادقة؛ وافق عليه من الخادم بالأمرdocker exec headscale headscale auth register --user myteam --auth-id <AUTH_ID>. بعد التسجيل، تتواصل الأجهزة عبر عنوان IP الشبكة (100.64.x.y) أو عبر اسم مضيف magic DNS.عرّف سياسات التحكم في الوصول
ما دامت لا توجد سياسة محمّلة، يسمح Headscale بكل حركة المرور بين العُقد — وهذا مقبول لفريق صغير موثوق، لا حين تتجاور حواسيب المطورين والمتعاقدين وخوادم الإنتاج. أنشئ
/opt/headscale/config/policy.hujsonوصرّح به فيconfig.yamlعبرpolicy.path: /etc/headscale/policy.hujson. يستخدم Headscale صيغة HuJSON نفسها المستخدمة في Tailscale: عرّف مجموعات المستخدمين، ووسِم الأجهزة كخوادم أو محطات عمل، واكتب قواعد تحدد أي المجموعات تصل إلى أي المنافذ. يوصي المشروع باستخدام Grants بدل ACL التي يعدّها Tailscale قديمة. تحقق من الملف بالأمرheadscale policy check --file <file>ثم أعد التحميل: لا تُقرأ السياسة إلا عند إعادة التحميل (docker kill --signal=HUP headscale، أوsystemctl reload headscaleفي التثبيت الأصلي). احفظ هذا الملف في مستودع Git خاص لتحتفظ بسجل تغييرات الوصول.أول تسجيل دخول
لا يملك Headscale واجهة ويب ولا حسابات: إنه خادم التحكم في شبكتك الخاصة، ويُدار عبر سطر الأوامر. عبر SSH:
docker exec -it headscale headscale users create monuser، ثم المفتاح بالأمرpreauthkeys create --user <ID> --reusable --expiration 24h، واربط أجهزتك بالأمرtailscale up --login-server https://<your-domain> --authkey <key>. يمكن للتطبيقات الرسومية أيضًا استهداف خادم مخصص: على macOS اضغط Option مع النقر على أيقونة Tailscale، ثم قائمة Debug ثمCustom Login Server؛ وعلى iOS الخيارUse custom coordination serverفي قائمة تسجيل الدخول؛ وعلى Android الخيارUse an alternate server؛ وعلى Windows الأمرtailscale login --login-serverفي PowerShell.
من دون Docker: حزمة .deb الرسمية
ينشر المشروع حزم .deb لـ Debian وUbuntu ويوصي بها على هذه التوزيعات: فهي تنشئ مستخدم النظام headscale، وتضع تهيئة افتراضية، وتثبّت وحدة systemd. إنه المسار الأبسط إذا كان Headscale وحيدًا على خادمه أو إذا كنت تفضّل خدمة أصلية على حاوية. أوامر الإدارة هي نفسها الواردة أعلاه، من دون البادئة docker exec headscale.
ثبّت Headscale عبر حزمة .deb
نزّل الحزمة وثبّتها
احصل على حزمة الإصدار المطلوب من صفحة الإصدارات على GitHub، بحسب معمارية جهازك (
amd64أوarm64)، وثبّتها عبرaptالذي يحلّ الاعتماديات:HEADSCALE_VERSION="0.29.7" HEADSCALE_ARCH="amd64" wget --output-document=headscale.deb \ "https://github.com/juanfont/headscale/releases/download/v${HEADSCALE_VERSION}/headscale_${HEADSCALE_VERSION}_linux_${HEADSCALE_ARCH}.deb" sudo apt install ./headscale.debثم تحقق: يجب أن يعرض
headscale versionالقيمة0.29.7.عدّل التهيئة
تضع الحزمة التهيئة في
/etc/headscale/config.yamlومثالًا محدّثًا في/usr/share/doc/headscale/examples/config-example.yaml. غيّر المفاتيح نفسها كما في Docker (server_urlوdatabaseوdns.base_domain)، لكن أبقِlisten_addr: 127.0.0.1:8080: تعمل الخدمة على المضيف، ولا ينبغي أن يصل إليها إلا الوكيل العكسي. تقيم البيانات في/var/lib/headscale.أعد تشغيل الخدمة وتحقق منها
أعد تشغيل الخدمة لتعيد قراءة التهيئة، ثم افحص حالتها وسجلاتها:
sudo systemctl restart headscale sudo systemctl status headscale sudo journalctl -u headscale -fيجب أن يظهر
Active: active (running). عند أول تشغيل، أكثر الأخطاء شيوعًا هيserver_urlبلا المخططhttps://، ونطاق MagicDNS مطابق لنطاق الخادم.استخدم سطر الأوامر دون صلاحيات root
يتحدث سطر الأوامر إلى الخدمة عبر مقبس Unix
/var/run/headscale/headscale.sock، الذي لا يصل إليه افتراضيًا إلا المستخدمheadscaleوroot. استخدمsudo، أو نفّذ الأوامر بصفة المستخدمheadscale، أو أضف حسابك إلى المجموعةheadscale. تحقق من الوصول بالأمرheadscale users list.
قدّم Headscale عبر HTTPS خلف Nginx
يتحدث عملاء Tailscale إلى Headscale ببروتوكولهم الخاص، المنقول عبر اتصال WebSocket يُفتح بطلب POST، وتكون قيمة ترويسة Upgrade فيه tailscale-control-protocol. لذا يجب أن يمرّر الوكيل العكسي ترويستي Upgrade وConnection كما هما، وألا يخزّن الردود مؤقتًا. تتبع التهيئة أدناه المثال الوارد في توثيق المشروع؛ احصل أولًا على الشهادة عبر certbot (certbot certonly --nginx -d vpn.yourdomain.com).
map $http_upgrade $connection_upgrade {
default keep-alive;
'' close;
}
server {
listen 80;
server_name vpn.yourdomain.com;
location = /generate_204 { return 204; }
location / { return 301 https://$server_name$request_uri; }
}
server {
listen 443 ssl;
http2 on;
server_name vpn.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/vpn.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vpn.yourdomain.com/privkey.pem;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_pass http://127.0.0.1:8080;
}
}اترك tls_cert_path وtls_key_path فارغين في config.yaml: يتولى Nginx إنهاء TLS، لذا فالتحذير listening without TLS عند التشغيل متوقع. ولكي تُظهر سجلات Headscale عناوين IP الحقيقية للعملاء، صرّح بالوكيل مصدرًا موثوقًا. في التثبيت الأصلي تكفي واجهة الحلقة المحلية؛ أما مع Docker فأضف أيضًا شبكة جسر Docker (docker network inspect)، لأن الحاوية ترى الوكيل قادمًا من بوابتها:
trusted_proxies:
- 127.0.0.1/32
- ::1/128يعمل Caddy أيضًا بسطر reverse_proxy 127.0.0.1:8080 بسيط. في المقابل، لا يُدعم وكيل Cloudflare ولا Cloudflare Tunnel، لأنهما لا يتعاملان مع WebSocket عبر POST: يجب أن يبقى سجل DNS للخادم في وضع DNS فقط.
اقرِن Headscale بـ Authelia لوصول شبكي محمي بالمصادقة الثنائية
يتولى Headscale التحكم في الوصول على مستوى الشبكة (أي عناوين IP يمكنها التواصل مع أي نظراء)، لكنه لا يفرض المصادقة على مستوى التطبيق. اقرِنه بـ Authelia على خادم VPS نفسه: وجّه خدماتك الداخلية (التي لا يُوصل إليها إلا عبر الشبكة المتشابكة) عبر طبقة forward-auth الخاصة بـ Authelia. يجب على المستخدمين إكمال المصادقة الثنائية للوصول إلى الخدمات حتى بعد دخولهم الشبكة — دفاع في العمق لأحمال العمل الحساسة.
تحقق من أن العُقد ترى بعضها
ظهور عقدة في headscale nodes list لا يثبت إلا أنها وصلت إلى خادم التنسيق. قبل تمرير حركة مرور حقيقية عبر الشبكة، تحقق من المسار من طرف إلى طرف انطلاقًا من العملاء أنفسهم.
افحص الشبكة المتشابكة من عميل
اقرأ حالة الشبكة
على عقدة مسجّلة، شغّل
tailscale status. يسرد الأمر النظراء مع عنوان IP الشبكة واسمهم ونوع الارتباط: تعنيdirectأن نفق WireGuard قائم دون وسيط، وتعنيrelayأنه يمر عبر مرحّل DERP — يعمل، لكن بزمن استجابة أعلى.اختبر الاتصال
خذ عنوان IP أحد النظراء من
tailscale statusثم نفّذping 100.64.0.2، أو الأفضلtailscale ping <node-name>الذي يبيّن هل وصل الرد مباشرة أم عبر مرحّل. إذا ظهر النظير لكنه لا يستجيب، يقيسtailscale netcheckزمن الاستجابة نحو كل منطقة DERP ويكشف UDP صادرًا محجوبًا.اختبر حل أسماء MagicDNS
مع
dns.magic_dns: true، تستجيب كل عقدة لاسمها القصير واسمها الكامل:ping node-nameأوping node-name.mesh.yourdomain.com. لا حاجة إلى أي سجل DNS عام لهذه الأسماء الداخلية. إذا فشل الحل، يعرضtailscale dns statusتهيئة DNS التي استلمها العميل من الخادم.
حالة استخدام: SSH بين خوادم VPS دون كشف المنفذ 22
بعد تسجيل خوادم VPS للتطوير والإنتاج على الشبكة المتشابكة نفسها، لم يعد SSH بحاجة إلى الاستماع على الواجهة العامة: يمر الاتصال عبر عنوان الشبكة داخل نفق WireGuard. أبقِ وصول الطرفية (console) لدى مزوّدك مفتوحًا قبل لمس الجدار الناري، تحسبًا لقاعدة تغلق الباب أمامك.
اقصر SSH على الشبكة المتشابكة
حدّد الواجهة وعنوان الشبكة
على كل خادم VPS، ينشئ عميل Tailscale الواجهة
tailscale0. يعرضtailscale ip -4عنوان الشبكة للجهاز؛ دوّن عنوان خادم الإنتاج، مثلًا100.64.0.3.اسمح بـ SSH عبر tailscale0 فقط
على خادم الإنتاج، اسمح بـ SSH على واجهة الشبكة المتشابكة قبل رفضه في غيرها — يطبّق UFW أول قاعدة مطابقة:
ufw allow in on tailscale0 to any port 22 proto tcp ufw deny 22/tcp ufw enable ufw status verboseلم يعد المنفذ 22 متاحًا من الإنترنت، لكنه يبقى مفتوحًا لكل عُقد الشبكة التي تسمح بها سياستك.
اتصل عبر الشبكة المتشابكة
من خادم التطوير أو من محطة عملك المسجّلة، اتصل عبر عنوان IP أو اسم MagicDNS:
ssh [email protected]أوssh [email protected]. يمر كل شيء داخل النفق المشفّر؛ ثم حدّد في سياسة Headscale أي المجموعات يمكنها الوصول إلى المنفذ 22 على هذا الخادم.
انقل فريقًا يعمل حاليًا على Tailscale
لا يتطلب الانتقال أي إعادة تثبيت: يقبل العميل الرسمي الخيار --login-server، فيكفي فصله عن الشبكة القديمة ثم وصله بخادمك. ينقطع كل جهاز بضع ثوانٍ أثناء العملية. وبما أن خادمك يوزّع بنفسه عناوين 100.x وأسماء MagicDNS، خطّط لتحديث السكربتات وقواعد الجدار الناري وملفات التهيئة التي تشير إلى القديمة منها.
انقل العملاء إلى Headscale
استرجع سياسة الوصول
انسخ ملف سياسة الـ tailnet من محرر Access controls في لوحة Tailscale وابدأ منه: صيغة HuJSON هي نفسها. افحصه بالأمر
headscale policy checkقبل الانتقال — فبعض الوظائف، مثل IP sets، غير مدعومة، ولا يتوفر إلا جزء من autogroups.افصل كل عميل ثم أعد وصله
على Linux أو من سطر الأوامر، نفّذ تسجيل الخروج ثم إعادة الاتصال بمفتاح مصادقة مسبقة:
tailscale logout tailscale up --login-server https://vpn.yourdomain.com --authkey <PREAUTHKEY>على macOS وiOS وAndroid وWindows، سجّل خروج الحساب من التطبيق، ثم أضف الخادم المخصص كما ورد أعلاه.
ابدأ بأجهزة الاختبار
انقل أولًا محطة عمل وخادمًا للاختبار، وتحقق من
tailscale statusومن حل الأسماء، ثم أجهزة التطوير، والإنتاج في الأخير. ما دامت بعض الأجهزة في الجهة الأخرى، فلن ترى الشبكتان بعضهما: خطّط لنقل الخدمة وعملائها في النافذة الزمنية نفسها.أغلق حساب Tailscale أو خفّض خطته
بعد نقل كل العُقد والتحقق منها، أغلق الـ tailnet أو عد إلى خطة Personal إن كان لديك استخدام شخصي. ولّد مفتاح مصادقة مسبقة جديدًا للتسجيلات القادمة بدل الاحتفاظ بمفتاح الانتقال إلى ما لا نهاية.
Headscale مقابل Tailscale Cloud
يبقى Tailscale Cloud المسار الأسهل للفرق الصغيرة: لا خادم للصيانة، وترقيات تلقائية، وفوترة مدمجة — وتبقى خطة Personal مجانية حتى 6 مستخدمين. بعد ذلك، تظهر خطة Standard بسعر 8 $ لكل مستخدم شهريًا في جدول الأسعار المعمول به منذ 8 أبريل 2026: أي 40 $ شهريًا لخمسة أشخاص و80 $ لعشرة. أما Headscale فيكلّف ثمن خادم VPS أيًا كان عدد الفريق — في ServOrbit يكفي VPS Solo (2 vCPU / 4 GB) بسعر 99 درهم/شهر لعشرات العُقد — يضاف إليه وقت التشغيل: الترقيات والنسخ الاحتياطي والمراقبة.
لذلك يصبح Headscale منطقيًا عندما يتجاوز الفريق 6 مستخدمين، أو عندما يفرض موطن البيانات إبقاء طوبولوجيا شبكتك خارج خوادم الأطراف الثالثة، أو عندما تريد قابلية تدقيق كاملة لسجلات التنسيق. العملاء متطابقون — الانتقال من Tailscale Cloud إلى Headscale يعني إعادة تشغيل tailscale up --login-server على كل جهاز.
Tailscale Personal وTailscale Standard وHeadscale
مرّر الجدول أفقيًا
| المعيار | Tailscale Personal | Tailscale Standard | Headscale على VPS |
|---|---|---|---|
| السعر | مجاني | 8 $ لكل مستخدم شهريًا | تكلفة خادم VPS |
| المستخدمون | حتى 6 | دون سقف | لا حد برمجي |
| أجهزة المستخدمين | دون سقف | دون سقف | لا حد برمجي |
| خادم التنسيق | سحابة Tailscale | سحابة Tailscale | خادمك، تحت سيطرتك |
| العميل | عميل Tailscale الرسمي | عميل Tailscale الرسمي | عميل Tailscale الرسمي (`--login-server`) |
| MagicDNS وACL وGrants | نعم | نعم | نعم، على نطاقك الخاص |
| Funnel وServe | يقدّمهما Tailscale | يقدّمهما Tailscale | غير مدعومين |
| الصيانة | لا شيء (خدمة مُدارة) | لا شيء (خدمة مُدارة) | ترقيات ونسخ احتياطي ومراقبة |
ما لا يحل Headscale محله
ينفّذ Headscale خادم التنسيق، لا المنصة التجارية كلها. ويسرد توثيقه نفسه ما ينقصه: لا يُدعم Tailscale Funnel (نشر خدمة محلية على الإنترنت)، ولا Tailscale Serve (مشاركتها داخل الـ tailnet عبر وكيل محلي)، ولا سجلات تدفق الشبكة؛ ولا يمكن استخدام مجموعات OIDC في ACL. ولا توجد كذلك لوحة ويب رسمية: كل شيء يمر عبر سطر الأوامر أو API. إذا اقتصر استخدامك على الاتصال الشبكي المتشابك وMagicDNS وسياسات الوصول والشبكات الفرعية وexit nodes، فإن Headscale يغطي الحاجة؛ أما إذا كنت تستخدم Funnel أو Serve بانتظام، فوازن بين هذه الوظائف وحجم التوفير قبل الانتقال — أو ألقِ نظرة على NetBird الذي يستضيف واجهة إدارته ذاتيًا أيضًا.
النسخ الاحتياطي والترقيات
- خذ نسخة احتياطية قبل كل ترقية: يطبّق Headscale ترحيلات قاعدة البيانات عند تشغيل الإصدار الجديد. أوقف الخدمة، وانسخ التهيئة والبيانات، ثم أعد التشغيل:
cd /opt/headscale && docker compose stop,cp -aR /opt/headscale /opt/headscale.backup-$(date +%Y%m%d%H%M%S),docker compose up -d. - يحتوي مجلد البيانات على
db.sqliteوnoise_private.key: فقدان هذا المفتاح يغيّر هوية الخادم ويُجبر كل العُقد على إعادة التسجيل. انسخه أيضًا خارج الخادم، إلى تخزين كائنات مثلًا. - ترقَّ إصدارًا بعد إصدار: يشترط المشروع المرور بكل إصدار ثانوي مستقر (مثلًا
0.27ثم0.28ثم0.29)، دائمًا في آخر تصحيح له، دون تخطي أي منها. - اقرأ ملاحظات الإصدار على GitHub قبل كل ترقية: فهي تنبّه إلى تغييرات التهيئة الكاسرة. ثم قارن ملف
config.yamlلديك بملف المثال الخاص بالإصدار الجديد.
استكشاف الأعطال: الأخطاء الأكثر شيوعًا
- لا ينجح العميل في التسجيل: تحقق من أن
https://vpn.yourdomain.com/healthيستجيب من الخارج، وأنserver_urlيطابق نطاق الشهادة تمامًا، وأن الوكيل يمرّر ترويستيUpgradeوConnection. - اتصالات
relayبدلdirect: يحجب NAT صارم أو جدار ناري حركة UDP بين العقدتين. شغّلtailscale netcheckعلى الطرفين لمعرفة ما يُحجب؛ تبقى الحركة ممكنة عبر مرحّلات DERP. - عقدة تظهر بحالة
offline: وصل العميل إلى الخادم لكنه لا يحافظ على الجلسة. افحصsystemctl status tailscaledوjournalctl -u tailscaledعلى العقدة؛ والسبب الأكثر شيوعًا جدار ناري محلي يقطع الاتصالات الصادرة. - يرفض Headscale التشغيل بعد ترقية: أُعيدت تسمية مفتاح تهيئة أو حُذف. يذكره السجل باسمه؛ ارجع إلى ملف المثال الخاص بالإصدار المثبّت.
- لا يحل MagicDNS الأسماء: تحقق من أن
dns.magic_dnsعلىtrueوأنdns.base_domainيختلف عن نطاقserver_url، ثم أعد وصل العميل ليستلم تهيئة DNS الجديدة.