72b6879f4b
- Refactored max_bot from nested packages to flat module structure - Q2: Extended BotUser model (patronymic, email, org, address, vcf_raw, contact_hash, phone_verified, email_verified, last_interaction, total_conversations, total_tickets) - Q2: VCF parser (FN, N, TEL, EMAIL, ORG, ADR), upsert on re-contact, NLP history context (_get_user_history_context -> YandexGPT) - Q1: Broadcast preview modal with 10s confirmation timer - Q3: CSS var(--white)->var(--bg-card), var(--text)->var(--text-primary) - Q4: bot_settings showNotification(), editable max_bot_id - Q5: Webhook secret passthrough via X-Max-Bot-Api-Secret - Masking sensitive keys, dialog_cleared handler, migrate via _add_column_if_not_exists() - Rate limit (asyncio.sleep 0.5 per 10), dead code removed, conv.intent context in contact.py - Portal pages: bot_consent, bot_kb (edit), bot_settings, bot_test, bot_tickets, portal_settings - Tests: 21/21 passing, added test_yandex_gpt.py, test_email_sender.py - Deploy: deploy_full.sh, schema.sql, seed_knowledge_base.sql
271 lines
12 KiB
Markdown
271 lines
12 KiB
Markdown
# Внимание: на сервере работает несколько проектов
|
|
|
|
## Дата обновления
|
|
2026-05-21
|
|
|
|
## Сервер
|
|
81.177.141.34 — единый VPS для независимых проектов.
|
|
Пользователь: `angel`
|
|
ОС: Ubuntu 24.04, Docker Engine
|
|
|
|
---
|
|
|
|
## 1. Проекты на сервере
|
|
|
|
### Проект A: aegisone — Сервисный портал AegisOne Engineering
|
|
|
|
| Параметр | Значение |
|
|
|----------|----------|
|
|
| Тип | Python FastAPI + PHP (публичный сайт) + PostgreSQL |
|
|
| Python | FastAPI на Uvicorn (4 workers), порт **8000** |
|
|
| PHP | Nginx (порт 8080) + PHP-FPM (порт 9000) |
|
|
| PostgreSQL | 16-alpine, порт **5432**, БД: `aegisone` |
|
|
| Домены | `service.aegisone.ru` (Python), `aegisone.ru` (PHP) |
|
|
| Директории | `/opt/projects/aegisone-py/` (Python), `/opt/projects/aegisone-php/` (PHP) |
|
|
| Docker проект | `aegisone` — контейнеры: `aegisone-app`, `aegisone-postgres` |
|
|
| Deploy | `py_service/deploy.sh` — версионирование, архив, SCP, docker compose up |
|
|
|
|
**Nginx-роутинг (service.aegisone.ru → localhost:8000):**
|
|
```
|
|
/ → localhost:8000 (FastAPI root — страница логина)
|
|
/service/* → localhost:8000 (весь сервис FastAPI)
|
|
/service-style.php, /logo.php, /assets/* → localhost:8080 (PHP)
|
|
```
|
|
|
|
**Структура Python-приложения:**
|
|
```
|
|
py_service/
|
|
├── app/
|
|
│ ├── main.py — точка входа FastAPI, lifespan, статика
|
|
│ ├── config.py — настройки (DB, SECRET_KEY, DOCS_DIR и т.д.)
|
|
│ ├── database.py — подключение к PostgreSQL
|
|
│ ├── dependencies.py — get_current_user, require_role
|
|
│ ├── models/
|
|
│ │ └── models.py — SQLAlchemy модели (User, Object, Client, SLA и т.д.)
|
|
│ ├── routers/
|
|
│ │ └── service_pages.py — все основные роуты + API бота Max
|
|
│ ├── documents_router.py — роуты документов (/service/documents/)
|
|
│ ├── services/
|
|
│ │ └── docs_permissions.py — discover_docs(), load_permissions()
|
|
│ ├── templates/ — Jinja2 шаблоны
|
|
│ │ ├── base.html — базовый HTML (noindex, favicon, theme switcher)
|
|
│ │ ├── login.html — страница входа
|
|
│ │ ├── page.html — основной layout с сайдбаром
|
|
│ │ ├── dashboard.html — дашборд (дублирует сайдбар из page.html)
|
|
│ │ ├── documents/ — шаблоны документов
|
|
│ │ ├── pages/ — шаблоны страниц (customers, objects, sla и т.д.)
|
|
│ │ └── bot_*.html — страницы управления ботом Max
|
|
│ └── static/
|
|
│ ├── css/ — service.css, service-theme.css
|
|
│ ├── js/ — theme.js
|
|
│ └── img/ — favicons, svg, logo
|
|
├── docs/ — .md файлы документов (26 шт)
|
|
├── scripts/ — bump_version.py, migrate_mysql_to_pg.py
|
|
├── Dockerfile, docker-compose.yml
|
|
└── requirements.txt
|
|
```
|
|
|
|
**Роли пользователей:** `owner` (владелец), `engineer` (инженер), `technician` (техник)
|
|
|
|
**Управление ботом Max (раздел в сайдбаре для owner):**
|
|
- `/service/bot-settings` — настройки (имя, телефоны, email, часы работы, YandexGPT)
|
|
- `/service/bot-settings/responses` — редактирование шаблонов ответов
|
|
- `/service/bot-settings/features` — toggle функций бота
|
|
- `/service/bot-settings/categories` — CRUD категорий обращений
|
|
- `/service/bot-settings/kb` — база знаний (FAQ)
|
|
- `/service/bot-settings/conversations` — просмотр диалогов
|
|
- `/service/bot-settings/users` — пользователи бота
|
|
- `/service/bot-settings/test-runner` — тестовый прогон диалога
|
|
- `/service/bot-settings/analytics` — статистика + рассылки
|
|
|
|
---
|
|
|
|
### Проект C: max_bot — Чат-бот «София» для Max Messenger
|
|
|
|
| Параметр | Значение |
|
|
|----------|----------|
|
|
| Тип | Python FastAPI (Max Bot API) |
|
|
| FastAPI | порт **8001** |
|
|
| PostgreSQL | общая БД `aegisone` (порт 5432), таблицы с префиксом `bot_` |
|
|
| Домен | `max.aegisone.ru` |
|
|
| Директория | `/opt/projects/aegisone-py/max_bot/` |
|
|
| Контейнер | `aegisone-max-bot` |
|
|
| Webhook | `https://max.aegisone.ru/webhook` → localhost:8001 |
|
|
| Токен бота | `id2311381465_bot` (хранится в bot_settings) |
|
|
|
|
**Структура:**
|
|
```
|
|
max_bot/
|
|
├── app/
|
|
│ ├── main.py — FastAPI app, webhook, API для портала
|
|
│ ├── config.py — настройки (shared DB URL)
|
|
│ ├── database.py — AsyncSession (общая БД aegisone)
|
|
│ ├── max_api.py — клиент Max API (send_message, subscribe)
|
|
│ ├── bot_engine.py — обработчик webhook событий
|
|
│ ├── fsm.py — конечный автомат состояний
|
|
│ ├── conversation.py — управление диалогами
|
|
│ ├── settings_cache.py — кэш настроек (5 мин TTL)
|
|
│ ├── text_renderer.py — рендер шаблонов с переменными
|
|
│ ├── file_storage.py — сохранение файлов (local → Yandex Disk future)
|
|
│ ├── handlers/ — обработчики состояний
|
|
│ │ ├── greeting.py — /start, приветствие
|
|
│ │ ├── consent.py — ФЗ-152 согласие
|
|
│ │ ├── contact.py — сбор контактов
|
|
│ │ ├── inquiry.py — сбор обращения + авто-категоризация
|
|
│ │ ├── handoff.py — передача оператору
|
|
│ │ ├── main_menu.py — главное меню
|
|
│ │ └── features/ — доп. функции (risk_score, sla_status, etc.)
|
|
│ ├── integrations/
|
|
│ │ ├── _1c_unf.py — webhook в 1С:УНФ + ответ от 1С
|
|
│ │ ├── portal_db.py — чтение из общей БД
|
|
│ │ └── yandex_gpt.py — YandexGPT для категоризации/эмоций
|
|
│ ├── keyboards/
|
|
│ │ └── inline.py — генераторы inline-клавиатур
|
|
│ └── models/
|
|
│ └── models.py — SQLAlchemy модели (bot_*)
|
|
├── sql/
|
|
│ └── bot_schema.sql — CREATE TABLE + начальные данные
|
|
├── nginx/
|
|
│ └── max-aegisone.conf — nginx config
|
|
├── Dockerfile, docker-compose.yml
|
|
└── requirements.txt
|
|
```
|
|
|
|
**Таблицы бота в общей БД:**
|
|
`bot_users`, `bot_conversations`, `bot_messages`, `bot_consent_logs`, `bot_1c_sync_log`,
|
|
`bot_knowledge_base`, `bot_categories`, `bot_settings`, `bot_features`, `bot_response_templates`, `bot_broadcasts`
|
|
|
|
**Nginx-роутинг (max.aegisone.ru → localhost:8001):**
|
|
```
|
|
/webhook → localhost:8001/webhook (Max API webhook)
|
|
/api/* → localhost:8001/api/* (API для сервисного портала)
|
|
/health → localhost:8001/health
|
|
```
|
|
|
|
---
|
|
|
|
### Проект B: VoIdeaAI — AI-платформа
|
|
|
|
| Параметр | Значение |
|
|
|----------|----------|
|
|
| Тип | Python FastAPI + React Frontend + PostgreSQL + Redis |
|
|
| FastAPI | порт **8020** |
|
|
| PostgreSQL | порт **5444**, БД: `voidea` |
|
|
| Redis | порт **6380** |
|
|
| Gitea | порт **3000**, PostgreSQL **5433** |
|
|
| Домены | `voideaai.ru`, `git.voideaai.ru` |
|
|
| Директория | `/opt/projects/voidea/` |
|
|
| Docker проект | `voidea` |
|
|
| Nginx конфиг | `/opt/projects/nginx-proxy/conf.d/voideaai.ru.conf` |
|
|
|
|
---
|
|
|
|
## 2. Критические правила
|
|
|
|
### Порты — НЕ занимать!
|
|
```
|
|
8000 — aegisone FastAPI
|
|
8001 — max_bot FastAPI
|
|
8080 — aegisone PHP nginx
|
|
9000 — aegisone PHP-FPM
|
|
5432 — aegisone PostgreSQL
|
|
8020 — VoIdea FastAPI
|
|
5444 — VoIdea PostgreSQL
|
|
6380 — VoIdea Redis
|
|
3000 — Gitea web
|
|
5433 — Gitea PostgreSQL
|
|
9001 — Portainer HTTP
|
|
9443 — Portainer HTTPS
|
|
```
|
|
|
|
### nginx-proxy общий
|
|
- Конфиги: `/opt/projects/nginx-proxy/conf.d/`
|
|
- Файлы: `aegisone.conf`, `service-aegisone.conf`, `max-aegisone.conf`, `voideaai.ru.conf`, `gitea.conf`
|
|
- **Перед рестартом nginx:** `docker compose -p nginx-proxy exec nginx nginx -t`
|
|
|
|
### Docker
|
|
- **Все контейнеры используют `network_mode: host`** (bridge не работает на OpenVZ)
|
|
- `docker system prune -af` удалит build cache ВСЕХ проектов
|
|
- Префиксы Docker Compose:
|
|
- `docker compose -p aegisone` (или `cd /opt/projects/aegisone-py && docker compose`)
|
|
- `docker compose -p voidea`
|
|
- `docker compose -p gitea`
|
|
- `docker compose -p nginx-proxy`
|
|
- `docker compose -p portainer`
|
|
|
|
### Диск
|
|
- 20GB всего, ~13GB свободно
|
|
- Проверка: `df -h /`
|
|
- Очистка: `docker builder prune -af`
|
|
|
|
### Публичная часть (PHP) НЕ ТРОГАТЬ
|
|
- PHP сайт (aegisone.ru) — отдельный проект, не связан с Python-сервисом
|
|
- Все изменения только в `py_service/` и `max_bot/`
|
|
|
|
---
|
|
|
|
## 3. Команды для проверки состояния
|
|
|
|
### aegisone (Python)
|
|
```bash
|
|
docker ps --filter name=aegisone
|
|
docker logs aegisone-app --tail=50
|
|
curl -s -o /dev/null -w '%{http_code}' http://localhost:8000/service/dashboard/
|
|
cat /opt/projects/aegisone-py/version.txt
|
|
docker exec aegisone-postgres psql -U aegisone -d aegisone -c "\dt"
|
|
```
|
|
|
|
### max_bot (София)
|
|
```bash
|
|
docker ps --filter name=max-bot
|
|
docker logs aegisone-max-bot --tail=50
|
|
curl -s http://localhost:8001/health
|
|
# Проверить webhook:
|
|
curl -s http://localhost:8001/api/bot/settings
|
|
```
|
|
|
|
### VoIdeaAI
|
|
```bash
|
|
docker compose -p voidea ps
|
|
docker compose -p voidea logs --tail=20 app
|
|
curl -s http://localhost:8020/health
|
|
```
|
|
|
|
---
|
|
|
|
## 4. Деплой
|
|
|
|
### aegisone (py_service)
|
|
```bash
|
|
# Локально (из py_service/)
|
|
./deploy.sh [--bump patch|minor|major]
|
|
```
|
|
|
|
### max_bot
|
|
```bash
|
|
# SCP на сервер, затем:
|
|
cd /opt/projects/aegisone-py/max_bot
|
|
docker compose build --no-cache
|
|
docker compose up -d
|
|
```
|
|
|
|
---
|
|
|
|
## 5. Troubleshooting
|
|
|
|
| Проблема | Действие |
|
|
|----------|----------|
|
|
| aegisone FastAPI не отвечает | `docker logs aegisone-app --tail=50` |
|
|
| max_bot не отвечает | `docker logs aegisone-max-bot --tail=50` |
|
|
| Ошибка БД | `docker logs aegisone-postgres --tail=20` |
|
|
| Документ не найден | Проверить `discover_docs()` — файл .md есть в `py_service/docs/`? |
|
|
| Webhook не работает | Проверить `curl http://localhost:8001/health` и nginx конфиг |
|
|
| Portainer не открывается | Проверить `http://81.177.141.34:9001` и `https://81.177.141.34:9443` |
|
|
| Не хватает места | `df -h /`, `docker builder prune -af` |
|
|
| nginx ошибка | `docker compose -p nginx-proxy exec nginx nginx -t` |
|
|
|
|
---
|
|
|
|
*Создан: 2026-05-20*
|
|
*Обновлён: 2026-05-21 — добавлен max_bot (София)*
|