Node.js使用Mongoose对MongoDB进行SSH隧道连接

jer*_*ipp 5 ssh mongoose mongodb node.js

我有两个Mongo DB.一个用于我的开发环境,一个用于生产,如我在Robomongo设置中所见:

两个Mongo DB

生产数据库通过SSH隧道连接到我的数字海洋虚拟服务器,如此处所示(具体情况已经明显改变).连接到我的生产网站/从我的生产网站连接时此设置正常:

SSH隧道设置

我现在正在开发一个不同/相关的项目,需要将我的本地机器连接到我的生产数据库,所以我假设我需要使用像tunnel-ssh这样的东西来完成它.我已经按照这个答案作为例子,但是我要么正在Error: (SSH) Channel open failure: open failed连接到我的Dev db(当我使用27017作为我的dstHost/dstPort/localPort时).我一定在考虑这个错误,或者我对我的配置感到愚蠢.我是公认的Mongo/Mongoose新手,所以两者都是可能的.有什么建议?

var fs = require("fs");
var mongoose = require('mongoose');
var tunnel = require('tunnel-ssh');

//===== db connection =====

var config = {
    username:'my.username',
    host:'my.ip.address',
    agent : process.env.SSH_AUTH_SOCK,
    privateKey:require('fs').readFileSync('/Users/myusername/.ssh/id_rsa'),
    port:22,
    dstHost:'mongodb://localhost:27000/mydbname',
    dstPort:27000,
    localHost:'127.0.0.1',
    password:'mypassword',
    localPort: 27000
};

var server = tunnel(config, function (error, server) {
    if(error){
        console.log("SSH connection error: " + error);
    }
    mongoose.connect('mongodb://localhost:27000/mydbname');

    var db = mongoose.connection;
    db.on('error', console.error.bind(console, 'DB connection error:'));
    db.once('open', function() {
        // we're connected!
        console.log("DB connection successful");
        // console.log(server);
    });
});
Run Code Online (Sandbox Code Playgroud)

提前致谢!

jer*_*ipp 7

最终的工作配置供将来参考.感谢mscdex - 我只需要提供正确的 dstPort并将其包含在我的Mongo URI字符串(27017)中.很简单.希望这可以帮助.

var config = {
    username:'myusername',
    host:'my.ip.address',
    agent : process.env.SSH_AUTH_SOCK,
    privateKey:require('fs').readFileSync('/Users/myusername/.ssh/id_rsa'),
    port:22,
    dstPort:27017,
    password:'mypassword'
};

var server = tunnel(config, function (error, server) {
    if(error){
        console.log("SSH connection error: " + error);
    }
    mongoose.connect('mongodb://localhost:27017/mydbname');

    var db = mongoose.connection;
    db.on('error', console.error.bind(console, 'DB connection error:'));
    db.once('open', function() {
        // we're connected!
        console.log("DB connection successful");
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 嗨,我已经尝试过您的解决方案,它非常有用,但我必须添加密码才能使其正常工作。非常感谢 :) (2认同)

msc*_*dex 6

dstHost需要是主机名/IP,而不是 MongoDB 连接字符串。在这种特殊情况下,您实际上可以省略dstHost,localHostlocalPort在这种特殊情况下,因为它们已经默认为您提供的值。


tio*_*mno 5

或者,如果您不想更改代码,只要您在隧道服务器上拥有 ssh 公钥,您可以通过终端上的 ssh 创建隧道:

ssh -fNL <local_port>:<mongodb_server_hostname_or_ip>:<mongodb_server_port> <tunnel_server_user>@<tunnel_server_hostname_or_ip>
Run Code Online (Sandbox Code Playgroud)

使用虚构 IP 连接到虚假 AWS EC2 AMI Linux 的示例

ssh -fNL 27000:101.202.10.20:27000 ec2-user@33.44.55.66
Run Code Online (Sandbox Code Playgroud)

现在这mongoose.connect('mongodb://localhost:27000/mydbname');就像一个魅力。;)

  • 最佳答案国际海事组织! (2认同)