Alpine Linux è l'immagine più piccola che offriamo. Sui nostri server un Alpine 3.21 appena installato occupava a riposo 55 MB di RAM e 153 MB di disco, contro 313 MB e 2,7 GB di Ubuntu 24.04. In cambio rinunci agli strumenti abituali. Alpine usa apk invece di apt, doas invece di sudo, OpenRC invece di systemd e musl invece di glibc.
I passi qui sotto sono gli stessi primi dieci minuti di Debian o Ubuntu, tradotti per Alpine. Abbiamo eseguito ogni comando sulla nostra immagine Alpine 3.21 prima di pubblicare, e due ci hanno colto di sorpresa la prima volta. Accedi come root con la password del tuo pannello.
1. Aggiorna, poi riavvia una volta
apk update && apk upgrade
uname -r
ls /lib/modules
Il server ha già installato gli aggiornamenti disponibili al primo avvio, quindi di solito apk upgrade ha poco da fare. Guarda piuttosto le ultime due righe. Se quel primo aggiornamento ha portato un nuovo kernel, il kernel in esecuzione (uname -r) non ha più i suoi moduli sul disco. Tutto ciò che carica un modulo fallisce finché non riavvii. Sul nostro server di prova l'installazione del firewall ha stampato ERROR: Couldn't determine iptables version. Se le due versioni sono diverse, riavvia adesso:
reboot
Il nostro server di prova è tornato in meno di un minuto.
2. Crea un utente che possa accedere
adduser -D deploy
passwd deploy
adduser deploy wheel
Non saltare passwd. adduser -D crea l'account senza password, Alpine lo segna come bloccato e sshd rifiuta un account bloccato anche con la chiave corretta. Nel nostro test l'unico indizio era questa riga in /var/log/messages:
User deploy not allowed because account is locked
La password serve anche dopo: è quella che chiederà doas.
Se hai aggiunto una chiave SSH quando hai ordinato il server, si trova nell'authorized_keys di root. Copiala al nuovo utente:
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
Non hai ancora una chiave? Creane una sul tuo computer e incolla la parte pubblica in /home/deploy/.ssh/authorized_keys.
3. Fai chiedere la password a doas
Alpine usa doas invece di sudo, e la nostra immagine lo concede già al gruppo wheel. La regola in /etc/doas.d/wheel.conf è permit nopass :wheel, quindi qualsiasi membro di wheel diventa root senza digitare nulla. Fai in modo che chieda la password e la ricordi per qualche minuto:
echo 'permit persist :wheel' > /etc/doas.d/wheel.conf
D'ora in poi doas apk add nano funziona come sudo apt install nano su Ubuntu.
4. SSH: solo chiavi, niente root
sshd legge i file in /etc/ssh/sshd_config.d/ in ordine di nome e tiene il primo valore che trova per ogni impostazione. Nella nostra immagine il primo file è 00-eqvps.conf, che consente l'accesso di root e con password perché tu possa entrare il primo giorno. Sostituiscine il contenuto:
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 terza riga conta su Alpine. L'immagine usa la build di OpenSSH con PAM, e con le sole prime due righe il nostro server di prova offriva ancora l'accesso keyboard-interactive. Con tutte e tre, un tentativo senza chiave riceve:
Permission denied (publickey).
Tieni aperta la sessione di root. In un secondo terminale verifica che ssh deploy@YOUR.SERVER.IP funzioni (su un piano NAT aggiungi -p e la porta personale del pannello) e che doas id accetti la password.
5. Firewall: ufw
ufw si trova nel repository community, già attivo sulla nostra immagine:
apk add ufw
ufw limit 22/tcp
ufw --force enable
rc-update add ufw default
ufw status
limit lascia passare SSH ma rallenta chi apre molte connessioni di fila. rc-update è importante qui, perché OpenRC non avvia il firewall dopo un riavvio se non lo aggiungi al runlevel. Dopo un riavvio il nostro server è tornato con Status: active. Su un piano NAT lascia SSH sulla porta 22: la tua porta esterna personale è inoltrata alla 22 dentro il server. Su un piano con IPv4 propria apri le porte web quando ti servono (ufw allow 80/tcp, ufw allow 443/tcp). La guida a ufw copre il resto.
6. Attiva cron e gli aggiornamenti giornalieri
Un Alpine appena installato non esegue alcun cron. Attivalo:
rc-update add crond default
rc-service crond start
Il crontab di root su Alpine esegue già tutto ciò che sta in /etc/periodic/daily alle 02:00. Metti lì uno script di aggiornamento:
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
L'ultimo comando elenca gli script che cron eseguirà, e il tuo dovrebbe esserci. Così ricevi le correzioni per la 3.21. Passare alla versione successiva di Alpine è un passo separato e manuale. Gli aggiornamenti del kernel richiedono comunque un riavvio: ripeti ogni tanto il controllo uname -r / ls /lib/modules del passo 1.
7. OpenRC in una tabella
Se conosci systemd, ecco quasi tutto ciò che cambia:
| Operazione | systemd | Alpine (OpenRC) |
|---|---|---|
| Avviare un servizio | systemctl start nginx | rc-service nginx start |
| Avvio al boot | systemctl enable nginx | rc-update add nginx default |
| Stato | systemctl status nginx | rc-service nginx status |
| Cosa è in esecuzione | systemctl list-units | rc-status |
| Log di sistema | journalctl | /var/log/messages |
8. Docker, e la porta che ufw non blocca
Alpine è un buon host Docker, perché il sistema stesso non dà fastidio:
apk add docker docker-cli-compose
rc-update add docker default
rc-service docker start
docker run --rm hello-world
Sul nostro server ci sono voluti 12 secondi, download compreso. Con il demone Docker attivo, la memoria usata è passata da 57 MB a 124 MB.
Una trappola che non riguarda solo Alpine: Docker scrive le proprie regole del firewall. Con ufw che consentiva solo SSH, abbiamo avviato nginx con -p 8080:80 e l'abbiamo raggiunto dall'esterno del server sulla porta 8080. ufw non l'ha bloccato. Se un container deve essere raggiungibile solo tramite un reverse proxy sullo stesso server, pubblicalo su localhost:
docker run -d -p 127.0.0.1:8080:80 nginx:alpine
Quale piano
Alpine lascia quasi tutta la RAM al tuo software. Il piano Nano (2 vCPU, 1 GB, 15 GB, $3/mese) basta per un piccolo servizio o qualche container. È un piano NAT, quindi SSH arriva da una porta personale. Se ti servono le porte 80 e 443 aperte su internet, Nano-IP ha la sua IPv4 per $8/mese. Per stack Docker più pesanti, Micro offre 2 GB per $5/mese.
Alpine 3.21 è nella pagina Alpine VPS e disponibile su tutti i piani Linux in VPS. Il pagamento è in USDT, USDC o ETH su Base, Ethereum o Polygon, senza documenti né carta.
Commenti
Ancora nessun commento. Sii il primo.