# getpgdata Node.js приложение для доступа к PostgreSQL (managed k8s, internal-only). Развёртывается на платформе Nubes как NodeJS managed service (аналогично ipwhitelist-app). ## Возможности - `GET /` — состояние подключения и список таблиц (не системные схемы) - `GET /table?schema=public&name=` — просмотр содержимого таблицы с пагинацией - `POST /query` — SQL-консоль (read-only, только `SELECT`) - `POST /api/sql` — JSON API для произвольных SQL-команд (см. ниже) - `GET /healthz` — liveness-проба для k8s ## JSON API: POST /api/sql Выполняет произвольный SQL против БД, на которую настроено приложение (текущие креды). Удобен для переноса данных между БД: читать из прежней (текущие креды) → затем после смены кредов на новую ПГ вставлять. **Запрос:** ```bash curl -X POST https:///api/sql \ -H 'Content-Type: application/json' \ -d '{"sql":"SELECT * FROM whitelist_entries LIMIT 10"}' ``` **Тело:** `{ "sql": "...", "params": [...] }` — `params` подставляются в `$1..$n`. **Ответ:** - `SELECT` → `{ "ok": true, "fields": [...], "rows": [...], "rowCount": n }` - `INSERT/UPDATE/DELETE` → `{ "ok": true, "rowCount": n }` - ошибка → HTTP 400/403, `{ "ok": false, "error": "..." }` **Ограничения и безопасность:** - Выполняется **один statement** (первый до `;`) — защита от мульти-комманд (`; DROP ...`) - `SELECT`/`WITH` — доступны всегда - `INSERT`/`UPDATE`/`DELETE`/`DDL` — **только при `WRITE_SQL=1`** в env; иначе возвращается HTTP 403 «Write-SQL отключён» - Для включения записи в jsonEnv добавь `"WRITE_SQL": "1"` ## Структура ``` getpgdata/ ├── package.json ├── server.js # точка входа (Express) ├── public/ │ └── style.css └── views/ ├── index.ejs ├── table.ejs ├── query.ejs └── error.ejs ``` ## Переменные окружения (jsonEnv) Готовый блок для вставки в jsonEnv Nubes UI. Два пользователя БД: `super` (полный доступ) и `contracts`. Используй один из вариантов, заменив `DB_USER`/`DB_PASS` на нужную пару. **Вариант 1 — пользователь `super` (по умолчанию):** ```json { "DB_HOST": "postgresqlk8s-master.60bdf3e3-5087-41ff-b760-fe6ea544a80e.svc.cluster.local", "DB_PORT": "5432", "DB_NAME": "ipwhitelist", "DB_USER": "super", "DB_PASS": "xnm9KHLibBvT5lYuQzaBVFPYJQHfTxbS4YeEWMcFvtXuXfLaXvgogqJ6uW0nbBUB", "DB_SSLMODE": "disable", "DB_CONNECT_TIMEOUT": "5000", "QUERY_MAX_ROWS": "200", "APP_ENV": "production", "PORT": "3000" } ``` **Вариант 2 — пользователь `contracts`:** ```json { "DB_HOST": "postgresqlk8s-master.60bdf3e3-5087-41ff-b760-fe6ea544a80e.svc.cluster.local", "DB_PORT": "5432", "DB_NAME": "ipwhitelist", "DB_USER": "contracts", "DB_PASS": "iO5lVu1aQaw31LudxywpddHhwZ0gg4cNGmj7y7UI25wU8nEzAM8FpbPX4iFhUQIY", "DB_SSLMODE": "disable", "DB_CONNECT_TIMEOUT": "5000", "QUERY_MAX_ROWS": "200", "APP_ENV": "production", "PORT": "3000" } ``` В коде значения читаются через `process.env`, поэтому достаточно вставить один из блоков в jsonEnv при создании сервиса в Nubes. БД доступна только изнутри k8s (internal `.svc.cluster.local`), поэтому приложение должно работать внутри кластера Nubes. ## Локальный запуск ```bash npm install DB_HOST= DB_USER= DB_PASS= npm start ``` Если БД недоступна — приложение стартует и показывает ошибку на странице, а не падает (важно для k8s health-проб и диагностики).