通过 Git 在 Ubuntu 14.04 上部署我的 Rails 应用程序
Deploying my Rails app via Git on an Ubuntu 14.04
我需要在新服务器上部署我的 rails 应用程序,目前真的不知道如何进行。我阅读了很多指南和 tuts,但由于我对一般部署了解不多,我希望得到一些直接帮助。
所以我开始做的是:
- 通过 ssh-key 将我的 Rails 应用程序从本地系统推送到 git 存储库
- 正在 Ubuntu 服务器上安装 Rails
- 正在 Ubuntu 服务器上安装 Postgres
- 在 Ubuntu 服务器上创建一个 Postgres 用户
- 正在创建一个 ssh 密钥以将我的服务器连接到我的 git 帐户
现在我知道可以使用 "hooks" 从服务器上的 git 存储库推送我的数据,但我不知道如何操作。此外,我不确定我是否需要在我的服务器上创建一个数据库以及我必须如何处理 database.yml
(是否足以为生产部分设置用户和密码?)。最后但同样重要的是,我不确定使用 git 是否安全,或者我是否需要配置或安装其他任何东西以获得基本的安全级别。
如有任何建议,我将不胜感激。
编辑:
已关注此 guide to set up capistrano。在第 7 步,我收到以下错误消息:
[6359a9ec] Warning: Permanently added 'github.com,192.30.252.130' (RSA) to the list of known hosts.
[6359a9ec]
[6359a9ec] Error reading response length from authentication socket.
[6359a9ec]
[6359a9ec] Permission denied (publickey).
[6359a9ec]
[6359a9ec] fatal: Could not read from remote repository.
[6359a9ec]
[6359a9ec]
[6359a9ec] Please make sure you have the correct access rights
[6359a9ec]
[6359a9ec] and the repository exists.
[6359a9ec]
我建议您查看 TeamCity by JetBrains。我知道这是您必须学习的另一种工具,但从长远来看,它会节省您的时间 运行。
基本上,我认为您可能希望设置部署管道。因此,您需要将应用程序依赖的所有依赖项安装在某处的另一台服务器上。
对于 Rails 应用程序,这将是 ruby、捆绑器和 rails gem 的所有依赖项,一个 javascript 运行time like 节点,postgres,也许还有其他一些东西。我正在胡思乱想,所以我相信您需要安装的不仅仅是这些。我还建议使用 ruby 版本管理工具,如 rbenv。有些人也喜欢自动安装所有这些依赖项,但现在手动安装可能更简单。
基本上 TeamCity 要做的是允许您定义存储库的 url,它可能位于 Bitbucket 或 Github,并让您定义应该采取的一系列步骤构建和部署您的应用程序。该应用程序可以部署到您安装 TeamCity 的同一台服务器上。我认为这对您来说是最简单的,至少目前是这样。
每当我在 TeamCity 中设置部署管道时,部署过程看起来类似于:
1) 我进行了更改并将我的代码推送到存储库。 (通常是 Bitbucket 或 Github)。
2) TeamCity 发现了这一变化并提取了 Rails 应用程序的源代码。
3) TeamCity 运行s bundle install
获取我的 Rails 应用程序需要的任何 gem。
4) TeamCity 运行 是我的测试。如果失败,它会停止构建并给我发一封电子邮件。 (您可以在 TeamCity 中配置 SMTP 设置。我建议使用 Mandrill,因为在这种规模下它是免费的。)
5) 测试 运行 成功后,TeamCity 然后将源代码复制到部署目录(通常类似于 /var/www/myApp/)。
6) 最后,一个命令是 运行 重新启动用于为您的 Rails 应用提供服务的任何服务器。它可能是 Thin、Unicorn 或其他。有时我会把它放在 Nginx 后面并使用 reverse-proxying 来负载平衡所有 Rails 应用程序实例。
这需要一点时间,但是一旦您掌握了它,您所做的每个项目都会有某种部署管道。我的第一次设置花了 2 周时间。
之后,当您只需更改代码并使用 git 将其推送到互联网上时,它会让您露出笑容。
编辑:
并具体回答您的问题:
Furthermore I am not sure if I need to create a database on my server and how I have to handle the database.yml (is it enough to set the user and password for the production part?)
在 rails 的当前版本中,我认为生产数据库凭据存储在机器本身的环境变量中。您可以根据需要存储凭据,只要它们不可公开访问即可。如果您的应用程序的源代码是私有的,那么您可以将其存储在 .yml 文件中。如果没有,则要么将生产 YAML 文件置于源代码控制之外,然后自行将其复制到部署服务器,要么使用环境变量。如果您使用 TeamCity,则可以在 TeamCity 本身中设置这些变量。
Last but not least I am not sure if using git is secure or if I need to configure or install anything else to get a basic level of security.
Git 是安全的,是的。但是像许多工具一样,它可以以不安全的方式使用。在推送和拉取代码时始终尝试使用 git、ssh 或 https 协议,你会没事的。
编辑 2:
我不建议在代码更改时自动部署生产环境应用程序。在 TeamCity 中,您应该有一个自动部署的测试版环境,一旦它经过全面测试,您就可以点击一个按钮并将这些更改部署到生产环境中。
首先,installing/running postgres 不应成为您的 rails 部署设置的一部分。也许,在未来的某个时候,postgres 甚至不会 运行 与您的 rails 应用程序在同一台机器上。
至于你的rails问题,我只能建议你看一下capistrano,它可以做你描述的任何事情并且稳定,battle-tested和开源。它比另一个答案中描述的 TeamCity 应用程序少得多,因此设置起来更简单。配置后,工作流程非常简单:
- git推
- 上限部署
capistrano 然后将提取新代码,使用捆绑器安装您的依赖项,运行 需要时迁移并重新启动您的 rails 应用程序服务器。它还将处理 database.yml 和其他不在您的存储库中的秘密文件(通过符号链接)。最后,如果你不小心部署了一些不好的东西,你也可以轻松回滚。
tldr: 使用 capistrano.
我需要在新服务器上部署我的 rails 应用程序,目前真的不知道如何进行。我阅读了很多指南和 tuts,但由于我对一般部署了解不多,我希望得到一些直接帮助。
所以我开始做的是:
- 通过 ssh-key 将我的 Rails 应用程序从本地系统推送到 git 存储库
- 正在 Ubuntu 服务器上安装 Rails
- 正在 Ubuntu 服务器上安装 Postgres
- 在 Ubuntu 服务器上创建一个 Postgres 用户
- 正在创建一个 ssh 密钥以将我的服务器连接到我的 git 帐户
现在我知道可以使用 "hooks" 从服务器上的 git 存储库推送我的数据,但我不知道如何操作。此外,我不确定我是否需要在我的服务器上创建一个数据库以及我必须如何处理 database.yml
(是否足以为生产部分设置用户和密码?)。最后但同样重要的是,我不确定使用 git 是否安全,或者我是否需要配置或安装其他任何东西以获得基本的安全级别。
如有任何建议,我将不胜感激。
编辑:
已关注此 guide to set up capistrano。在第 7 步,我收到以下错误消息:
[6359a9ec] Warning: Permanently added 'github.com,192.30.252.130' (RSA) to the list of known hosts.
[6359a9ec]
[6359a9ec] Error reading response length from authentication socket.
[6359a9ec]
[6359a9ec] Permission denied (publickey).
[6359a9ec]
[6359a9ec] fatal: Could not read from remote repository.
[6359a9ec]
[6359a9ec]
[6359a9ec] Please make sure you have the correct access rights
[6359a9ec]
[6359a9ec] and the repository exists.
[6359a9ec]
我建议您查看 TeamCity by JetBrains。我知道这是您必须学习的另一种工具,但从长远来看,它会节省您的时间 运行。
基本上,我认为您可能希望设置部署管道。因此,您需要将应用程序依赖的所有依赖项安装在某处的另一台服务器上。
对于 Rails 应用程序,这将是 ruby、捆绑器和 rails gem 的所有依赖项,一个 javascript 运行time like 节点,postgres,也许还有其他一些东西。我正在胡思乱想,所以我相信您需要安装的不仅仅是这些。我还建议使用 ruby 版本管理工具,如 rbenv。有些人也喜欢自动安装所有这些依赖项,但现在手动安装可能更简单。
基本上 TeamCity 要做的是允许您定义存储库的 url,它可能位于 Bitbucket 或 Github,并让您定义应该采取的一系列步骤构建和部署您的应用程序。该应用程序可以部署到您安装 TeamCity 的同一台服务器上。我认为这对您来说是最简单的,至少目前是这样。
每当我在 TeamCity 中设置部署管道时,部署过程看起来类似于:
1) 我进行了更改并将我的代码推送到存储库。 (通常是 Bitbucket 或 Github)。
2) TeamCity 发现了这一变化并提取了 Rails 应用程序的源代码。
3) TeamCity 运行s bundle install
获取我的 Rails 应用程序需要的任何 gem。
4) TeamCity 运行 是我的测试。如果失败,它会停止构建并给我发一封电子邮件。 (您可以在 TeamCity 中配置 SMTP 设置。我建议使用 Mandrill,因为在这种规模下它是免费的。)
5) 测试 运行 成功后,TeamCity 然后将源代码复制到部署目录(通常类似于 /var/www/myApp/)。
6) 最后,一个命令是 运行 重新启动用于为您的 Rails 应用提供服务的任何服务器。它可能是 Thin、Unicorn 或其他。有时我会把它放在 Nginx 后面并使用 reverse-proxying 来负载平衡所有 Rails 应用程序实例。
这需要一点时间,但是一旦您掌握了它,您所做的每个项目都会有某种部署管道。我的第一次设置花了 2 周时间。
之后,当您只需更改代码并使用 git 将其推送到互联网上时,它会让您露出笑容。
编辑:
并具体回答您的问题:
Furthermore I am not sure if I need to create a database on my server and how I have to handle the database.yml (is it enough to set the user and password for the production part?)
在 rails 的当前版本中,我认为生产数据库凭据存储在机器本身的环境变量中。您可以根据需要存储凭据,只要它们不可公开访问即可。如果您的应用程序的源代码是私有的,那么您可以将其存储在 .yml 文件中。如果没有,则要么将生产 YAML 文件置于源代码控制之外,然后自行将其复制到部署服务器,要么使用环境变量。如果您使用 TeamCity,则可以在 TeamCity 本身中设置这些变量。
Last but not least I am not sure if using git is secure or if I need to configure or install anything else to get a basic level of security.
Git 是安全的,是的。但是像许多工具一样,它可以以不安全的方式使用。在推送和拉取代码时始终尝试使用 git、ssh 或 https 协议,你会没事的。
编辑 2:
我不建议在代码更改时自动部署生产环境应用程序。在 TeamCity 中,您应该有一个自动部署的测试版环境,一旦它经过全面测试,您就可以点击一个按钮并将这些更改部署到生产环境中。
首先,installing/running postgres 不应成为您的 rails 部署设置的一部分。也许,在未来的某个时候,postgres 甚至不会 运行 与您的 rails 应用程序在同一台机器上。
至于你的rails问题,我只能建议你看一下capistrano,它可以做你描述的任何事情并且稳定,battle-tested和开源。它比另一个答案中描述的 TeamCity 应用程序少得多,因此设置起来更简单。配置后,工作流程非常简单:
- git推
- 上限部署
capistrano 然后将提取新代码,使用捆绑器安装您的依赖项,运行 需要时迁移并重新启动您的 rails 应用程序服务器。它还将处理 database.yml 和其他不在您的存储库中的秘密文件(通过符号链接)。最后,如果你不小心部署了一些不好的东西,你也可以轻松回滚。
tldr: 使用 capistrano.