Когда проект на VPS перерастает один-два скрипта, начинаются проблемы: порты конфликтуют, библиотеки ломаются при обновлении, а перенос на новый сервер занимает часы. Docker и Docker Compose решают это полностью. Контейнеры изолируют сервисы, а один yaml-файл управляет всем стеком.
Мы используем этот подход для белорусских стартапов и компаний уже несколько лет — результат один: один сервер вместо трёх, деплой за 30 секунд и полная портативность. Ниже — проверенный гайд от чистого VPS до продакшена. Всё без лишней теории, только рабочие команды и реальные наблюдения.
Установка Docker на VPS
Подключитесь по SSH и начните с обновления системы. На Ubuntu 22.04/24.04 или Debian:
sudo apt update && sudo apt upgrade -y sudo apt install curl -y
Установка одной командой — самый надёжный вариант: curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
Добавьте пользователя в группу docker: sudo usermod -aG docker $USER newgrp docker
Проверьте: docker run hello-world
Если контейнер запустился — всё готово. На AlmaLinux/Rocky Linux замените apt на dnf, но принцип тот же.
Важный момент для белорусских тарифов: при 2 ГБ RAM Docker иногда уходит в OOM. Берите от 4 ГБ и добавьте в /etc/docker/daemon.json строку «log-driver»: «json-file» с ограничением размера логов. Перезапустите сервис: sudo systemctl restart docker.
Docker Compose V2 идёт как плагин. Проверьте: docker compose version
Если отсутствует — установите: sudo apt install docker-compose-plugin
Теперь можно создавать первые стеки.
Docker Compose: от первого контейнера до рабочего стека
Создайте папку проекта: mkdir ~/myapp && cd ~/myapp
Файл docker-compose.yml: version: ‘3.9’ services: web: image: nginx:stable-alpine restart: unless-stopped ports:
- «80:80» volumes:
- ./html:/usr/share/nginx/html:ro
api: build: ./api restart: unless-stopped depends_on:
- db environment:
- DB_HOST=db
db: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: app POSTGRES_USER: appuser POSTGRES_PASSWORD: ${DB_PASS} volumes:
- db_data:/var/lib/postgresql/data
volumes: db_data:
Создайте папку api и Dockerfile внутри: FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . EXPOSE 3000 CMD [«npm», «start»]
Файл .env: DB_PASS=ваш_сильный_пароль
Запуск: docker compose up -d —build
Стек работает. Изменения в коде — одна команда: docker compose up -d —build
Логи: docker compose logs -f api
Мы так запускаем 80 % проектов: лендинг + backend + база. Добавляйте Redis или Redis в тот же файл — VPS потянет без проблем.
Продакшен: безопасность, масштабирование и миграция
В продакшене меняем три вещи.
Во-первых, secrets. Никогда не заливайте пароли в git. Используйте .env и добавляйте: environment:
- DB_PASSWORD=${DB_PASS}
Во-вторых, healthcheck и сети: db: healthcheck: test: [«CMD-SHELL», «pg_isready -U appuser»] interval: 10s retries: 5 networks:
- backend
api: networks:
- backend
networks: backend: internal: true
В-третьих, volumes и бэкапы. Данные живут вне контейнера, поэтому: tar -czf backup-$(date +%F).tar.gz /var/lib/docker/volumes
Для автообновления добавьте сервис watchtower: watchtower: image: containrrr/watchtower volumes:
- /var/run/docker.sock:/var/run/docker.sock environment:
- WATCHTOWER_POLL_INTERVAL=3600
Миграция на новый VPS: копируете папку проекта, .env и volumes — docker compose up -d. Готово за 5 минут.
Для белорусских проектов добавляем ufw + fail2ban и лимиты ресурсов в compose (cpus и memory). Один сервер 8 ГБ/4 ядра держит магазин, API и админку одновременно.
Выводы
Docker и Docker Compose превращают VPS в мини-облако. Вы экономите на инфраструктуре, ускоряете деплой и забываете о «работает у меня — не работает у клиента». Начните с установки сегодня — через неделю проект будет в контейнере, а миграции и обновления станут рутиной. Именно так мы запускаем большинство белорусских решений в 2026 году.



