Files
polygon/DEPLOYMENT_DIAGNOSIS.md
T

56 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Диагностика: create прошёл, адрес Polygon не открывается
Дата инцидента: 25.10.2026
## Наблюдения
- В интерфейсе создания показан ответ `201`; в строке также указано время завершения 08:25:13.
- Браузер для `https://polygon.pythonk8s.dev.nubes.ru/` сообщает `DNS_PROBE_FINISHED_NXDOMAIN`.
- `NXDOMAIN` означает, что DNS-имя не найдено. Браузер не дошёл до HTTP-запроса к Flask.
- Ответ `201` подтверждает ответ API на создание, но сам по себе не доказывает, что все стадии операции завершились успешно, под запущен и DNS-запись доступна.
Стадии и `errorLog` операции не приложены, поэтому точная причина по имеющимся данным не установлена.
## Проверенные риски
### Домен сервиса Nubes Flask
Источник схемы Flask — `/home/naeel/TF/tf_provider/generated/<stand>/resources_yaml/89_flask.yaml`.
В `accessConfiguration.domain` короткое имя в одном октете предназначено для создания имени в служебной DNS-зоне. Для полного FQDN схема описывает проверку уже существующей A-записи, направленной на ingress.
Проверенный пример для DEV: `domain = "flask-crud"` даёт `flask-crud.pythonk8s.dev.nubes.ru` (`/home/naeel/TF/tf_provider/stack/test/flask/facts.md`). Поэтому следует сверить фактически отправленное значение `domain` и адрес `state_out.connectionUrl`. Если в create отправили полный FQDN, но A-запись заранее не существует, DNS-стадия может не пройти. Это гипотеза до просмотра стадий операции.
### Относительный путь к YAML в Polygon
В [loader.py](site/config/loader.py) пути заданы относительно текущей рабочей директории: по умолчанию `services`, а в `POLYGON_STANDS` обычно `services/dev`, `services/test`, `services/prod`. Фактические каталоги находятся внутри `site/services/`.
Инструкция Nubes Flask (`~/HowTo/howto-flask-nubes.md`) указывает запуск `python site/app.py` из корня репозитория. Если рабочая директория процесса действительно корень репозитория, загрузчик будет искать `<repo>/services`, а не `<repo>/site/services`; импорт конфигурации упадёт с `FileNotFoundError` до старта Flask и `/health`. Если платформа меняет рабочую директорию на `site`, этот путь работает. Фактический CWD деплоя и логи пода не проверены.
Этот риск может объяснить неготовность приложения после создания, но сам по себе не создаёт `NXDOMAIN`: DNS-имя проверяется до соединения с Flask.
### Healthcheck
В [app.py](site/app.py) есть маршрут `/health`, возвращающий `OK`. Схема Nubes Flask разрешает пустой `healthPath`, при котором платформа проверяет доступность приложения по порту. Если в create указан непустой `healthPath`, нужно проверить, что это существующий маршрут и что под действительно слушает ожидаемый платформой порт.
## Проверка гипотезы о старых YAML и задержке
`config/loader.py` перечисляет YAML только в каталогах, заданных `POLYGON_STANDS`, либо в `services/` при отсутствии этой переменной. Каждый файл открывается и разбирается один раз при импорте `config.loader`; обработчики API затем используют загруженные словари из памяти. Резервные каталоги `resources_yaml.bak-*` из `tf_provider` Polygon не сканирует.
Следовательно, старый YAML может оставить устаревший сервис или параметры в ответах API и способен помешать запуску, если файл невалиден или отсутствует ожидаемый каталог. Но в коде нет основания заключать, что чтение старых YAML вызвало заметную задержку, а тем более DNS `NXDOMAIN`. Время загрузки YAML отдельно не измерялось.
**Исправление прежнего ответа:** оценки размера и времени чтения YAML, а также предположение о конкретном negative-cache TTL DNS ранее были приведены без измерений и не являются установленными фактами. То, что адрес позднее открылся, доказывает только, что в момент повторной проверки он разрешался и отвечал; почему это изменилось, без DNS-диагностики и журналов Nubes неизвестно.
Локальные удаления YAML в Polygon не отправлялись в Gitea и не развёртывались, поэтому сами по себе не меняли работающий сервис.
## Что проверить для точного диагноза
1. В карточке инстанса: фактические `startupConfiguration.resourceRealm`, `accessConfiguration.domain`, `appConfiguration.gitPath`, `appConfiguration.healthPath` и `state_out.connectionUrl`.
2. У операции `create`: список `stages`, результат каждой стадии и `errorLog`, особенно стадии DNS и запуска приложения.
3. В логах пода: статус контейнера и traceback. Ошибка `Services directory not found: services` подтвердит проблему CWD/YAML-пути.
4. В DNS: существует ли A-запись для точного `state_out.connectionUrl` и указывает ли она на ingress выбранного resource realm.
## Вывод
Непосредственно `DNS_PROBE_FINISHED_NXDOMAIN` означает отсутствие разрешаемой DNS-записи для запрошенного имени. Наиболее важные проверки — сопоставить `domain` с `state_out.connectionUrl` и изучить DNS-стадию. Отдельно нужно проверить рабочую директорию процесса: текущий `loader.py` использует относительные пути и может не найти YAML при запуске из корня репозитория.
`tf_provider` — источник истины для схемы Flask; его YAML в рамках этого анализа не менялись.