Compare commits

...

3 Commits

7 changed files with 18 additions and 42 deletions

View File

@@ -15,4 +15,3 @@ ADMIN_USERNAME=admin
ADMIN_PASSWORD=change-me
SESSION_SECRET=change-me-session-secret
API_PORT=8000
MCP_PORT=8001

View File

@@ -1,5 +1,9 @@
# Changelog
## 0.7.5
- Production Compose запускает только API и PostgreSQL.
## 0.7.4
- Ускорена фильтрация сотрудников по учёной степени.

View File

@@ -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}}}'
```

View File

@@ -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.

View File

@@ -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"

View File

@@ -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:

View File

@@ -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 = [