Plan independent DrHider and Obfuscator services
This commit is contained in:
@@ -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-тесты обоих сервисов проходят одновременно.
|
||||||
Reference in New Issue
Block a user