−25%

на річну оплату Windows, до 31.10. До тарифів

EQVPS
Почати

Як налаштувати VPS на Alpine Linux: apk, doas, OpenRC і файрвол

Перші кроки на свіжому VPS з Alpine Linux 3.21: оновитися й перезавантажитися, створити користувача з doas, який справді зможе увійти, вимкнути вхід root і за паролем, поставити ufw, увімкнути cron і щоденні оновлення. Плюс порт Docker, який ufw не закриває.

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, ось майже все, що змінюється:

ЗавданняsystemdAlpine (OpenRC)
Запустити сервісsystemctl start nginxrc-service nginx start
Автозапуск під час завантаженняsystemctl enable nginxrc-update add nginx default
Статусsystemctl status nginxrc-service nginx status
Що запущеноsystemctl list-unitsrc-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, без документів і картки.

Часті питання

Чому Alpine набагато менший за Ubuntu і Debian?

У ньому musl замість glibc, BusyBox для базових команд і OpenRC замість systemd. На наших серверах свіжий Alpine 3.21 у простої займав 55 МБ пам'яті та 153 МБ диска. Ubuntu 24.04 займав 313 МБ і 2,7 ГБ.

Чому новий користувач отримує «account is locked», хоча ключ правильний?

adduser -D створює обліковий запис без пароля, Alpine позначає його як заблокований, і sshd відмовляє такому користувачу навіть із правильним ключем. У журналі з'являється рядок «User deploy not allowed because account is locked». Задайте користувачу пароль командою passwd, і вхід за ключем запрацює.

Чому на Alpine не працює SSH-тунель?

У стандартному /etc/ssh/sshd_config Alpine стоїть AllowTcpForwarding no, тож перенаправлення ssh -L відхиляються. Якщо тунелі потрібні, змініть значення на yes у цьому файлі та виконайте rc-service sshd restart.

Чи запуститься моя програма на Alpine?

Усе з репозиторіїв Alpine запуститься, як і контейнери Docker на будь-якому базовому образі. Готові бінарники Linux, зібрані під glibc, на musl часто не стартують. Шукайте збірку для Alpine або musl чи запускайте програму в Docker. Пакет gcompat допомагає з деякими простими glibc-бінарниками.

Якого тарифу вистачить для Alpine?

Тарифу Nano на 1 ГБ за $3 на місяць вистачає із запасом: сама система займає близько 55 МБ. Якщо потрібні відкриті в інтернет порти 80 і 443, беріть Nano-IP за $8 на місяць, у нього власний IPv4.

Коментарі

Поки немає коментарів. Будьте першим.

Залишити коментар

Коментарі проходять модерацію перед публікацією.