如何使用on Rails的Ruby的一键式上DigitalOcean应用

DigitalOcean的Ruby on Rails的一键式应用程序提供了一个便捷的方式,让您的Rails应用程序快速启动并运行。 nginx的,Unicorn和Postgres的所有预安装,一键是举办你的应用程序的理想基地。本教程会给你你需要让你的项目离地面的所有细节。

介绍

DigitalOcean的Ruby on Rails一键式应用程序提供了一种方便的方式让您的Rails应用程序在Ubuntu服务器上运行。 与Nginx,Unicorn和Postgres所有预装,一键式是托管您的应用程序的一个伟大的基础。 本教程将给你所有的细节,让你的项目离开地面。

包括组件

除了一个普通的Ubuntu 14.04 Droplet,Ruby on Rails一键式图像包括以下组件:

  • Ruby2.2:Ruby语言的支持,安装了RVM
  • 导轨4:Rails Web框架的Gem
  • PostgreSQL的 :生产Rails应用程序部署中最常用的数据库服务器
  • 麒麟 :Rails应用服务器
  • nginx的 :其被配置为反向代理向Unicorn通用HTTP服务器

它也可以预先配置系统用户和数据库用户,无论是命名为轨道 ,这是用来部署应用程序。 为方便起见, git软件包安装在图像上。

在短短的一点,我们就进入了组件的细节配置,这里的登录名和密码可以发现,以及如何启动应用程序。

创建你的Ruby on Rails Droplet

如果你还没有这样做,创建从DigitalOcean控制面板Droplet,然后选择on Rails的Ruby14.04上的一键式应用程序镜像。 我们将指导您完成这些步骤。

注意:如果您已经创建与Ruby on Rails的一个Droplet的14.04图像,你应该跳过这一节。

首先,登录到DigitalOcean控制面板

然后点击创建按钮Droplet

在Droplet创建页面上,指定所需的主机名和大小。 对于不接收大量通信基本应用程序,1GB的Droplet要细:

Droplet主机名和大小

选择您所需的地区:

选择区域和选项

现在,在选择图片部分,单击应用程序选项卡,然后选择on Rails的Ruby14.04上的图像:

选择Ruby on Rails一键式应用程序映像

接下来,选择任何其他设置,如专用网络,IPv6或备份。

最后,选择哪个SSH密钥,如果有的话,你要使用访问该Droplet,然后点击Create按钮Droplet

你的Ruby on Rails Droplet将很快准备就绪。 有关创建Droplet的更多详细信息,请查看本教程: 如何创建自己的第DigitalOceanDroplet

如何访问您的Ruby on Rails Droplet

一旦你的Droplet创建,你可以通过两种方式访问​​它:

  1. 作为运行Rails应用程序的用户,通过在Web浏览器中访问Droplet的IP地址
  2. 作为服务器管理员,通过连接作为root通过SSH用户。 此方法将用于部署您的应用程序

您Droplet的公网IP地址,可以在中找到DigitalOcean控制面板

检查占位符Rails应用程序

一键式应用程序附带一个应该在默认情况下运行的占位符Rails应用程序。 要查看示例Rails应用程序是否正在运行,请在Web浏览器中访问Droplet的公共IP地址。

例如,假设你的Droplet的IP地址是111.111.111.111 在这种情况下,你会打开http:// 111.111.111.111在Web浏览器来验证Rails的运行:

默认Rails页面

如果您看到示例Rails页面,则可以登录到服务器。

通过SSH访问Droplet

要部署自己的Rails应用程序,您需要连接到您的Droplet为root通过SSH。 让我们现在做吧。

注意:如果你以前没有使用SSH或PuTTY,您可能要参考本教程的详细信息: 如何连接到你的SSHDroplet

在电脑上,打开一个终端并登录到您的Droplet作为root通过SSH使用此命令(替换您Droplet的IP地址):

ssh root@droplet.ip.address

如果提示您输入密码,请输入在创建Droplet时通过电子邮件发送给您的密码。 或者,如果您使用SSH密钥设置Droplet,则密钥将用于身份验证。

登录名和密码

Ruby on Rails一键式应用程序预配置了以下内容:

  • 系统用户名为 ,其中部署应用程序
  • PostgreSQL数据库用户也称为轨道 ,其用于由应用程序连接到数据库

这两个登录的密码是随机生成的,并且可以在每天通过SSH登录服务器时显示的消息(MOTD)中找到。 MOTD应该看起来像这样:

MOTD
-------------------------------------------------------------------------------------
Thank you for using DigitalOcean's Rails Application.
We have created a default Rails application that can be seen from http://111.111.11.111/
-------------------------------------------------------------------------------------
You can use the following SFTP credentials to upload your webpages (using FileZilla/WinSCP/Rsync):
  * Host: 111.111.11.111
  * User: rails
  * Pass: PzAaUykNL4
-------------------------------------------------------------------------------------
You can use the following Postgres database credentials:
  * User: rails
  * Pass: temq0AtHj7
-------------------------------------------------------------------------------------
Nginx listens on public IP (111.111.11.111) port 80 and forwards requests to Unicorn on port 8080
Nginx access log is in /var/log/nginx/access.log and error log is in /var/log/nginx/error.log
Unicorn configuration files are in /etc/unicorn.conf and /etc/default/unicorn
Unicorn log is in /var/log/unicorn/unicorn.log
-------------------------------------------------------------------------------------
To get a list of available gems: gem list
To get a list of Rubies: rvm list
To get Gem environment: gem env
-------------------------------------------------------------------------------------

为了简化应用程序的部署,自动生成数据库密码也位于/etc/default/unicorn文件,作为APP_DATABASE_PASSWORD环境变量。

如何部署您的Rails应用程序

我们将引导您部署一个我们将从GitHub克隆的示例Rails应用程序。 如果你有自己的部署流程,随意阅读有关一键式应用程序的配置的详细信息,可在发现配置详细信息下面的应用程序部署的例子部分。

总而言之,我们将介绍以下步骤:

  • Git克隆你的应用程序
  • 配置数据库连接
  • 更新您的Gemfile包括unicornpg的Gem,并运行打捆
  • 运行rake任务
  • 配置Unicorn
  • 配置Nginx

让我们开始吧。

Git克隆你的应用程序

我们假设你正在登录的root用户。 我们将演示如何手动部署应用程序, sample_tasks ,从GitHub的信息库。

首先,让我们使用git来克隆要部署到用户的主目录下的应用程序。 如果您想部署自己的应用程序,请务必在此处替换您自己的存储库链接:

cd ~rails
git clone https://github.com/thisismitch/sample_tasks.git

这将克隆程序存储库到rails主目录。 在我们的例子中,这意味着应用程序所在的目录中名为sample_tasks

配置数据库连接

现在我们准备配置您的应用程序连接到PostgreSQL数据库。 在这个例子中,我们将简单地复制数据库配置为rails_project应用到我们的新的应用程序,然后修改它咯。

示例应用程序的复制database.yml文件到您的应用程序的config目录,像这样(这里替补多你的应用程序的路径):

cp ~rails/rails_project/config/database.yml ~rails/sample_tasks/config/

该文件中的配置,这将允许应用程序连接到提供PostgreSQL数据库,但是我们使用它之前应该改变数据库的名称。 在编辑器中打开文件(我们将使用nano这里):

nano ~rails/sample_tasks/config/database.yml

查找“Rails 项目”的每个实例(有三个),并与您的名字替换它应用在我们的例子中,“样品的任务”。 如果您使用nano ,你可以查找和替换的应用程序名称是这样的:按Ctrl-W然后Ctrl-R输入“rails_project”,然后Enter ,然后在您的应用程序的名称类型,然后Enter ,然后打A

你已经更新了文件后, production部分应该是这样的(与你的应用程序的名称,而不是强调“sample_tasks”):

database.yml摘录
production:
  <<: *default
  database: sample_tasks_production
  username: rails
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>

保存并退出。 这是Ctrl-O Enter ,然后Ctrl-X如果你正在使用nano。

更新Gemfile

如果您的应用程序未配置为使用PostgreSQL和Unicorn,您应该将这些gem添加到Gemfile中。 在编辑器中打开的Gemfile(我们将使用nano这里):

nano ~rails/sample_tasks/Gemfile

包括了pgunicorn加入这些行Gem:

group :production do
  gem 'unicorn'
  gem 'pg'
end

记下指定的Ruby版本。

保存并退出。

注意:如果您的Gemfile指定版本的Ruby,它是从一个被安装在系统上的不同,你可以使用RVM安装。 例如,Gemfile示例指定了Ruby 2.0.0,因此我们可以这样安装:

rvm install 2.0.0
rvm use ruby-2.0.0-p643 --default

现在切换到应用程序的目录并运行bundler:

cd ~rails/sample_tasks && bundle install

运行Rake任务

我们已经准备好运行我们的rake任务,但我们需要设置我们的PostgreSQL数据库用户的密码环境。 为了做到这一点,我们需要源/etc/default/unicorn文件(这个细节,可以在发现配置详细信息部分)使用此命令:

. /etc/default/unicorn

现在运行你的rake任务。 在我们的示例中,我们将创建生产数据库,运行任何迁移,然后预编译我们的资产:

RAILS_ENV=production rake db:create
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake assets:precompile

在这一点上,你可能需要更改应用程序文件到导轨用户的所有权:

chown -R rails: /home/rails/sample_tasks

配置Unicorn

现在我们需要更新Unicorn配置文件以指向我们的应用程序的路径。 打开/etc/unicorn.conf文件进行编辑:

nano /etc/unicorn.conf

查找指定行working_directory ,并取代其与应用程序的路径值。 您可以使用我们用于数据库配置文件的相同的查找和替换技巧。 完成后,该行应该看起来像这样(使用应用程序的实际路径):

/etc/unicorn.conf节选
working_directory "/home/rails/sample_tasks"

保存并退出。

接下来,编辑/etc/default/unicorn文件:

nano /etc/default/unicorn

查找指定线路APP_ROOT ,并更新指向您的应用程序。 同样,这是一个问题,找到并替换“rails_project”与您的应用程序的名称。 完成后,该行应如下所示:

/ etc / default / unicorn摘要
APP_ROOT=/home/rails/sample_tasks

应用程序已准备就绪。 重新启动Unicorn加载它:

service unicorn restart

我们的应用程序部署几乎完成。 我们只需要稍微重新配置Nginx。

更新Nginx配置

Nginx的,这是作为一个反向代理Unicorn,需要知道你的应用程序的路径public目录。 使用此命令打开Nginx配置文件:

nano /etc/nginx/sites-enabled/rails

查找指定行root ,并改变它,所以它指向您的应用程序的public目录。 同样,这是一个问题,用您的应用程序的名称替换“rails_project”。 完成后,该行应该看起来像这样:

/ etc / nginx / sites-enabled / rails excerpt
    root /home/rails/sample_tasks/public;

保存并退出。

现在重新加载Nginx以使更改生效:

service nginx reload

访问您的Rails应用程序

您现在应该能够在Web浏览器访问您的Droplet的公网IP地址来访问你的应用程序: http:// droplet.ip.address 如果按照这个例子正好,你会希望通过去`来访问它http:// droplet.ip.address /tasks ,因为它没有一个默认的索引页。

恭喜您部署了您的Ruby on Rails应用程序!

如果你想了解更多关于你的Droplet的设置,或进一步定制,强烈建议你阅读下一部分。

配置详细信息

Rails项目由Unicorn提供服务,它监听unix套接字,由Nginx反向代理,监听端口80。

Nginx

nginx的配置是位于/etc/nginx/sites-enabled/rails root指令应设置为你的应用程序的目录。 您可以自定义它以添加SSL证书,并根据需要添加其他上游服务器:

/ etc / nginx / sites-enabled / rails
upstream app_server {
    server unix:/var/run/unicorn.sock fail_timeout=0;
}

server {
        listen   80;
        root /home/rails/rails_project/public;
        server_name _;
        index index.htm index.html;

        location / {
                try_files $uri/index.html $uri.html $uri @app;
        }

        location ~* ^.+\.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|mp3|flv|mpeg|avi)$ {
                        try_files $uri @app;
                }

         location @app {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_pass http://app_server;
    }
}

一旦接收Nginx的端口80上的请求,它服务于静态内容,如图像,将请求转发给Unicorn,它监听在Unix套接字/var/run/unicorn.sock

Unicorn

Unicorn是用来为Ruby on Rails应用,并期待在指定的文件working_directory ,这是设置/home/rails/ rails_project默认。 这应该更新到您的应用程序的路径。

我们增加了在最小的Unicorn配置/etc/unicorn.conf它指定套接字的路径来听,多少工人产卵,以及在何处存储日志文件:

/etc/unicorn.conf
listen "unix:/var/run/unicorn.sock"
worker_processes 4
user "rails"
working_directory "/home/rails/rails_project"
pid "/var/run/unicorn.pid"
stderr_path "/var/log/unicorn/unicorn.log"
stdout_path "/var/log/unicorn/unicorn.log"

另一个重要的配置文件是/etc/default/unicorn并指定配置文件的位置,更重要的是,Ruby,Gem,和守护进程的路径,以及随机产生的SECRET_KEY_BASEAPP_DATABASE_PASSWORD 您将需要更新APP_ROOT指定应用程序的路径:

/ etc / default / unicorn
# Change paramentres below to appropriate values and set CONFIGURED to yes.
CONFIGURED=yes

# Default timeout until child process is killed during server upgrade,
# it has *no* relation to option "timeout" in server's config.rb.
TIMEOUT=60

# Path to your web application, sh'ld be also set in server's config.rb,
# option "working_directory". Rack's config.ru is located here.
APP_ROOT=/home/rails/rails_project

# Server's config.rb, it's not a rack's config.ru
CONFIG_RB=/etc/unicorn.conf

# Where to store PID, sh'ld be also set in server's config.rb, option "pid".
PID=/var/run/unicorn.pid
RAILS_ENV="production"
UNICORN_OPTS="-D -c $CONFIG_RB -E $RAILS_ENV"

PATH=/usr/local/rvm/rubies/ruby-2.2.1/bin:/usr/local/sbin:/usr/bin:/bin:/sbin:/usr/local/rvm/bin:/usr/local/rvm/gems/ruby-2.2.1@global/bin:/usr/local/rvm/gems/ruby-2.2.1/bin/
export GEM_HOME=/usr/local/rvm/gems/ruby-2.2.1
export GEM_PATH=/usr/local/rvm/gems/ruby-2.2.1:/usr/local/rvm/gems/ruby-2.2.1@global
DAEMON=/usr/local/rvm/gems/ruby-2.2.1/bin/unicorn

# Generate by running `rake -f /home/rails/Rakefile secret`
export SECRET_KEY_BASE=e9a806f70df01968fdda069f009690b2a09a168e5b495aed217090a8cb5ef4b76f82d7efa430409c968996ffa43ef9393d4e1cdb82dc7549cc8fcd2beb0d0338
export APP_DATABASE_PASSWORD=temq0AtHj7

Ruby版本管理器

由于一些Rails应用程序可能需要不同的Ruby版本,我们使用Ruby版本管理器(rvm)来安装Ruby。

这允许您在服务器上安装多个Ruby版本,然后由不同的应用程序使用。

目前, Ruby版本2.2.1用作默认版本。

如果您的应用程序需要不同版本的Ruby,例如2.0.0,您可以使用RVM安装:

rvm install 2.0.0

要使用RVM修改默认Ruby版本,请使用:

rvm use ruby-2.0.0-p643 --default

您可以通过运行命令获取已知的Ruby版本的列表rvm list known

如果你想安装最新的Ruby当前可用:

rvm install ruby --latest
rvm use ruby --latest --default

如果你改变了Ruby版本,你也需要更新Unicorn在配置/etc/default/unicorn和修改已安装的Ruby版本的路径。 了解Ruby在哪里:

root@rails:~# which ruby
/usr/local/rvm/rubies/ruby-2.0.0-p643/bin/ruby
root@rails-testing:~# rvm list

rvm rubies

=> ruby-2.0.0-p643 [ x86_64 ]
 * ruby-2.2.1 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

root@rails:~# rvm use ruby-2.2.1 --default
Using /usr/local/rvm/gems/ruby-2.2.1
root@rails:~# rvm list

rvm rubies

   ruby-2.0.0-p643 [ x86_64 ]
=* ruby-2.2.1 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

root@rails:~# which ruby
/usr/local/rvm/rubies/ruby-2.2.1/bin/ruby
root@rails:~# ruby -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]

你还应该为新的Ruby安装安装Unicorn,Rails和Bundler gem:

gem install bundler rails unicorn

一旦你有你默认情况下,更改使用Ruby的位置/etc/default/unicorn路径名,包括/usr/local/rvm/rubies子文件夹, /usr/local/rvm/gems子文件夹的新安装的版本,以及作为Unicorn的位置:

/ etc / default / unicorn摘要
PATH=/usr/local/rvm/rubies/ruby-2.2.1/bin:/usr/local/sbin:/usr/bin:/bin:/sbin:/usr/local/rvm/bin:/usr/local/rvm/gems/ruby-2.2.1@global/bin:/usr/local/rvm/gems/ruby-2.2.1/bin/
export GEM_HOME=/usr/local/rvm/gems/ruby-2.2.1
export GEM_PATH=/usr/local/rvm/gems/ruby-2.2.1:/usr/local/rvm/gems/ruby-2.2.1@global
DAEMON=/usr/local/rvm/gems/ruby-2.2.1/bin/unicorn

您还需要安装您的应用程序需要在Gemfile中的任何其他gems:

cd /home/rails && bundle install

安装必要的Gem后,您应该使用以下命令重新启动Unicorn:

sudo service unicorn restart

检查日志文件中/var/log/unicorn/unicorn.log ,如果你看到任何Bundler::GemNotFound错误,那么你就必须安装缺少的Gem。

使用以下命令连续监视日志输出:

tail -f /var/log/unicorn/unicorn.log

示例错误行如下所示:

Could not find i18n-0.6.1 in any of the sources (Bundler::GemNotFound)

对于这个特定的错误,你可能需要安装特定版本的i18n gem:

gem install i18n -v 0.6.1

如果您有错误,已经安装了更新的版本(例如i18n-0.9.0,只需卸载该gem并安装正确的一个:

gem uninstall i18n -v 0.9.0
gem install i18n -v 0.6.1

上传文件

我们建议您使用SFTP(安全FTP) ,SCP,或Rsync的上传您的文件,因为它们都使用加密的数据传输。

Windows用户可以使用WinSCP上传文件。 对于所有其他操作系统(包括Windows),可以使用FileZilla中和rsync。

对于经验丰富的开发人员,我们有一篇文章如何设置的Git

Rails应用程序的根应该在目录中/home/rails ,例如/home/rails/ rails_project Nginx的和Unicorn将查找在公共页面/home/rails/ rails_project /public ,除非你重新配置它们,务必使用相应SFTP上传文件。

在当日消息提供您的SFTP凭证(凭证是不同的,每Droplet随机生成),并同时有/etc/motd.tail为您的评论。

Postgres数据库凭据

一键安装包括一个Postgres数据库供您使用(凭证是不同的,并为每个Droplet随机生成)。

此应用程序映像的先前版本使用MySql作为其默认数据库。 如果您正在使用的版本,随机生成的MySQL root密码,可在发现/root/.my.cnf

对于数据库凭据rails用户也保存在/etc/motd.tail ,并显示在今日消息如上所示。 他们还远销作为环境变量APP_DATABASE_PASSWORD/etc/default/unicorn样品Rails项目是预装在其数据库配置(读取该/home/rails/config/database.yml )使用:

<%= ENV['APP_DATABASE_PASSWORD'] %>

下一步