Node服务一键离线部署

背景说明

项目测试通过,到了上线部署阶段。部署的机器安全限制比较严格,不允许访问外网。此外,没有对外网开放ssh服务,无法通过ssh远程操作。

针对上面提到的两条限制条件,通过下面方式解决:

  • 无法访问外部网络:将依赖的环境本地下载,打包上传,离线安装;
  • 无法ssh远程操作:将安装/初始化步骤脚本化,安装包交给运维人员,一键部署;

安装包说明

让运维同学将安装包置于/data/my_install下。安装包大致如容如下。其中install_scripts目录中,存放的是部署相关的脚本。

[root@localhost my_install]# tree -L 1
.
├── control # 各种服务控制脚本
├── install_scripts # 安装脚本
├── node-v5.11.1-linux-x64 # node二进制包
├── npm_modules_global_offline # 全局的npm模块,比如 pm2
├── express_svr # express应用
└── uninstall_scripts # 卸载脚本

部署脚本说明

[root@localhost install_scripts]# tree -L 1
.
├── install_node.sh # 安装nodejs
├── install_npm_moduels.sh # 安装npm模块
├── install_run_service.sh # 启动服务
├── install_express_svr.sh # 部署express应用
└── install.sh # 部署总入口

Node安装

看下nodejs安装脚本。为了安装快些,这里我们采用的是编译好的二进制文件。只需要将相关文件拷贝到指定路径即可。

Node安装包说明

以下是nodejs@v5.11.1的目录。

[root@localhost node-v5.11.1-linux-x64]# tree -L 2
.
├── bin
│   ├── node # node可执行文件
│   └── npm -> ../lib/node_modules/npm/bin/npm-cli.js # npm可执行文件,其实是个软链接
├── CHANGELOG.md
├── include # 各种包含文件
│   └── node
├── lib
│   └── node_modules # npm模块安装目录
├── LICENSE
├── README.md
└── share
    ├── doc
    ├── man # 说明文件
    └── systemtap

拷贝路径说明如下

本地路径 拷贝到的路径 备注
./bin/node /usr/local/bin/node node可执行文件
./bin/npm /usr/local/bin/node npm可执行文件,软链接,指向 /usr/local/lib/node_modules/npm/bin/npm-cli.js
./lib/node_modules/ /usr/local/lib/ npm模块安装目录
./include/node /usr/local/include/ 各种包含文件
./share/man/man1/node.1 /usr/local/man/man1/ 使用说明

安装脚本

install_node.sh

[root@localhost install_scripts]# cat install_node.sh
#!/bin/bash
# 安装nodejs

cd /data/my_install/
cd node-v5.11.1-linux-x64/

cp -r ./lib/node_modules/ /usr/local/lib/ # copy the node modules folder to the /lib/ folder
cp -r ./include/node /usr/local/include/ # copy the /include/node folder to /usr/local/include folder
mkdir -p /usr/local/man/man1 # create the man folder
cp ./share/man/man1/node.1 /usr/local/man/man1/ # copy the man file
cp ./bin/node /usr/local/bin/ # copy node to the bin folder
ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm ## making the symbolic link to npm

全局npm模块安装

这里我们就用到了pm2,需要全局安装。根据npm全局模块的安装方式,需要分两步

  • 将pm2模块目录拷贝到/usr/local/lib/node_modules下。
  • /usr/local/bin/下,建立软链接,指向/usr/local/lib/node_modules/pm2/bin/下的可执行文件。

pm2安装说明

首先,把pm2包下载下来,这步略。我在这里放到了npm_modules_global_offline目录下,以防以后还有其他全部模块要一起安装。

软链接映射关系如下

目标文件路径 源文件路径
/usr/local/bin/pm2 /usr/local/lib/node_modules/pm2/bin/pm2
/usr/local/bin/pm2-dev /usr/local/lib/node_modules/pm2/bin/pm2-dev

安装脚本

install_npm_moduels.sh

#!/bin/bash
# 安装全局npm模块

cd /data/my_install/
cd npm_modules_global_offline/

cp -rf ./node_modules/* /usr/local/lib/node_modules/
ln -s /usr/local/lib/node_modules/pm2/bin/pm2 /usr/local/bin/pm2
ln -s /usr/local/lib/node_modules/pm2/bin/pm2-dev /usr/local/bin/pm2-dev

Express应用安装

express应用的安装相对比较简单,本地npm install后,连同node_modules目录一起打包即可。

脚本如下,把express_svr拷贝到指定路径即可。

install_express_svr.sh

#!/bin/bash
# 安装express应用

cd /data/my_install/

if [ ! -d "/data/web/express_svr" ]; then
  mkdir /data/web/express_svr
fi

cp -rf ./express_svr/* /data/express_svr/

一键部署脚本

简易版本

其实没那么玄乎,无非就是再写个脚本,统一调用下前面提到的脚本。奏是这么简单。

install.sh

./install_node.sh
./install_npm_moduels.sh
./install_otc_svr.sh
./install_run_service.sh

运行:

./install.sh

进一步完善

上面脚本的缺陷比较明显,没有进度提示,也没有运行状态提示。于是优化一下,虽然也不能算是完善,但相比之前的版本的确会好很多。

#!/bin/bash

commands=(
./install_node.sh "install nodejs"
./install_npm_moduels.sh "install npm modules"
./install_express_svr.sh "install express application"
./install_run_service.sh "start services"
)

commands_len=${#commands[@]}

for (( i=0; i<$commands_len; i=i+2 ))
do
    desc_index=i+1
    desc=${commands[$desc_index]}

    echo -e $desc" - starts ..."

    ${commands[$i]}

    if [ "$?" ==  "0" ]; then
      echo -e $desc" - ok \n"
    else
      echo -e $desc" - failed ! \n"
    fi
done

运行看下效果:

install nodejs - starts ...
install nodejs - ok 

install npm modules - starts ...
install npm modules - ok 

install express application - starts ...
install express application - ok 

start services - starts ...
# pm2启动日志,一大坨,这里忽略
start services - ok

一键卸载脚本

从上面的内容可以看到,离线部署的过程,主要包含了几个操作

  • 文件拷贝
  • 建立软连接
  • 启动服务

那么,卸载无非就是上面几个步骤的反操作。脚本大致如下,跟前面的部署脚本其实是一一对应的。这里就不再赘述。

[root@localhost uninstall_scripts]# tree -L 1
.
├── uninstall_run_service.sh
├── uninstall_node.sh
├── uninstall_npm_modules.sh
├── uninstall_express_svr.sh
└── uninstall.sh

写在后面

文中提及的node服务离线部署,应该已经可以涵盖大部分的场景,举一反三即可。当然更富在的场景还有,这里就不再展开。

时间: 2024-08-02 23:24:24

Node服务一键离线部署的相关文章

在阿里云HPC上用容器服务一键部署和运行WRF解决方案

背景 众所周知,容器技术的出现深刻改变了软件交付的方式: 敏捷: 秒级应用启动.轻量级隔离.细粒度资源控制.低性能损耗 标准化:版本管理可追溯. 可移植性: 环境无关的交付.部署方式:可用于软件生命周期中不同运行环境.这些能力不但影响了企业软件的开发.构建和交付模式,提高了交付效率和可靠性,也对于像WRF(Weather Research Forecast)这类大型开源气象科学预报软件产生了潜移默化的影响.美国国家大气研究中心(NCAR,也是WRF的开发方)于2016年开源了自己的容器化解决方案

Cloud Foundry 登录 Azure,一键快速部署 PaaS

微软宣布在Azure云端平台上,推出Cloud Foundry的公共预览版,可提供快速部署机制,让开发者一键就能用Cloud Foundry打造出自家PaaS环境.微软预计未来数周内释出公共测试版,几个月后推出正式版. 微软Azure资深专案主管Ning Kuang表示,在Azure资源管理(Resource Manager)机制中提供了Cloud Foundry部署模板,可提供一键快速部署Cloud Foundry,可简化企业将其他公有云服务或企业内部私有云上的Cloud Foundry工作负

离线部署额外域控制器,Active Directory系列之六

在上篇博文中我们介绍了部署额外域控制器的意义,同时介绍了如何在线部署额外域控制器,也就是额外域控制器通过网络以在线方式从复制伙伴那里获取Active Directory数据.在线部署额外域控制器是我们部署额外域控制器时的首选,它方便易行,在拥有快速网络连接的环境下使用非常合适.但我们也要考虑另外一种场景,域控制器之间是通过低速网络连接的!如果域控制器之间的网络质量不理想,例如有的域控制器需要部署到非洲,那我们就不能希望获得一个高速,稳定,可靠的通讯网络.在这种情况下,如果我们还使用在线方式部署额

阿里云容器服务体验: 部署 ShellPays 条码支付整合服务平台 -- (一)系统概要与环境准备

此平台系统已在多种计算环境上进行部署,并且投入生产.本文所述方案是为了参与阿里云容器服务公测.如要投入实际使用,需要跟据实际计算环境调整相关参数,并且需要与支付服务机构签订收单协议,比如:支付宝钱包,微信支付等.还会产生阿里云的资源租用费. 系统概要 此平台系统在于帮助用户,快速.低成本.方便的统一接入多种条码支付收单业务.平台系统采用了多种技术手段的整合,比如:动静分离.OSGi.容器服务等.注:系统架构超过了当前所承载业务的需求 环境准备 1. 注册阿里云账号,并创建 AccessKey 创

基于YARN与Docker实现分布式Web服务的自动化部署运维工具

问题描述 部署运维工具主要有以下需求:-面向服务实例LTS类业务组件,不考虑数据库.缓存等基础组件-实现对这些分布式服务进行自动化部署.启停与伸缩-要能够支持自动部署与固定部署混合-自动部署,不指定主机,不指定端口-服务实例分配允许指定主机范围-固定部署,指定主机与端口,匹配传统需求-服务实例服务注册与查询-服务日志存储日志收集需求-数据存储共享存储需求挂共享存储-其他需求,配置界面与监控界面各位大神有没有实现思路与案例? 解决方案

请问安卓商城的服务端如何部署(使用的structs2+hibernate框架)

问题描述 请问安卓商城的服务端如何部署(使用的structs2+hibernate框架) 最近从网上下载了一个android应用的源码,源码有2个工程,客户端和服务端,服务端是用struts2+hibernate框架搭建的.想自己运行一下试试,在android模拟器里应用可以成功加载上但打开只有只有一个layout的框架,没有内容,应该是没有连接到服务端读不出数据库内容所致.在客户端里改了connectWeb类里的请求url,在服务端里我在myeclipse添加了tomcat6.0,然后改了hi

Adobe周一宣布全面转向云服务,离线软件六月起停止更新

Adobe 周一宣布公司将全面转向云服务,将此前一次性出售离线软件的盈利模式转为按月收费的用户订阅云服务模式. Adobe 的系列软件从十年前起便以 http://www.aliyun.com/zixun/aggregation/16466.html">Creative Suite 套装的形式存在,用户可以单独购买其中的一款或几款软件,也可以以套装为单位购买.去年 Adobe 发布的该套装软件的在线云服务 Creative Cloud,用户可以付费购买该服务,当时 Adobe 并没有计划今

单独写的一个socket服务应该怎么部署?部署到哪个平台?

问题描述 RT:想问下:我通过java代码实现了一个socket服务端(可以启动socket服务,接收客户端请求,给客户端回复响应),在eclipse中调试启动服务,调测是OK的:但是这个服务怎么才能集成或部署到一个类似于jetty或tomcat容器中呢?(而不是每次通过eclipse启动),知道的能告诉我一个具体方法吗?感激! 解决方案 应该是c/s程序吧,直接在服务器上调用java命令运行main类就行,就像我们开始学习java时需要手动编译运行一样,先javac编译,再java运行你把在你

MBaaS服务特性和部署策略

移动应用需要保持7x24小时在线,这一特点使得移动后端即服务(MBaaS)成为运行业务逻辑和进行数据分析的天然选择.本文中,作者对云后端服务进行了全面介绍. 任何一家企业,都需要明确的移动战略来保持竞争优势.当你还在通过智能手机构建通讯和计算平台.客户与员工应用时,你的竞争对手们可能已经开始用应用提供新服务.实现业务流程流水化了. IT在企业的数字化战略开发和实施中占据关键性的地位.CIO必须理解真正理解移动战略的诉求,并积极采取措施克服企业的惰性.技术及文化的挑战:由于缺乏相应的技能.预算吃紧