Подключение к postgresql через SSH Tunnel
Есть база данных postgresql на удаленном сервере. Из pgAdmin я подключаюсь к этой бд только через ssh tunnel.
Можно ли как-то подключиться к бд в nodejs?
Как сделать proxy или во что обернуть этот код?
const {Pool, Client} = require('pg');
let pg = {
connection: new Pool({
user: 'dbuser',
host: 'dbhost',
database: 'postgres',
password: 'dbpass',
port: 5432,
}),
selectEmail: function (email) {
return new Promise(async (resolve, reject) => {
const str = `SELECT * FROM "user" WHERE "email" = '${email}'`;
this.connection.query(str, (err, res) => {
if (res) {
resolve(true);
} else {
resolve(false);
}
});
});
},
};
module.exports = pg;
Ответы (2 шт):
Автор решения: pasx
→ Ссылка
вы можете использовать пакет SSH, чтобы открыть туннель из Node.js
Например, эта ссылка: https://www.npmjs.com/package/tunnel-ssh
Когда туннель открыт, вы подключаетесь к БД, как если бы она была локальной.
Например, как показано здесь: https://medium.com/@dannibla/connecting-nodejs-postgresql-f8967b9f5932
Автор решения: nörbörnën
→ Ссылка
Подключение к базе данных postgresql на удалённом сервере с использованием ssh-туннеля
Код полностью рабочий, проверен на macOS Mojave, node.js v14.13.0, драйвер pg v8.4.0, библиотека tunnel-ssh v4.1.4.
const fs = require('fs');
const os = require('os');
const tunnelSsh = require('tunnel-ssh');
const { Pool } = require('pg');
(async () => {
/** @type {import('net').Server} */
let tunnel;
try {
tunnel = await createTunnel();
} catch (err) {
console.error(err);
return;
}
try {
const db = connectPg();
const { rows } = await db.query('select now()');
console.log(rows); // [ { now: 2020-10-13T22:08:50.496Z } ]
} catch (err) {
console.error(err);
} finally {
tunnel.close();
}
})();
/**
* @param {number} [localPort=63334]
* @returns {Promise<import('net').Server>}
*/
async function createTunnel(localPort = 63334) {
/** @type {import('tunnel-ssh').Config} */
const tunnelConfig = {
username: 'имя пользователя на удалённом сервере',
password: 'пароль пользователя на удалённом сервере',
// в случае если настроен доступ по ключу
// privateKey: fs.readFileSync(`${os.homedir()}/.ssh/id_rsa`),
host: 'адрес удалённого сервера',
port: 22, // порт для ssh-соединения
dstPort: 5432, // порт postgres на удалённом сервере
localPort: localPort, // порт postgres на локальной машине
keepAlive: true,
readyTimeout: 10000,
};
return new Promise((resolve, reject) => {
tunnelSsh(tunnelConfig, (err, server) => {
if (err) {
return reject(err);
}
resolve(server);
})
.on('error', (err) => console.error('[tunnel-ssh] error:', err))
.on('connection', () => console.log('[tunnel-ssh] connected'))
.on('close', () => console.log('[tunnel-ssh] closed'));
});
}
/**
* @param {number} [localPort=63334]
* @returns {import('pg').Pool}
*/
function connectPg(localPort = 63334) {
/** @type {import('pg').ConnectionConfig} */
const connectionConfig = {
database: 'db_name',
port: localPort, // порт, куда туннель проксирует postgres
user: 'db_user_name',
password: 'db_user_password'
};
return new Pool(connectionConfig);
}