使用 Capistrano 将 Rails 应用部署到 Digital Ocean
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
以下是我搭建 DigitalOcean 服务器和部署 Rails 应用的基本步骤。我最初是从 GoRails 的视频教程中学习到这些的,但随着时间的推移,我一直在不断迭代、调整和改进。或许这篇文章能帮助你快速上线应用,或者你也有更好的方法可以与我分享。
如果您还没有 Digital Ocean 账户,可以使用此链接注册:https://m.do.co/c/33c1f4fb065a。是的,如果您使用我的链接注册,我会获得推荐奖励,但前提是您最终在 Digital Ocean 消费了。即使您没有消费,如果您在 Hacktoberfest 期间注册,您仍然可以获得 100 美元的 60 天有效期奖励。
让我们启动一个服务器!
创建液滴
-
创建一个液滴
- 选择 Ubuntu 作为您的发行版 (16.04.4 x64)
- 选择您的服务器实例大小(最小 1GB 内存和 1 个 CPU)
- 选择纽约 1 号或 3 号作为您的数据中心(我位于东海岸,所以这对我来说是最合理的选择)。
- 选修的:
- 现在添加 SSH 密钥(也可以稍后添加)
- 重命名主机名(通常重命名为有意义的名称)
-
服务器实例创建完成后,系统会发送一封包含登录凭据的电子邮件。
-
使用提供的凭据通过 SSH 连接到新的 droplet
-
最佳实践是创建一个新用户来管理部署,而不是使用现有用户。
root$ sudo adduser deploy$ sudo adduser deploy sudo$ su deploy
如果您在创建服务器实例时没有提供 SSH 密钥,现在应该提供。如果您已经提供了,请跳过此步骤:
请在您的计算机上执行此操作,不要在服务器上执行!
我使用一个名为 ssh-copy-id 的 macOS 工具。如果您没有安装它,可以通过运行$ brew install ssh-copy-id
* 来获取,$ ssh-copy-id deploy@SERVERIP其中 SERVERIP 是您的 droplet 的 IP 地址。
回到我们原定的节目安排
- 使用部署用户身份通过 SSH 重新登录服务器
在服务器上以部署身份运行以下命令
-
首先获取Node和Yarn。
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
-
然后安装基本依赖项。
$ sudo apt-get update$ sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev software-properties-common libffi-dev nodejs yarn
-
然后安装 rbenv(用于管理 Ruby 版本,如果你愿意,也可以使用 rvm,但我个人更喜欢 rbenv)。
$ cd$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc$ exec $SHELL$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build$ echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc$ exec $SHELL
-
最后安装 Ruby。
$ rbenv install 2.4.1或者你的应用程序正在运行的任何 Ruby 版本$ rbenv global 2.4.1——或者你刚刚安装的任何东西$ ruby -v-- 验证是否已安装并设置正确的版本$ gem install bundler$ rbenv rehash
配置 Nginx 和 Passenger
这将实际运行我们的“服务器”并提供(此处并无双关之意)我们的应用程序。
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7-
$ sudo apt-get install -y apt-transport-https ca-certificates -
$ sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main > /etc/apt/sources.list.d/passenger.list' -
$ sudo apt-get update -
$ sudo apt-get install -y nginx-extras passenger
检查一下你刚才做的所有操作是否都正确无误。
$ sudo service nginx start在服务器上运行程序,然后在浏览器中访问服务器的 IP 地址。
如果到目前为止一切操作正确,你应该会看到 Nginx 欢迎消息。
配置 Nginx 和 Passenger
$ sudo vim /etc/nginx/nginx.conf- 找到以下代码行并取消注释
include /etc/nginx/passenger.conf:## # Phusion 乘客 ## # 如果您安装了 ruby-passenger 或 ruby-passenger-enterprise,请取消注释 ##
- 找到以下代码行并取消注释
包含 /etc/nginx/passenger.conf;
-
保存并关闭 (:wq)
$ sudo vim /etc/nginx/passenger.conf
-
修改 passenger_ruby 行,使其指向 rbenv(或者如果您使用的是 rvm,则指向 rvm):
passenger_ruby /home/deploy/.rbenv/shims/ruby;
-
保存并关闭 (:wq)
完成所有操作后,重启 Nginx 服务器。
$ sudo service nginx restart
环境因素
- 请确保您位于部署用户部分的最顶层。
- 跑步
$ cd ~
- 跑步
$ git clone https://github.com/rbenv/rbenv-vars.git $(rbenv root)/plugins/rbenv-vars$ vim .rbenv-vars- 根据需要将任何环境变量添加到文件中。
PostgreSQL
- 跑步
$ sudo apt-get install postgresql postgresql-contrib libpq-dev - 设置 postgres 用户(也名为“deploy”,但与我们的 Linux 用户“deploy”不同)和数据库
$ sudo su - postgres$ createuser --pwprompt deploy请记下您选择的密码。$ createdb -O deploy APP_NAME_production其中 APP_NAME 是应用程序的名称$ exit
部署
首先,我们需要配置代码仓库的存储桶,使其能够与服务器通信。因为我们是直接从代码仓库部署,而不是从本地机器部署。
- 通过 SSH 连接到我们的服务器后,
ssh-keygen在命令行输入。 - 按照提示设置新密钥。本例中不需要密码阶段。
- 服务器生成新密钥后,运行
cat ~/.ssh/id_rsa.pub并复制返回的密钥。 - 将密钥添加到应用程序的存储库中
- 如果您使用的是 Bitbucket,可以在“设置” > “访问密钥”中找到该选项。
回到本地计算机,我们来安装 Capistrano。
-
在你的 Gemfile 文件中添加:
gem 'capistrano'
gem 'capistrano-rails'
gem 'capistrano-passenger'
gem 'capistrano-rbenv' (如果您使用 rvm,请使用:gem 'capistrano-rvm') -
跑
$ bundle install,然后$ cap install
如果您想自定义此安装,请参阅 Capistrano 文档。
-
请
config/deploy.rb修改以下几行,将其更新为当前应用程序的名称和仓库地址:设置:应用程序,“YOUR_APPS_NAME” 设置 :repo_url, "YOUR_APPS_REPO" 设置 :deploy_to, "/home/deploy/YOUR_APPS_NAME" 追加 :linked_files、“config/database.yml”和“config/secrets.yml” 追加 :linked_dirs、“log”、“tmp/pids”、“tmp/cache”、“tmp/sockets”、“public/system”
-
将
config/deploy/production.rb服务器的 IP 地址更改为新 droplet 的 IP 地址服务器 '104.131.189.221',用户:'deploy',角色:%w{app db web} -
然后,您可以使用该命令
cap production deploy部署应用程序的新版本。- 第一次尝试时会失败并抛出错误,但我们快要成功了。
最后冲刺
通过 SSH 重新连接到服务器,以部署身份创建 2 个文件
-
/home/deploy/APP_NAME/shared/config/database.yml- 在此文件中添加以下内容:
生产: 适配器:PostgreSQL 主机:127.0.0.1 数据库:APP_NAME_production 用户名:部署 密码:您的POST密码(不是您的Linux密码) 编码:Unicode 泳池:5
- 在此文件中添加以下内容:
-
/home/deploy/APP_NAME/shared/config/secrets.yml- 在此文件中添加以下内容:
生产: secret_key_base: 您的密钥
(注:我相当确定 Rails 5.2 中有更好的方法来实现这一点,但我个人还没有在生产环境中使用过。)
- 在此文件中添加以下内容:
运行程序$ sudo visudo -f /etc/sudoers.d/nginx_overrides并将以下内容添加到文件中:
# Nginx 命令 Cmnd_Alias NGINX_RESTART = /usr/sbin/service nginx 重启 Cmnd_Alias NGINX_RELOAD = /usr/sbin/service nginx 重新加载 # 无需密码的命令 部署 ALL=NOPASSWD: NGINX_RESTART, NGINX_RELOAD
更新网址
服务器端最后要做的是告诉 Nginx 对应用程序做出响应。
- 跑步
sudo ln -s /etc/nginx/sites-available/THE_URL_YOU_WANT_HERE.com /etc/nginx/sites-enabled/ -
然后
sudo vim /etc/nginx/sites-enabled/THE_URL_YOU_WANT_HERE.com,将文件内容替换为:服务器 { 听 80; 监听 [::]:80 ipv6only=on; server_name THE_URL_YOU_WANT_HERE.com; 乘客已启用; rails_env 生产环境; root /home/deploy/APP_NAME/current/public; # 将服务器错误页面重定向到静态页面 /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { 根 html; } } -
回到本地机器上
$ cap production deploy再运行一次,然后应该就可以正常营业了。 -
如果您仍然看到的是默认的 Nginx 页面,请运行
$ cap production server:restart
如果我遗漏了什么,或者有什么地方做错了(或者可以改进的地方),请告诉我。当然,运行一个“真正”的生产服务器需要考虑很多方面,比如日志、安全、负载均衡等等,但这能让你的应用上线运行。而且,自己配置服务器的感觉也很棒。
文章来源:https://dev.to/drbragg/deploying-a-rails-app-to-digital-ocean-with-capistrano-2e1k