# MIEM Employees Server Сервис собирает сотрудников МИЭМ с сайта ВШЭ, хранит карточки и историю обновлений в Postgres, показывает минимальную админку и отдает read-only MCP endpoint для ИИ-агентов. ## Архитектура - `api`: FastAPI, REST API, HTML-админка, healthcheck. - `worker`: weekly scheduler, который запускает парсинг по `CRAWL_CRON`. - `mcp`: открытый HTTP MCP endpoint для ИИ-агентов. - `postgres`: основная БД. Парсер использует фиксированный источник сотрудников, по умолчанию `https://miem.hse.ru/persons`. Для каждой карточки сохраняются ФИО, должности, год начала работы, контакты, идентификаторы, вкладки профиля, секции, публикации, курсы, ВКР, JSON-снапшот и сжатый HTML-снапшот. Ссылки обходятся только из меню профиля самого сотрудника (`person-menu`), например `#sci`, `#teaching`, `#main`. ## Переменные окружения Скопируйте `.env.example` в `.env` и поменяйте секреты: ```bash cp .env.example .env ``` Основные настройки: - `DATABASE_URL`: строка подключения SQLAlchemy. - `SOURCE_URL`: список сотрудников МИЭМ. - `CRAWL_CRON`: расписание в формате crontab, по умолчанию `0 3 * * 1`. - `CRAWL_LIMIT`: опциональный лимит профилей для тестового запуска. - `ADMIN_USERNAME`, `ADMIN_PASSWORD`: логин и пароль админки. - `SESSION_SECRET`: секрет подписи cookie. - `PARSER_USE_PLAYWRIGHT`: включение Playwright-рендера динамических вкладок. ## Локальный запуск ```bash python -m venv .venv .venv\Scripts\activate pip install -r requirements.txt uvicorn app.main:app --reload ``` Админка: `http://localhost:8000/admin`. В админке доступны: - `Dashboard`: общая статистика, последний добавленный сотрудник, прогресс текущего/последнего парсинга и ручной запуск. - `Directory`: настраиваемая таблица сотрудников с фильтрами, сортировкой, пагинацией и выбором колонок. - `Employees`: простая legacy-таблица сотрудников. - `Runs`: история запусков, ошибки и progress bar. ## Docker Compose ```bash docker compose up --build ``` По умолчанию: - API и админка: `http://localhost:8000` - MCP: `http://localhost:8001/mcp` - Postgres: `localhost:5432` Таблицы создаются приложением при старте. SQL-миграция для ручного применения лежит в `migrations/001_init.sql`. ## Парсинг Weekly worker запускается по `CRAWL_CRON`. Ручной запуск доступен в админке на `Dashboard` и странице `Runs` или через REST: ```bash curl -X POST http://localhost:8000/api/crawl-runs --cookie "miem_admin_session=..." ``` Алгоритм обновления: - найденные сотрудники получают статус `active` и обновленный `last_seen_at`; - новые сотрудники добавляются в `employees`; - количество новых сотрудников за запуск сохраняется в `crawl_runs.new_count`; - активные сотрудники, исчезнувшие из текущего списка источника, получают статус `dismissed` и `dismissed_at`; - каждый успешный разбор сохраняет запись в `employee_snapshots`. Во время выполнения парсинга `found_count`, `parsed_count` и `error_count` обновляются в базе. Админка опрашивает `/api/crawl-runs/latest` и показывает прогресс как `parsed_count + error_count / found_count`. ## MCP Endpoint: `POST /mcp`, без авторизации на уровне приложения. Поддерживаемые tools: - `search_employees(query, status?, limit?)` - `get_employee(profile_id_or_url)` - `list_employee_publications(profile_id_or_url)` - `list_employee_courses(profile_id_or_url)` - `get_crawl_status()` Пример локального legacy-режима со статическим токеном: ```bash curl http://localhost:8001/mcp \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' ``` Если MCP нужно ограничить, делайте это на сетевом уровне: localhost binding, VPN, firewall, reverse proxy или другой внешний контур доступа. ## Обслуживание ```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.4.5`. Админка всегда показывает версии backend и frontend в footer.