基于 Node.js 的服务器自动化部署搭建实录
基于 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 设置
- 在要配置的 Github 的设置页面找到 Webhooks 选项,点击「Add webhook」。
- 配置 Payload URL(接受 POST 请求的服务器 URL)。
- Secret(可以理解为配对暗号)。
- Content-type 选择
application/json。 - 其余默认设置即可。
配置 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 的服务器自动化部署搭建实录的更多相关文章
- 【Node】node.js实现服务器的反向代理,解决跨域问题
跨域对于前端来说是一个老大难的问题,许多方法如jsonp.document.domain + iframe...都有或多或少的问题,一个最佳实践就是通过服务器nginx做反向代理,但奈何不懂相关知识, ...
- LIGHTX-CMS —— 基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客系统
概述 LIGHTX-CMS 是我基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客发布系统. 项目本身可以拿来部署个人博客网站,同时我认为其也适合用以新手学习 Node ...
- Fenix – 基于 Node.js 的桌面静态 Web 服务器
Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...
- node.js 初学(二)—— 搭建注册/登录服务器
node.js 初学(二)—— 搭建注册/登录服务器 理论上来说,代码实现在理论和实际上是一样的.但实际上来说,他们不是 做一个最简单的用户注册登录功能 1.接口定义: 注册:/user?act=re ...
- 译\Node.js应用的持续部署
Node.js应用的持续部署 翻译前 翻译自:https://blog.risingstack.com/continuous-deployment-of-node-js-applications/ 正 ...
- 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具
认识Web.桌面和移动app新开发模式 - 基于Node.js环境和VS Code工具 一.开发环境的搭建(基于win10) 1.安装node.js和npm 到node.js官网下载安装包(包含npm ...
- 基于云原生DevOps服务自动化部署前端项目学习总结
本文主要以部署前端Vue项目为例,讲述了如何基于云原生DevOps服务自动化部署前端项目~从开发完成到线上环境,我们只需提交代码即可~ 一.引言 作为一名开发人员,日常工作中我们除了需要负责代码的开发 ...
- 基于Node.js + jade + Mongoose 模仿gokk.tv
原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 关于gokk 大学的娱乐活动基本就是在寝室看电影了→_→,一般都会选择去goxiazai.cc上看,里面的资源多,质量高 ...
- 基于Node.js的强大爬虫 能直接发布抓取的文章哦
基于Node.js的强大爬虫 能直接发布抓取的文章哦 基于Node.js的强大爬虫能直接发布抓取的文章哦!本爬虫源码基于WTFPL协议,感兴趣的小伙伴们可以参考一下 一.环境配置 1)搞一台服务器,什 ...
随机推荐
- 14Filter&Listener
1.Filter:过滤器 1.1 概念 生活中的过滤器:净水器,空气净化器,土匪. web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能. 过滤器的作用: 一般用于完成 ...
- ffmpeg函数03__av_seek_frame()
当需要把视频跳转到N秒的时候可以使用下面的方法:int64_t timestamp = N * AV_TIME_BASE; av_seek_frame(fmtctx, index_of_video, ...
- 采用线性回归方法降低双目测距到平面的误差(sklearn)
继上篇,为了改善标定板的深度信息: remove_idx1 = np.where(Z <= 0) remove_idx2 = np.where(Z > 500)#将Z轴坐标限定在0-500 ...
- Newsgroups数据集研究
1.数据集介绍 20newsgroups数据集是用于文本分类.文本挖据和信息检索研究的国际标准数据集之一. 数据集收集了大约20,000左右的新闻组文档,均匀分为20个不同主题的新闻组集合. 一些新闻 ...
- BeanUtils对象属性copy的性能对比以及源码分析
1. 对象属性拷贝的常见方式及其性能 在日常编码中,经常会遇到DO.DTO对象之间的转换,如果对象本身的属性比较少的时候,那么我们采用硬编码手工setter也还ok,但如果对象的属性比较多的情况下,手 ...
- CSS 分类 (Classification)
★★CSS 分类属性 (Classification)★★ ⑴CSS 分类属性允许你控制如何显示元素,设置图像显示于另一元素中的何处,相对于其正常位置来定位元素,使用绝对值来定位元素,以及元素的可见度 ...
- C语言 - strcmp和strncmp的编程实现及总结
一.strcmp和strncmp的编程实现及总结 1.strcmp函数的实现 要求: 原型: int strcmp(char *dest,char * src,int n); 头文件:# ...
- matplotlib中plt.scatter()参数详解
scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, l ...
- HDU 5249:KPI(权值线段树)
KPI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Desc ...
- 安装破解confluence6.7.1(插图丢了,一直懒得补)
JIRA安装:https://www.cnblogs.com/wei9593/p/10194784.html 1环境: centos7.2 java-1.8https://www.cnblogs. ...