Files
medtech-hackathon/infra/deploy
admins c1ed1962a8 feat(pitch): питч-лендос с прогрессом по дням и встроенным демо-видео + PPTX
- pitch/landing: дека для защиты (reveal) — хук, проблема, живое демо (видео),
  решение, как работает, прогресс день 1→2→3 по рубрике и по ТЗ, фишки, бизнес.
- демо-видео (запись интерфейса) встроено на раннем слайде, отдаётся с /pitch.
- PPTX по официальному шаблону (команда 107): ресурсы, результаты, демонстрация.
- caddy: маршрут /pitch.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 13:34:07 +05:00
..

Деплой MedArchive

Контейнер API (FastAPI) за общим Caddy на Selectel KZ. Read-only поиск работает на готовой SQLite-базе; приём ZIP через интерфейс (/ingest) дораспаковывает и нормализует новые прайсы прямо на сервере, поэтому в образ включены тяжёлые зависимости (pdfplumber, pymupdf, google-genai), а контейнеру нужен ключ Gemini.

Раскладка на сервере

  • /root/medarchive/ — код и данные, монтируется в контейнер как /app:
    • api/, contracts/, etl/ — код (правки кода не требуют пересборки образа);
    • web/ — статический фронт (его же отдаёт Caddy);
    • data/medarchive.db — собранная база, data/quality_report.json — отчёт сборки;
    • data/dict_emb.npy — кэш эмбеддингов справочника (чтобы догрузка не пересчитывала его);
    • data/reference/dictionary.xlsx — эталонный справочник услуг для нормализации.
  • /root/med-hackathon/ — каталог Caddy: docker-compose.yml, Dockerfile, Caddyfile, site/ (презентации) и .env с GEMINI_API_KEY (в публичный репозиторий не попадает).

Шаги

  1. Залить код и данные в /root/medarchive/ (см. раскладку выше).
  2. Положить docker-compose.yml, Dockerfile, Caddyfile в /root/med-hackathon/.
  3. Создать /root/med-hackathon/.env:
    GEMINI_API_KEY=…
    
  4. Собрать образ и поднять стек:
    cd /root/med-hackathon
    docker compose build api
    docker compose up -d
    
  5. Маршруты Caddy: /api/* → контейнер API, / → фронт, /demo и /day1 → презентации.

Авто-загрузка из папки

Сервис сам забирает свежие прайсы из папки без участия человека:

  1. Папка на хосте /root/medarchive/inbox смонтирована в контейнер как /app/inbox (она внутри тома /root/medarchive).
  2. Путь задаётся в админке или запросом: curl -X POST ".../api/settings?watch_folder=/app/inbox".
  3. Крон на хосте дёргает обработку каждые 10 минут:
    */10 * * * * curl -fsS -X POST https://med.secondbrain.tools/api/scan -o /dev/null
    
    Уже обработанные файлы фиксируются в ingested_file и повторно не берутся.

Проверка

curl https://med.secondbrain.tools/api/health
curl https://med.secondbrain.tools/api/stats
# приём архива через интерфейс:
curl -X POST https://med.secondbrain.tools/api/ingest -F "file=@archive.zip"