Alpine Linux est la plus petite image que nous proposons. Sur nos serveurs, un Alpine 3.21 neuf occupait au repos 55 Mo de RAM et 153 Mo de disque, contre 313 Mo et 2,7 Go pour Ubuntu 24.04. En échange, vous renoncez aux outils habituels. Alpine utilise apk au lieu de apt, doas au lieu de sudo, OpenRC au lieu de systemd et musl au lieu de glibc.
Les étapes ci-dessous sont les mêmes dix premières minutes que sur Debian ou Ubuntu, transposées à Alpine. Nous avons exécuté chaque commande sur notre image Alpine 3.21 avant publication, et deux d'entre elles nous ont piégés la première fois. Connectez-vous en root avec le mot de passe de votre tableau de bord.
1. Mettre à jour, puis redémarrer une fois
apk update && apk upgrade
uname -r
ls /lib/modules
Votre serveur a déjà installé les mises à jour disponibles à son premier démarrage, donc apk upgrade n'a en général presque plus rien à faire. Regardez plutôt les deux dernières lignes. Si cette première mise à jour a apporté un nouveau noyau, le noyau en cours (uname -r) n'a plus ses modules sur le disque. Tout ce qui charge un module échoue alors jusqu'au redémarrage. Sur notre serveur de test, l'installation du pare-feu a affiché ERROR: Couldn't determine iptables version. Si les deux versions diffèrent, redémarrez maintenant :
reboot
Notre serveur de test est revenu en moins d'une minute.
2. Créer un utilisateur qui peut se connecter
adduser -D deploy
passwd deploy
adduser deploy wheel
Ne sautez pas passwd. adduser -D crée le compte sans mot de passe, Alpine le marque comme verrouillé, et sshd refuse un compte verrouillé même avec la bonne clé. Dans notre test, le seul indice était cette ligne dans /var/log/messages :
User deploy not allowed because account is locked
Le mot de passe servira aussi plus tard : c'est lui que doas demandera.
Si vous avez ajouté une clé SSH en commandant le serveur, elle se trouve dans le authorized_keys de root. Copiez-la pour le nouvel utilisateur :
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
Pas encore de clé ? Créez-en une sur votre ordinateur et collez la partie publique dans /home/deploy/.ssh/authorized_keys.
3. Faire demander le mot de passe par doas
Alpine utilise doas au lieu de sudo, et notre image l'autorise déjà pour le groupe wheel. La règle de /etc/doas.d/wheel.conf est permit nopass :wheel : tout membre de wheel devient root sans rien taper. Faites-lui demander le mot de passe, puis le retenir quelques minutes :
echo 'permit persist :wheel' > /etc/doas.d/wheel.conf
Désormais, doas apk add nano fonctionne comme sudo apt install nano sous Ubuntu.
4. SSH : clés uniquement, pas de root
sshd lit les fichiers de /etc/ssh/sshd_config.d/ dans l'ordre des noms et garde la première valeur trouvée pour chaque réglage. Sur notre image, le premier fichier est 00-eqvps.conf, qui autorise root et les mots de passe pour que vous puissiez entrer le premier jour. Remplacez son contenu :
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) '
La troisième ligne compte sous Alpine. L'image utilise la version d'OpenSSH avec PAM, et avec les deux premières lignes seulement, notre serveur de test proposait encore la connexion keyboard-interactive. Avec les trois, une tentative sans clé obtient :
Permission denied (publickey).
Gardez votre session root ouverte. Dans un second terminal, vérifiez que ssh deploy@YOUR.SERVER.IP fonctionne (sur une offre NAT, ajoutez -p et le port personnel du tableau de bord) et que doas id accepte le mot de passe.
5. Pare-feu : ufw
ufw se trouve dans le dépôt community, déjà activé sur notre image :
apk add ufw
ufw limit 22/tcp
ufw --force enable
rc-update add ufw default
ufw status
limit laisse passer SSH mais ralentit quiconque ouvre beaucoup de connexions d'affilée. rc-update est important ici, car OpenRC ne relance pas le pare-feu après un redémarrage tant qu'il n'est pas ajouté au runlevel. Après un redémarrage, notre serveur est revenu avec Status: active. Sur une offre NAT, laissez SSH sur le port 22 : votre port externe personnel est redirigé vers le 22 du serveur. Sur une offre avec sa propre IPv4, ouvrez les ports web quand vous en avez besoin (ufw allow 80/tcp, ufw allow 443/tcp). Le guide ufw couvre le reste.
6. Activer cron et les mises à jour quotidiennes
Un Alpine neuf ne fait tourner aucun cron. Activez-le :
rc-update add crond default
rc-service crond start
La crontab de root sous Alpine lance déjà tout ce qui se trouve dans /etc/periodic/daily à 02:00. Déposez-y un script de mise à jour :
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
La dernière commande liste les scripts que cron exécutera, et le vôtre doit y figurer. Vous recevez ainsi les correctifs de la 3.21. Passer à la version suivante d'Alpine est une étape à part, manuelle. Les mises à jour du noyau demandent toujours un redémarrage : refaites de temps en temps la vérification uname -r / ls /lib/modules de l'étape 1.
7. OpenRC en un tableau
Si vous connaissez systemd, voici l'essentiel de ce qui change :
| Tâche | systemd | Alpine (OpenRC) |
|---|---|---|
| Démarrer un service | systemctl start nginx | rc-service nginx start |
| Lancer au démarrage | systemctl enable nginx | rc-update add nginx default |
| État | systemctl status nginx | rc-service nginx status |
| Ce qui tourne | systemctl list-units | rc-status |
| Journal système | journalctl | /var/log/messages |
8. Docker, et le port que ufw ne bloque pas
Alpine fait un bon hôte Docker, car le système lui-même ne gêne pas :
apk add docker docker-cli-compose
rc-update add docker default
rc-service docker start
docker run --rm hello-world
Sur notre serveur, cela a pris 12 secondes téléchargement compris. Avec le démon Docker lancé, la mémoire utilisée est passée de 57 Mo à 124 Mo.
Un piège qui ne concerne pas qu'Alpine : Docker écrit ses propres règles de pare-feu. Alors que ufw n'autorisait que SSH, nous avons lancé nginx avec -p 8080:80 et l'avons atteint depuis l'extérieur du serveur sur le port 8080. ufw ne l'a pas bloqué. Si un conteneur ne doit être joint que via un reverse proxy sur le même serveur, publiez-le sur localhost :
docker run -d -p 127.0.0.1:8080:80 nginx:alpine
Quelle offre
Alpine laisse presque toute la RAM à vos propres logiciels. L'offre Nano (2 vCPU, 1 Go, 15 Go, $3/mois) suffit pour un petit service ou quelques conteneurs. C'est une offre NAT, donc SSH arrive par un port personnel. Si les ports 80 et 443 doivent être ouverts sur Internet, Nano-IP a sa propre IPv4 pour $8/mois. Pour des piles Docker plus lourdes, Micro donne 2 Go pour $5/mois.
Alpine 3.21 figure sur la page Alpine VPS et sur toutes les offres Linux de la section VPS. Le paiement se fait en USDT, USDC ou ETH sur Base, Ethereum ou Polygon, sans pièce d'identité ni carte.
Commentaires
Pas encore de commentaires. Soyez le premier.