首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Node.js 使用 SCP + SSH 部署项目

Node.js 使用 SCP + SSH 部署项目

原创
作者头像
除除
发布2025-12-12 14:34:37
发布2025-12-12 14:34:37
1490
举报
文章被收录于专栏:除除的专栏除除的专栏
Node.js 使用 SCP + SSH 部署项目
Node.js 使用 SCP + SSH 部署项目

内容声明

本文仅用于技术分享和学习交流,内容不包含任何广告、推广、引流、付费课程或外链信息。所有示例和配置均为技术实践,欢迎参考和自定义。


本文介绍了如何在无法直接访问 GitLab 的生产环境中,通过 SCP 和 SSH 实现代码上传及项目重启。利用 scp2 和 ssh2 npm 包完成文件传输与命令执行,并通过 webpack 打包脚本以适配 GitLab CI/CD 环境,解决依赖缺失问题,实现自动化部署。

背景

在项目部署上线的过程中,正常流程是在生成环境 Git 拉取最新代码来进行更新。但是某些极端情况下,由于内网管控的封闭性,生产环境无法拉取 GitLab 端所存储的代码,此时便只能通过 SCP 和 SSH 来曲线救国了。

解决方案

借助 scp2ssh2 这两个 npm 包,实现项目代码的上传和启动。

代码语言:bash
复制
npm i scp2 ssh2 -D

deploy.example.js:

代码语言:javascript
复制
// 服务器信息
const host = '127.0.0.1';
const username = 'root';
const password = 'password';
const port = 22;
const projectName = 'example-web';
const path = `/root/web/${projectName}/`;

// 上传
async function upload () {
  const client = require('scp2');
  const remoteAddress = `${username}:${password}@${host}`;
  return new Promise((resolve, reject) => {
    client.scp(`../${projectName}`, `${remoteAddress}:${path}`, err => {
      if (err) {
        reject(`Fail: 1 ${err.message}`);
        return;
      }
      resolve('upload success!');
    })
  });
}

// 重启
async function restart () {
  var Client = require('ssh2').Client;
  var conn = new Client();
  return new Promise((resolve, reject) => {
    conn.on('ready', function() {
      console.log('Client :: ready');
      conn.exec(`cd ${path};pwd;npm i;npm run restart;`, function(err, stream) {
        if (err) throw err;
        stream.on('close', function(code, signal) {
          console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
          conn.end();
          resolve('restart success!');
        }).on('data', function(data) {
          console.log('STDOUT: ' + data);
        }).stderr.on('data', function(data) {
          console.log('STDERR: ' + data);
        });
      });
    }).connect({
      host,
      port,
      username,
      password,
    });
  });
}

// 启动任务
;(async () => {
  // 上传
  const uploadResult = await upload().catch(console.error);
  console.log(uploadResult);
  // 重启
  const restartResult = await restart().catch(console.error);
  console.log(restartResult);
})();

此时已经可以在本地进行部署了。但是使用 GitLab CICD 进行部署的时候会遇到问题,就是 GitLab 容器环境中并没有 scp2ssh2 这两个 npm 包,我们可以借助 webpack 将以上脚本打包成 Node 容器环境可直接运行的脚本。

webpack.config.deploy.example.js:

代码语言:javascript
复制
const path = require('path');

module.exports = {
  entry: './deploy.example.js',
  mode: 'production',
  output: {
    filename: 'deploy.example.bin.js',
    path: path.resolve(__dirname, './'),
  },
  target: 'node',
  node: {
    dgram: 'empty',
    child_process: 'empty',
    fs: 'empty'
  }
};

package.json:

代码语言:json
复制
{
  // ...
  "node": {
    "http": false,
    "https": false,
    "net": false,
    "path": false,
    "stream": false,
    "tls": false,
    "fs": "empty"
  }
}

npx webpack --config webpack.config.deploy.example.js:

Build Result
Build Result

更新记录

本文首次编辑于 2021-07-16,最近更新于 2025-12-07。项目代码在 Node.js 8.x 上已测试可稳定运行。

版权声明

本文为原创文章,作者保留版权。转载请保留本文完整内容,并以超链接形式注明作者及原文出处。

作者: 除除

原文: http://blog.mazey.net/2180.html

(完)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 解决方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档