ops: дублирующий stale DATABASE_URL (europatech_neon_dryrun) в prod api/.env — footgun на money-пути #732

Closed
opened 2026-06-17 13:03:47 +00:00 by andrei · 1 comment
Owner

Что

prod api/.env (89.167.108.198, gitignored, mtime 2026-06-07, НЕ генерится деплоем) содержит ДВА DATABASE_URL:

  • L129: ...@127.0.0.1:15435/europatech_neon_dryrun (stale — БД с ~3 миграциями, почти пустая)
  • L138: ...@127.0.0.1:15435/europatech_prod (correct — 231 миграция, реальные данные: agent_tasks=3050, infra_metric_samples=28355)

Живой API (europatech-api-prod-candidate, pid проверен через /proc/environ) использует europatech_prod (dotenv last-wins ✓), 8 дней стабильно, 0 Sentry-ошибок. НЕ активный инцидент.

Риск (footgun)

L129 первым — любой first-match потребитель подключится к ПУСТОЙ dryrun-БД:

  • prisma CLI в другом окружении / ручной скрипт читающий .env
  • смена версии/поведения dotenv
  • если кто-то поменяет порядок строк → last-wins станет neon_dryrun → живой API на пустой БД → outage + путаница данных

Дубль DATABASE_URL на РАЗНЫЕ БД (одна пустая) = инцидент, ждущий случиться, на money/data-критичном пути.

Фикс

Убрать L129 (europatech_neon_dryrun) из prod api/.env через ops-канал (ручной secrets-файл, бэкап перед правкой). Рестарт API НЕ требуется (живой процесс уже на europatech_prod). Опционально: дропнуть саму неиспользуемую БД europatech_neon_dryrun после подтверждения, что ничто на неё не смотрит.

Где могу ошибиться

dotenv = last-wins, поэтому сейчас всё корректно; риск латентный. Но именно такие "работает по случайности" конфиги дают катастрофу при следующем изменении.

## Что prod `api/.env` (89.167.108.198, gitignored, mtime 2026-06-07, НЕ генерится деплоем) содержит **ДВА** `DATABASE_URL`: - **L129**: `...@127.0.0.1:15435/europatech_neon_dryrun` (stale — БД с ~3 миграциями, почти пустая) - **L138**: `...@127.0.0.1:15435/europatech_prod` (correct — 231 миграция, реальные данные: agent_tasks=3050, infra_metric_samples=28355) Живой API (`europatech-api-prod-candidate`, pid проверен через /proc/environ) использует **europatech_prod** (dotenv last-wins ✓), 8 дней стабильно, 0 Sentry-ошибок. НЕ активный инцидент. ## Риск (footgun) L129 первым — любой first-match потребитель подключится к ПУСТОЙ dryrun-БД: - prisma CLI в другом окружении / ручной скрипт читающий .env - смена версии/поведения dotenv - если кто-то поменяет порядок строк → last-wins станет neon_dryrun → живой API на пустой БД → outage + путаница данных Дубль `DATABASE_URL` на РАЗНЫЕ БД (одна пустая) = инцидент, ждущий случиться, на money/data-критичном пути. ## Фикс Убрать **L129** (`europatech_neon_dryrun`) из prod `api/.env` через ops-канал (ручной secrets-файл, бэкап перед правкой). Рестарт API НЕ требуется (живой процесс уже на europatech_prod). Опционально: дропнуть саму неиспользуемую БД `europatech_neon_dryrun` после подтверждения, что ничто на неё не смотрит. ## Где могу ошибиться dotenv = last-wins, поэтому сейчас всё корректно; риск латентный. Но именно такие "работает по случайности" конфиги дают катастрофу при следующем изменении.
Author
Owner

Закрыто с verification (2026-07-09):

Что сделано / найдено

  • prod api/.env: дубль уже отсутствовал — единственный DATABASE_URL (L137) на europatech_prod. Живой процесс проверен через /proc/<pid>/environ — на europatech_prod.
  • НО найден второй footgun: /home/europatech/europatech/.env.local (апрельский dev-override в активной рабочей копии) содержал DATABASE_URL на europatech_neon_dryrun. Строка удалена, бэкап: .env.local.bak-20260709. Остальные строки файла не тронуты.
  • Полный скан /home/europatech по .env*/*.sh/*.yml: ссылок на neon_dryrun не осталось.
  • pg_stat_activity: 0 подключений к europatech_neon_dryrun.
  • API health после правки: 200, version 69665f75. Рестарт не требовался.

Остаток (решение CEO): сама БД europatech_neon_dryrun ещё существует в srv-postgres18. DROP DATABASE — необратимая операция, автономно не выполняю. Ссылок на неё в конфигах ноль, активных подключений ноль — можно дропать по команде.

Закрыто с verification (2026-07-09): **Что сделано / найдено** - prod `api/.env`: дубль уже отсутствовал — единственный DATABASE_URL (L137) на `europatech_prod`. Живой процесс проверен через `/proc/<pid>/environ` — на `europatech_prod`. - НО найден второй footgun: `/home/europatech/europatech/.env.local` (апрельский dev-override в активной рабочей копии) содержал DATABASE_URL на `europatech_neon_dryrun`. Строка удалена, бэкап: `.env.local.bak-20260709`. Остальные строки файла не тронуты. - Полный скан `/home/europatech` по `.env*/*.sh/*.yml`: ссылок на neon_dryrun не осталось. - `pg_stat_activity`: 0 подключений к `europatech_neon_dryrun`. - API health после правки: 200, version 69665f75. Рестарт не требовался. **Остаток (решение CEO)**: сама БД `europatech_neon_dryrun` ещё существует в srv-postgres18. DROP DATABASE — необратимая операция, автономно не выполняю. Ссылок на неё в конфигах ноль, активных подключений ноль — можно дропать по команде.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/europatech#732
No description provided.