Skip to content

Latest commit

 

History

History
223 lines (162 loc) · 7.58 KB

File metadata and controls

223 lines (162 loc) · 7.58 KB

Docker

ReMind включает две Compose-конфигурации:

  • docker-compose.dev.yml для локальной разработки с hot reload.
  • docker-compose.yml для production-like стека с Nginx, Flask, Celery, PostgreSQL и Redis.

Development stack

Первый запуск:

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

Rebuild нужен после изменения:

  • package.json или package-lock.json
  • requirements*.txt
  • файлы в requirements/
  • Dockerfile.dev
  • system packages или base image assumptions

Для обычных изменений frontend/backend кода достаточно:

docker compose -f docker-compose.dev.yml up

Vite отвечает за frontend HMR, Flask перезагружает backend, а scripts/reload_on_change.py перезапускает Celery worker при изменении Python-файлов.

Production-like stack

Запуск:

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 --build

Compose сам формирует внутренние 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 предназначен только для тестирования.

Health Checks

Backend health:

curl http://127.0.0.1:5000/health

Nginx health в production-like stack:

curl http://127.0.0.1/health

Metrics:

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.