axe/.env.example

125 lines
7.2 KiB
Plaintext
Raw Permalink Normal View History

2026-10-18 19:07:25 +00:00
# Скопировать в .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