Docker-развёртывание
Сборка образов
bash
# Сборка SLOzy Web
docker build -t slozy-web:latest .
# Сборка ингестора
docker build -f Dockerfile.ingestor -t slozy-ingestor:latest .Два compose-файла
В проекте два файла для разных окружений:
docker-compose.yml (разработка)
Полный стек для локальной разработки. Всё необходимое запускается одной командой:
| Сервис | Назначение | Порт |
|---|---|---|
postgres | PostgreSQL 16, учётные данные из .env, /tmp заблокирован (noexec) | 127.0.0.1:5432 |
redis | Redis 7 с паролем из .env | 127.0.0.1:6379 |
prometheus | Хранилище метрик, 30 дней хранения | 127.0.0.1:9090 |
grafana | Дашборды, пароль из .env | 127.0.0.1:3001 |
slozy-web | Основное Go-приложение | 127.0.0.1:8080 |
slozy-frontend | Vite + React dev-сервер | 127.0.0.1:3000 |
bash
docker compose up -ddocker-compose.prod.yml (продакшен)
Минимальный продакшен-стек. Не включает PostgreSQL и Redis — предполагается, что они управляются внешними сервисами (RDS, ElastiCache и т.п.).
| Сервис | Назначение | Порты |
|---|---|---|
slozy-web | Go-приложение с лимитами (2 CPU / 4 GB) | 127.0.0.1:8080,9090 |
slozy-ingestor | Воркер сбора метрик (1 CPU / 2 GB) | нет |
nginx | Reverse proxy, SSL на 80/443 | 80, 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.comHealth checks
Встроенные health checks для каждого сервиса:
yaml
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s