Alpine Linux е най-малкият образ, който предлагаме. На нашите сървъри нов Alpine 3.21 в покой заемаше 55 MB RAM и 153 MB диск, срещу 313 MB и 2,7 GB за Ubuntu 24.04. Цената е, че се отказвате от познатите инструменти. Alpine използва apk вместо apt, doas вместо sudo, OpenRC вместо systemd и musl вместо glibc.
Стъпките по-долу са същите първи десет минути като на Debian или Ubuntu, пренесени на Alpine. Изпълнихме всяка команда на нашия образ с Alpine 3.21 преди публикуване и две от тях ни подведоха първия път. Влезте като root с паролата от панела.
1. Обновете и рестартирайте веднъж
apk update && apk upgrade
uname -r
ls /lib/modules
Сървърът вече е инсталирал наличните обновления при първото стартиране, така че apk upgrade обикновено няма много работа. Гледайте по-скоро последните два реда. Ако онова първо обновяване е донесло ново ядро, работещото ядро (uname -r) вече няма модулите си на диска. Всичко, което зарежда модул, ще дава грешка до рестарта. На тестовия ни сървър инсталирането на защитната стена изписа ERROR: Couldn't determine iptables version. Ако двете версии се различават, рестартирайте сега:
reboot
Тестовият ни сървър се върна за по-малко от минута.
2. Създайте потребител, който може да влезе
adduser -D deploy
passwd deploy
adduser deploy wheel
Не пропускайте passwd. adduser -D създава акаунта без парола, Alpine го маркира като заключен, а sshd отказва заключен акаунт дори с правилен ключ. В нашия тест единствената следа беше този ред в /var/log/messages:
User deploy not allowed because account is locked
Паролата ще ви трябва и по-нататък: нея ще иска doas.
Ако при поръчката на сървъра сте добавили SSH ключ, той е в authorized_keys на root. Копирайте го на новия потребител:
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
Още нямате ключ? Създайте си на компютъра и поставете публичната част в /home/deploy/.ssh/authorized_keys.
3. Нека doas пита за парола
Alpine използва doas вместо sudo, а нашият образ вече го разрешава на групата wheel. Правилото в /etc/doas.d/wheel.conf е permit nopass :wheel, тоест всеки член на wheel става root, без да въвежда нищо. Нека пита за паролата и после я помни няколко минути:
echo 'permit persist :wheel' > /etc/doas.d/wheel.conf
Оттук нататък doas apk add nano работи като sudo apt install nano в Ubuntu.
4. SSH: само ключове, без root
sshd чете файловете в /etc/ssh/sshd_config.d/ по реда на имената и за всяка настройка запазва първата намерена стойност. В нашия образ първият файл е 00-eqvps.conf, който разрешава root и пароли, за да влезете още първия ден. Заменете съдържанието му:
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) '
Третият ред има значение на Alpine. Образът използва версията на OpenSSH с PAM и само с първите два реда тестовият ни сървър продължаваше да предлага вход keyboard-interactive. С трите заедно опит за вход без ключ получава:
Permission denied (publickey).
Не затваряйте сесията на root. Във втори терминал проверете, че ssh deploy@YOUR.SERVER.IP работи (при план с NAT добавете -p и личния порт от панела) и че doas id приема паролата.
5. Защитна стена: ufw
ufw е в хранилището community, което в нашия образ е включено:
apk add ufw
ufw limit 22/tcp
ufw --force enable
rc-update add ufw default
ufw status
limit пропуска SSH, но забавя всеки, който отваря много връзки подред. rc-update е важен тук, защото OpenRC не пуска защитната стена след рестарт, ако не я добавите в runlevel. След рестарт сървърът ни се върна със Status: active. При план с NAT оставете SSH на порт 22: личният ви външен порт е пренасочен към 22 вътре в сървъра. При план със собствен IPv4 отваряйте уеб портове, когато ви потрябват (ufw allow 80/tcp, ufw allow 443/tcp). Останалото е в ръководството за ufw.
6. Включете cron и ежедневните обновления
Нов сървър с Alpine изобщо не пуска cron. Включете го:
rc-update add crond default
rc-service crond start
crontab-ът на root в Alpine вече пуска всичко в /etc/periodic/daily в 02:00. Сложете там скрипт за обновяване:
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
Последната команда изброява скриптовете, които cron ще пусне, и вашият трябва да е в списъка. Така получавате поправките за 3.21. Преминаването към следващата версия на Alpine е отделна, ръчна стъпка. Обновленията на ядрото пак изискват рестарт: от време на време повтаряйте проверката uname -r / ls /lib/modules от стъпка 1.
7. OpenRC в една таблица
Ако познавате systemd, ето почти всичко, което се променя:
| Задача | systemd | Alpine (OpenRC) |
|---|---|---|
| Стартиране на услуга | systemctl start nginx | rc-service nginx start |
| Старт при зареждане | systemctl enable nginx | rc-update add nginx default |
| Състояние | systemctl status nginx | rc-service nginx status |
| Какво работи | systemctl list-units | rc-status |
| Системен журнал | journalctl | /var/log/messages |
8. Docker и портът, който ufw не спира
Alpine е добър хост за Docker, защото самата система почти не пречи:
apk add docker docker-cli-compose
rc-update add docker default
rc-service docker start
docker run --rm hello-world
На нашия сървър това отне 12 секунди заедно с изтеглянето. С работещ демон на Docker заетата памет се качи от 57 MB на 124 MB.
Капан, който не е само на Alpine: Docker пише собствени правила в защитната стена. Докато ufw разрешаваше само SSH, пуснахме nginx с -p 8080:80 и го достигнахме отвън на порт 8080. ufw не го спря. Ако контейнерът трябва да е достъпен само през reverse proxy на същия сървър, публикувайте го на localhost:
docker run -d -p 127.0.0.1:8080:80 nginx:alpine
Кой план
Alpine оставя почти цялата RAM на вашия софтуер. Планът Nano (2 vCPU, 1 GB, 15 GB, $3/мес.) стига за малка услуга или няколко контейнера. Това е план с NAT, така че SSH идва през личен порт. Ако портове 80 и 443 трябва да са отворени към интернет, Nano-IP има собствен IPv4 за $8/мес. За по-тежки Docker стекове Micro дава 2 GB за $5/мес.
Alpine 3.21 е на страницата Alpine VPS и е наличен на всеки Linux план в раздела VPS. Плащането е в USDT, USDC или ETH в мрежите Base, Ethereum или Polygon, без документи и карта.
Коментари
Още няма коментари. Бъди първият.