Alpine Linux ist das kleinste Image, das wir anbieten. Auf unseren Servern belegte ein frisches Alpine 3.21 im Leerlauf 55 MB RAM und 153 MB Festplatte, Ubuntu 24.04 dagegen 313 MB und 2,7 GB. Dafür verzichten Sie auf die gewohnten Werkzeuge. Alpine nutzt apk statt apt, doas statt sudo, OpenRC statt systemd und musl statt glibc.
Die Schritte unten sind dieselben ersten zehn Minuten wie bei Debian oder Ubuntu, übertragen auf Alpine. Wir haben jeden Befehl vor der Veröffentlichung auf unserem Alpine-3.21-Image ausgeführt, und zwei davon haben uns beim ersten Mal erwischt. Melden Sie sich als root mit dem Passwort aus Ihrem Dashboard an.
1. Aktualisieren und einmal neu starten
apk update && apk upgrade
uname -r
ls /lib/modules
Ihr Server hat die verfügbaren Updates schon beim ersten Start installiert, deshalb hat apk upgrade meist kaum noch etwas zu tun. Achten Sie stattdessen auf die letzten beiden Zeilen. Hat dieses erste Update einen neuen Kernel gebracht, liegen die Module des laufenden Kernels (uname -r) nicht mehr auf der Platte. Alles, was ein Modul lädt, schlägt dann bis zum Neustart fehl. Auf unserem Testserver meldete die Firewall-Installation ERROR: Couldn't determine iptables version. Wenn die beiden Versionen nicht übereinstimmen, starten Sie jetzt neu:
reboot
Unser Testserver war nach weniger als einer Minute wieder da.
2. Einen Benutzer anlegen, der sich anmelden kann
adduser -D deploy
passwd deploy
adduser deploy wheel
Lassen Sie passwd nicht weg. adduser -D legt das Konto ohne Passwort an, Alpine markiert es als gesperrt, und sshd lehnt ein gesperrtes Konto auch mit korrektem Schlüssel ab. In unserem Test war der einzige Hinweis diese Zeile in /var/log/messages:
User deploy not allowed because account is locked
Das Passwort brauchen Sie auch später: doas fragt danach.
Wenn Sie bei der Bestellung einen SSH-Schlüssel hinterlegt haben, steht er in den authorized_keys von root. Kopieren Sie ihn zum neuen Benutzer:
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
Noch kein Schlüssel? Erzeugen Sie einen auf Ihrem Computer und fügen Sie den öffentlichen Teil in /home/deploy/.ssh/authorized_keys ein.
3. doas nach dem Passwort fragen lassen
Alpine nutzt doas statt sudo, und unser Image erlaubt es der Gruppe wheel bereits. Die Regel in /etc/doas.d/wheel.conf lautet permit nopass :wheel, also wird jedes Mitglied von wheel root, ohne etwas einzutippen. Lassen Sie es nach dem Passwort fragen und sich dieses ein paar Minuten merken:
echo 'permit persist :wheel' > /etc/doas.d/wheel.conf
Ab jetzt funktioniert doas apk add nano so, wie sudo apt install nano unter Ubuntu.
4. SSH: nur Schlüssel, kein root
sshd liest die Dateien in /etc/ssh/sshd_config.d/ in Namensreihenfolge und behält für jede Einstellung den ersten gefundenen Wert. In unserem Image ist die erste Datei 00-eqvps.conf. Sie erlaubt Root- und Passwort-Logins, damit Sie am ersten Tag hineinkommen. Ersetzen Sie ihren Inhalt:
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) '
Die dritte Zeile ist auf Alpine wichtig. Das Image nutzt den PAM-Build von OpenSSH, und mit nur den ersten beiden Zeilen bot unser Testserver weiterhin den Login per keyboard-interactive an. Mit allen drei bekommt ein Anmeldeversuch ohne Schlüssel:
Permission denied (publickey).
Lassen Sie die Root-Sitzung offen. Prüfen Sie in einem zweiten Terminal, dass ssh deploy@YOUR.SERVER.IP funktioniert (bei einem NAT-Tarif mit -p und dem persönlichen Port aus dem Dashboard) und dass doas id das Passwort annimmt.
5. Firewall: ufw
ufw liegt im community-Repository, das in unserem Image aktiviert ist:
apk add ufw
ufw limit 22/tcp
ufw --force enable
rc-update add ufw default
ufw status
limit lässt SSH durch, bremst aber jeden aus, der viele Verbindungen hintereinander öffnet. rc-update ist hier wichtig, denn OpenRC startet die Firewall nach einem Neustart nur, wenn Sie sie zum Runlevel hinzufügen. Nach einem Neustart kam unser Server mit Status: active zurück. Bei einem NAT-Tarif lassen Sie SSH auf Port 22: Ihr persönlicher externer Port wird auf 22 im Server weitergeleitet. Bei einem Tarif mit eigener IPv4 öffnen Sie Web-Ports, wenn Sie sie brauchen (ufw allow 80/tcp, ufw allow 443/tcp). Den Rest erklärt die ufw-Anleitung.
6. cron und tägliche Updates einschalten
Ein frischer Alpine-Server führt überhaupt kein cron aus. Schalten Sie es ein:
rc-update add crond default
rc-service crond start
Die root-crontab von Alpine startet bereits alles in /etc/periodic/daily um 02:00 Uhr. Legen Sie dort ein Update-Skript ab:
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
Der letzte Befehl listet die Skripte, die cron ausführen wird, und Ihres sollte dabei sein. So bekommen Sie die Fehlerbehebungen für 3.21. Der Wechsel zum nächsten Alpine-Release ist ein eigener, manueller Schritt. Kernel-Updates brauchen weiterhin einen Neustart: Wiederholen Sie die Prüfung uname -r / ls /lib/modules aus Schritt 1 ab und zu.
7. OpenRC in einer Tabelle
Wenn Sie systemd kennen, ist das fast alles, was sich ändert:
| Aufgabe | systemd | Alpine (OpenRC) |
|---|---|---|
| Dienst starten | systemctl start nginx | rc-service nginx start |
| Beim Booten starten | systemctl enable nginx | rc-update add nginx default |
| Status | systemctl status nginx | rc-service nginx status |
| Was läuft | systemctl list-units | rc-status |
| Systemlog | journalctl | /var/log/messages |
8. Docker und der Port, den ufw nicht blockiert
Alpine ist ein guter Docker-Host, weil das System selbst kaum im Weg steht:
apk add docker docker-cli-compose
rc-update add docker default
rc-service docker start
docker run --rm hello-world
Auf unserem Server dauerte das 12 Sekunden inklusive Download. Mit laufendem Docker-Daemon stieg der belegte Speicher von 57 MB auf 124 MB.
Eine Falle, die nicht nur Alpine betrifft: Docker schreibt eigene Firewall-Regeln. Während ufw nur SSH erlaubte, starteten wir nginx mit -p 8080:80 und erreichten es von außerhalb des Servers auf Port 8080. ufw blockierte es nicht. Soll ein Container nur über einen Reverse Proxy auf demselben Server erreichbar sein, veröffentlichen Sie ihn auf localhost:
docker run -d -p 127.0.0.1:8080:80 nginx:alpine
Welcher Tarif
Alpine lässt fast den ganzen RAM Ihrer eigenen Software. Der Tarif Nano (2 vCPU, 1 GB, 15 GB, $3/Monat) reicht für einen kleinen Dienst oder ein paar Container. Es ist ein NAT-Tarif, SSH kommt also über einen persönlichen Port herein. Wenn die Ports 80 und 443 aus dem Internet erreichbar sein müssen, hat Nano-IP eine eigene IPv4 für $8/Monat. Für schwerere Docker-Stacks bietet Micro 2 GB für $5/Monat.
Alpine 3.21 steht auf der Alpine-VPS-Seite und ist bei jedem Linux-Tarif unter VPS verfügbar. Bezahlt wird in USDT, USDC oder ETH auf Base, Ethereum oder Polygon, ohne Ausweis und ohne Karte.
Kommentare
Noch keine Kommentare. Sei der Erste.