ReMind включает две Compose-конфигурации:
docker-compose.dev.ymlдля локальной разработки с hot reload.docker-compose.ymlдля production-like стека с Nginx, Flask, Celery, PostgreSQL и Redis.
Первый запуск:
docker compose -f docker-compose.dev.yml up --buildОбычный запуск после сборки зависимостей:
docker compose -f docker-compose.dev.yml upИли через npm:
npm run docker:devСервисы:
| Сервис | URL / роль |
|---|---|
frontend |
http://127.0.0.1:5173 |
backend |
http://127.0.0.1:5000 |
worker |
Celery worker с Python file watcher |
db |
PostgreSQL 15 |
redis |
Redis 7 с append-only persistence |
Dev stack по умолчанию не читает основной .env. Он выставляет LOAD_DOTENV=false и использует Compose environment values, чтобы production cookie/domain/password настройки не ломали локальную разработку.
Для локальных override можно добавить .env.dev. Это необязательно.
Rebuild нужен после изменения:
package.jsonилиpackage-lock.jsonrequirements*.txt- файлы в
requirements/ Dockerfile.dev- system packages или base image assumptions
Для обычных изменений frontend/backend кода достаточно:
docker compose -f docker-compose.dev.yml upVite отвечает за frontend HMR, Flask перезагружает backend, а scripts/reload_on_change.py перезапускает Celery worker при изменении Python-файлов.
Запуск:
docker compose up --buildСервисы:
| Сервис | Роль |
|---|---|
nginx |
Public HTTP edge и static/API proxy |
app |
Flask application из production image |
worker |
Celery background worker |
telegram-bot |
Опциональный Telegram Bot API worker (profile telegram) |
db |
PostgreSQL database |
redis |
Sessions, queue broker и runtime cache |
Обязательные environment values:
SECRET_KEY=replace-with-a-long-random-secret
DB_PASSWORD=replace-with-a-strong-db-password
REDIS_PASSWORD=replace-with-a-strong-redis-password
AI_PROVIDER_API_KEY=your-ai-provider-api-key
AI_PROVIDER_MODEL_NAME=your-ai-provider-model
BACKEND_URL=https://your-domain.exampleОпциональные интеграции:
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
APPLE_APP_BUNDLE_ID=synvexai.remind
# Web-вход включается только при наличии Services ID и точного HTTPS callback из Apple Developer.
APPLE_SERVICE_ID=
APPLE_WEB_REDIRECT_URI=https://your-domain.example/login/apple/callback
# Для обязательной server-side проверки web authorization code укажите готовый
# APPLE_CLIENT_SECRET либо APPLE_TEAM_ID + APPLE_KEY_ID + APPLE_PRIVATE_KEY_PATH.
APPLE_CLIENT_SECRET=
APPLE_TEAM_ID=
APPLE_KEY_ID=
APPLE_PRIVATE_KEY_PATH=
TELEGRAM_CLIENT_ID=
TELEGRAM_BOT_TOKEN=
TELEGRAM_BOT_USERNAME=
TURNSTILE_SITE_KEY=
TURNSTILE_SECRET_KEY=Ниже переменные для тонкой настройки Telegram-бота:
# Частота обновления draft-ответа в приватных чатах (секунды)
TELEGRAM_DRAFT_INTERVAL_SECONDS=0.55
# Размер истории диалога:
TELEGRAM_MAX_CONTEXT_MESSAGES=4
TELEGRAM_MAX_CONTEXT_MESSAGES_INLINE=4
# Уровень мыслительной нагрузки (от "minimal" до "high"):
# - общий для всех Telegram-каналов
TELEGRAM_THINKING_LEVEL=low
# - отдельные режимы для обычных сообщений и inline
TELEGRAM_THINKING_LEVEL_MESSAGE=medium
TELEGRAM_THINKING_LEVEL_INLINE=minimalДля нового Telegram Login откройте @BotFather → Bot Settings → Web Login,
добавьте origin сайта в Allowed URLs и скопируйте выданный Client ID в
TELEGRAM_CLIENT_ID. Имя и аватар бота используются Telegram на экране подтверждения
входа, поэтому оформите их как профиль ReMind.
Для Telegram-бота используйте тот же профиль бота, который связан с Web Login, и
заполните TELEGRAM_BOT_TOKEN и TELEGRAM_BOT_USERNAME. В BotFather включите:
- Groups и нужный режим Group Privacy;
- Inline Mode (
/setinline) и inline feedback, чтобы ReMind получалchosen_inline_resultи сохранял только действительно отправленные inline-ответы; - Guest Mode, чтобы бот отвечал по
@username, даже не состоя в чате.
После настройки запустите стек с профилем Telegram:
docker compose --profile telegram up --buildCompose сам формирует внутренние DATABASE_URL, REDIS_URL и Celery URL с хостами
db и redis из DB_PASSWORD/REDIS_PASSWORD. Значения этих URL в .env относятся
к запуску приложения напрямую на хосте и не подменяют адреса внутри контейнеров.
Для локального запуска GITHUB_OAUTH_ENCRYPTION_KEY может быть пустым: ReMind
детерминированно выводит совместимый Fernet-ключ из SECRET_KEY. Production Compose
по-прежнему требует отдельный ключ. Его можно сгенерировать командой:
python3 -c 'from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())'Worker сам проверяет supports_inline_queries и supports_guest_queries, публикует
локализованные команды и использует sendRichMessageDraft/sendRichMessage с
безопасным fallback на обычный текст для старых Bot API-серверов.
Для временного внешнего тестирования можно дополнительно включить Cloudflare Quick Tunnel без открытия входящего порта и без Cloudflare-токена:
docker compose --profile telegram --profile tunnel up -d cloudflared
docker compose logs cloudflaredВыданный домен https://*.trycloudflare.com временный и меняется при пересоздании
контейнера. Quick Tunnel предназначен только для тестирования.
Backend health:
curl http://127.0.0.1:5000/healthNginx health в production-like stack:
curl http://127.0.0.1/healthMetrics:
curl http://127.0.0.1:5000/metricsОстановить dev stack:
npm run docker:dev:downПосмотреть logs:
docker compose -f docker-compose.dev.yml logs -f backend
docker compose -f docker-compose.dev.yml logs -f workerПересобрать dev stack:
npm run docker:dev:buildСбросить dev volumes:
docker compose -f docker-compose.dev.yml down -vКоманда удалит локальные PostgreSQL и Redis данные dev stack.