Alpine Linux أصغر صورة نقدّمها. على خوادمنا استهلك Alpine 3.21 جديد وهو خامل 55 MB من الذاكرة و153 MB من القرص، مقابل 313 MB و2.7 GB لـ Ubuntu 24.04. والثمن أنك تتخلى عن الأدوات المعتادة. يستخدم Alpine الأداة apk بدل apt، وdoas بدل sudo، وOpenRC بدل systemd، وmusl بدل glibc.
الخطوات أدناه هي الدقائق العشر الأولى نفسها كما على Debian أو Ubuntu، منقولة إلى Alpine. شغّلنا كل أمر على صورة Alpine 3.21 لدينا قبل النشر، واثنان منها أوقعانا في المرة الأولى. ادخل باسم root بكلمة المرور الموجودة في لوحة التحكم.
1. حدّث النظام ثم أعد التشغيل مرة واحدة
apk update && apk upgrade
uname -r
ls /lib/modules
خادمك ثبّت التحديثات المتاحة عند أول إقلاع، لذلك لا يبقى لـ apk upgrade عادةً ما يفعله. انظر بدلاً من ذلك إلى السطرين الأخيرين. إذا جاء ذلك التحديث الأول بنواة جديدة، فإن النواة العاملة (uname -r) لم تعد وحداتها موجودة على القرص. وكل ما يحمّل وحدة سيفشل حتى تعيد التشغيل. على خادم الاختبار لدينا طبع تثبيت جدار الحماية ERROR: Couldn't determine iptables version. إذا اختلف الإصداران فأعد التشغيل الآن:
reboot
عاد خادم الاختبار لدينا في أقل من دقيقة.
2. أنشئ مستخدماً يستطيع الدخول
adduser -D deploy
passwd deploy
adduser deploy wheel
لا تتجاوز passwd. ينشئ adduser -D الحساب بلا كلمة مرور، فيعلّمه Alpine مقفلاً، ويرفض sshd الحساب المقفل حتى مع المفتاح الصحيح. في اختبارنا كان الدليل الوحيد هذا السطر في /var/log/messages:
User deploy not allowed because account is locked
وكلمة المرور مهمة لاحقاً أيضاً: هي ما سيطلبه doas.
إذا أضفت مفتاح SSH عند طلب الخادم، فهو في ملف authorized_keys الخاص بـ root. انسخه إلى المستخدم الجديد:
install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
install -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys
ليس لديك مفتاح بعد؟ أنشئ واحداً على حاسوبك والصق الجزء العام في /home/deploy/.ssh/authorized_keys.
3. اجعل doas يطلب كلمة المرور
يستخدم Alpine الأداة doas بدل sudo، وصورتنا تسمح بها مسبقاً لمجموعة wheel. القاعدة في /etc/doas.d/wheel.conf هي permit nopass :wheel، أي أن أي عضو في wheel يصبح root دون أن يكتب شيئاً. اجعلها تطلب كلمة المرور ثم تتذكرها لبضع دقائق:
echo 'permit persist :wheel' > /etc/doas.d/wheel.conf
من الآن يعمل doas apk add nano كما يعمل sudo apt install nano على Ubuntu.
4. SSH: مفاتيح فقط وبلا root
يقرأ sshd الملفات في /etc/ssh/sshd_config.d/ بترتيب الأسماء ويحتفظ بـأول قيمة يجدها لكل إعداد. في صورتنا أول ملف هو 00-eqvps.conf، وهو يسمح بدخول root وبكلمات المرور كي تتمكن من الدخول في اليوم الأول. استبدل محتواه:
cat > /etc/ssh/sshd_config.d/00-eqvps.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
EOF
sshd -t && rc-service sshd restart
sshd -T | grep -E '^(permitrootlogin|passwordauthentication|kbdinteractiveauthentication) '
السطر الثالث مهم على Alpine. تستخدم الصورة نسخة OpenSSH المبنية مع PAM، ومع السطرين الأولين فقط ظل خادم الاختبار لدينا يعرض الدخول عبر keyboard-interactive. ومع الأسطر الثلاثة تحصل محاولة الدخول بلا مفتاح على:
Permission denied (publickey).
أبقِ جلسة root مفتوحة. في طرفية ثانية تأكد أن ssh deploy@YOUR.SERVER.IP يعمل (في خطة NAT أضف -p والمنفذ الخاص من لوحة التحكم) وأن doas id يقبل كلمة المرور.
5. جدار الحماية: ufw
الأداة ufw موجودة في مستودع community، وهو مفعّل في صورتنا:
apk add ufw
ufw limit 22/tcp
ufw --force enable
rc-update add ufw default
ufw status
يسمح limit بـ SSH لكنه يبطّئ من يفتح اتصالات كثيرة متتالية. وrc-update مهم هنا، لأن OpenRC لا يشغّل جدار الحماية بعد إعادة التشغيل ما لم تضفه إلى runlevel. بعد إعادة التشغيل عاد خادمنا وحالته Status: active. في خطة NAT اترك SSH على المنفذ 22: منفذك الخارجي الخاص موجَّه إلى 22 داخل الخادم. وفي خطة لها IPv4 خاص افتح منافذ الويب عند الحاجة (ufw allow 80/tcp، ufw allow 443/tcp). والباقي في دليل ufw.
6. شغّل cron والتحديثات اليومية
خادم Alpine الجديد لا يشغّل cron إطلاقاً. شغّله:
rc-update add crond default
rc-service crond start
جدول crontab الخاص بـ root في Alpine يشغّل أصلاً كل ما في /etc/periodic/daily عند الساعة 02:00. ضع هناك سكربت تحديث:
cat > /etc/periodic/daily/apk-upgrade <<'EOF'
#!/bin/sh
apk upgrade --update-cache --no-progress >> /var/log/apk-auto.log 2>&1
EOF
chmod +x /etc/periodic/daily/apk-upgrade
run-parts --test /etc/periodic/daily
الأمر الأخير يعرض السكربتات التي سيشغّلها cron، ويجب أن يكون سكربتك بينها. بهذا تحصل على إصلاحات 3.21. أما الانتقال إلى إصدار Alpine التالي فخطوة يدوية منفصلة. وتحديثات النواة ما زالت تحتاج إعادة تشغيل: كرر من حين لآخر فحص uname -r / ls /lib/modules من الخطوة 1.
7. OpenRC في جدول واحد
إذا كنت تعرف systemd، فهذا معظم ما يتغير:
| المهمة | systemd | Alpine (OpenRC) |
|---|---|---|
| تشغيل خدمة | systemctl start nginx | rc-service nginx start |
| التشغيل عند الإقلاع | systemctl enable nginx | rc-update add nginx default |
| الحالة | systemctl status nginx | rc-service nginx status |
| ما الذي يعمل | systemctl list-units | rc-status |
| سجل النظام | journalctl | /var/log/messages |
8. Docker، والمنفذ الذي لا يحجبه ufw
Alpine مضيف جيد لـ Docker لأن النظام نفسه لا يعترض الطريق تقريباً:
apk add docker docker-cli-compose
rc-update add docker default
rc-service docker start
docker run --rm hello-world
استغرق ذلك على خادمنا 12 ثانية مع التنزيل. ومع تشغيل خدمة Docker ارتفعت الذاكرة المستخدمة من 57 MB إلى 124 MB.
فخ لا يخص Alpine وحده: يكتب Docker قواعد جدار الحماية الخاصة به. بينما كان ufw لا يسمح إلا بـ SSH، شغّلنا nginx بالخيار -p 8080:80 ووصلنا إليه من خارج الخادم على المنفذ 8080. لم يحجبه ufw. إذا كان يجب الوصول إلى حاوية عبر وكيل عكسي على الخادم نفسه فقط، فانشرها على localhost:
docker run -d -p 127.0.0.1:8080:80 nginx:alpine
أي خطة تختار
يترك Alpine معظم الذاكرة لبرامجك أنت. خطة Nano (2 vCPU، 1 GB، 15 GB، $3 شهرياً) تكفي لخدمة صغيرة أو بضع حاويات. إنها خطة NAT، فيدخل SSH عبر منفذ خاص. إذا احتجت المنفذين 80 و443 مفتوحين للإنترنت، فخطة Nano-IP لها IPv4 خاص مقابل $8 شهرياً. ولحزم Docker الأثقل تمنحك Micro 2 GB مقابل $5 شهرياً.
Alpine 3.21 موجود في صفحة Alpine VPS ومتاح في كل خطط Linux ضمن VPS. الدفع بعملات USDT أو USDC أو ETH على شبكات Base أو Ethereum أو Polygon، دون وثائق هوية أو بطاقة.
التعليقات
لا تعليقات بعد. كن الأول.