Skip to content

Конфигурация

Все настройки можно. задаются через переменные окружения с единым префиксом MOZHNO_*. Ниже — полный список с описаниями и значениями по умолчанию.

Модель конфигурации: приложение читает настройки только из переменных окружения MOZHNO_*. Все имеют безопасные значения по умолчанию — сервер стартует без какой-либо конфигурации. Полный шаблон — в файле .env.example в корне репозитория. Профиль dev (через SPRING_PROFILES_ACTIVE=dev) предназначен только для локальной разработки из исходников.

Как задавать переменные

Docker Compose — в секции environment сервиса:

yaml
services:
  mozhno:
    image: mozhnodev/mozhno:latest
    environment:
      MOZHNO_JWT_SECRET: ${MOZHNO_JWT_SECRET}   # из .env или окружения хоста
      MOZHNO_DB_URL: jdbc:postgresql://postgres:5432/feature_flags
      MOZHNO_DB_PASSWORD: secret
      MOZHNO_BASE_URL: https://flags.example.com

docker run — через флаги -e:

bash
docker run -p 8080:8080 \
  -e MOZHNO_JWT_SECRET=$(openssl rand -base64 32) \
  -e MOZHNO_DB_URL=jdbc:postgresql://db:5432/feature_flags \
  -e MOZHNO_DB_PASSWORD=secret \
  mozhnodev/mozhno:latest

Файл .env (Docker Compose подхватывает автоматически):

bash
MOZHNO_JWT_SECRET=your-256-bit-secret
MOZHNO_DB_PASSWORD=secret
MOZHNO_JWT_ACCESS_TOKEN_TTL_MINUTES=30

Запуск JAR напрямую — через переменные окружения процесса:

bash
export MOZHNO_JWT_SECRET=$(openssl rand -base64 32)
export MOZHNO_DB_PASSWORD=secret
java -jar mozhno.jar

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

ПеременнаяПо умолчаниюОписание
MOZHNO_SERVER_PORT8080Порт, на котором слушает HTTP-сервер
MOZHNO_BASE_URLhttp://localhost:8080Публичный URL сервера. Используется для генерации ссылок и CORS
MOZHNO_JWT_SECRET— (опционально для dev)Секретный ключ для подписи JWT-токенов. Минимум 256 бит. Принимается как простой текст (>= 32 символов), так и Base64 (>= 32 байт после декодирования). Если не задан — генерируется случайный ключ на время сессии (при рестарте все токены инвалидируются). Для продакшена задайте явно
MOZHNO_CACHE_TTL_MINUTES5TTL кеша Caffeine в минутах. При multi-node уменьшите до 1 или 0. Подробнее — Масштабирование
MOZHNO_CLIENT_MAX_METRICS_PER_KEY1000Максимальное количество хранимых метрик на API-ключ

Инициализация (первый запуск)

ПеременнаяПо умолчаниюОписание
MOZHNO_INIT_EMAIL— (если не задана — администратор не создаётся)Email администратора, создаваемого при первом запуске (если в БД нет пользователей)
MOZHNO_INIT_PASSWORDПароль администратора при первом запуске

При первом запуске с пустой БД сервер создаёт:

  • Пользователя-администратора — если заданы обе переменные MOZHNO_INIT_EMAIL и MOZHNO_INIT_PASSWORD, и в БД ещё нет пользователей
  • Проект «Default Project» — если в БД ещё нет проектов

Если переменные не заданы, сервер стартует без пользователей — войти будет невозможно. Задайте их или создайте администратора вручную через прямой INSERT в БД.

При логине заново через переменные окружения администратор не пересоздаётся — если пользователи уже есть в БД, бутстрап пропускается.

База данных

ПеременнаяПо умолчаниюОписание
MOZHNO_DB_URLjdbc:postgresql://localhost:5432/feature_flagsJDBC URL для подключения к PostgreSQL
MOZHNO_DB_USERNAMEflags_userИмя пользователя базы данных
MOZHNO_DB_PASSWORDflags_passwordПароль пользователя базы данных

Дополнительные настройки пула соединений

ПеременнаяПо умолчаниюОписание
MOZHNO_DB_POOL_MAX_SIZE20Максимальный размер пула соединений HikariCP
MOZHNO_DB_POOL_MIN_IDLE5Минимальное количество простаивающих соединений
MOZHNO_DB_POOL_CONNECTION_TIMEOUT10000Таймаут получения соединения (мс)

Flyway (миграции)

ПеременнаяПо умолчаниюОписание
MOZHNO_FLYWAY_ENABLEDtrueАвтоматический запуск миграций при старте
MOZHNO_FLYWAY_LOCATIONSclasspath:db/migrationПуть к файлам миграций

JWT и безопасность

ПеременнаяПо умолчаниюОписание
MOZHNO_JWT_SECRET— (опционально для dev)Секретный ключ подписи JWT. Если не задан — генерируется случайный ключ (все токены сбрасываются при рестарте)
MOZHNO_JWT_ACCESS_TOKEN_TTL_MINUTES15Время жизни access-токена в минутах
MOZHNO_JWT_REFRESH_TOKEN_TTL_DAYS30Время жизни refresh-токена в днях

Refresh-токены используют семейную ротацию (family rotation). При каждом обновлении старый refresh-токен инвалидируется, новый сохраняется в ту же «семью». Если украденный токен используется повторно, вся семья аннулируется.

Swagger / OpenAPI

ПеременнаяПо умолчаниюОписание
MOZHNO_SWAGGER_UI_PATH/swagger-ui.htmlПуть к Swagger UI
MOZHNO_API_DOCS_PATH/v3/api-docsПуть к OpenAPI-спецификации

Пример .env-файла

bash
# JWT secret (опционально для dev — без него генерируется случайный ключ)
MOZHNO_JWT_SECRET=your-256-bit-secret-change-me-in-production

# База данных
MOZHNO_DB_URL=jdbc:postgresql://localhost:5432/feature_flags
MOZHNO_DB_USERNAME=flags_user
MOZHNO_DB_PASSWORD=flags_password

# Сервер
MOZHNO_SERVER_PORT=8080
MOZHNO_BASE_URL=http://localhost:8080

# JWT
MOZHNO_JWT_ACCESS_TOKEN_TTL_MINUTES=15
MOZHNO_JWT_REFRESH_TOKEN_TTL_DAYS=30

# Пул соединений
MOZHNO_DB_POOL_MAX_SIZE=20
MOZHNO_DB_POOL_MIN_IDLE=5

# Кеш
MOZHNO_CACHE_TTL_MINUTES=5
MOZHNO_CLIENT_MAX_METRICS_PER_KEY=1000

# Бутстрап (первый запуск) — создаёт администратора при пустой БД
MOZHNO_INIT_EMAIL=admin@admin.com
MOZHNO_INIT_PASSWORD=admin

Продакшен-рекомендации

  1. MOZHNO_JWT_SECRET — используйте криптографически стойкий ключ длиной не менее 256 бит. Сгенерировать (один из вариантов; также подойдёт простая строка >= 32 символов):

    bash
    openssl rand -base64 32
  2. База данных — всегда задавайте сложный пароль. Не используйте flags_password на проде.

  3. MOZHNO_BASE_URL — укажите реальный домен (https://flags.example.com) для корректной работы CORS и генерации ссылок.

  4. Пул соединений — для продакшена увеличьте MOZHNO_DB_POOL_MAX_SIZE до 20–50 в зависимости от нагрузки.

  5. Refresh token rotation — включена по умолчанию. Ротация предотвращает перехват токенов.

  6. Смените пароль администратора — после первого входа с бутстрап-учётной записью (MOZHNO_INIT_EMAIL / MOZHNO_INIT_PASSWORD) сразу смените пароль. На проде не используйте admin@admin.com / admin.

Дополнительные настройки безопасности

Rate Limiting

ПеременнаяПо умолчаниюОписание
MOZHNO_SECURITY_RATE_LIMIT_ENABLEDtrueВключение rate limiting
MOZHNO_SECURITY_RATE_LIMIT_LOGIN_CAPACITY5Ёмкость корзины для логина
MOZHNO_SECURITY_RATE_LIMIT_LOGIN_REFILL_TOKENS5Токенов за интервал для логина
MOZHNO_SECURITY_RATE_LIMIT_LOGIN_REFILL_MINUTES1Интервал пополнения для логина (мин)
MOZHNO_SECURITY_RATE_LIMIT_PASSWORD_RESET_CAPACITY3Ёмкость для сброса пароля
MOZHNO_SECURITY_RATE_LIMIT_PASSWORD_RESET_REFILL_TOKENS3Токенов за интервал для сброса
MOZHNO_SECURITY_RATE_LIMIT_PASSWORD_RESET_REFILL_MINUTES60Интервал пополнения для сброса (мин)
MOZHNO_SECURITY_RATE_LIMIT_REFRESH_CAPACITY10Ёмкость для обновления токенов
MOZHNO_SECURITY_RATE_LIMIT_REFRESH_REFILL_TOKENS10Токенов за интервал для refresh
MOZHNO_SECURITY_RATE_LIMIT_REFRESH_REFILL_MINUTES1Интервал пополнения для refresh (мин)
MOZHNO_SECURITY_RATE_LIMIT_CLIENT_CAPACITY1000Ёмкость для SDK-клиентов
MOZHNO_SECURITY_RATE_LIMIT_CLIENT_REFILL_TOKENS1000Токенов за интервал для SDK
MOZHNO_SECURITY_RATE_LIMIT_CLIENT_REFILL_MINUTES1Интервал пополнения для SDK (мин)
MOZHNO_SECURITY_RATE_LIMIT_API_WRITE_CAPACITY100Ёмкость для admin write-операций
MOZHNO_SECURITY_RATE_LIMIT_API_WRITE_REFILL_TOKENS100Токенов за интервал для write
MOZHNO_SECURITY_RATE_LIMIT_API_WRITE_REFILL_MINUTES1Интервал пополнения для write (мин)

CORS

ПеременнаяПо умолчаниюОписание
MOZHNO_SECURITY_CORS_ALLOWED_ORIGINS""Разрешённые origin для CORS (через запятую)

JWT

ПеременнаяПо умолчаниюОписание
MOZHNO_JWT_ISSUERmozhnoИздатель токенов (iss claim)

Аудит

ПеременнаяПо умолчаниюОписание
MOZHNO_AUDIT_RETENTION_DAYS365Срок хранения записей аудита в днях

Прочее

ПеременнаяПо умолчаниюОписание
MOZHNO_CLIENT_INSTANCE_RETENTION_DAYS30Срок хранения неактивных экземпляров SDK
MOZHNO_DB_POOL_LEAK_DETECTION30000Порог детекции утечек соединений (мс)
MOZHNO_CACHE_TYPEcaffeineSpring-тип кеша. caffeine — in-memory (Community). Для Redis добавьте spring-boot-starter-data-redis и смените на redis

SMTP (почта)

ПеременнаяПо умолчаниюОписание
MOZHNO_SMTP_HOSTlocalhostХост SMTP-сервера
MOZHNO_SMTP_PORT587Порт SMTP-сервера
MOZHNO_SMTP_USERNAMEИмя пользователя SMTP
MOZHNO_SMTP_PASSWORDПароль SMTP
MOZHNO_MAIL_FROMnoreply@mozhno.devАдрес отправителя писем

Новые настройки

Помимо перечисленных, доступны дополнительные группы (значения по умолчанию заданы, менять не обязательно):

ПеременнаяПо умолчаниюОписание
MOZHNO_SECURITY_BCRYPT_STRENGTH12Сложность (cost) BCrypt для хеширования паролей
MOZHNO_SECURITY_MAX_FAILED_LOGIN_ATTEMPTS5Неудачных попыток входа до блокировки аккаунта
MOZHNO_SECURITY_LOCKOUT_DURATION_MINUTES15Длительность блокировки аккаунта (мин)
MOZHNO_AUTH_PASSWORD_RESET_TOKEN_TTL_HOURS1Срок жизни токена сброса пароля (ч)
MOZHNO_AUTH_PASSWORD_RESET_COOLDOWN_MINUTES5Минимальный интервал между письмами сброса (мин)
MOZHNO_AUTH_INVITE_TOKEN_TTL_DAYS7Срок жизни токена приглашения (дни)
MOZHNO_AUTH_ACTIVITY_WINDOW_MINUTES5Как часто обновляется метка активности пользователя (мин)
MOZHNO_WEBHOOK_CONNECT_TIMEOUT_SECONDS10Таймаут соединения для вебхуков (с)
MOZHNO_WEBHOOK_REQUEST_TIMEOUT_SECONDS30Таймаут запроса для вебхуков (с)
MOZHNO_WEBHOOK_ASYNC_CORE_POOL_SIZE4Базовый размер пула потоков вебхуков
MOZHNO_WEBHOOK_ASYNC_MAX_POOL_SIZE16Максимальный размер пула потоков вебхуков
MOZHNO_WEBHOOK_ASYNC_QUEUE_CAPACITY100Ёмкость очереди задач вебхуков
MOZHNO_FLAGS_MAX_TAGS_PER_FLAG10Максимум тегов на флаг
MOZHNO_FLAGS_DEFAULT_PAGE_SIZE50Размер страницы по умолчанию
MOZHNO_FLAGS_MAX_PAGE_SIZE200Максимальный размер страницы (список флагов)
MOZHNO_FLAGS_ENRICHED_MAX_PAGE_SIZE500Максимальный размер страницы (обогащённый список)
MOZHNO_CACHE_MAX_SIZE5000Максимум записей в кеше
MOZHNO_MANAGEMENT_PORT9090Порт actuator/метрик
MOZHNO_SWAGGER_ENABLEDtrueВключение Swagger UI
MOZHNO_LOG_LEVEL_ROOTINFOКорневой уровень логирования
MOZHNO_LOG_LEVEL_APPINFOУровень логирования dev.mozhno

Полный перечень с дефолтами — в файле .env.example.

Что дальше?

Released under the BSL 1.1 License.