Под задачу

VPS для разработчика: какой сервер взять под пет-проект и Docker

Пет-проекту с Docker и базой обычно хватает сервера с 2 ядрами и 2 ГБ памяти — от 400 до 1 840 ₽ в месяц, смотря у кого брать. Дороже обходятся ошибки: Docker открывает порты в обход фаервола, логи контейнеров по умолчанию растут без предела, а выключенный сервер у части провайдеров продолжает списывать деньги.

Обновлено 02.10.2026≈ 9 мин чтения
Содержание 8

Когда нужен VPS, а когда хватит хостинга

Обычный хостинг рассчитан на сайты на PHP: WordPress, лендинг, сайт-визитку. Если пет-проект такой, сервер не нужен — разница подробно разобрана в статье Чем VPS отличается от обычного хостинга.

VPS нужен, если есть хотя бы одно из этого:

  • бэкенд на Node.js, Python или Go, который работает круглосуточно, а не только пока идёт запрос;
  • Docker и docker compose — на обычном хостинге прав root обычно нет, и поставить их нельзя;
  • своя база PostgreSQL или Redis;
  • вебхуки, очереди, задачи по расписанию;
  • проект должен быть доступен в интернете, пока ваш ноутбук выключен.

Сколько ресурсов нужно

Ориентир по сценариям. Это наша оценка, а не требования провайдеров, — кроме строки про VS Code, она взята из документации VS Code.

Что работает на сервереПамятьЯдра
Бот или небольшой API без Docker1 ГБ1
VS Code Remote-SSH1 ГБ — минимум, рекомендуют от 2 ГБот 2
Приложение и PostgreSQL в Docker Compose2 ГБ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 ГБ
Selectel400 ₽, диск 40 ГБ650 ₽, диск 50 ГБ
SpaceWeb930,46 ₽, 30 ГБ1 164,06 ₽, 40 ГБ
Beget960 ₽, 30 ГБ1 140 ₽, 40 ГБ
Timeweb Cloud1 000 ₽, 40 ГБ1 200 ₽, 50 ГБ
FirstVDSтакого тарифа нет1 069 ₽, 60 ГБ
Reg.ru1 473,67 ₽, 40 ГБне сравнивали
RUVDS1 840 ₽, 40 ГБне сравнивали

Подвохи каждого провайдера разобраны в рейтинге VPS. Для учебного проекта сервер можно получить и бесплатно, на время: у SpaceWeb три дня теста, у Reg.ru сервер с 1 ядром и 1 ГБ памяти бесплатен три месяца — после идентификации и при положительном балансе.

На сайте есть партнёрские ссылки на Timeweb Cloud и Beget: если вы оплатите сервер после перехода по ним, провайдер заплатит нам процент. Для вас цена от этого не меняется.

Что важно разработчику, кроме цены

  • Короткая оплата. Сервер для эксперимента можно поднять на вечер и удалить. По часам платят у 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.

Держите Docker свежим: в версиях до 28.0.0 до портов на 127.0.0.1 могли достучаться не только сам сервер, но и машины из того же сегмента сети (L2).

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 или сначала копия

Что почитать дальше

Проверено и обновлено: 02.10.2026