Alpine Linux আমাদের সবচেয়ে ছোট ইমেজ। আমাদের সার্ভারে নতুন Alpine 3.21 অলস অবস্থায় 55 MB RAM ও 153 MB ডিস্ক নিচ্ছিল, যেখানে Ubuntu 24.04 নিয়েছিল 313 MB ও 2.7 GB। বিনিময়ে চেনা টুলগুলো ছাড়তে হয়। 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 কী যোগ করে থাকলে সেটা root-এর authorized_keys-এ আছে। নতুন ইউজারের জন্য কপি করুন:
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 ঠিক Ubuntu-র sudo apt install nano-র মতো কাজ করে।
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 জরুরি, কারণ runlevel-এ যোগ না করলে OpenRC রিবুটের পরে ফায়ারওয়াল চালু করে না। রিবুটের পরে আমাদের সার্ভার 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
Alpine-এ root-এর crontab আগে থেকেই /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-এর পরের রিলিজে যাওয়া আলাদা, হাতে করার ধাপ। কার্নেল আপডেটে এখনো রিবুট লাগে: ধাপ 1-এর uname -r / ls /lib/modules যাচাই মাঝে মাঝে আবার করুন।
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 প্রায় পুরো RAM আপনার নিজের সফটওয়্যারের জন্য রেখে দেয়। 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-এর প্রতিটি Linux প্ল্যানে পাওয়া যায়। পেমেন্ট হয় Base, Ethereum বা Polygon নেটওয়ার্কে USDT, USDC বা ETH-এ, পরিচয়পত্র বা কার্ড ছাড়াই।
মন্তব্য
এখনো কোনো মন্তব্য নেই। প্রথম হোন।