EQVPS

Как развернуть Docker Compose-стек на VPS

Разверните многоконтейнерный стек на VPS с Docker Compose: напишите docker-compose.yml, храните секреты в .env, поднимите с рестартом после перезагрузки и публикуйте только те порты, которые действительно нужны. Копируемый пример с веб-приложением, БД и reverse proxy.

Docker Compose описывает многоконтейнерный стек в одном файле и запускает его одной командой. Это инструкция по развёртыванию; сначала установите Docker, если ещё не сделали. Для стека под ИИ-агента (агент + векторная БД + Redis) смотрите docker-compose для ИИ-агентов.

1. Стек: приложение + база данных + reverse proxy

# /opt/stack/docker-compose.yml
services:
  app:
    image: your/app:latest
    restart: unless-stopped
    env_file: [.env]
    depends_on: [db]
    # no ports: — reached only through the proxy below

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes: ["pg:/var/lib/postgresql/data"]   # internal only

  caddy:                                        # HTTPS automatically
    image: caddy:2
    restart: unless-stopped
    ports: ["80:80", "443:443"]                 # the only public entrypoint
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data

volumes: { pg: {}, caddy_data: {} }

Секреты живут в .env, никогда в compose-файле:

# /opt/stack/.env  (chmod 600, git-ignored)
DB_PASSWORD=a-long-random-string

Минимальный Caddyfile проксирует ваш домен к приложению и сам получает HTTPS:

app.yourdomain.com {
  reverse_proxy app:8080
}

2. Поднимите его

cd /opt/stack
docker compose up -d
docker compose ps
docker compose logs -f app

restart: unless-stopped на каждом сервисе + Docker, включённый при загрузке = стек сам возвращается после перезагрузки.

3. Повседневные команды

docker compose pull && docker compose up -d   # update images
docker compose down                            # stop the stack
docker compose restart app                     # restart one service

То, в чём часто ошибаются: открытые порты

Docker публикует порты через iptables, поэтому контейнер с ports: ["5432:5432"] доступен из интернета даже за файрволом UFW, который вы считали закрытым. Публикуйте только публичную точку входа (proxy на 80/443); держите БД и кэши в compose-сети или привязанными к 127.0.0.1. Всему, что обслуживает веб-трафик, нужен тариф с выделенным IP; сочетайте с файрволом UFW.

Для целого стека за одним IP смотрите self-host нескольких сервисов. Root примерно за минуту, NVMe, без KYC, оплата в крипте.

Частые вопросы

Как развернуть Docker Compose-стек на VPS?

Установите Docker с плагином Compose, напишите docker-compose.yml с описанием каждого сервиса, храните секреты в .env, игнорируемом git, затем docker compose up -d. Задайте restart: unless-stopped на каждом сервисе и включите Docker при загрузке, чтобы стек переживал перезагрузки. Пример ниже запускает веб-приложение, Postgres и reverse proxy на Caddy.

Куда класть секреты — в compose-файл?

Нет. Поместите их в файл .env (chmod 600, игнорируется git) и ссылайтесь на них как ${VAR} в compose, либо используйте Docker secrets. Никогда не коммитьте пароли или API-ключи в docker-compose.yml — утёкший файл с живыми учётными данными — классическая ошибка.

Вернётся ли стек после перезагрузки?

Только если вы ему это скажете. Задайте restart: unless-stopped (или always) на каждом сервисе и включите Docker при загрузке (systemctl enable docker). Тогда docker compose up -d переживает перезагрузки и перезапускает упавшие контейнеры.

Какие порты открываются?

Только то, что вы публикуете через ports:. Привяжите внутренние сервисы (БД, кэши) к compose-сети или 127.0.0.1 и публикуйте лишь публичную точку входа — обычно reverse proxy на 80/443. Docker публикует через iptables, поэтому случайная строка ports: доступна из интернета даже за UFW.

Вы просите документы или карту?

Нет. Email для регистрации, оплата в USDC или USDT — без документов, без карты. Root примерно за минуту.

Комментарии

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

Оставить комментарий

Комментарии проходят модерацию перед публикацией.