From c8a776ec0408e7bc817ca64232ed2b3555bbebf7 Mon Sep 17 00:00:00 2001 From: naeel Date: Tue, 18 Aug 2026 20:11:22 +0400 Subject: [PATCH] =?UTF-8?q?getpgdata:=20=D0=BF=D0=BE=D1=80=D1=82=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D1=83=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E?= =?UTF-8?q?=203000=20(=D0=BA=D0=B0=D0=BA=20=D1=83=20whitelist),=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D1=81=D0=B8=D1=8F=201.0.1,=20=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D1=8F=202026-08-18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- history/2026-08-18.md | 92 +++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- server.js | 2 +- 4 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 history/2026-08-18.md diff --git a/README.md b/README.md index b499bc5..122c7b4 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ getpgdata/ "DB_CONNECT_TIMEOUT": "5000", "QUERY_MAX_ROWS": "200", "APP_ENV": "production", - "PORT": "5000" + "PORT": "3000" } ``` @@ -61,7 +61,7 @@ getpgdata/ "DB_CONNECT_TIMEOUT": "5000", "QUERY_MAX_ROWS": "200", "APP_ENV": "production", - "PORT": "5000" + "PORT": "3000" } ``` diff --git a/history/2026-08-18.md b/history/2026-08-18.md new file mode 100644 index 0000000..2036ab8 --- /dev/null +++ b/history/2026-08-18.md @@ -0,0 +1,92 @@ +# История getpgdata — 2026-08-18 + +## Суть проекта + +`getpgdata` — отдельное приложение для доступа к PostgreSQL (managed k8s, internal-only). +Разворачивается на платформе Nubes как **NodeJS managed service** (`nodejsk8s`). + +Репозиторий: `https://gitea.services.ngcloud.ru/Nail/getpgdata.git` (ветка `master`). +Локальный путь: `/home/naeel/ipwhitelist-app/getpgdata`. + +## 1. Создание (Flask-версия, ошибочная) + +Первоначально приложение было собрано как **Flask (Python)** по howto `~/nubes/howto-flask-nubes.md` +(структура `site/app.py` + `requirements.txt`). Запушено коммитом `5c5e11c`. + +**Функции Flask-версии:** главная со списком таблиц, просмотр таблицы, SQL-консоль (read-only), `/healthz`. + +## 2. Ошибка пользователя и замена на Node.js + +Пользователь указал, что перепутал стек — нужно **Node.js**, а не Flask. + +**Решение:** Flask-файлы (`site/`, `requirements.txt`) удалены, создана Node.js структура +по образцу рабочего `ipwhitelist-app`: + +``` +getpgdata/ +├── package.json # version 1.0.x; main server.js; start: node server.js +├── server.js # точка входа: Express + pg Pool +├── public/style.css +└── views/ + ├── index.ejs # главная: подключение + список таблиц + ├── table.ejs # просмотр таблицы с пагинацией + ├── query.ejs # SQL-консоль (read-only, только SELECT) + └── error.ejs +``` + +Коммит замены: `b061dcd`. + +**Проверено:** `node -c server.js`, `npm install` (90 пакетов), реальный запуск сервера: +- `GET /` → 200 (рендер страницы) +- `GET /healthz` при недоступной БД → 503 (degraded, приложение не падает) +- `GET /table` без имени → 302 redirect +- `POST /query` не-SELECT → блокируется (read-only) +- статика `/public/style.css` → 200 + +## 3. Настройки подключения к БД + +- Хост: `postgresqlk8s-master.60bdf3e3-5087-41ff-b760-fe6ea544a80e.svc.cluster.local` +- Порт: `5432` +- БД: `ipwhitelist` (коммит `102689d` — дефолт изменён с `postgres` на `ipwhitelist`) +- Пользователи: `super` (полный доступ) и `contracts` — оба с паролями из jsonEnv +- `DB_SSLMODE`: `disable` + +Пароли в коде НЕ хранятся (читаются через `process.env.DB_PASS`). Готовые jsonEnv-блоки +на обоих пользователей добавлены в `README.md` (коммит `a890bb9`). + +## 4. Проблема деплоя: под `nodejsk8s` не стартует + +**Симптом (Nubes UI):** +> Приложение не запустилось. Производится полный откат установки. +> Error: jlib.k8s [correctReplicaActive] | ERROR | Под(ы) не работают: 'nodejsk8s' (Deployment). + +**Диагноз (сравнение с работающим `whitelist`):** + +| Параметр | `whitelist` (работает) | `getpgdata` (падал) | +|---|---|---| +| Точка входа | `server.js`, `main` в package.json | `server.js` ✓ | +| `npm start` | `node server.js` | `node server.js` ✓ | +| **Дефолтный порт** | **3000** | **5000** ✗ | +| Liveness | `/healthz` | `/healthz` ✓ | +| Старт без доступной БД | стартует | стартует ✓ | + +**Гипотеза:** дефолтный порт `5000` (перенесён из Flask-версии) не совпадает с портом `3000`, +который ожидает платформа Nubes для NodeJS managed service. Health-проба не находила сервис → +под не Ready → «не работает nodejsk8s» → откат. + +**Исправление:** дефолтный `PORT` в `server.js` изменён с `5000` на `3000`; +в `README.md` jsonEnv-блоки обновлены (`PORT: 3000`); `package.json` version → `1.0.1`. + +**Проверено:** сервер запущен без env `PORT` → слушает `0.0.0.0:3000`, `/` → 200, `/healthz` → 503 (degraded). + +**⚠️ НЕ проверено:** доступ к кластеру Nubes с этой машины отсутствует (`iot-naeel` и +`naeel-test-3` требуют OIDC-аутентификацию, managed-сервисы в них не видны). Поэтому +точную причину «почему под упал» по логам пода подтвердить нельзя — требуется лог пода +из Nubes UI. Если деплой после фикса порта снова не поднимется — смотреть логи пода +(`nodejsk8s` Deployment) в UI, а не только полагаться на гипотезу о порте. + +## 5. Прочее + +- `package-lock.json` закоммичен (зависимости: express, ejs, pg). +- `node_modules/` в `.gitignore`. +- Версия в `package.json` повышается при каждой правке кода (правило проекта). diff --git a/package.json b/package.json index c725c00..a5c1f6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getpgdata", - "version": "1.0.0", + "version": "1.0.1", "description": "Node.js приложение для доступа к PostgreSQL (managed k8s, internal-only)", "main": "server.js", "scripts": { diff --git a/server.js b/server.js index 58ab3bb..7725ef7 100644 --- a/server.js +++ b/server.js @@ -170,7 +170,7 @@ app.use((err, req, res, next) => { // --------------------------------------------------------------------------- // Запуск // --------------------------------------------------------------------------- -const PORT = parseInt(process.env.PORT || '5000', 10); +const PORT = parseInt(process.env.PORT || '3000', 10); app.listen(PORT, '0.0.0.0', () => { console.log(`getpgdata listening on port ${PORT} (env=${APP_ENV})`);