Files

111 lines
4.3 KiB
Markdown

# getpgdata
Node.js приложение для доступа к PostgreSQL (managed k8s, internal-only).
Развёртывается на платформе Nubes как NodeJS managed service (аналогично ipwhitelist-app).
## Возможности
- `GET /` — состояние подключения и список таблиц (не системные схемы)
- `GET /table?schema=public&name=<table>` — просмотр содержимого таблицы с пагинацией
- `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://<app>/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=<host> DB_USER=<user> DB_PASS=<pass> npm start
```
Если БД недоступна — приложение стартует и показывает ошибку на странице,
а не падает (важно для k8s health-проб и диагностики).