كنت قد أنهيت تثبيتاً نظيفاً لـ Ubuntu Server 26 LTS، نصّبت Docker وDocker Compose، أعددت n8n وCloudflare Tunnel، وكل شيء كان يعمل بشكل مثالي. السيرفر يأخذ IP ثابت من الراوتر 192.168.1.6، الأتمتة تشتغل، والحياة جميلة.

ثم أغلقت الجهاز يدوياً.

وحين أعدت تشغيله في اليوم التالي، فتحت لوحة تحكم الراوتر لأرى الأجهزة المتصلة… السيرفر لم يكن موجوداً. اختفى تماماً. كأنه لم يُولد قط.


ما الذي رأيته على الشاشة؟

حين نظرت إلى شاشة السيرفر أثناء الإقلاع، وجدت رسالة تتكرر كالحلم المزعج:

Job systemd-networkd-wait-online.service/start running (1min 5s / no limit)
Job systemd-networkd-wait-online.service/start running (1min 35s / no limit)
Job systemd-networkd-wait-online.service/start running (1min 49s / no limit)

الجهاز كان عالقاً ينتظر. ينتظر ماذا؟ ينتظر أن تتصل الشبكة. لكن الشبكة لم تتصل لأنه كان ينتظر واجهات Docker الافتراضية (docker0، veth…) أن تكتمل — وهي واجهات لا تكتمل إلا بعد أن تنطلق الـ containers، وهي لا تنطلق إلا بعد أن يكتمل الإقلاع… دائرة مفرغة بامتياز.


التشخيص: ثلاثة أسباب متشابكة

بعد التحقيق طبعا بمساعدة السيد Claude ، تبيّن أن المشكلة لم تكن سبباً واحداً بل تضافرت عدة عوامل معاً:

أولاً — Docker أفسد الحساب: عند تثبيت Docker، يُنشئ واجهات شبكية افتراضية (docker0، br-xxxxx، veth). خدمة systemd-networkd-wait-online كانت تنتظر كل هذه الواجهات، لا فقط كارت الشبكة الحقيقي، مما جعل الإقلاع يتعطل في كل مرة.

ثانياً — DHCP لم يكمل عمله: حتى بعد اكتمال الإقلاع، كارت الشبكة eno1 كان يظهر في حالة UP لكن بدون أي IP. الطلب DHCP ذهب ولم يعد. تبيّن أن systemd-networkd في الإصدارات الحديثة يستخدم أحياناً معرّفاً عشوائياً بدلاً من MAC Address، مما يجعل الراوتر يعطيه IP مختلف في كل مرة أو يتجاهله تماماً.

ثالثاً — أدوات قديمة اختفت: حاولت تشغيل dhclient لتجديد عنوان IP يدوياً… command not found. حاولت nmcli… نفس الجواب. Ubuntu 26 أزال هذه الأدوات القديمة وأصبح يعتمد كلياً على networkctl وnetplan.


الحل: خطوتان لا ثالث لهما

الخطوة الأولى — تقييد خدمة الانتظار

المشكلة أن الخدمة كانت تنتظر الجميع. الحل: نخبرها بوضوح أن تنتظر eno1 فقط ولا شيء غيره.

sudo systemctl edit systemd-networkd-wait-online.service

ونضع داخله:

[Service]
ExecStart=
ExecStart=/lib/systemd/systemd-networkd-wait-online --interface=eno1
sudo systemctl daemon-reload

هذا وحده يحل مشكلة التأخير في الإقلاع.

الخطوة الثانية — إصلاح DHCP Client ID

نفتح إعدادات Netplan:

sudo nano /etc/netplan/00-installer-config.yaml

ونضيف سطراً واحداً فقط:

network:
  version: 2
  ethernets:
    eno1:
      dhcp4: true
      dhcp6: true
      dhcp-identifier: mac        # ← هذا هو المفتاح
      match:
        macaddress: 3c:d9:2b:70:71:c5
      set-name: eno1
sudo netplan apply

هذا السطر الصغير dhcp-identifier: mac يجعل الجهاز يعرّف نفسه دائماً بنفس الـ MAC Address، فيعطيه الراوتر نفس الـ IP في كل مرة.

الخطوة الثالثة (اختيارية لكن مُوصى بها) — حجز IP في الراوتر

ادخل على لوحة تحكم الراوتر، ابحث عن DHCP Reservation أو Address Binding، واربط MAC Address 3c:d9:2b:70:71:c5 بالعنوان 192.168.1.6 دائماً.


ما تعلمته من هذا كله

السيرفر المنزلي يختلف عن الـ VM على السحابة — هنا لا يوجد من يعيد تشغيل الخدمات تلقائياً، وكل قرار في الإعداد يظهر أثره وقت أحوج ما تكون إليه.

Docker أداة رائعة، لكنها تُعقّد طبقة الشبكة بشكل غير مرئي. وUbuntu Server 26 تغيّر كثيراً — إذا كنت معتاداً على dhclient وifconfig، فأنت الآن في عالم مختلف.

الدرس الأهم: لا تفترض أن ما نجح مرة سينجح دائماً بعد الإعادة التشغيل. اختبر دائماً بعد أول reboot.