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 приблизно за хвилину.

Коментарі

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

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

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