Alpine Linux to najmniejszy obraz w naszej ofercie. Na naszych serwerach świeży Alpine 3.21 zajmował w spoczynku 55 MB RAM i 153 MB dysku, a Ubuntu 24.04 — 313 MB i 2,7 GB. Ceną jest rezygnacja z dobrze znanych narzędzi. Alpine używa apk zamiast apt, doas zamiast sudo, OpenRC zamiast systemd i musl zamiast glibc.
Poniższe kroki to te same pierwsze dziesięć minut co na Debianie czy Ubuntu, przełożone na Alpine. Przed publikacją wykonaliśmy każde polecenie na naszym obrazie Alpine 3.21, a dwa z nich za pierwszym razem nas zaskoczyły. Zaloguj się jako root hasłem z panelu.
1. Zaktualizuj i raz zrestartuj
apk update && apk upgrade
uname -r
ls /lib/modules
Serwer zainstalował dostępne aktualizacje już przy pierwszym uruchomieniu, więc apk upgrade zwykle nie ma wiele do zrobienia. Patrz raczej na dwa ostatnie wiersze. Jeśli ta pierwsza aktualizacja przyniosła nowe jądro, działające jądro (uname -r) nie ma już swoich modułów na dysku. Wszystko, co ładuje moduł, będzie się wtedy wysypywać aż do restartu. Na naszym serwerze testowym instalacja zapory wypisała ERROR: Couldn't determine iptables version. Jeśli wersje się różnią, zrestartuj teraz:
reboot
Nasz serwer testowy wrócił w niecałą minutę.
2. Utwórz użytkownika, który może się zalogować
adduser -D deploy
passwd deploy
adduser deploy wheel
Nie pomijaj passwd. adduser -D tworzy konto bez hasła, Alpine oznacza je jako zablokowane, a sshd odrzuca zablokowane konto nawet z poprawnym kluczem. W naszym teście jedyną wskazówką był ten wiersz w /var/log/messages:
User deploy not allowed because account is locked
Hasło przyda się też później: o nie zapyta doas.
Jeśli przy zamawianiu serwera dodałeś klucz SSH, znajduje się on w authorized_keys roota. Skopiuj go nowemu użytkownikowi:
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
Nie masz jeszcze klucza? Utwórz go na swoim komputerze i wklej część publiczną do /home/deploy/.ssh/authorized_keys.
3. Niech doas pyta o hasło
Alpine używa doas zamiast sudo, a nasz obraz już pozwala na to grupie wheel. Reguła w /etc/doas.d/wheel.conf to permit nopass :wheel, czyli każdy członek wheel zostaje rootem bez wpisywania czegokolwiek. Niech pyta o hasło i pamięta je przez kilka minut:
echo 'permit persist :wheel' > /etc/doas.d/wheel.conf
Od teraz doas apk add nano działa tak, jak sudo apt install nano na Ubuntu.
4. SSH: tylko klucze, bez roota
sshd czyta pliki z /etc/ssh/sshd_config.d/ w kolejności nazw i dla każdego ustawienia zachowuje pierwszą znalezioną wartość. W naszym obrazie pierwszym plikiem jest 00-eqvps.conf, który pozwala na logowanie roota i hasłem, żebyś pierwszego dnia mógł wejść. Zastąp jego zawartość:
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) '
Trzeci wiersz ma znaczenie na Alpine. Obraz używa wersji OpenSSH z PAM i przy samych dwóch pierwszych wierszach nasz serwer testowy wciąż oferował logowanie keyboard-interactive. Ze wszystkimi trzema próba logowania bez klucza dostaje:
Permission denied (publickey).
Nie zamykaj sesji roota. W drugim terminalu sprawdź, czy działa ssh deploy@YOUR.SERVER.IP (na planie z NAT dodaj -p i osobisty port z panelu) i czy doas id przyjmuje hasło.
5. Zapora: ufw
ufw jest w repozytorium community, które w naszym obrazie jest włączone:
apk add ufw
ufw limit 22/tcp
ufw --force enable
rc-update add ufw default
ufw status
limit przepuszcza SSH, ale spowalnia każdego, kto otwiera wiele połączeń pod rząd. rc-update jest tu ważne, bo OpenRC nie uruchomi zapory po restarcie, dopóki nie dodasz jej do runlevelu. Po restarcie nasz serwer wrócił ze Status: active. Na planie z NAT zostaw SSH na porcie 22: twój osobisty port zewnętrzny jest przekierowany na 22 wewnątrz serwera. Na planie z własnym IPv4 otwieraj porty WWW, gdy ich potrzebujesz (ufw allow 80/tcp, ufw allow 443/tcp). Resztę opisuje poradnik ufw.
6. Włącz cron i codzienne aktualizacje
Świeży Alpine w ogóle nie uruchamia crona. Włącz go:
rc-update add crond default
rc-service crond start
crontab roota w Alpine już uruchamia wszystko z /etc/periodic/daily o 02:00. Wrzuć tam skrypt aktualizacji:
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
Ostatnie polecenie wypisuje skrypty, które uruchomi cron, i twój powinien być na liście. Tak dostajesz poprawki dla 3.21. Przejście na kolejne wydanie Alpine to osobny, ręczny krok. Aktualizacje jądra nadal wymagają restartu: co jakiś czas powtórz sprawdzenie uname -r / ls /lib/modules z kroku 1.
7. OpenRC w jednej tabeli
Jeśli znasz systemd, to prawie wszystko, co się zmienia:
| Zadanie | systemd | Alpine (OpenRC) |
|---|---|---|
| Uruchom usługę | systemctl start nginx | rc-service nginx start |
| Uruchamiaj przy starcie | systemctl enable nginx | rc-update add nginx default |
| Stan | systemctl status nginx | rc-service nginx status |
| Co działa | systemctl list-units | rc-status |
| Log systemowy | journalctl | /var/log/messages |
8. Docker i port, którego ufw nie blokuje
Alpine to dobry host dla Dockera, bo sam system prawie nie przeszkadza:
apk add docker docker-cli-compose
rc-update add docker default
rc-service docker start
docker run --rm hello-world
Na naszym serwerze zajęło to 12 sekund razem z pobieraniem. Z działającym demonem Dockera zajęta pamięć wzrosła z 57 MB do 124 MB.
Pułapka, która nie dotyczy tylko Alpine: Docker zapisuje własne reguły zapory. Gdy ufw przepuszczał tylko SSH, uruchomiliśmy nginx z -p 8080:80 i dostaliśmy się do niego spoza serwera na porcie 8080. ufw go nie zablokował. Jeśli kontener ma być dostępny tylko przez reverse proxy na tym samym serwerze, publikuj go na localhost:
docker run -d -p 127.0.0.1:8080:80 nginx:alpine
Jaki plan
Alpine zostawia prawie cały RAM twojemu oprogramowaniu. Plan Nano (2 vCPU, 1 GB, 15 GB, $3/mies.) wystarczy na małą usługę albo kilka kontenerów. To plan z NAT, więc SSH wchodzi przez osobisty port. Jeśli porty 80 i 443 mają być otwarte do internetu, Nano-IP ma własny IPv4 za $8/mies. Na cięższe stosy Dockera Micro daje 2 GB za $5/mies.
Alpine 3.21 jest na stronie Alpine VPS i dostępny na każdym planie z Linuksem w dziale VPS. Płatność w USDT, USDC lub ETH w sieciach Base, Ethereum lub Polygon, bez dokumentów i karty.
Komentarze
Brak komentarzy. Bądź pierwszy.