Alpine Linux is de kleinste image die we aanbieden. Op onze servers gebruikte een verse Alpine 3.21 in rust 55 MB RAM en 153 MB schijf, tegen 313 MB en 2,7 GB voor Ubuntu 24.04. Daarvoor lever je de vertrouwde tools in. Alpine gebruikt apk in plaats van apt, doas in plaats van sudo, OpenRC in plaats van systemd en musl in plaats van glibc.
De stappen hieronder zijn dezelfde eerste tien minuten als op Debian of Ubuntu, vertaald naar Alpine. We hebben elk commando vóór publicatie op onze Alpine 3.21-image uitgevoerd, en twee ervan zetten ons de eerste keer op het verkeerde been. Log in als root met het wachtwoord uit je dashboard.
1. Bijwerken en één keer herstarten
apk update && apk upgrade
uname -r
ls /lib/modules
Je server heeft de beschikbare updates al bij de eerste start geïnstalleerd, dus apk upgrade heeft meestal weinig meer te doen. Kijk liever naar de laatste twee regels. Als die eerste update een nieuwe kernel bracht, staan de modules van de draaiende kernel (uname -r) niet meer op schijf. Alles wat een module laadt, faalt dan tot je herstart. Op onze testserver gaf de installatie van de firewall ERROR: Couldn't determine iptables version. Verschillen de twee versies, herstart dan nu:
reboot
Onze testserver was binnen een minuut terug.
2. Maak een gebruiker die kan inloggen
adduser -D deploy
passwd deploy
adduser deploy wheel
Sla passwd niet over. adduser -D maakt het account zonder wachtwoord aan, Alpine markeert het als vergrendeld, en sshd weigert een vergrendeld account zelfs met de juiste sleutel. In onze test was de enige aanwijzing deze regel in /var/log/messages:
User deploy not allowed because account is locked
Het wachtwoord heb je later ook nodig: doas vraagt erom.
Heb je bij het bestellen van de server een SSH-sleutel toegevoegd, dan staat die in de authorized_keys van root. Kopieer hem naar de nieuwe gebruiker:
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
Nog geen sleutel? Maak er een op je computer en plak het publieke deel in /home/deploy/.ssh/authorized_keys.
3. Laat doas om het wachtwoord vragen
Alpine gebruikt doas in plaats van sudo, en onze image staat het al toe voor de groep wheel. De regel in /etc/doas.d/wheel.conf is permit nopass :wheel, dus elk lid van wheel wordt root zonder iets te typen. Laat het om het wachtwoord vragen en dat daarna een paar minuten onthouden:
echo 'permit persist :wheel' > /etc/doas.d/wheel.conf
Vanaf nu werkt doas apk add nano zoals sudo apt install nano op Ubuntu.
4. SSH: alleen sleutels, geen root
sshd leest de bestanden in /etc/ssh/sshd_config.d/ op naamvolgorde en houdt voor elke instelling de eerste waarde die het vindt. Op onze image is het eerste bestand 00-eqvps.conf, dat root en wachtwoorden toestaat zodat je er op dag één in komt. Vervang de inhoud:
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) '
De derde regel doet ertoe op Alpine. De image draait de PAM-build van OpenSSH, en met alleen de eerste twee regels bood onze testserver nog steeds inloggen via keyboard-interactive aan. Met alle drie krijgt een inlogpoging zonder sleutel:
Permission denied (publickey).
Laat je root-sessie open. Controleer in een tweede terminal dat ssh deploy@YOUR.SERVER.IP werkt (op een NAT-pakket voeg je -p en de persoonlijke poort uit je dashboard toe) en dat doas id het wachtwoord accepteert.
5. Firewall: ufw
ufw staat in de community-repository, die op onze image al aan staat:
apk add ufw
ufw limit 22/tcp
ufw --force enable
rc-update add ufw default
ufw status
limit laat SSH door maar remt wie veel verbindingen achter elkaar opent. rc-update is hier belangrijk, want OpenRC start de firewall na een herstart pas als je hem aan het runlevel toevoegt. Na een herstart kwam onze server terug met Status: active. Laat SSH op een NAT-pakket op poort 22: je persoonlijke externe poort wordt naar 22 in de server doorgestuurd. Op een pakket met eigen IPv4 open je webpoorten wanneer je ze nodig hebt (ufw allow 80/tcp, ufw allow 443/tcp). De ufw-handleiding behandelt de rest.
6. Zet cron en dagelijkse updates aan
Een verse Alpine-server draait helemaal geen cron. Zet het aan:
rc-update add crond default
rc-service crond start
De root-crontab van Alpine draait al alles in /etc/periodic/daily om 02:00. Zet daar een updatescript neer:
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
Het laatste commando toont de scripts die cron zal draaien, en het jouwe hoort erbij te staan. Zo krijg je de fixes voor 3.21. Overstappen naar de volgende Alpine-release is een aparte, handmatige stap. Kernelupdates hebben nog steeds een herstart nodig: herhaal af en toe de controle uname -r / ls /lib/modules uit stap 1.
7. OpenRC in één tabel
Ken je systemd, dan is dit vrijwel alles wat verandert:
| Taak | systemd | Alpine (OpenRC) |
|---|---|---|
| Dienst starten | systemctl start nginx | rc-service nginx start |
| Starten bij opstarten | systemctl enable nginx | rc-update add nginx default |
| Status | systemctl status nginx | rc-service nginx status |
| Wat draait er | systemctl list-units | rc-status |
| Systeemlog | journalctl | /var/log/messages |
8. Docker, en de poort die ufw niet tegenhoudt
Alpine is een goede Docker-host, omdat het systeem zelf nauwelijks in de weg zit:
apk add docker docker-cli-compose
rc-update add docker default
rc-service docker start
docker run --rm hello-world
Op onze server duurde dit 12 seconden, inclusief downloaden. Met de Docker-daemon actief steeg het gebruikte geheugen van 57 MB naar 124 MB.
Een valkuil die niet alleen voor Alpine geldt: Docker schrijft zijn eigen firewallregels. Terwijl ufw alleen SSH toestond, startten we nginx met -p 8080:80 en bereikten we het van buiten de server op poort 8080. ufw hield het niet tegen. Moet een container alleen via een reverse proxy op dezelfde server bereikbaar zijn, publiceer hem dan op localhost:
docker run -d -p 127.0.0.1:8080:80 nginx:alpine
Welk pakket
Alpine laat bijna al het RAM over aan je eigen software. Het pakket Nano (2 vCPU, 1 GB, 15 GB, $3/maand) is genoeg voor een kleine dienst of een paar containers. Het is een NAT-pakket, dus SSH komt binnen via een persoonlijke poort. Moeten poort 80 en 443 open staan naar internet, dan heeft Nano-IP een eigen IPv4 voor $8/maand. Voor zwaardere Docker-stacks geeft Micro je 2 GB voor $5/maand.
Alpine 3.21 staat op de Alpine VPS-pagina en is beschikbaar op elk Linux-pakket onder VPS. Betalen gaat in USDT, USDC of ETH op Base, Ethereum of Polygon, zonder ID of kaart.
Reacties
Nog geen reacties. Wees de eerste.