【问题标题】:Connection timed out when I try to deploy my node with PM2 to Heroku当我尝试使用 PM2 将节点部署到 Heroku 时,连接超时
【发布时间】:2023-11-05 20:44:01
【问题描述】:

我尝试关注this tutorial ..

我使用heroku keys:add在heroku中创建并添加了密钥

ssh -vT git@heroku.com

debug1: Next authentication method: publickey
debug1: Offering RSA public key: C:/Users/rider/.ssh/heroku
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug1: Authentication succeeded (publickey).
Authenticated to heroku.com ([50.19.85.156]:22).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
shell request failed on channel 0

问题

当我执行命令pm2 deploy ecosystem.json production setup结果..

λ pm2 deploy ecosystem.json production setup
--> Deploying to production environment
--> on host serve-provaninja.herokuapp.com
ssh: connect to host <myhost>.herokuapp.com port 22: Connection timed out

  setup paths failed

Deploy failed

我的项目文件

过程文件

web: node main.js && pm2 logs all

ecosystem.json

{
  "apps" : [{
    "name"       : "Project name",
    "script"      : "index.js"
  }],

  "deploy" : {
      "production" : {
        "user" : "git",
        "host" : "<myhost>.herokuapp.com",
        "ref"  : "origin/master",
        "repo" : "git@github.com:<myproject>.git",
        "path" : "/var/www/production",
        "post-deploy" : "npm install --production && pm2 startOrRestart ecosystem.json —env production"
      }
    }
}

ma​​in.js

var pm2 = require('pm2');
var os = require("os");

var MACHINE_NAME = os.hostname();
var PRIVATE_KEY  = process.env.KEYMETRICS_PRIVATE_KEY;
var PUBLIC_KEY   = process.env.KEYMETRICS_PUBLIC_KEY;

var ecosystem = require('./ecosystem.json');
var maxMemory = process.env.WEB_MEMORY || 512;

pm2.connect(function() {
  ecosystem.apps.forEach(function(app) {
      pm2.start({
        script    : app.script,
        name      : app.name,
        max_memory_restart : maxMemory + 'M',
        post_update: ["npm install"]
      }, errback);
  });
});

function errback(err,proc) {
  pm2.interact(PRIVATE_KEY, PUBLIC_KEY, MACHINE_NAME, function() {
   pm2.launchBus(function(err, bus) {
     console.log('[PM2] Log streaming started');
     bus.on('log:out', function(packet) {
       console.log('[App:%s] %s', packet.process.name, packet.data);
     });

     bus.on('log:err', function(packet) {
       console.error('[App:%s][Err] %s', packet.process.name, packet.data);
     });
    });
  });
}

【问题讨论】:

    标签: node.js heroku npm pm2


    【解决方案1】:

    我在 heroku 中使用引导脚本启动了我的 pm2 进程,类似于您已经拥有的。

    这是我遵循的教程来实现这一点: http://pm2.keymetrics.io/docs/usage/use-pm2-with-cloud-providers/

    编辑:添加一些细节,我不相信有一种方法可以轻松地通过 ssh 进入 heroku dyno。因为 dyno 结构是一个动态生成的架构,并且没有静态机器或 ip 可以利用,所以 ssh 无法以您想要的方式使用

    【讨论】:

    • 本教程是如何在云端运行你的应用,我的问题是如何使用pm2 deploy ecosystem.json production setup进行部署
    • 如何将应用部署到 Heroku?
    • 我使用 travis ci 部署到 heroku:docs.travis-ci.com/user/deployment/heroku
    最近更新 更多