5.1 KiB
5.1 KiB
DrHider — Полный аудит и план рефакторинга
Дата: 2026-07-12 Платформа: Штурвал (Managed Flask) — запускает Flask сам, без Dockerfile/gunicorn URL: https://drhider.pythonk8s.dev.nubes.ru/ Репозиторий: https://gitea.services.ngcloud.ru/Nail/drhider
Текущее состояние (аудит каждого файла)
| Файл | Статус | Решение |
|---|---|---|
Dockerfile |
❌ НЕ НУЖЕН | Штурвал сам запускает Flask. Удалить. |
drhider_server.py |
❌ НЕ НУЖЕН | Standalone-сервер с ВМ (:8767). Flask app.py уже обрабатывает /api/drhider. Удалить. |
requirements.txt |
⚠️ Нужны правки | Убрать gunicorn и gevent. Оставить flask, python-docx, pdfplumber, httpx. |
.gitignore |
✅ OK | Без изменений. |
.gitea/workflows/deploy.yaml |
✅ OK | CI для Штурвала. |
site/app.py |
⚠️ Нужны правки | Удалить блок if __name__ == "__main__" (gunicorn). При рефакторинге — вынести LLMClient. |
site/templates/index.html |
✅ OK | UI. |
site/static/favicon.svg |
✅ OK | Иконка (из loadtest). |
drhider.py |
⚠️ МОНОЛИТ | 560 строк. Разбить на ~20 модулей. |
History/ |
✅ OK | Документация. |
План рефакторинга (Фаза 1: удаление лишнего)
Шаг 1.1 — Удалить Dockerfile
Шаг 1.2 — Удалить drhider_server.py
Шаг 1.3 — Исправить requirements.txt (убрать gunicorn, gevent)
Шаг 1.4 — Исправить site/app.py (убрать блок if __name__ == "__main__")
Шаг 1.5 — Проверить синтаксис → commit → push
План рефакторинга (Фаза 2: модульная структура)
Новая структура drhider/ пакета (вместо drhider.py 560 строк):
drhider/ # Пакет ядра обфускации
├── __init__.py # re-export: obfuscate_files()
├── config.py # Константы: ENTITY_PATTERNS, COMPANY_PATTERN, PERSON_PATTERN,
│ # RU_SURNAMES, RU_NAMES, RU_PATRONYMICS,
│ # RU_CITIES, RU_STREETS, FAKE_DOMAINS
├── checksum.py # _checksum_inn10, _checksum_inn12, _checksum_ogrn
├── random_utils.py # _random_digits, _random_letters
├── generators/ # Генераторы фиктивных значений
│ ├── __init__.py # ENTITY_GENERATORS маппинг
│ ├── phone.py # generate_phone
│ ├── email.py # generate_email
│ ├── inn.py # generate_inn10, generate_inn12
│ ├── ogrn.py # generate_ogrn
│ ├── kpp.py # generate_kpp
│ ├── bik.py # generate_bik
│ ├── accounts.py # generate_rs, generate_ks
│ ├── passport.py # generate_passport
│ ├── company.py # generate_company
│ ├── person.py # generate_person
│ └── address.py # generate_address
├── extractor.py # _extract_text, _expand_zips, _convert_pdfs_to_docx
├── scanner.py # Проход 1: _scan_regex, _scan_llm_ner
├── replacer.py # Проход 2: _replace_in_docx, _replace_in_text, _apply_replacements
├── builder.py # Сборка: _build_zip, _build_mapping_csv
├── obfuscator.py # TwoPassObfuscator — оркестратор
└── llm_client.py # LLMClient (из app.py → сюда)
site/ # Flask-приложение
├── __init__.py
├── app.py # Только create_app() + регистрация blueprint'ов
├── routes/
│ ├── __init__.py # Регистрация всех blueprint'ов
│ ├── main_bp.py # GET /
│ ├── health_bp.py # GET /health
│ └── api_bp.py # POST /api/drhider
├── templates/index.html
└── static/favicon.svg
Принципы:
- Каждый файл ≤ 50 строк (где возможно)
- Каждый файл — одна ответственность
- Максимум docstring и инлайн-комментариев
- Все импорты явные, никаких
import *
Переменные окружения (для Штурвала)
| Переменная | Значение |
|---|---|
LLM_API_KEY |
sk-ucI5YvOticoOQ9Kuj5K9mQ |
LLM_URL |
https://api.aillm.ru/v1/chat/completions |
LLM_MODEL |
gpt-oss-120b |