发布于 2026-01-06 2 阅读
0

使用 Capistrano 将 Rails 应用程序部署到 Digital Ocean DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

使用 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