我希望将有关在我运行的服务器(而不是 Heroku)上部署 Rails 应用程序的当前最佳实践的信息汇总在一起。该应用程序由多人开发,他们都有权限部署它。该应用程序将在可能有多个应用程序的服务器上运行。
- 将 Apache 或 Nginx 与 Passenger 结合使用
- 我使用 Ubuntu,但这应该不会有太大区别。
- Capistrano 似乎是向服务器推送的最佳方式。
现在我有一些疑问:
- 要不要用 RVM?Passenger 只能使用一个版本的 Ruby,所以没什么用,不是吗?
- 您将如何构建用户权限和 ssh 密钥?我的想法是,您肯定不希望用户是“您自己”(例如,服务器上的 dnw),而是一个角色帐户。Ubuntu 的 www-data 对此是否合理,或者最好创建一个不同的用户?每个应用程序一个?如果有人在 Web 应用程序中发现漏洞,这些用户应该具有什么样的配置(例如,/etc/passwd 中的 shell、组等)才能使系统尽可能安全?您将使用什么样的 capistrano 配方来实现这一点?
- 现在,我们将 git 也加入进来:git 需要能够从 git 服务器中无密码提取数据,因此需要进行一些密钥交换。远程 git 设置应该是什么样子才能让一切变得安全可靠?
- 还有什么我没有涉及的吗?
答案1
- Nginx/unicorn(Passenger 带来的麻烦比它的价值更大,特别是当你处理多个 Ruby 版本时)。由 daemontools 管理的 Unicorns /真主,因为上帝让我感到不安。
- rbenv 而不是 RVM(rbenv 的设计目标是做一件事并把它做好,而不是像 RVM 那样“把所有事情都做一半,做一半”)。
- 每个应用程序的用户,为每个有权管理每个单独应用程序的开发人员提供 SSH 密钥。
- 您可以以独立用户身份运行应用程序本身,并使用 ACL 来允许仅访问应用程序所需的文件系统部分;此应用程序用户不应允许登录。我个人认为这有点过分,但如果您想要进行一些渐进式分离,这也是可行的。
- Capistrano 是另一个“痛苦的半成品”工具;我推荐快点,尽管这可能是因为我写的。