96 lines
5.1 KiB
Markdown
96 lines
5.1 KiB
Markdown
# 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` |
|