VPS для разработчика: какой сервер взять под пет-проект и Docker
Пет-проекту с Docker и базой обычно хватает сервера с 2 ядрами и 2 ГБ памяти — от 400 до 1 840 ₽ в месяц, смотря у кого брать. Дороже обходятся ошибки: Docker открывает порты в обход фаервола, логи контейнеров по умолчанию растут без предела, а выключенный сервер у части провайдеров продолжает списывать деньги.
Содержание 8
Когда нужен VPS, а когда хватит хостинга
Обычный хостинг рассчитан на сайты на PHP: WordPress, лендинг, сайт-визитку. Если пет-проект такой, сервер не нужен — разница подробно разобрана в статье Чем VPS отличается от обычного хостинга.
VPS нужен, если есть хотя бы одно из этого:
- бэкенд на Node.js, Python или Go, который работает круглосуточно, а не только пока идёт запрос;
- Docker и
docker compose— на обычном хостинге прав root обычно нет, и поставить их нельзя; - своя база PostgreSQL или Redis;
- вебхуки, очереди, задачи по расписанию;
- проект должен быть доступен в интернете, пока ваш ноутбук выключен.
Сколько ресурсов нужно
Ориентир по сценариям. Это наша оценка, а не требования провайдеров, — кроме строки про VS Code, она взята из документации VS Code.
| Что работает на сервере | Память | Ядра |
|---|---|---|
| Бот или небольшой API без Docker | 1 ГБ | 1 |
| VS Code Remote-SSH | 1 ГБ — минимум, рекомендуют от 2 ГБ | от 2 |
| Приложение и PostgreSQL в Docker Compose | 2 ГБ | 2 |
| То же плюс Redis, очередь и сборка образов прямо на сервере | 4 ГБ | 2 |
Память кончается раньше ядер. Больше всего её съедает сборка: npm install, компиляция, docker build. На сервере с 1–2 ГБ включите файл подкачки, как в статье Как настроить VPS с нуля: сборка пойдёт медленнее, но меньше шансов, что её оборвёт нехватка памяти.
Диск тоже уходит незаметно: образы, тома и кэш сборки копятся с каждым обновлением. Сколько места занял Docker, покажет команда docker system df. Освободить место:
docker system pruneОна удаляет остановленные контейнеры, неиспользуемые сети, «висячие» образы без имени и кэш сборки, а перед удалением спрашивает подтверждение. Тома с данными по умолчанию не трогает. С флагом --volumes удаляются и анонимные тома, которые не использует ни один контейнер: если база хранила данные в таком томе, а её контейнер был остановлен, данные можно потерять.
Сколько стоит
Цены сняты со страниц провайдеров 30.09.2026: помесячно, вместе с публичным IP-адресом.
| Провайдер | 2 ядра, 2 ГБ | 2 ядра, 4 ГБ |
|---|---|---|
| Selectel | 400 ₽, диск 40 ГБ | 650 ₽, диск 50 ГБ |
| SpaceWeb | 930,46 ₽, 30 ГБ | 1 164,06 ₽, 40 ГБ |
| Beget | 960 ₽, 30 ГБ | 1 140 ₽, 40 ГБ |
| Timeweb Cloud | 1 000 ₽, 40 ГБ | 1 200 ₽, 50 ГБ |
| FirstVDS | такого тарифа нет | 1 069 ₽, 60 ГБ |
| Reg.ru | 1 473,67 ₽, 40 ГБ | не сравнивали |
| RUVDS | 1 840 ₽, 40 ГБ | не сравнивали |
Подвохи каждого провайдера разобраны в рейтинге VPS. Для учебного проекта сервер можно получить и бесплатно, на время: у SpaceWeb три дня теста, у Reg.ru сервер с 1 ядром и 1 ГБ памяти бесплатен три месяца — после идентификации и при положительном балансе.
Что важно разработчику, кроме цены
- Короткая оплата. Сервер для эксперимента можно поднять на вечер и удалить. По часам платят у Timeweb Cloud и за VDS у Selectel, по дням — у Beget, на тарифах «Старт» у RUVDS — посекундно.
- Выключенный сервер — не бесплатный. Selectel прямо пишет, что VDS оплачивается и выключенным. У RUVDS сервер оплачивается от создания до удаления. Чтобы перестать платить, сервер нужно удалить, а данные заранее сохранить в другом месте.
- При удалении проверьте IP-адрес. Timeweb Cloud позволяет оставить публичный IP на аккаунте после удаления сервера — и берёт за него деньги, пока он там лежит. Сам удалённый сервер восстановить нельзя.
- Тариф проще увеличить, чем уменьшить. У Timeweb Cloud тариф меняется только в большую сторону: диск нельзя уменьшить. У VDS Selectel уменьшения нет вовсе — только новый сервер и перенос данных. Начинайте с меньшего: добавить ресурсов потом можно.
- Снимок перед рискованным шагом. Перед обновлением системы или миграцией базы сделайте снимок диска. У Timeweb Cloud он бесплатный, но один на сервер и живёт 7 дней, а пока он есть, нельзя менять диск и переустанавливать систему. У Beget снимки стоят 5 ₽ за ГБ в месяц.
- Готовый образ. В маркетплейсе Timeweb Cloud есть образ Docker на Ubuntu 24.04 — сервер можно создать сразу с ним.
- Данные пользователей. Если в проекте появятся персональные данные, учтите: про VDS Selectel прямо сказано, что он не соответствует 152-ФЗ, и поручение на обработку данных для него не дают.
Docker на сервере: пять настроек сразу
1. Ставьте Docker из репозитория Docker
В Ubuntu есть свой пакет docker.io, но Docker называет такие пакеты неофициальными: они конфликтуют с официальными. Если на сервере что-то из них уже стоит, сначала удалите — эта команда взята из инструкции Docker:
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)Дальше — по официальной инструкции для Ubuntu, она поддерживает Ubuntu 26.04, 24.04 и 22.04. Скрипт-установщик с get.docker.com Docker советует только для тестовых сред и среды разработки, а не для рабочего сервера с живым проектом.
2. Группа docker — это root
Чтобы не писать sudo перед каждой командой, пользователя добавляют в группу docker:
sudo usermod -aG docker $USERПосле этого перезайдите на сервер и проверьте: docker run hello-world. Но Docker прямо предупреждает: группа docker даёт права уровня root. Добавляйте в неё только тех, кому и так доверили бы root. Если нужно строже, у Docker есть режим rootless.
3. Порты — только на 127.0.0.1
Главная ловушка: Docker и ufw несовместимы. Трафик к опубликованным портам контейнеров Docker перехватывает раньше, чем до него доходят правила ufw. Строка "5432:5432" в compose-файле откроет базу всему интернету, даже если в sudo ufw status порта 5432 нет. В документации Docker так и написано: публикация портов по умолчанию небезопасна.
Правильно — привязать порт к 127.0.0.1, тогда до него достучится только сам сервер. Фрагмент compose-файла:
services:
app:
build: .
restart: unless-stopped
ports:
- "127.0.0.1:8080:8080"
db:
image: postgres # версию образа, пароль и том для данных задайте по документации образа
restart: unless-stopped
ports:
- "127.0.0.1:5432:5432"Внутри Compose контейнеры и так видят друг друга по имени сервиса: приложение подключается к базе по адресу db:5432, публиковать для этого порт базы не нужно. Строка ports у базы нужна, только чтобы заходить в неё со своего компьютера через SSH-туннель — о нём ниже. Наружу проект отдаёт nginx на самом сервере: он принимает посетителей на портах 80 и 443 и передаёт запросы на 127.0.0.1:8080. Как его настроить — в статье Как разместить сайт на VPS.
4. Ограничьте логи
По умолчанию Docker сохраняет всё, что контейнер пишет в консоль, в JSON-файлы и никак их не ограничивает. Болтливый контейнер может занять логами весь диск. Сам Docker советует драйвер local: он сжимает и обрезает логи сам — по умолчанию до 100 МБ на контейнер, пять файлов по 20 МБ. Запишите в файл /etc/docker/daemon.json (если он уже есть, добавьте строку в него, а не затирайте):
{
"log-driver": "local"
}И перезапустите Docker:
sudo systemctl restart dockerНастройка действует только на новые контейнеры — уже созданные нужно пересоздать. Поэтому удобнее всего сделать это сразу после установки, пока контейнеров ещё нет.
5. Автозапуск после перезагрузки
Сам Docker в Ubuntu запускается вместе с системой, а контейнеры — нет: по умолчанию политика перезапуска no. Добавьте в compose-файл restart: unless-stopped, как в примере выше. Тогда контейнер поднимется после сбоя и после перезагрузки сервера, но не после того, как вы остановили его сами. Для docker run то же самое делает флаг --restart unless-stopped.
Как работать с кодом на сервере
VS Code по SSH. Расширение Remote-SSH открывает папку на сервере прямо в редакторе. Серверу нужен минимум 1 ГБ памяти, а рекомендуют 2 ГБ и 2 ядра. Ubuntu подходит, Alpine и другие системы без glibc — нет. Входить лучше по ключу, а не по паролю: как его настроить, разобрано в статье Как подключиться к VPS по SSH.
База через SSH-туннель. Чтобы открыть базу на сервере в DBeaver, pgAdmin или другом клиенте на своём компьютере, порт базы наружу открывать не нужно:
ssh -N -L 15432:127.0.0.1:5432 USER@IP_СЕРВЕРАПока команда работает, подключайте клиент к 127.0.0.1:15432 у себя на компьютере: ssh переправит соединение на порт 5432 сервера по зашифрованному каналу. Ключ -N значит «только туннель, без команд на сервере». Порт 15432 взят, чтобы не столкнуться с PostgreSQL, если он стоит и у вас. Как не открыть базу всему интернету и как делать её копии — в статье Сервер для базы данных.
Пароли и токены держите в файле .env на сервере и не добавляйте его в git.
Частые ошибки
| Ошибка | Чем кончается | Как правильно |
|---|---|---|
"5432:5432" в compose-файле в расчёте на ufw | База открыта всему интернету | "127.0.0.1:5432:5432" или вовсе без ports |
| Логи контейнеров без ограничений | Логи занимают весь диск | Драйвер local в daemon.json |
| Сервер выключили, чтобы не платить | У Selectel и RUVDS деньги списываются дальше | Сохранить данные и удалить сервер |
| Взяли тариф «на вырост» | У Timeweb Cloud и VDS Selectel его не уменьшить | Начинать с меньшего |
| Запустили приложение командой в терминале | Оно умирает вместе с SSH-сеансом | restart: unless-stopped или служба systemd |
| Добавили в группу docker чужую учётную запись | У неё фактически права root | Только свою |
docker system prune --volumes «для порядка» | Можно потерять базу из анонимного тома | Без --volumes или сначала копия |
Что почитать дальше
- Как настроить VPS с нуля — пользователь, вход по ключу, фаервол и подкачка.
- Сервер для базы данных — своя база или облачная и как не открыть её наружу.
- Рейтинг VPS 2026 — семь провайдеров и подвохи каждого.
- Ubuntu на VPS — какую версию выбрать и как обновлять.
- VPS для телеграм-бота — если ваш проект — бот.
- Хостинг для Python и Node.js — когда сайту на Django, Flask или Node.js хватит обычного хостинга.
Проверено и обновлено: 02.10.2026