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