Alpine Linux sunduğumuz en küçük imaj. Sunucularımızda yeni kurulmuş bir Alpine 3.21 boşta 55 MB RAM ve 153 MB disk kullandı; Ubuntu 24.04 ise 313 MB ve 2,7 GB. Bunun karşılığında alışık olduğunuz araçlardan vazgeçersiniz. Alpine, apt yerine apk, sudo yerine doas, systemd yerine OpenRC ve glibc yerine musl kullanır.
Aşağıdaki adımlar, Debian ya da Ubuntu üzerindeki ilk on dakikanın Alpine'e uyarlanmış hâli. Yayımlamadan önce her komutu Alpine 3.21 imajımızda çalıştırdık ve ikisi ilk seferde bizi şaşırttı. Panelinizdeki parolayla root olarak giriş yapın.
1. Güncelleyin, sonra bir kez yeniden başlatın
apk update && apk upgrade
uname -r
ls /lib/modules
Sunucunuz mevcut güncellemeleri ilk açılışta zaten kurdu, bu yüzden apk upgrade genellikle pek bir şey yapmaz. Bunun yerine son iki satıra bakın. O ilk güncelleme yeni bir çekirdek getirdiyse, çalışan çekirdeğin (uname -r) modülleri artık diskte değildir. Modül yükleyen her şey yeniden başlatana kadar hata verir. Test sunucumuzda güvenlik duvarı kurulumu ERROR: Couldn't determine iptables version yazdı. İki sürüm farklıysa şimdi yeniden başlatın:
reboot
Test sunucumuz bir dakikadan kısa sürede geri geldi.
2. Giriş yapabilen bir kullanıcı oluşturun
adduser -D deploy
passwd deploy
adduser deploy wheel
passwd adımını atlamayın. adduser -D hesabı parolasız oluşturur, Alpine onu kilitli olarak işaretler ve sshd kilitli bir hesabı doğru anahtarla bile reddeder. Testimizde tek ipucu /var/log/messages içindeki şu satırdı:
User deploy not allowed because account is locked
Parola daha sonra da gerekir: doas onu soracak.
Sunucuyu sipariş ederken bir SSH anahtarı eklediyseniz, root'un authorized_keys dosyasındadır. Yeni kullanıcıya kopyalayın:
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
Henüz anahtarınız yok mu? Bilgisayarınızda bir tane oluşturun ve açık kısmını /home/deploy/.ssh/authorized_keys içine yapıştırın.
3. doas parola sorsun
Alpine, sudo yerine doas kullanır ve imajımız wheel grubuna bunu zaten izin verir. /etc/doas.d/wheel.conf içindeki kural permit nopass :wheel olduğundan, wheel grubundaki herkes hiçbir şey yazmadan root olur. Parola sormasını ve birkaç dakika hatırlamasını sağlayın:
echo 'permit persist :wheel' > /etc/doas.d/wheel.conf
Artık doas apk add nano, Ubuntu'daki sudo apt install nano gibi çalışır.
4. SSH: yalnızca anahtar, root yok
sshd, /etc/ssh/sshd_config.d/ içindeki dosyaları ad sırasıyla okur ve her ayar için bulduğu ilk değeri tutar. İmajımızda ilk dosya 00-eqvps.conf'tur; ilk gün girebilmeniz için root ve parolayla girişe izin verir. İçeriğini değiştirin:
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) '
Üçüncü satır Alpine'de önemlidir. İmaj OpenSSH'nin PAM'li sürümünü kullanır ve yalnızca ilk iki satırla test sunucumuz hâlâ keyboard-interactive girişi sunuyordu. Üçü birlikteyken anahtarsız bir giriş denemesi şunu alır:
Permission denied (publickey).
root oturumunuzu açık tutun. İkinci bir terminalde ssh deploy@YOUR.SERVER.IP komutunun çalıştığını (NAT paketinde -p ve paneldeki kişisel portu ekleyin) ve doas id komutunun parolayı kabul ettiğini kontrol edin.
5. Güvenlik duvarı: ufw
ufw, imajımızda zaten etkin olan community deposunda bulunur:
apk add ufw
ufw limit 22/tcp
ufw --force enable
rc-update add ufw default
ufw status
limit, SSH'ye izin verir ama art arda çok sayıda bağlantı açanı yavaşlatır. rc-update burada önemlidir, çünkü OpenRC güvenlik duvarını runlevel'a eklemediğiniz sürece yeniden başlatmadan sonra çalıştırmaz. Yeniden başlatmanın ardından sunucumuz Status: active ile geri geldi. NAT paketinde SSH'yi 22 numaralı portta bırakın: kişisel dış portunuz sunucunun içinde 22'ye yönlendirilir. Kendi IPv4'ü olan pakette web portlarını gerektiğinde açın (ufw allow 80/tcp, ufw allow 443/tcp). Gerisi ufw rehberinde.
6. cron'u ve günlük güncellemeleri açın
Yeni bir Alpine sunucusu hiç cron çalıştırmaz. Açın:
rc-update add crond default
rc-service crond start
Alpine'de root'un crontab'ı /etc/periodic/daily içindeki her şeyi saat 02:00'de zaten çalıştırır. Oraya bir güncelleme betiği koyun:
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
Son komut cron'un çalıştıracağı betikleri listeler; sizinki de listede olmalı. Böylece 3.21 düzeltmelerini alırsınız. Sonraki Alpine sürümüne geçmek ayrı ve elle yapılan bir adımdır. Çekirdek güncellemeleri yine yeniden başlatma ister: 1. adımdaki uname -r / ls /lib/modules kontrolünü arada bir tekrarlayın.
7. Tek tabloda OpenRC
systemd biliyorsanız değişenlerin çoğu bunlar:
| İş | systemd | Alpine (OpenRC) |
|---|---|---|
| Servisi başlat | systemctl start nginx | rc-service nginx start |
| Açılışta başlat | systemctl enable nginx | rc-update add nginx default |
| Durum | systemctl status nginx | rc-service nginx status |
| Neler çalışıyor | systemctl list-units | rc-status |
| Sistem günlüğü | journalctl | /var/log/messages |
8. Docker ve ufw'nin engellemediği port
Alpine iyi bir Docker sunucusudur, çünkü sistemin kendisi pek araya girmez:
apk add docker docker-cli-compose
rc-update add docker default
rc-service docker start
docker run --rm hello-world
Sunucumuzda bu, indirme dahil 12 saniye sürdü. Docker hizmeti çalışırken kullanılan bellek 57 MB'tan 124 MB'a çıktı.
Yalnızca Alpine'e özgü olmayan bir tuzak: Docker kendi güvenlik duvarı kurallarını yazar. ufw yalnızca SSH'ye izin verirken nginx'i -p 8080:80 ile başlattık ve sunucunun dışından 8080 portundan ona ulaştık. ufw engellemedi. Bir konteynere yalnızca aynı sunucudaki bir ters vekil üzerinden erişilecekse onu localhost'ta yayımlayın:
docker run -d -p 127.0.0.1:8080:80 nginx:alpine
Hangi paket
Alpine, RAM'in neredeyse tamamını kendi yazılımınıza bırakır. Nano paketi (2 vCPU, 1 GB, 15 GB, ayda $3) küçük bir servis ya da birkaç konteyner için yeterli. Bu bir NAT paketi, yani SSH kişisel bir porttan gelir. 80 ve 443 portlarının internete açık olması gerekiyorsa Nano-IP ayda $8'a kendi IPv4'ünü verir. Daha ağır Docker yığınları için Micro ayda $5'a 2 GB sunar.
Alpine 3.21, Alpine VPS sayfasında ve VPS bölümündeki tüm Linux paketlerinde mevcut. Ödeme Base, Ethereum veya Polygon ağlarında USDT, USDC veya ETH ile yapılır; kimlik ve kart gerekmez.
Yorumlar
Henüz yorum yok. İlk olun.