111 lines
4.3 KiB
Markdown
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-проб и диагностики).
|