Skip to content

Docker-развёртывание

Сборка образов

bash
# Сборка SLOzy Web
docker build -t slozy-web:latest .

# Сборка ингестора
docker build -f Dockerfile.ingestor -t slozy-ingestor:latest .

Два compose-файла

В проекте два файла для разных окружений:

docker-compose.yml (разработка)

Полный стек для локальной разработки. Всё необходимое запускается одной командой:

СервисНазначениеПорт
postgresPostgreSQL 16, учётные данные из .env, /tmp заблокирован (noexec)127.0.0.1:5432
redisRedis 7 с паролем из .env127.0.0.1:6379
prometheusХранилище метрик, 30 дней хранения127.0.0.1:9090
grafanaДашборды, пароль из .env127.0.0.1:3001
slozy-webОсновное Go-приложение127.0.0.1:8080
slozy-frontendVite + React dev-сервер127.0.0.1:3000
bash
docker compose up -d

docker-compose.prod.yml (продакшен)

Минимальный продакшен-стек. Не включает PostgreSQL и Redis — предполагается, что они управляются внешними сервисами (RDS, ElastiCache и т.п.).

СервисНазначениеПорты
slozy-webGo-приложение с лимитами (2 CPU / 4 GB)127.0.0.1:8080,9090
slozy-ingestorВоркер сбора метрик (1 CPU / 2 GB)нет
nginxReverse proxy, SSL на 80/44380, 443
bash
docker compose -f docker-compose.prod.yml up -d

Зачем два файла?

Одного docker-compose.yml недостаточно, потому что:

  • В разработке PostgreSQL, Redis, Prometheus, Grafana и фронтенд удобно иметь как контейнеры — всё поднимается без внешних зависимостей
  • В продакшене базы данных должны быть отказоустойчивыми: managed PostgreSQL (RDS, CloudSQL) и Redis (ElastiCache) дают бэкапы, репликацию и автоматическое восстановление, чего нет в контейнерных БД
  • Разный профиль безопасности — продакшен привязывает порты к 127.0.0.1, добавляет лимиты ресурсов, использует отдельный ingestor и reverse proxy для SSL
  • Разная сборка — dev собирает исходники с hot-reload, prod использует готовые образы с restart: unless-stopped

Защита (оба файла)

Все compose-файлы применяют:

  • security_opt: no-new-privileges:true — запрет повышения привилегий
  • tmpfs: /tmp:noexec,nosuid,size=100M — запрет на исполнение в /tmp
  • Порты только на 127.0.0.1 — не торчат наружу
  • Пароли из .env — никогда не хардкодятся

Переменные окружения

Все секреты задаются через .env файл. Полный список — в .env.example.

bash
cp .env.example .env
# Отредактируйте .env под своё окружение

Nginx

Конфигурация Nginx расположена в deployments/nginx/nginx.prod.conf. В production режиме:

  • SSL-termination на 443 порту
  • Проксирование запросов на slozy-web:8080
  • Раздача статики из volume slozy_static
  • Health check /health

Для выпуска SSL-сертификата используйте certbot или Let's Encrypt:

bash
docker compose -f docker-compose.prod.yml exec nginx certbot --nginx -d yourdomain.com

Health checks

Встроенные health checks для каждого сервиса:

yaml
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 10s