source: src/config/database.js

main
Last change on this file was 7517a3a, checked in by Luka Krstikj <luka.krstik@…>, 23 hours ago

init

  • Property mode set to 100644
File size: 2.6 KB
Line 
1const { Client: SSHClient } = require('ssh2');
2const { Client: PGClient } = require('pg');
3const net = require('net');
4
5let pgClient = null;
6let sshClient = null;
7let sshServer = null;
8
9async function connect() {
10 return new Promise((resolve, reject) => {
11 sshClient = new SSHClient();
12
13 sshClient.on('ready', () => {
14 console.log('SSH Connected successfuly.');
15
16 sshServer = net.createServer((sock) => {
17 sshClient.forwardOut(
18 sock.remoteAddress,
19 sock.remotePort,
20 process.env.DB_HOST,
21 parseInt(process.env.DB_PORT),
22 (err, stream) => {
23 if (err) {
24 sock.end();
25 console.error('SSH forwarding error:', err);
26 return;
27 }
28 sock.pipe(stream).pipe(sock);
29 }
30 );
31 });
32
33 sshServer.listen(0, '127.0.0.1', async () => {
34 const localPort = sshServer.address().port;
35 console.log(`SSH tunnel: localhost:${localPort} -> ${process.env.DB_HOST}:${process.env.DB_PORT}`);
36
37 pgClient = new PGClient({
38 host: '127.0.0.1',
39 port: localPort,
40 user: process.env.DB_USER,
41 password: process.env.DB_PASSWORD,
42 database: process.env.DB_NAME,
43 });
44
45 try {
46 await pgClient.connect();
47
48 await pgClient.query(`SET search_path TO ${process.env.DB_SCHEMA}`);
49
50 console.log(`Database connected (schema: ${process.env.DB_SCHEMA})`);
51 resolve(pgClient);
52 } catch (err) {
53 console.error('Database connection error:', err);
54 reject(err);
55 }
56 });
57
58 sshServer.on('error', (err) => {
59 console.error('SSH server error:', err);
60 reject(err);
61 });
62 });
63
64 sshClient.on('error', (err) => {
65 console.error('SSH Connection error:', err);
66 reject(err);
67 });
68
69 sshClient.connect({
70 host: process.env.SSH_HOST,
71 port: parseInt(process.env.SSH_PORT),
72 username: process.env.SSH_USER,
73 password: process.env.SSH_PASSWORD,
74 });
75 });
76}
77
78function getPool() {
79 if (!pgClient) {
80 throw new Error('Database not connected. Call connect() first.');
81 }
82 return {
83 query: (...args) => pgClient.query(...args),
84 };
85}
86
87async function close() {
88 if (pgClient) {
89 await pgClient.end();
90 console.log('Database connection closed');
91 }
92 if (sshServer) {
93 sshServer.close();
94 console.log('SSH server closed');
95 }
96 if (sshClient) {
97 sshClient.end();
98 console.log('SSH connection closed');
99 }
100}
101
102module.exports = {
103 connect,
104 getPool,
105 close,
106};
Note: See TracBrowser for help on using the repository browser.