Alpine Linux کوچکترین ایمیجی است که ارائه میدهیم. روی سرورهای ما یک Alpine 3.21 تازه در حالت بیکار 55 MB رم و 153 MB دیسک مصرف میکرد، در برابر 313 MB و 2.7 GB برای Ubuntu 24.04. بهایش کنار گذاشتن ابزارهای آشناست. Alpine بهجای apt از apk، بهجای sudo از doas، بهجای systemd از OpenRC و بهجای glibc از musl استفاده میکند.
قدمهای زیر همان ده دقیقهٔ اول روی 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 بهجای sudo از doas استفاده میکند و ایمیج ما از قبل آن را برای گروه 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 جلویش را نگرفت. اگر کانتینری باید فقط از راه یک reverse proxy روی همان سرور در دسترس باشد، آن را روی 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 با ماهی $8 یک IPv4 اختصاصی دارد. برای پشتههای سنگینتر Docker، Micro با ماهی $5 2 GB رم میدهد.
Alpine 3.21 در صفحهٔ Alpine VPS هست و روی همهٔ پلنهای لینوکس در بخش VPS در دسترس است. پرداخت با USDT، USDC یا ETH روی شبکههای Base، Ethereum یا Polygon انجام میشود، بدون مدرک هویتی و کارت.
نظرات
هنوز نظری نیست. اولین نفر باشید.