提供Node.JS webapp"手中的密钥"

Ran*_*lue 8 linux packaging web-applications node.js

我正在为客户端构建一个简单的Node.JS应用程序.webapp应该易于部署在每个服务器实例(RedHat EL 6.3)上,"密钥在手".

打包Node.JS应用程序的最佳方法是什么?基本上,我需要一个"安装程序"或"包"来:

  • 安装Node.JS
  • 安装依赖项(npm install)
  • 填充应用程序文件(CSS,JS,HTML等)

Pet*_*ons 8

你应该提供一个独立的包.请查看伟大的网站The Twelve-Factor App,特别是构建,发布,运行部分.来自该网站的经验丰富的运营工程师有很多来之不易的智慧.

  • 在你的应用程序的repo中,编写一个可以生成可分发存档的脚本(shell,节点等等)
  • RPM或tar存档是您最明智的选择.tar更便携,更简单.RPM可以很好地与基于RPM的发行版集成.如果你没有做过很多软件包装/管理工作,我建议从tar开始.RPM比tar要复杂得多.
  • tar存档应该在其中嵌入node.js文件.这将使您的应用程序易于安装,并避免共享系统范围的节点安装,从而创建人工耦合.如果你使用RPM路由,你可以在RPM规范文件中指定node作为依赖项(但你可能不应该 - 见下文).
  • 存档也应嵌入所有npm依赖项.不要npm install在包安装时运行.考虑使用npm shrinkwrap工具在开发期间管理依赖项,但在部署时,它们应该预先捆绑并准备运行.

具体来说,这些是你应该避免的坏主意:

  • 安装期间请勿从Internet下载任何内容.这是脆弱的,缓慢的,可能会给你带来不幸的惊喜,包括安全问题
  • 不要在可以在构建时构建的安装时构建工件.因此,预先构建CSS文件,requirejs优化文件,预编译二进制文件等.

至于您的应用程序RPM是否应将node.js列为依赖项或将节点嵌入到RPM中,以下是需要考虑的一些要点.

  • 将node.js嵌入到您的RP​​M中
    • 单个.rpm文件分发
    • 允许您的应用程序严格控制它使用的节点版本.(见下文)
    • 可靠性更高.事实上,您的应用程序可能至少与您开发的node.js的次要版本(例如0.8.x)或甚至补丁版本(例如> = 0.8.12 <0.9)紧密耦合.最好允许node.js将您的应用与操作系统分离,但不要误以为您的应用程序可以在不同版本的node.js上可靠地运行而无需进行测试和调整.最常见的是,现在操作系统上只运行了1个应用程序,并且在应用程序之间共享节点的概念错误地通过适当的解耦和应用程序的操作独立性来限制磁盘空间的保留.
    • 目前还不清楚在yumland是否有任何正式/可靠的预制RPM将"正常工作".
  • 将node.js指定为PRM的依赖项
    • 遵循操作系统包管理的一般理念(避免重复,节省磁盘空间等)
    • RPM提供超出TAR的功能,包括库存管理,卸载,升级等.由于您提出这个问题,您可能还没准备好正确解决这些问题,因此您可能希望从tar开始,一旦您对此有了充分的了解,考虑RPM升级脚本等.
    • 一旦您的应用程序开始使用数据库或3,支持用于电子邮件,日志聚合器等的守护程序,"单个文件分发"的好点很快就会变得站不住脚.