getpgdata: JSON API POST /api/sql для произвольных SQL-команд (WRITE_SQL=1), версия 1.0.3

This commit is contained in:
naeel
2026-08-18 21:22:50 +04:00
parent 352e7ec2e6
commit 886d1f073d
4 changed files with 105 additions and 1 deletions
+25
View File
@@ -116,3 +116,28 @@ getpgdata/
**⚠️ Точная причина падения пода по-прежнему не подтверждена** (нет доступа к логам Nubes).
Если под не поднимется и после этого — смотреть логи `nodejsk8s` Deployment в Nubes UI:
replica не активна (CrashLoopBackOff, invalidImage, порт/health, зависший старт).
## 7. JSON API POST /api/sql (перенос данных в новую ПГ)
**Контекст:** нужно перенести белые списки (IP, кто создал, когда) из прежней БД в **новую**
PostgreSQL (тот же realm k8s). Доступ к новой БД — через Keycloak, автоматизировать нельзя.
Решение: код в репе `getpgdata` + передеплой с кредами новой ПГ.
**Что добавлено (версия 1.0.3):**
- Эндпоинт **`POST /api/sql`** — JSON API для произвольных SQL-команд.
Body: `{ "sql": "...", "params": [...] }` (params → `$1..$n`).
- `SELECT`/`WITH` → `{ ok:true, fields, rows, rowCount }` (всегда доступен)
- `INSERT`/`UPDATE`/`DELETE`/DDL → `{ ok:true, rowCount }` **только при `WRITE_SQL=1`**
- иначе → HTTP 403 «Write-SQL отключён»
- **Защита:** выполняется только первый statement (split по `;`) — блокирует мульти-команды
вроде `SELECT 1; DROP TABLE ...`.
- Флаг в env: `WRITE_SQL=1` включает запись.
**Логика переноса:**
1. Приложение подключено к прежней БД — читать данные через `/api/sql` (SELECT).
2. Сменить креды в jsonEnv на новую ПГ (+ `WRITE_SQL=1`).
3. Передеплой — теперь `/api/sql` выполняет запросы уже в новой БД; выполнить INSERT данных.
**Проверено:** `node -c server.js` OK; локально: пустой SQL → 400; SELECT → идёт в БД;
`INSERT` без `WRITE_SQL` → 403 (до попытки подключения); `WRITE_SQL=1` + мульти-statement →
берётся только первый; процесс проверки остановлен.