Перейти к содержанию

Архитектура системы CalmTrader

Версия: 1.0 Дата: 13.01.2026 Контракт: order-001-phase1-ru Задача: 2.4.1 Архитектура и схема БД (A4A-30)


1. Обзор системы

CalmTrader — AI-психолог для трейдеров, реализованный как Telegram-бот с веб-админкой. Система помогает трейдерам управлять эмоциями через:

  • Pre-market check-in и post-market reflection
  • Дыхательные упражнения (/breathe)
  • Guided медитации (/meditate)
  • AI-ассистент на базе GPT-4o

1.1 Ключевые характеристики

Характеристика Значение
Архитектура Микросервисная
Язык backend Python 3.12
База данных PostgreSQL 16 + pgvector
Кэш Redis 7
Object Storage MinIO
Reverse Proxy Traefik v3.2
Контейнеризация Docker + Docker Compose
CI/CD GitHub Actions

2. Архитектурная диаграмма

2.1 Общая схема

                                    ┌─────────────────────────────────────────────────────────────┐
                                    │                         INTERNET                            │
                                    └─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                         TRAEFIK (Reverse Proxy)                                     │
│                                    Let's Encrypt SSL Auto-Renewal                                   │
│  ┌────────────────┬────────────────┬────────────────┬────────────────┬────────────────────────────┐ │
│  │ api.calmtrader │ bot.calmtrader │ app.calmtrader │admin.calmtrader│ storage.calmtrader.ai      │ │
│  │     .ai        │     .ai        │     .ai        │    .ai         │                            │ │
│  └────────────────┴────────────────┴────────────────┴────────────────┴────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────────────────────────────┘
            │                   │                 │                │                     │
            ▼                   ▼                 ▼                ▼                     ▼
┌───────────────────┐ ┌───────────────────┐ ┌───────────────┐ ┌───────────────┐ ┌───────────────────┐
│    API Service    │ │   Bot Service     │ │   Mini App    │ │  Admin Panel  │ │      MinIO        │
│    (FastAPI)      │ │   (aiogram 3.x)   │ │   (Static)    │ │ (Ionic/Angular│ │  (Object Storage) │
│    Port: 8000     │ │   Port: 8080      │ │   Port: 80    │ │   Port: 80    │ │   Port: 9000      │
└───────────────────┘ └───────────────────┘ └───────────────┘ └───────────────┘ └───────────────────┘
            │                   │                                     │                     │
            │                   │                                     │                     │
            ▼                   ▼                                     ▼                     │
┌─────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                        INTERNAL NETWORK                                              │
│  ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────────────────┐│
│  │    PostgreSQL     │ │      Redis        │ │   Agent Service   │ │         Admin Bot             ││
│  │   (pgvector/pg16) │ │    (7-alpine)     │ │   (GPT-4o Agent)  │ │      (Image Gen, etc.)        ││
│  │    Port: 5432     │ │    Port: 6379     │ │    Port: 8001     │ │        Port: 8090             ││
│  └───────────────────┘ └───────────────────┘ └───────────────────┘ └───────────────────────────────┘│
└─────────────────────────────────────────────────────────────────────────────────────────────────────┘

2.2 Mermaid диаграмма

flowchart TB
    subgraph Internet
        Users[Telegram Users]
        Admin[Administrators]
    end

    subgraph Traefik["Traefik Reverse Proxy"]
        SSL[Let's Encrypt SSL]
    end

    subgraph Web["WEB Network (External)"]
        API[API Service<br/>FastAPI :8000]
        Bot[Bot Service<br/>aiogram :8080]
        MiniApp[Mini App<br/>Static :80]
        AdminPanel[Admin Panel<br/>Ionic/Angular :80]
        AdminBot[Admin Bot<br/>:8090]
        Docs[Docs<br/>MkDocs :80]
        MinIO[MinIO<br/>Object Storage :9000]
    end

    subgraph Internal["INTERNAL Network"]
        Postgres[(PostgreSQL<br/>pgvector :5432)]
        Redis[(Redis<br/>Cache :6379)]
        Agent[Agent Service<br/>GPT-4o :8001]
    end

    Users --> |HTTPS| Traefik
    Admin --> |HTTPS| Traefik
    Traefik --> API
    Traefik --> Bot
    Traefik --> MiniApp
    Traefik --> AdminPanel
    Traefik --> AdminBot
    Traefik --> Docs
    Traefik --> MinIO

    Bot --> API
    Bot --> Agent
    Bot --> MinIO
    API --> Postgres
    API --> Redis
    Agent --> Postgres
    AdminBot --> API

3. Компоненты системы

3.1 Traefik (Reverse Proxy)

Контейнер: traefik Образ: traefik:v3.2 Порты: 80 (HTTP), 443 (HTTPS)

Функции: - Reverse proxy для всех сервисов - Автоматическое получение SSL-сертификатов (Let's Encrypt) - Маршрутизация по доменам - Health checks

Домены: | Домен | Сервис | |-------|--------| | api.calmtrader.ai | API | | bot.calmtrader.ai | Bot webhook | | app.calmtrader.ai | Mini App | | admin.calmtrader.ai | Admin Panel | | admin-bot.calmtrader.ai | Admin Bot | | docs.calmtrader.ai | Documentation | | storage.calmtrader.ai | MinIO (public) |

3.2 PostgreSQL

Контейнер: trader-psy-db Образ: pgvector/pgvector:pg16 Порт: 5432 (internal)

Функции: - Основное хранилище данных - Поддержка векторных embeddings (pgvector) - Persistent storage через Docker volume

База данных: trader_psy

3.3 Redis

Контейнер: trader-psy-redis Образ: redis:7-alpine Порт: 6379 (internal)

Функции: - Кэширование - Session storage - Append-only persistence

3.4 MinIO (Object Storage)

Контейнер: trader-psy-minio Образ: minio/minio Порты: 9000 (API), 9001 (Console)

Функции: - S3-совместимое хранилище - Голосовые сообщения пользователей - Аудио для дыхательных упражнений и медитаций - Изображения (art)

Бакеты: | Бакет | Содержимое | |-------|------------| | voice-messages | Голосовые сообщения пользователей | | breathing-audio | Аудио для дыхательных упражнений | | meditation-audio | Аудио для медитаций | | art | Изображения (watercolor New Yorker style) | | public | Публичные ресурсы (style refs) |

3.5 API Service (FastAPI)

Контейнер: trader-psy-api Образ: Custom (apps/api/Dockerfile) Порт: 8000

Функции: - REST API для всех клиентов - CRUD операции с БД - Миграции (Alembic) - Health checks

Зависимости: PostgreSQL, MinIO

Endpoints: См. CLAUDE.md для полного списка

3.6 Agent Service (AI)

Контейнер: trader-psy-agent Образ: Custom (apps/agent/Dockerfile) Порт: 8001 (internal)

Функции: - AI-агент на базе GPT-4o - Персонализированные ответы - Onboarding flow - Context-aware диалоги

Зависимости: PostgreSQL, OpenAI API

3.7 Bot Service (Telegram)

Контейнер: trader-psy-bot Образ: Custom (apps/bot/Dockerfile) Порт: 8080

Функции: - Telegram webhook handler - Команды: /start, /settings, /checkin, /checkout, /breathe, /meditate, /reset - Voice-to-Text (OpenAI Whisper) - Text-to-Speech (OpenAI TTS, ElevenLabs) - PromptBuilder для AI-промптов

Зависимости: API, Agent, MinIO

3.8 Admin Bot

Контейнер: trader-psy-admin-bot Образ: Custom (apps/admin-bot/Dockerfile) Порт: 8090

Функции: - Административный Telegram-бот - Генерация изображений (Midjourney API) - Управление пользователями

Зависимости: API

3.9 Admin Panel

Контейнер: trader-psy-admin Образ: Custom (apps/admin/Dockerfile) Порт: 80

Функции: - Веб-панель администратора - User management - Statistics dashboard - Telegram Mini App интеграция

Технологии: Ionic 8, Angular 20+, Tailwind CSS

3.10 Mini App

Контейнер: trader-psy-mini-app Образ: Custom (apps/mini-app/Dockerfile) Порт: 80

Функции: - Telegram Mini App для пользователей - Статический HTML/JS

3.11 Documentation

Контейнер: trader-psy-docs Образ: Custom (apps/docs/Dockerfile) Порт: 80

Функции: - MkDocs Material documentation - Автогенерация из markdown


4. Сетевая топология

4.1 Docker Networks

Сеть Тип Назначение
web External Публичный доступ через Traefik
internal Bridge Внутренняя коммуникация сервисов

4.2 Доступ к сервисам

┌─────────────────────────────────────────────────────────────────┐
│                         WEB Network                              │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────────┐│
│  │ Traefik │ │   API   │ │   Bot   │ │  Admin  │ │  Mini App   ││
│  │         │ │         │ │         │ │  Panel  │ │             ││
│  │         │ │         │ │         │ │         │ │             ││
│  └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────────┘│
│              │           │                                       │
└──────────────│───────────│───────────────────────────────────────┘
               │           │
               ▼           ▼
┌─────────────────────────────────────────────────────────────────┐
│                       INTERNAL Network                           │
│  ┌──────────────┐ ┌─────────┐ ┌─────────┐ ┌───────────────────┐ │
│  │  PostgreSQL  │ │  Redis  │ │  Agent  │ │       MinIO       │ │
│  │              │ │         │ │         │ │                   │ │
│  └──────────────┘ └─────────┘ └─────────┘ └───────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

5. Потоки данных

5.1 Основной пользовательский flow

sequenceDiagram
    participant U as User (Telegram)
    participant B as Bot Service
    participant A as Agent Service
    participant API as API Service
    participant DB as PostgreSQL
    participant M as MinIO

    U->>B: Сообщение / Команда
    B->>API: POST /users (upsert)
    API->>DB: INSERT/UPDATE user
    B->>A: Запрос к AI агенту
    A->>DB: Получить контекст пользователя
    A->>A: Генерация ответа (GPT-4o)
    A->>B: Ответ агента
    B->>API: POST /messages (save)
    API->>DB: INSERT message
    B->>U: Ответ пользователю

5.2 Voice Message Flow

sequenceDiagram
    participant U as User
    participant B as Bot
    participant W as Whisper API
    participant M as MinIO
    participant A as Agent

    U->>B: Voice message
    B->>W: Transcribe audio
    W->>B: Text transcript
    B->>M: Upload voice file
    B->>A: Process text
    A->>B: AI response
    B->>B: TTS (OpenAI/ElevenLabs)
    B->>U: Voice response

5.3 Breathing Exercise Flow

sequenceDiagram
    participant U as User
    participant B as Bot
    participant API as API
    participant M as MinIO

    U->>B: /breathe
    B->>U: Выбор техники (inline buttons)
    U->>B: Выбор (box_breathing)
    B->>API: GET /breathing-audio/parts
    API->>M: Get audio files
    M->>API: Audio parts
    API->>B: Audio URLs
    B->>B: Assemble audio
    B->>U: Voice message + transcript

6. Deployment и CI/CD

6.1 Инфраструктура

Хостинг: Hetzner Cloud IP: 65.21.108.205 SSH alias: trader-psy Path: /opt/trader-psy

6.2 CI/CD Pipeline

flowchart LR
    A[Push to main] --> B[GitHub Actions]
    B --> C[Lint: ruff check]
    C --> D[Test: pytest]
    D --> E[Deploy: SSH]
    E --> F[git pull]
    F --> G[docker compose up]
    G --> H[Migrations: alembic]
    H --> I[Health check]
    I --> J[Notify users]

Файл: .github/workflows/deploy.yml

6.3 Docker Volumes

Volume Назначение
postgres-data Данные PostgreSQL
redis-data Данные Redis
traefik-certificates SSL-сертификаты
minio-data Файлы MinIO

7. Безопасность

7.1 SSL/TLS

  • Provider: Let's Encrypt (ACME)
  • Auto-renewal: Yes (Traefik)
  • Min TLS: 1.2

7.2 Сетевая изоляция

  • Внутренние сервисы (PostgreSQL, Redis, Agent) недоступны извне
  • Публичный доступ только через Traefik
  • MinIO доступен публично только для bucket public

7.3 Secrets Management

Все секреты хранятся в .env файле на сервере: - TELEGRAM_BOT_TOKEN - POSTGRES_PASSWORD - MINIO_ROOT_PASSWORD - OPENAI_API_KEY - ELEVENLABS_API_KEY - APIFRAME_API_KEY

7.4 Рекомендации (TODO)

  • Добавить rate limiting в Traefik
  • Настроить Fail2Ban
  • Внедрить Sentry для мониторинга ошибок
  • Провести security audit (A4A-23)

8. Мониторинг

8.1 Health Checks

Сервис Endpoint Интервал
API GET /health 30s
PostgreSQL pg_isready 10s
Redis redis-cli ping 10s
MinIO /minio/health/live 30s

8.2 Логирование

  • Docker logs: docker compose logs -f <service>
  • Structured logging в API/Bot (Python logging)

Приложения

A. Команды управления

# Подключение к серверу
ssh trader-psy

# Статус сервисов
ssh trader-psy "docker compose -f /opt/trader-psy/infrastructure/docker-compose.yml ps"

# Логи
ssh trader-psy "docker compose -f /opt/trader-psy/infrastructure/docker-compose.yml logs -f"

# Рестарт
ssh trader-psy "docker compose -f /opt/trader-psy/infrastructure/docker-compose.yml restart"

# Миграции
ssh trader-psy "docker compose -f /opt/trader-psy/infrastructure/docker-compose.yml exec api alembic upgrade head"

B. Связанные документы


Документ создан в рамках выполнения контракта order-001-phase1-ru