diff --git a/.env.example b/.env.example index 6a7bf9f..0e31c4d 100644 --- a/.env.example +++ b/.env.example @@ -15,4 +15,3 @@ ADMIN_USERNAME=admin ADMIN_PASSWORD=change-me SESSION_SECRET=change-me-session-secret API_PORT=8000 -MCP_PORT=8001 diff --git a/CHANGELOG.md b/CHANGELOG.md index af1c3a5..7c2527b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.7.5 + +- Production Compose запускает только API и PostgreSQL. + ## 0.7.4 - Ускорена фильтрация сотрудников по учёной степени. diff --git a/MCP_DESCRIPTION.md b/MCP_DESCRIPTION.md index b2386b3..ebf4cf1 100644 --- a/MCP_DESCRIPTION.md +++ b/MCP_DESCRIPTION.md @@ -8,7 +8,7 @@ - Подключение к приложению: `app/main.py` - HTTP endpoint: `POST /mcp` - Локально при обычном запуске API: `http://localhost:8000/mcp` -- В Docker Compose через отдельный сервис `mcp`: `http://localhost:8001/mcp` +- В Docker Compose endpoint обслуживает `api`: `http://localhost:8000/mcp` - Авторизация на уровне приложения: отсутствует. Заголовок `Authorization` не проверяется и не влияет на ответ. Если доступ к MCP нужно ограничить, это должно делаться внешним контуром: bind на localhost, VPN, firewall, reverse proxy или отдельная сетевая политика. @@ -622,7 +622,7 @@ Hash набора считается по отсортированному сп Список tools: ```bash -curl http://localhost:8001/mcp \ +curl http://localhost:8000/mcp \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' ``` @@ -630,7 +630,7 @@ curl http://localhost:8001/mcp \ Поиск сотрудника: ```bash -curl http://localhost:8001/mcp \ +curl http://localhost:8000/mcp \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search_employees","arguments":{"query":"Сергеев","limit":5}}}' ``` @@ -638,7 +638,7 @@ curl http://localhost:8001/mcp \ Полная синхронизация: ```bash -curl http://localhost:8001/mcp \ +curl http://localhost:8000/mcp \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"sync_employees","arguments":{"include_data":false}}}' ``` @@ -646,7 +646,7 @@ curl http://localhost:8001/mcp \ Delta-синхронизация: ```bash -curl http://localhost:8001/mcp \ +curl http://localhost:8000/mcp \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"sync_employees","arguments":{"client_hash":"known-sha256","include_data":true}}}' ``` diff --git a/README.md b/README.md index 2fc4514..2b98d52 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,7 @@ ## Архитектура -- `api`: FastAPI, REST API, HTML-админка, healthcheck. -- `worker`: weekly scheduler, который запускает парсинг по `CRAWL_CRON`. -- `mcp`: открытый HTTP MCP endpoint для ИИ-агентов. +- `api`: FastAPI, REST API, HTML-админка, MCP endpoint и healthcheck. - `postgres`: основная БД. Парсер использует фиксированный источник сотрудников, по умолчанию `https://miem.hse.ru/persons`. Для каждой карточки сохраняются ФИО, должности, год начала работы, контакты, идентификаторы, вкладки профиля, секции, публикации, курсы, ВКР, новости, JSON-снапшот и сжатый HTML-снапшот. Детальные публикации дополнительно нормализуются в отдельную таблицу `employee_publications`, а новости из блока «В новостях» — в `employee_news_links`. Ссылки обходятся только из меню профиля самого сотрудника (`person-menu`), например `#sci`, `#teaching`, `#main`. @@ -23,7 +21,6 @@ cp .env.example .env - `DATABASE_URL`: строка подключения SQLAlchemy. - `SOURCE_URL`: список сотрудников МИЭМ. -- `CRAWL_CRON`: расписание в формате crontab, по умолчанию `0 3 * * 1`. - `CRAWL_LIMIT`: опциональный лимит профилей для тестового запуска. - `ADMIN_USERNAME`, `ADMIN_PASSWORD`: логин и пароль админки. - `SESSION_SECRET`: секрет подписи cookie. @@ -51,13 +48,12 @@ uvicorn app.main:app --reload ## Docker Compose ```bash -docker compose up --build +docker compose up -d --build --remove-orphans ``` По умолчанию: - API и админка: `http://localhost:8000` -- MCP: `http://localhost:8001/mcp` - Postgres: `localhost:5432` Таблицы создаются приложением при старте. При обновлении существующей базы приложение также добавляет недостающие runtime-колонки, например `crawl_runs.skipped_count`. SQL-миграции для ручного применения лежат в `migrations/`. @@ -84,7 +80,7 @@ docker compose up --build ## Парсинг -Weekly worker запускается по `CRAWL_CRON`. Ручной запуск доступен в админке на `Dashboard` и странице `Runs` или через REST: +Ручной запуск доступен в админке на `Dashboard` и странице `Runs` или через REST: ```bash curl -X POST http://localhost:8000/api/crawl-runs --cookie "miem_admin_session=..." @@ -131,7 +127,7 @@ Endpoint: `POST /mcp`, без авторизации на уровне прил Пример локального запроса списка tools: ```bash -curl http://localhost:8001/mcp \ +curl http://localhost:8000/mcp \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' ``` @@ -142,9 +138,8 @@ curl http://localhost:8001/mcp \ ```bash docker compose logs -f api -docker compose logs -f worker docker compose exec postgres pg_dump -U miem miem_workers > backup.sql docker compose down ``` -Версия сервиса: `0.7.3`. Админка всегда показывает версии backend и frontend в footer. +Версия сервиса: `0.7.5`. Админка всегда показывает версии backend и frontend в footer. diff --git a/app/version.py b/app/version.py index 576f286..9aba414 100644 --- a/app/version.py +++ b/app/version.py @@ -1,3 +1,3 @@ -APP_VERSION = "0.7.4" -FRONTEND_VERSION = "0.7.4" -BACKEND_VERSION = "0.7.4" +APP_VERSION = "0.7.5" +FRONTEND_VERSION = "0.7.5" +BACKEND_VERSION = "0.7.5" diff --git a/docker-compose.yml b/docker-compose.yml index 5883282..ad53a6a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,27 +25,5 @@ services: postgres: condition: service_healthy - worker: - build: . - command: python -m app.worker - env_file: .env - environment: - DATABASE_URL: postgresql+psycopg://${POSTGRES_USER:-miem}:${POSTGRES_PASSWORD:-miem_password}@postgres:5432/${POSTGRES_DB:-miem_workers} - depends_on: - postgres: - condition: service_healthy - - mcp: - build: . - command: uvicorn app.main:app --host 0.0.0.0 --port 8000 - env_file: .env - environment: - DATABASE_URL: postgresql+psycopg://${POSTGRES_USER:-miem}:${POSTGRES_PASSWORD:-miem_password}@postgres:5432/${POSTGRES_DB:-miem_workers} - ports: - - "127.0.0.1:${MCP_PORT:-8001}:8000" - depends_on: - postgres: - condition: service_healthy - volumes: postgres_data: diff --git a/pyproject.toml b/pyproject.toml index fa132b6..2c38a39 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "miem-workers" -version = "0.7.4" +version = "0.7.5" description = "MIEM employees parser, admin API, and MCP server" requires-python = ">=3.11" dependencies = [