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

S
Description
No description provided
Readme
112 KiB
Languages
PLpgSQL 49.3%
JavaScript 28%
EJS 16.3%
CSS 6.4%