部署 如何优雅地部署 Rails 项目到大量客户服务器,并且让客户手动更新版本?

msg7086 · 2015年07月17日 · 最后由 wppurking 回复于 2015年07月20日 · 3065 次阅读

背景

有两个 Rails 项目,一个是主应用,另一个是管理界面(改一些系统配置,升级主应用,etc)。

原先的系统全程 puppet 管理,管理界面直接覆盖文件,主应用则是自动更新 git 库。管理界面的后台去找 git tag 再显示在界面上由用户点击后 git checkout 到指定版本。

用户的话,就假定有 50 个客户公司,每个公司 1 台设备好了。

现在打算翻新整个部署流程,用 mina 来部署 Rails 应用。

问题

  1. 管理界面本来是由 puppet 直接覆盖到客户机上的。如果改用 mina 合适吗?有没有可能批量部署? (这个不需要征得客户同意就可以更新)

  2. 主应用是先由 puppet 更新到 git,再由管理界面用户自己选定版本签出。如果改用 mina 的话要怎么实现呢? 我初步只想到可以先由 puppet 签出到客户服务器上,然后再由客户从本地 git 目录 mina 部署到本地 web 目录。

你们怎么看?

尝试下 docker ?

数据,状态存 DB, 更新/重启直接对 image 操作就好。

#1 楼 @wppurking 那部署的话,直接替换 docker 镜像吗?

另外忘了说一点了。主应用涉及到一些比较核心的操作,比如启动 xen 虚拟机、建立虚拟网卡之类的操作。

@msg7086 如果一定需要重启服务器 Docker 则帮不上忙了,你们更新 rails 应用需要重启 XEN , 建立虚拟网卡那么多事啊?

使用 Docker 可以简化到给客户更新本地应用一个 Image 镜像,然后 docker run 即可。镜像是可以类似 git 那样有版本以及差异化叠加的。想象一下:"更新代码-> 自动化生成 Docker Image -> 客户服务器 docker stop/pull/run[停止/更新/启动]" 然后就正常了。

#3 楼 @wppurking 不是更新应用需要,而是主应用本来就是虚拟机操作面板(之类的,只是业务上还有些不同),本身就跑在比如说 Xen 的 Dom0 上的。如果是 docker 的话,能透过 docker 的隔离去调用系统本身的 su 等级的程序么?

@msg7086 不行... 如果是 docker 的 container 运行,那么应用在 container 内是不感知也不推荐想办法去操作宿主机的。在 container 内执行 sudo 级别的操作,也只能影响 container 内不影响宿主机。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号