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 против БД, на которую настроено приложение (текущие креды). Удобен для переноса данных между БД: читать из прежней (текущие креды) → затем после смены кредов на новую ПГ вставлять.
Запрос:
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 (по умолчанию):
{
"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:
{
"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.
Локальный запуск
npm install
DB_HOST=<host> DB_USER=<user> DB_PASS=<pass> npm start
Если БД недоступна — приложение стартует и показывает ошибку на странице, а не падает (важно для k8s health-проб и диагностики).