Skip to content

Продакшен-развёртывание

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

Перед запуском в production убедитесь, что все критически важные переменные установлены:

env
# Обязательные
JWT_SECRET=<надёжный секрет, минимум 32 символа>
POSTGRES_PASSWORD=<пароль БД>
POSTGRES_SSL_MODE=require

# Режим работы
DEV_MODE=false
GIN_MODE=release
ENVIRONMENT=production
LOG_LEVEL=info
LOG_FORMAT=json

# CORS
CORS_ENABLED=true
CORS_ORIGINS=https://slozy.example.com

# Пул соединений
POSTGRES_MAX_OPEN_CONNS=25
POSTGRES_MAX_IDLE_CONNS=10

Обязательные проверки

1. JWT Secret

В продакшене обязательно замените значение по умолчанию:

bash
# Генерация надёжного секрета
openssl rand -base64 48

Установите в JWT_SECRET. Используйте одно и то же значение на всех репликах для валидации токенов.

2. Режим разработки

DEV_MODE=true включает:

  • Логирование запросов с телом и заголовками
  • CORS для всех источников
  • Graceful shutdown с логами
  • Панику при миграциях в случае ошибки

В production DEV_MODE=false отключает диагностическую информацию.

3. GIN_MODE

bash
GIN_MODE=release

В release-режиме gin логирует только ошибки, не выводит цветные логи, использует оптимизированный маршрутизатор.

4. SSL

SLOzy не терминирует SSL самостоятельно — используйте Nginx reverse proxy или Ingress с cert-manager.

Конфигурация Nginx в deployments/nginx/nginx.prod.conf:

nginx
server {
    listen 443 ssl http2;
    server_name slozy.example.com;

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

    location / {
        proxy_pass http://slozy-web:8080;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

5. Health check

Эндпоинты для мониторинга:

bash
# Базовый health check
curl https://slozy.example.com/health
# {"status":"healthy","time":"2026-06-11T12:00:00Z"}

# Readiness probe
curl https://slozy.example.com/ready
# {"status":"ready","time":"2026-06-11T12:00:00Z"}

6. Prometheus

Metrics доступны на /metrics (порт 9090). В production рекомендуется:

  • Закрыть /metrics за basic auth или использовать отдельный network namespace
  • Настроить scrape_interval: 30s в prometheus/prometheus.yml
  • Установить retention.time: 30d