Alpine Linux — найкомпактніший образ із тих, що ми пропонуємо. На наших серверах свіжий Alpine 3.21 у простої займав 55 МБ пам'яті та 153 МБ диска, а Ubuntu 24.04 — 313 МБ і 2,7 ГБ. Платити за це доводиться звичними інструментами. В 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 замість sudo використовується doas, і в нашому образі групі 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 МБ до 124 МБ.
Одна пастка, не пов'язана саме з Alpine: Docker пише власні правила файрвола. Коли ufw дозволяв лише SSH, ми запустили nginx з -p 8080:80 і відкрили його ззовні сервера на порту 8080. ufw його не закрив. Якщо контейнер має бути доступний лише через зворотний проксі на тому самому сервері, публікуйте його на localhost:
docker run -d -p 127.0.0.1:8080:80 nginx:alpine
Який тариф
Alpine залишає майже всю пам'ять вашим програмам. Тарифу Nano (2 vCPU, 1 ГБ, 15 ГБ, $3/міс) вистачить для невеликого сервісу або кількох контейнерів. Це тариф з NAT, тому SSH приходить через персональний порт. Якщо потрібні відкриті в інтернет порти 80 і 443, у Nano-IP є власний IPv4 за $8/міс. Для важчих стеків Docker Micro дає 2 ГБ за $5/міс.
Alpine 3.21 є на сторінці Alpine VPS і доступний на всіх Linux-тарифах у розділі VPS. Оплата в USDT, USDC або ETH у мережах Base, Ethereum або Polygon, без документів і картки.
Коментарі
Поки немає коментарів. Будьте першим.