DrHider — обфускация документов (Managed Flask)
URL: https://drhider.pythonk8s.dev.nubes.ru/
Репозиторий: https://gitea.services.ngcloud.ru/Nail/drhider
Платформа: Штурвал (Managed Flask на pythonk8s)
Дизайн фронтенда: /home/naeel/nubes/design/
Что делает
Загружаешь документы (.docx, .pdf, .txt, .zip) — получаешь ZIP с обфусцированными копиями. Все персональные данные, реквизиты, телефоны, email заменяются на фиктивные. В архиве — mapping.csv с таблицей замен (оригинал → фиктивное).
Обфускация двухпроходная:
- Проход 1 (сбор): regex + LLM находят все сущности во всех файлах → глобальный словарь замен
- Проход 2 (замена): применяем замены ко всем файлам → ZIP
Согласованность: одна и та же сущность во всех файлах → одно и то же фиктивное значение.
⛔ ПРАВИЛА ДЛЯ АГЕНТОВ (читать перед ЛЮБЫМ действием)
1. НЕ смотреть локальные папки contracts/contracts-flask
Весь старый код drhider — ТОЛЬКО на ВМ (5.172.178.213). НЕ локально.
Единственное исключение: /home/naeel/nubes/loadtest/ (образец структуры managed Flask).
2. Штурвал запускает Flask САМ
- БЕЗ Dockerfile (удалён)
- БЕЗ gunicorn (нет в requirements.txt)
- Точка входа:
site/app.py→app = create_app() - Деплой:
git push origin master→ авто-деплой в UI Штурвала
3. НЕ менять код без «делай»
Даже если ошибка очевидна. Показать → описать → ЖДАТЬ.
4. После ЛЮБОЙ правки:
python3 -c "import py_compile; py_compile.compile('файл.py', doraise=True)"
git add -A && git commit -m "подробное описание" && git push
5. Документировать ВСЁ в History/
Каждое изменение, план, ошибку — в отдельный .md файл.
Структура проекта
drhider/ — пакет ядра обфускации
| Файл | Назначение |
|---|---|
__init__.py |
re-export: obfuscate_files, LLMClient, TwoPassObfuscator |
config.py |
Константы: regex-паттерны (ENTITY_PATTERNS, COMPANY_PATTERN, PERSON_PATTERN), словари имён/городов/улиц |
llm_client.py |
LLMClient — HTTP-клиент к LLM API (aillm.ru) |
extractor.py |
Извлечение текста из .docx/.pdf/.doc/.txt + expand_zips |
scanner.py |
Проход 1: scan_regex (regex) + scan_llm_ner (LLM NER) + генерация гибридных токенов |
replacer.py |
Проход 2: apply_replacements, replace_in_docx |
builder.py |
Сборка: build_zip, build_mapping_csv |
obfuscator.py |
TwoPassObfuscator — оркестратор + obfuscate_files() |
Фиктивные значения — гибридные токены (шаблон + номер), генерируются в scanner.py
через TYPE_POOLS + _next_token(). Примеры: Иванов_0001, ООО_Технология_0034, ул_Ленина_0015.
Отдельного пакета генераторов (generators/) нет.
site/ — Flask-приложение
| Файл | Назначение |
|---|---|
app.py |
create_app() — создание Flask, регистрация blueprint'ов, VERSION |
session.py |
Управление сессиями: файлы, результат, CSV, очистка по таймауту |
routes/__init__.py |
register_routes(app) |
routes/main_bp.py |
GET / — HTML-интерфейс |
routes/health_bp.py |
GET /health — {"ok": true, "version": "..."} |
routes/api_bp.py |
API загрузки/обработки/скачивания (см. раздел API) |
templates/index.html |
UI (выбор файлов, прогресс, скачивание) |
static/favicon.svg |
Иконка |
Корневые файлы
| Файл | Назначение |
|---|---|
requirements.txt |
flask, python-docx, pdfplumber, httpx |
.gitignore |
__pycache__/, *.pyc, .env |
.gitea/workflows/deploy.yaml |
CI: валидация Python |
History/ |
Документация всех изменений |
README.md |
Этот файл |
docs/ARCHITECTURE.md |
Архитектура |
docs/DEPLOY.md |
Деплой, ВМ, переменные окружения |
docs/DEVELOPMENT.md |
Порядок действий при изменении кода |
API
| Метод | Путь | Что делает |
|---|---|---|
GET |
/ |
HTML-интерфейс |
GET |
/health |
{"ok": true, "version": "..."} |
POST |
/api/upload |
Загрузка файлов в сессию → {ok, session, count} |
GET |
/api/process_stream/<sid> |
SSE: обработка файлов сессии, прогресс пофайлово |
POST |
/api/process/<sid> |
Обработка файлов сессии (legacy) |
GET |
/api/download/<sid> |
Скачать ZIP с обфусцированными файлами |
GET |
/api/csv/<sid> |
Скачать mapping.csv отдельно |
Переменные окружения (Штурвал)
| Переменная | Значение |
|---|---|
LLM_API_KEY |
sk-ucI5YvOticoOQ9Kuj5K9mQ |
LLM_URL |
https://api.aillm.ru/v1/chat/completions |
LLM_MODEL |
gpt-oss-120b |
Связь с ВМ contracts (legacy)
На ВМ 5.172.178.213 (contracts.kube5s.ru) есть старая версия drhider:
drhider_server.pyна порту 8767 — standalone HTTP-серверdrhider.py— та же логика, что и в этом проекте (скопирована оттуда)
Этот проект (drhider.pythonk8s.dev.nubes.ru) — независимый managed Flask, заменяет ВМ-версию.
SSH к ВМ: ssh -i ~/.ssh/naeel_vm_id_ed25519 naeel@5.172.178.213