diff --git a/PLAN-INDEPENDENT-SERVICES.md b/PLAN-INDEPENDENT-SERVICES.md new file mode 100644 index 0000000..053c73f --- /dev/null +++ b/PLAN-INDEPENDENT-SERVICES.md @@ -0,0 +1,128 @@ +# План: независимые DrHider и Obfuscator + +## Цель + +Получить два полностью независимых production-сервиса: + +- **DrHider** — репозиторий `Nail/drhider`, отдельный Flask-инстанс и отдельный upload-буфер. +- **Obfuscator** — репозиторий `forcloud/obfuscator`, отдельный Flask-инстанс и отдельный upload-буфер. + +После разделения изменения, версии, деплои, сессии и временные файлы одного сервиса не должны влиять на другой. + +## Целевая схема + +```text +DrHider + repo: https://gitea.services.ngcloud.ru/Nail/drhider.git + app: https://drhider.pythonk8s.dev.nubes.ru/ + buffer: https://upload-drhider.sinefo.ru/buffer/ + +Obfuscator + repo: https://gitea.services.ngcloud.ru/forcloud/obfuscator.git + app: https://obfuscator.pythonk8s.services.ngcloud.ru/ + buffer: https://upload-obfuscator.sinefo.ru/buffer/ +``` + +Оба буфера могут находиться на VM213, но должны иметь разные hostname и разные директории: + +```text +/var/www/upload-drhider/ +/var/www/upload-obfuscator/ +``` + +Текущий адрес `https://upload.sinefo.ru/drhider-upload/` считать временным legacy-маршрутом. Его не использовать в новой конфигурации Obfuscator. + +## Этап 1. Разделить production-инстансы + +1. Создать отдельный Managed Flask-инстанс для `forcloud/obfuscator`. +2. Оставить DrHider подключённым только к `Nail/drhider`. +3. Проверить, что у сервисов разные: + - instance ID; + - hostname; + - переменные окружения; + - настройки Redeploy. +4. Не добавлять `upstream`, не использовать общий Git remote и не подключать один репозиторий как submodule другого. + +## Этап 2. Разделить upload-буферы на VM213 + +1. Создать две директории с владельцем пользователя Nginx: + - `/var/www/upload-drhider/`; + - `/var/www/upload-obfuscator/`. +2. Добавить в Nginx два независимых WebDAV location: + - `/buffer/` для `upload-drhider.sinefo.ru`; + - `/buffer/` для `upload-obfuscator.sinefo.ru`. +3. Для каждого location настроить отдельно: + - `alias`; + - `PUT`, `GET`, `DELETE`; + - `client_max_body_size`; + - CORS только для своего Flask-инстанса; + - очистку старых временных файлов. +4. Не менять и не удалять старый маршрут до завершения миграции и проверки обоих сервисов. + +## Этап 3. DNS и TLS + +Создать A-записи на IP VM213 `5.172.178.213`: + +```text +upload-drhider.sinefo.ru A 5.172.178.213 +upload-obfuscator.sinefo.ru A 5.172.178.213 +``` + +Для обоих hostname выпустить отдельные сертификаты Certbot и проверить автоматическое продление. + +## Этап 4. Конфигурация приложений + +В DrHider указать только его буфер. В Obfuscator указать только его буфер. + +Проверить и при необходимости заменить во всех рабочих файлах: + +- фронтендовый `VM_UPLOAD_URL`; +- backend `VM_UPLOAD_PREFIX`; +- значение `vmUploadPrefix` в health/config endpoint; +- CORS origin; +- пути временного хранения и очистки. + +Переименовать общие переменные в нейтральные имена, например `UPLOAD_BUFFER_URL`, если это не ломает существующий публичный API. + +## Этап 5. Независимые деплои + +Для каждого сервиса отдельно: + +1. Изменить код только в его репозитории. +2. Выполнить локальные тесты и проверку синтаксиса. +3. Сделать commit и push в его `master`. +4. Выполнить Redeploy соответствующего Managed Flask-инстанса. +5. Проверить `/health` и версию. + +Push в `Nail/drhider` не должен запускать или изменять Obfuscator. Push в `forcloud/obfuscator` не должен запускать или изменять DrHider. + +## Этап 6. Проверка изоляции + +Для каждого сервиса отдельно проверить: + +- `GET /health` возвращает правильную версию; +- браузерный `OPTIONS` возвращает CORS только для своего origin; +- `PUT -> GET -> DELETE` работает через собственный hostname; +- файл одного сервиса не виден в директории другого; +- отмена и очистка сессии не затрагивают второй сервис; +- обновление версии одного приложения не меняет `/health` второго. + +## Этап 7. Удаление legacy-связей + +После успешной миграции и периода наблюдения: + +1. Перевести оба приложения на новые buffer hostname. +2. Проверить отсутствие `contracts.kube5s.ru` и `upload.sinefo.ru/drhider-upload/` в рабочих конфигурациях. +3. Удалить старый WebDAV location только после подтверждения, что активных клиентов больше нет. +4. Обновить README обоих проектов и документацию VM213. + +## Критерий готовности + +Разделение считается завершённым, когда: + +- у DrHider и Obfuscator разные production-инстансы; +- у них разные Git-репозитории без общей синхронизации; +- у них разные upload hostname и директории на VM213; +- CORS и TLS настроены для каждого отдельно; +- независимый Redeploy одного сервиса не меняет другой; +- smoke-тесты обоих сервисов проходят одновременно.