129 lines
6.5 KiB
Markdown
129 lines
6.5 KiB
Markdown
# План: независимые 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-тесты обоих сервисов проходят одновременно.
|