125 lines
7.2 KiB
Plaintext
125 lines
7.2 KiB
Plaintext
# Скопировать в .env и заполнить. Файл .env не попадает в git (.gitignore).
|
||
|
||
# Строка подключения к PostgreSQL. Два взаимозаменяемых варианта:
|
||
# внешняя база через туннель → localhost:5432 (запуск: make up)
|
||
DATABASE_URL=postgres://user:pass@localhost:5432/building_mgmt?sslmode=disable
|
||
# локальная база в docker → localhost:5433
|
||
# DATABASE_URL=postgres://building_app:building_app@localhost:5433/building_mgmt?sslmode=disable
|
||
|
||
# Пул соединений PostgreSQL (необязательно; пусто — дефолты pgxpool).
|
||
# В проде рекомендуется задать явно (см. .env.prod.example):
|
||
# DB_MAX_CONNS=20 DB_MIN_CONNS=2
|
||
# DB_MAX_CONN_LIFETIME=1h DB_MAX_CONN_IDLE_TIME=30m
|
||
DB_MAX_CONNS=
|
||
DB_MIN_CONNS=
|
||
DB_MAX_CONN_LIFETIME=
|
||
DB_MAX_CONN_IDLE_TIME=
|
||
|
||
# Секрет подписи JWT: минимум 32 случайных символа.
|
||
# Сгенерировать: openssl rand -base64 48
|
||
JWT_SECRET=
|
||
|
||
# Режим окружения: пусто (dev) или production. В production
|
||
# команда seed (демо-аккаунты) отказывается работать.
|
||
APP_ENV=
|
||
|
||
# Порт HTTP-сервера. По умолчанию 8080.
|
||
PORT=8080
|
||
|
||
# Swagger UI на /swagger/index.html. По умолчанию выключен — на проде
|
||
# открытая схема не нужна; в локальной разработке ставить true.
|
||
SWAGGER=false
|
||
|
||
# Secure-флаг на httpOnly-куке refresh-токена. Локально сайт идёт по
|
||
# HTTP, а браузер Secure-куку по HTTP отвергает — оставлять false.
|
||
# В проде, когда сайт за TLS, ставить true.
|
||
COOKIE_SECURE=false
|
||
|
||
# Доверенные reverse proxy для X-Forwarded-For (через запятую, CIDR/IP).
|
||
# пусто — доверен только loopback (127.0.0.1/32, ::1/32): дефолт
|
||
# за proxy — подсеть proxy: TRUSTED_PROXIES=172.0.0.0/12
|
||
# Сам proxy обязан ПЕРЕЗАПИСЫВАТЬ X-Forwarded-For ($remote_addr), а не
|
||
# дополнять: gin берёт левый элемент, оставленный клиентом.
|
||
TRUSTED_PROXIES=
|
||
|
||
# CORS: источники фронта через запятую (scheme + host + port).
|
||
# пусто — заголовки не отдаются вовсе (дефолт; фронту на том же
|
||
# домене CORS не нужен, чужому домену — и не должно быть)
|
||
# несколько — CORS_ORIGINS=http://localhost:3000,http://127.0.0.1:3000
|
||
CORS_ORIGINS=
|
||
|
||
# Логирование (необязательно).
|
||
# LOG_LEVEL = debug | info | warn | error (по умолчанию info)
|
||
# LOG_FORMAT = text | json (по умолчанию text;
|
||
# json — когда логи собирает агрегатор)
|
||
LOG_LEVEL=info
|
||
LOG_FORMAT=text
|
||
|
||
# Режим gin: debug (по умолчанию) выводит баннер и цветной access-log.
|
||
# Пусто = release — только структурные логи.
|
||
GIN_MODE=
|
||
|
||
# S3-совместимое хранилище для фотоотчёта (фейл-фаст: без него сервер
|
||
# не стартует — бакет создаётся сам при старте). Локально — MinIO в
|
||
# compose: S3 на http://localhost:5434, консоль http://localhost:5435
|
||
# (вход/пароль minioadmin/minioadmin).
|
||
# В проде — любой S3: у AWS endpoint пустой, ключи берутся из IAM-ролей;
|
||
# у R2/Wasabi/своего MinIO — endpoint + ключи.
|
||
S3_ENDPOINT=http://localhost:5434
|
||
S3_REGION=us-east-1
|
||
S3_BUCKET=building-mgmt
|
||
S3_ACCESS_KEY=minioadmin
|
||
S3_SECRET_KEY=minioadmin
|
||
# path-style («/бакет/ключ») обязателен для локального MinIO: поддомен
|
||
# «бакет.localhost:5434» не резолвится. Для штатного AWS — false/пусто.
|
||
S3_USE_PATH_STYLE=true
|
||
|
||
# Фотоотчёт: потолок одного файла (в байтах) и число файлов на заявку.
|
||
# Пусто — дефолты 10485760 (10 МБ) и 20.
|
||
PHOTO_MAX_BYTES=10485760
|
||
PHOTO_MAX_PER_TICKET=20
|
||
|
||
# Автоочистка старых заявок: удалять закрытые заявки, чей closed_at
|
||
# старше N дней (прогон при старте и раз в сутки). 0 — чистка выключена.
|
||
# Незакрытые заявки не удаляются никогда, независимо от возраста.
|
||
TICKET_RETENTION_DAYS=60
|
||
|
||
# --- SMTP писем подтверждения (POST /users/:id/confirm) ---
|
||
# Пустой SMTP_HOST — письма не шлются. SMTP_TLS: tls | starttls | none;
|
||
# пусто = tls для порта 465, иначе starttls. SMTP_FROM пуст → берётся SMTP_USER.
|
||
# Локальная разработка — Mailpit вместо боевого SMTP:
|
||
# docker run -d -p 1025:1025 -p 8025:8025 axllent/mailpit
|
||
# SMTP_HOST=localhost SMTP_PORT=1025 SMTP_TLS=none SMTP_USER= SMTP_PASSWORD= SMTP_FROM=dev@localhost
|
||
SMTP_HOST=
|
||
SMTP_PORT=587
|
||
SMTP_USER=
|
||
SMTP_PASSWORD=
|
||
SMTP_FROM=
|
||
SMTP_TLS=
|
||
# База ссылок на страницу входа внутри письма.
|
||
APP_BASE_URL=http://localhost:3000
|
||
|
||
# --- Telegram: уведомления о заявках, не взятых в работу за 24 часа ---
|
||
# Два источника бота (подробности — README, раздел «Уведомления в Telegram»):
|
||
# 1. личный токен пользователя — вводится в разделе «Настройки»,
|
||
# шифруется DATA_ENCRYPTION_KEY и хранится в БД;
|
||
# 2. глобальный бот сервера — запасной для тех, кто токен не ввёл.
|
||
# Пусто и то, и другое — уведомления выключены: GET /auth/telegram
|
||
# отдаёт enabled:false, выдача кода — 400 telegram not configured.
|
||
# Бот заводится через @BotFather; для общей цели его нужно добавить
|
||
# в группу или канал.
|
||
#
|
||
# Ключ шифрования токенов пользователей (32 байта, base64 или hex;
|
||
# генерация: openssl rand -base64 32 либо openssl rand -hex 32).
|
||
# Пусто — ввод токена в вебе выключен (POST /auth/telegram/bot → 400),
|
||
# а сохранённые ранее не расшифровываются.
|
||
DATA_ENCRYPTION_KEY=
|
||
# Токен глобального бота — секрет, задаётся только здесь (в код и в git
|
||
# не попадает); его отсутствие не ломает фичу, если есть личные токены.
|
||
TELEGRAM_BOT_TOKEN=
|
||
# База Bot API; пусто = https://api.telegram.org.
|
||
TELEGRAM_API_URL=
|
||
# Порог напоминания (duration: 24h, 30m) и период фонового тика.
|
||
TELEGRAM_NOTIFY_AFTER=24h
|
||
TELEGRAM_TICK_EVERY=1m
|