diff --git a/history/2026-08-18.md b/history/2026-08-18.md index 2036ab8..2fe5a4d 100644 --- a/history/2026-08-18.md +++ b/history/2026-08-18.md @@ -90,3 +90,29 @@ getpgdata/ - `package-lock.json` закоммичен (зависимости: express, ejs, pg). - `node_modules/` в `.gitignore`. - Версия в `package.json` повышается при каждой правке кода (правило проекта). + +## 6. Минимальный вывод на экран (фикс падения пода) + +Несмотря на фикс порта (п.4), деплой снова упал — под `nodejsk8s` не поднялся. + +**Требование пользователя:** «сделай код минимальным. Сам код не удаляй — сделай вывод +на экран какой-то информации и всё». + +**Решение (коммит c8a776e, версия 1.0.2):** +- Роут `GET /` переписан так, чтобы **не зависеть от EJS-шаблонов**: отдаёт простой HTML + напрямую (`res.send`), выводя: + - версию Node, `APP_ENV`, PID + - конфиг БД (host, port, database, user) + - статус подключения к БД (или текст ошибки) + - список таблиц (или сообщение об ошибке) +- Каждая попытка работы с БД обёрнута в try/catch, поэтому страница **всегда** отдаёт 200 + с информацией, даже если БД недоступна. +- Весь остальной код (роуты `/table`, `/query`, `/healthz`, `dbConfig`, `pool`) **не удалён** — + только главная страница упрощена. + +**Проверено:** синтаксис OK; запуск без env `PORT` → слушает `0.0.0.0:3000`; +`GET /` → 200 (HTML с конфигом и статусом БД), `GET /healthz` при недоступной БД → 503 degraded. + +**⚠️ Точная причина падения пода по-прежнему не подтверждена** (нет доступа к логам Nubes). +Если под не поднимется и после этого — смотреть логи `nodejsk8s` Deployment в Nubes UI: +replica не активна (CrashLoopBackOff, invalidImage, порт/health, зависший старт). diff --git a/package.json b/package.json index a5c1f6f..3f209dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getpgdata", - "version": "1.0.1", + "version": "1.0.2", "description": "Node.js приложение для доступа к PostgreSQL (managed k8s, internal-only)", "main": "server.js", "scripts": { diff --git a/server.js b/server.js index 7725ef7..ed1a518 100644 --- a/server.js +++ b/server.js @@ -62,31 +62,80 @@ app.get('/healthz', async (req, res) => { } }); -// Главная: состояние подключения + список таблиц +// Главная: минимальный вывод информации на экран. +// Не зависит от EJS-шаблонов — всегда отдаёт HTML, даже если БД недоступна. app.get('/', async (req, res) => { - let tables = null; - let error = null; + const cfg = dbConfig(); + + let dbStatus = 'нет данных'; + let tablesHtml = ''; try { - const r = await pool.query( + const r = await pool.query('SELECT version() AS v'); + dbStatus = 'подключено: ' + (r.rows[0] && r.rows[0].v ? r.rows[0].v : 'ok'); + } catch (e) { + dbStatus = 'недоступна: ' + (e && e.message ? e.message : String(e)); + } + + try { + const t = await pool.query( `SELECT schemaname, tablename FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') ORDER BY schemaname, tablename` ); - tables = r.rows; + if (t.rows && t.rows.length) { + tablesHtml = t.rows + .map((r) => `${esc(r.schemaname)}${esc(r.tablename)}`) + .join(''); + } else { + tablesHtml = 'таблиц нет'; + } } catch (e) { - error = e.message; + tablesHtml = 'не удалось получить таблицы'; } - res.render('index', { - cfg: dbConfig(), - tables, - error, - env: APP_ENV, - }); + res + .status(200) + .set('Content-Type', 'text/html; charset=utf-8') + .send(html(cfg, dbStatus, tablesHtml)); }); +// Экранирование HTML +function esc(v) { + return String(v).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); +} + +// Простая HTML-страница с информацией +function html(cfg, dbStatus, tablesHtml) { + return ` + + + + getpgdata — информация + + +

getpgdata

+

Node.js ${esc(process.version)} · env=${esc(APP_ENV)} · PID=${esc(String(process.pid))}

+ +

База данных

+ + + + + + +
Host${esc(cfg.host)}
Port${esc(String(cfg.port))}
Database${esc(cfg.database)}
User${esc(cfg.user)}
Статус${esc(dbStatus)}
+ +

Таблицы

+ + + ${tablesHtml} +
СхемаТаблица
+ +`; +} + // Просмотр таблицы с пагинацией app.get('/table', async (req, res) => { const schema = (req.query.schema || 'public').replace(/[^a-zA-Z0-9_]/g, '');