89 lines
2.3 KiB
JavaScript
89 lines
2.3 KiB
JavaScript
const mysql = require('mysql2/promise');
|
|
const { Client } = require('ssh2');
|
|
const dotenv = require('dotenv');
|
|
const path = require('path');
|
|
|
|
dotenv.config({ path: path.join(__dirname, '../.env') });
|
|
|
|
// SSH configuration
|
|
const sshConfig = {
|
|
host: process.env.PROD_SSH_HOST,
|
|
port: process.env.PROD_SSH_PORT || 22,
|
|
username: process.env.PROD_SSH_USER,
|
|
privateKey: process.env.PROD_SSH_KEY_PATH ? require('fs').readFileSync(process.env.PROD_SSH_KEY_PATH) : undefined
|
|
};
|
|
|
|
// Database configuration
|
|
const dbConfig = {
|
|
host: process.env.PROD_DB_HOST || 'localhost', // Usually localhost when tunneling
|
|
user: process.env.PROD_DB_USER,
|
|
password: process.env.PROD_DB_PASSWORD,
|
|
database: process.env.PROD_DB_NAME,
|
|
port: process.env.PROD_DB_PORT || 3306
|
|
};
|
|
|
|
async function testConnection() {
|
|
const ssh = new Client();
|
|
|
|
try {
|
|
// Create new Promise for SSH connection
|
|
await new Promise((resolve, reject) => {
|
|
ssh.on('ready', resolve)
|
|
.on('error', reject)
|
|
.connect(sshConfig);
|
|
});
|
|
|
|
console.log('SSH Connection successful!');
|
|
|
|
// Forward local port to remote MySQL port
|
|
const tunnel = await new Promise((resolve, reject) => {
|
|
ssh.forwardOut(
|
|
'127.0.0.1',
|
|
0,
|
|
dbConfig.host,
|
|
dbConfig.port,
|
|
(err, stream) => {
|
|
if (err) reject(err);
|
|
resolve(stream);
|
|
}
|
|
);
|
|
});
|
|
|
|
console.log('Port forwarding established');
|
|
|
|
// Create MySQL connection over SSH tunnel
|
|
const connection = await mysql.createConnection({
|
|
...dbConfig,
|
|
stream: tunnel
|
|
});
|
|
|
|
console.log('MySQL Connection successful!');
|
|
|
|
// Test query
|
|
const [rows] = await connection.query('SELECT COUNT(*) as count FROM products');
|
|
console.log('Query successful! Product count:', rows[0].count);
|
|
|
|
// Clean up
|
|
await connection.end();
|
|
ssh.end();
|
|
console.log('Connections closed successfully');
|
|
return rows[0].count;
|
|
|
|
} catch (error) {
|
|
console.error('Error:', error);
|
|
if (ssh) ssh.end();
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// If running directly (not imported)
|
|
if (require.main === module) {
|
|
testConnection()
|
|
.then(() => process.exit(0))
|
|
.catch(error => {
|
|
console.error('Test failed:', error);
|
|
process.exit(1);
|
|
});
|
|
}
|
|
|
|
module.exports = { testConnection };
|