基于 Node.js 的服务器自动化部署搭建实录

摘要:本文主要记录我在服务器上使用 GitHub 的 Webhooks 进行网站自动化部署的过程。最终效果:开发终端向 Github 仓库推送代码后,服务器端自动拉取仓库并重启服务器。搭建过程主要参考了 lovelucy.info 的博客。

搭建环境:我正在使用的是 Vultr 的服务器,系统版本是 CentOS 7 x64。

在服务器上安装 Node.js

最简单的方法:从 EPEL 库安装 Node.js

$ sudo yum install epel-release
$ sudo yum install nodejs
// 检查是否成功安装
$ node --version
$ npm --version

(注:未经本人测试,版本可能相对较老。)

我个人搭建过程中使用了 Node.js 官网 的 Linux 二进制文件来安装 Node.js。下载安装包时要留意 Linux 的版本。(X86/X64)

// Node.js 安装目录
$ cd /usr/local/bin // Node.js 官网提供的 Linux 二进制文件
$ wget https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.xz // 解压缩
$ tar xvJf node-v8.12.0-linux-x64.tar.xz // 配置环境变量
$ vi /etc/profile // 添加以下内容到文件末尾 ====================
export NODE_HOME=/usr/local/bin/nodejs export PATH=$PATH:$NODE_HOME/bin export NODE_PATH=$NODE_HOME/lib/node_modules // 添加以上内容到文件末尾 ==================== // 保存退出后source一下,使其立即生效
$ source /etc/profile // 检查是否安装成功
$ node -v
$ npm -v

至此,成功在服务器上安装最新版本的 Node.js。

编写拉取仓库、重启服务器脚本

一个可供参考的例子:deploy.sh

#!/bin/bash

WEB_PATH='/home/nodejs-be-demo'

echo "Start deployment"
cd $WEB_PATH
echo "pulling source code..."
git reset --hard origin/master
git clean -f
git pull
git checkout master
npm install
npm run start
echo "Finished."

配置 Github 仓库的 Webhook 设置

  1. 在要配置的 Github 的设置页面找到 Webhooks 选项,点击「Add webhook」。
  2. 配置 Payload URL(接受 POST 请求的服务器 URL)。
  3. Secret(可以理解为配对暗号)。
  4. Content-type 选择 application/json
  5. 其余默认设置即可。

配置 Node.js 脚本

在配置 Node.js 脚本之前,需要先安装依赖,这里用到了一个中间件github-webhook-handler,以及进程管理服务forever

$ npm install -g github-webhook-handler
$ npm install -g forever

脚本内容如下:deploy.js

var http = require('http')
var createHandler = require('github-webhook-handler')
var handler = createHandler({ path: '/autodeploy', secret: 'mySecret' })
// 上面的 secret 保持和 GitHub 后台设置的一致 function run_cmd(cmd, args, callback) {
var spawn = require('child_process').spawn;
var child = spawn(cmd, args);
var resp = ""; child.stdout.on('data', function(buffer) { resp += buffer.toString(); });
child.stdout.on('end', function() { callback (resp) });
} http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404
res.end('no such location')
})
}).listen(7777)
// 这里是监听的端口号 handler.on('error', function (err) {
console.error('Error:', err.message)
}) handler.on('push', function (event) {
console.log('Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref);
run_cmd('sh', ['./deploy.sh'], function(text){ console.log(text) });
}) /*
handler.on('issues', function (event) {
console.log('Received an issue event for % action=%s: #%d %s',
event.payload.repository.name,
event.payload.action,
event.payload.issue.number,
event.payload.issue.title)
})
*/

这里 Node.js 监听的是 7777 端口,你也可以使用 Nginx 反向代理到 80 端口。

用下面的命令测试一下,接收到 push 之后控制台会有输出:

$ node deploy.js

如果没什么问题,forever 就可以开起来了。

$ forever start deploy.js

其他问题

部署过程中可能遇到无法访问对应端口的问题,需要检查一下服务器的防火墙设置。大部分服务器都是白名单机制,只开放特定的端口。

CentOS 7 下默认使用的防火墙是 FirewallD,之前版本请搜索iptables

另:FirewallD 和 iptables 的区别?

FirewallD 相关命令:

  • 启动服务,并在系统引导式启动该服务

     sudo systemctl start firewalld
    sudo systemctl enable firewalld
  • 停止并禁用

     sudo systemctl stop firewalld
    sudo systemctl disable firewalld
  • 检查防火墙状态。输出应该是 running 或者 not running。

     sudo firewall-cmd --state
  • 允许或拒绝任意端口/协议(如:12345端口,该规则在 public 区域)

     sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent
    sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent
  • 重新加载 FirewallD 使规则立即生效

     sudo firewall-cmd --reload
  • 查看特定区域的所有配置

     sudo firewall-cmd --zone=public --list-all

    示例输出:

     public (default, active)
    interfaces: ens160
    sources:
    services: dhcpv6-client http ssh
    ports: 12345/tcp
    masquerade: no
    forward-ports:
    icmp-blocks:
    rich rules:

更多详细的 FirewallD 配置,请看 CentOS 上的 FirewallD 简明指南

基于 Node.js 的服务器自动化部署搭建实录的更多相关文章

  1. 【Node】node.js实现服务器的反向代理,解决跨域问题

    跨域对于前端来说是一个老大难的问题,许多方法如jsonp.document.domain + iframe...都有或多或少的问题,一个最佳实践就是通过服务器nginx做反向代理,但奈何不懂相关知识, ...

  2. LIGHTX-CMS —— 基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客系统

    概述 LIGHTX-CMS 是我基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客发布系统. 项目本身可以拿来部署个人博客网站,同时我认为其也适合用以新手学习 Node ...

  3. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

  4. node.js 初学(二)—— 搭建注册/登录服务器

    node.js 初学(二)—— 搭建注册/登录服务器 理论上来说,代码实现在理论和实际上是一样的.但实际上来说,他们不是 做一个最简单的用户注册登录功能 1.接口定义: 注册:/user?act=re ...

  5. 译\Node.js应用的持续部署

    Node.js应用的持续部署 翻译前 翻译自:https://blog.risingstack.com/continuous-deployment-of-node-js-applications/ 正 ...

  6. 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具

    认识Web.桌面和移动app新开发模式 - 基于Node.js环境和VS Code工具 一.开发环境的搭建(基于win10) 1.安装node.js和npm 到node.js官网下载安装包(包含npm ...

  7. 基于云原生DevOps服务自动化部署前端项目学习总结

    本文主要以部署前端Vue项目为例,讲述了如何基于云原生DevOps服务自动化部署前端项目~从开发完成到线上环境,我们只需提交代码即可~ 一.引言 作为一名开发人员,日常工作中我们除了需要负责代码的开发 ...

  8. 基于Node.js + jade + Mongoose 模仿gokk.tv

    原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 关于gokk 大学的娱乐活动基本就是在寝室看电影了→_→,一般都会选择去goxiazai.cc上看,里面的资源多,质量高 ...

  9. 基于Node.js的强大爬虫 能直接发布抓取的文章哦

    基于Node.js的强大爬虫 能直接发布抓取的文章哦 基于Node.js的强大爬虫能直接发布抓取的文章哦!本爬虫源码基于WTFPL协议,感兴趣的小伙伴们可以参考一下 一.环境配置 1)搞一台服务器,什 ...

随机推荐

  1. linux 指定ftp用户 特定目录及权限

    Linux添加FTP用户并设置权限   在linux中添加ftp用户,并设置相应的权限,操作步骤如下:  1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建 ...

  2. Windows10永久激活的工具

    最近发现一个很好用的Windows10 永久激活的工具,比KMS什么的管用,而且无毒无公害.几乎支持所有的win10版本.感兴趣的朋友可以试试.之前win10没洗白的同学,也试试吧,说不定就洗白了呢. ...

  3. 牛客小白月赛12 J 月月查华华的手机 (序列自动机模板题)

    链接:https://ac.nowcoder.com/acm/contest/392/J 来源:牛客网 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机.月月出于人类最单纯的好奇 ...

  4. SQL注入--盲注及报错注入

    盲注查询 盲注其实就是没有回显,不能直观地得到结果来调整注入数据,只能通过其他方式来得到是否注入成功,主要是利用了一些数据库内置函数来达到的 布尔盲注 布尔很明显Ture跟Fales,也就是说它只会根 ...

  5. Codeforces 837E Vasya's Function 数论 找规律

    题意:定义F(a,0) = 0,F(a,b) = 1 + F(a,b - GCD(a,b).给定 x 和 y (<=1e12)求F(x,y). 题解:a=A*GCD(a,b) b=B*GCD(a ...

  6. jvm中的新生代Eden和survivor区

    1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  7. 对比MySQL,你究竟在什么时候更需要MongoDB(转载)

    你期望一个更高的写负载 万美元的交易. 不可靠环境保证高可用性 设置副本集(主-从服务器设置)不仅方便而且很快,此外,使用MongoDB还可以快速.安全及自动化的实现节点(或数据中心)故障转移. 未来 ...

  8. 原型模式故事链(5)--JS变量作用域、作用域链、闭包

    上一章 JS执行上下文.变量提升.函数声明 传送门:https://segmentfault.com/a/11... 本次我们主要讲讲变量作用域和闭包变量作用域:顾名思义:变量起作用的范围.变量分为全 ...

  9. echarts实践用法

    在折线图中,当点击某个节点,出现提示浮框,并且可以进行点击操作 echarts 配置 tooltip: { show: true, formatter: function(e) { return 'a ...

  10. 处理并解决mysql8.0 caching-sha2-password问题,开启远程访问

    原文:https://blog.csdn.net/u010026255/article/details/80062153 启动mysql服务:service mysqld start ALTER US ...