DELETE /api/nodes/{uuid} возвращает 204, но нода остаётся в БД и продолжает опрашиваться

Окружение

  • Панель: remnawave/backend:latest, версия 3.3.2
  • Нода: remnawave/node:latest, 3.3.2
  • PostgreSQL 18.3, Valkey 9.0.3, nginx 1.28

Что происходит

Нода, которая никогда не поднималась (DNS её адреса не резолвится, статус в панели — красный, трафик 0 B, версия не определена), не удаляется ни из UI, ни через API.

Шаги воспроизведения

  1. Добавить ноду с заведомо несуществующим адресом, например test.example.host:2222.
  2. Нажать «Удалить» в карточке ноды.

Ожидается

Нода удаляется, health check по ней прекращается.

По факту

  • Браузер получает HTTP 204 — по OpenAPI это успех ("204": { "description": "Operation successful, no content returned" }).
  • Карточка после Ctrl+Shift+R остаётся на месте.
  • В логах панели в момент запроса нет ни одной записи — ни об удалении, ни об ошибке.
  • Строка в БД остаётся:
docker exec -it remnawave-db psql -U postgres -d postgres -c "select uuid, name, address, is_disabled from nodes;"

                 uuid                 |   name    |      address      | is_disabled
--------------------------------------+-----------+-------------------+-------------
 4190a099-...-f1b7eefae0d1            | Singapore | singa.example.host| f

  • Health check продолжает крутиться каждые 10 секунд:
WARN [NodeHealthCheckQueueProcessor] Node 4190a099-...-f1b7eefae0d1, singa.example.host:2222 – health check attempt 1 of 2, message: "getaddrinfo ENOTFOUND singa.example.host"
WARN [NodeHealthCheckQueueProcessor] Node 4190a099-...-f1b7eefae0d1, singa.example.host:2222 – health check attempt 2 of 2, message: "getaddrinfo ENOTFOUND singa.example.host"
WARN [NodeHealthCheckQueueProcessor] Lost connection to Node 4190a099-...-f1b7eefae0d1, singa.example.host:2222, message: "getaddrinfo ENOTFOUND singa.example.host"

Что уже проверено

docker exec -it remnawave-db psql -U postgres -d postgres -c "SELECT conrelid::regclass AS child_table, conname, confdeltype FROM pg_constraint WHERE confrelid = 'nodes'::regclass;"

           child_table            |                     conname                     | confdeltype
----------------------------------+-------------------------------------------------+-------------
 nodes_usage_history              | nodes_usage_history_node_uuid_fkey              | c
 config_profile_inbounds_to_nodes | config_profile_inbounds_to_nodes_node_uuid_fkey | c
 infra_billing_nodes              | infra_billing_nodes_node_uuid_fkey              | c
 hosts_to_nodes                   | hosts_to_nodes_node_uuid_fkey                   | c
 nodes_user_usage_history         | nodes_user_usage_history_node_id_fkey           | c
 user_traffic                     | user_traffic_last_connected_node_uuid_fkey      | n
 node_meta                        | node_meta_node_id_fkey                          | c
 torrent_blocker_reports          | torrent_blocker_reports_node_id_fkey            | c

Ручной DELETE FROM nodes WHERE uuid = '...' отрабатывает без ошибок и каскад срабатывает корректно, то есть на уровне схемы препятствий нет.

Обходной путь

docker exec remnawave-db pg_dump -U postgres postgres > backup.sql
docker exec -it remnawave-db psql -U postgres -d postgres -c "DELETE FROM nodes WHERE uuid = '<uuid>';"
docker exec -it remnawave-redis valkey-cli flushall
docker compose restart remnawave

Без flushall повторяющаяся задача health-check остаётся в очереди и продолжает логировать несуществующую ноду.

Пришлите полный лог панели.

redis/valkey кстати говоря, флашить необязательно. Панель самостоятельно очищает его при запуске.

Полный лог приложить не смогу, контейнер панели пересоздавался, и json-log исходного инстанса удалился вместе с ним. Постоянный сбор логов в файл теперь настроил.

Воспроизвести не удалось строку ноды возвращал из pg_dump, удаляется штатно. Тогда помог обычный docker compose restart remnawave.

Раз воспроизведения нет, тему можно закрывать. Если повторится, приложу лог сразу.