From 814625ef57cd4fc7ac8ba45b56ba709a3e6a1111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Fri, 29 May 2026 21:56:20 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BA=D0=B0=D1=80=D0=BA=D0=B0=D1=81=20?= =?UTF-8?q?Express=20+=20pg,=20health=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 16 ++++++++++++++++ package.json | 16 ++++++++++++++++ server.js | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/db.js | 24 ++++++++++++++++++++++++ views/index.ejs | 13 +++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 .env.example create mode 100644 package.json create mode 100644 server.js create mode 100644 src/db.js create mode 100644 views/index.ejs diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..fd12d24 --- /dev/null +++ b/.env.example @@ -0,0 +1,16 @@ +# База данных +DB_HOST=your-db-host.svc.cluster.local +DB_PORT=5432 +DB_NAME=postgres +DB_USER=your-user +DB_PASS=your-password +DB_SSLMODE=require + +# Сервер +PORT=3000 + +# Лимиты +DEFAULT_LIMIT=15 + +# Режим разработки (true = без Keycloak, читать X-Dev-User из заголовка) +DEV_MODE=true diff --git a/package.json b/package.json new file mode 100644 index 0000000..2051131 --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "ipwhitelist", + "version": "0.1.0", + "description": "IP WhiteList microservice for cloud provider", + "main": "server.js", + "scripts": { + "start": "node server.js", + "dev": "node --watch server.js" + }, + "dependencies": { + "dotenv": "^16.4.7", + "ejs": "^3.1.10", + "express": "^4.21.1", + "pg": "^8.13.1" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..f11a6c5 --- /dev/null +++ b/server.js @@ -0,0 +1,45 @@ +const express = require('express'); +const path = require('path'); +require('dotenv').config(); +const { checkConnection } = require('./src/db'); + +const app = express(); +const PORT = process.env.PORT || 3000; + +// Шаблоны +app.set('view engine', 'ejs'); +app.set('views', path.join(__dirname, 'views')); + +// Статика +app.use(express.static(path.join(__dirname, 'public'))); + +// Парсинг форм +app.use(express.urlencoded({ extended: true })); + +// Health check (для nubes_nodejs) +app.get('/healthz', async (req, res) => { + try { + await checkConnection(); + res.status(200).send('OK'); + } catch (e) { + res.status(500).send('DB error'); + } +}); + +// Главная страница +app.get('/', (req, res) => { + res.render('index', { title: 'IP WhiteList' }); +}); + +async function start() { + try { + const ok = await checkConnection(); + console.log('DB connected:', ok); + app.listen(PORT, () => console.log(`Server on port ${PORT}`)); + } catch (e) { + console.error('DB connection failed:', e.message); + process.exit(1); + } +} + +start(); diff --git a/src/db.js b/src/db.js new file mode 100644 index 0000000..f716a86 --- /dev/null +++ b/src/db.js @@ -0,0 +1,24 @@ +const { Pool } = require('pg'); +require('dotenv').config(); + +const pool = new Pool({ + host: process.env.DB_HOST, + port: process.env.DB_PORT || 5432, + database: process.env.DB_NAME || 'postgres', + user: process.env.DB_USER, + password: process.env.DB_PASS, + ssl: process.env.DB_SSLMODE === 'require' ? { rejectUnauthorized: false } : false, + max: 10, + idleTimeoutMillis: 30000, +}); + +pool.on('error', (err) => { + console.error('DB pool error:', err.message); +}); + +async function checkConnection() { + const { rows } = await pool.query('SELECT 1 AS ok'); + return rows[0].ok === 1; +} + +module.exports = { pool, checkConnection }; diff --git a/views/index.ejs b/views/index.ejs new file mode 100644 index 0000000..36527cd --- /dev/null +++ b/views/index.ejs @@ -0,0 +1,13 @@ + + + + + + <%= title %> + + + +

<%= title %>

+

Сервис работает. БД подключена.

+ +