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