axe/.env.example
2026-10-18 22:07:25 +03:00

125 lines
7.2 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Скопировать в .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