本文章目的是带您了解如何将已有 Ruby On Rails 项目完成线上部署。其中包含选择云服务器,安装环境依赖,配置NGINX和数据库,最后利用Capistrano完成自动化部署。希望对您有所帮助。
云服务器
服务器是我们 Ruby on Rails 项目的立身之地,是对外开放和服务的基础设施。一般而言,有能力者可以选择自建服务器。但在这里,本人更推荐使用云服务器,主打一个便捷易用。
选择云服务器厂商
市面上有许多的云服务器提供商,一般都是按月或按年租用云服务器。因为我们后续可能会遇到各种各样的问题,比如说域名备案、网络连接、设备升级等,所以选择一个稳定可靠的云服务器厂商就显得格外重要。在这里,本人更推荐选择大厂的云服务器,毕竟大厂的安全性和客服服务质量基本没有问题。
以下有几个云服务器厂商,供您选择:
本人推荐 阿里云。 因为阿里云目前是国内用户占比最大的云服务器厂商。每年都有活动,可以以较优惠的价格购买到合适的云服务器。售后服务有所保障。后续的域名购买和备案等,流程清晰。值得信赖。
选择云服务器规格
我们的 Ruby and Rails 项目一般来说对 RAM 有一定的要求,但是现在市面上基础的云服务器,基本上也能够满足基本需求了,因此不用过于担心。另外,我们预计将会使用 Postgresql 作为后台数据库,后期也可能包含 Redis/Sidekiq 作为缓存和异步的工具,而这些可能性也都需要一定的 RAM 来支持运行,因此我们在考虑要什么规格的云服务器时,也应该把这些要素考虑进去。
在这里,本人推荐选择 2GB RAM 的云服务器,特别是首次进行项目部署的朋友们。 现在市面上卖的基础规格也几乎都是 2核2G 起步了,对于我们的基础项目是完全够用的。如果说您的项目需要一些特别庞大的依赖,比如说 ElasticSearch,那么您可以需求更大规格的 RAM,预计可能要 4GB 起步。或者您可以选择拆分细化您的项目,从而使得规格分配更加合理。
对于存储规格等,本人觉得基础的云服务器提供的就足够了。如果您对自己的项目有清晰的了解和认知,那么请您根据自己的需求做出选择。而对于初入门的未来大佬,我们就从最便宜最基础的规格入手,毕竟各大厂商都有试用的机会,再不济也可以先尝试一年的时间。这段时间,足够让我们对自己的项目和需求有充足的了解了。
本网站选择的规格:2核2G,带宽-3Mbps
本文章安装的系统环境:Ubuntu 22.04
如果您后续不想进行域名备案,那么您可以尝试购买地址在中国香港或者境外的云服务器。但请注意,境外云服务器可能会有被墙的风险。
域名备案
我们想要上线一个网站,并且能够方便对外开放使用,那么基本上就需要一个域名。刚购买的云服务器,一般来说会有自己的公网IP,前期尚未拥有域名之前,我们可以临时通过访问这个IP地址来访问自己的项目网站。后期对外开放时,一个域名就是必要的了,本网站
icebob.site
就是域名。域名注册购买服务,各大云服务器厂商都有提供。为了方便,本人建议在哪购买云服务器,就在哪购买域名。至于域名的选择,本人的建议是:如果您的项目是公司级、国际化或者比较重要,对外需要可信度的,那么就选择 .com
, .cn
, .net
这种顶级域名;如果您的项目是初期尝试,那么就选择相对优惠划算的域名即可。
有了域名以后,就要考虑备案了。按照中国的法律法规,在中国大陆上线的网站,都需要预先进行备案,否则会有被封的风险。各大厂商基本都有备案服务,入口一般是在顶部菜单栏的右侧。按照官方的备案流程和说明,填写好主体信息,上传好材料,再进行一次校验就好了。厂商基本上会进行一次初审,如果未通过会有电话联系告知如何修改;如果初审通过,会上交政府部门进行正式备案。
域名不是买断制的,一般都是按年计算有效期,需要续费持有。
如果您的云服务器和域名的购买厂商非同一个,那么要注意:备案是在云服务器厂商进行,DNS解析是在域名厂商进行。
如果您购买的云服务器地址不在中国大陆,比如说中国香港或者境外,那么备案这一步就不是必须的。
登录云服务器
到了这里,您已经买好云服务器了吧?检查一下您的邮箱或者短信,应该会收到您的云服务器初始密码。让我们尝试一下登录您的云服务器:
# 本地控制台(后简称:本地),把 1.2.3.4
改成您的云服务器公网IP(后同)
ssh root@1.2.3.4
输入密码后,按回车键即可成功登录。如果您想修改 root 管理员的密码,在远程控制台(后简称:远程)可以使用 passwd root
命令进行修改。通过 exit
命令,我们可以登出云服务器。
如果您要修改 root 管理员的密码,在修改密码时,务必小心保证其安全,不要使用简单密码。
安全起见,接下来我们要创建一个新的用户:deploy(用户名可自行更改,后同)。针对这个 deploy 用户,我们只给予其有限的权限,为了防范其他人拥有我们云服务器的全部控制权。后续我们在云服务器的操作,几乎都在 deploy 这个用户上进行,包括配置和部署上线项目。为了在远程创建 deploy 用户,我们先重新登录云服务器。
# 远程控制台(后简称:远程),一步步按提示完成以下命令,最后一个命令是登出指令
adduser deploy
adduser deploy sudo
exit
因为我们时常要登录远程,所以为了方便,我们可以设置免密登录(非必要项)。这里主要使用的是 ssh-keygen
和 ssh-copy-id
两个命令。命令 ssh-keygen
是用来创建公钥和私钥的。而命令 ssh-copy-id
会将本地的公钥拷贝到远程的 ~/.ssh/authorized_keys 文件内。首先,我们先检查一下本地是否已经生成过公钥和私钥:
# 本地
# 以下命令是查看文件指令
# 如果显示了内容,说明已经生成过公钥和私钥
# 如果报未找到文件的错误,说明还未生成过公钥和私钥
cat ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub
如果本地未生成过公钥和私钥,那么使用 ssh-keygen
命令进行创建,过程一直按回车键即可。创建完后采用上述命令进行检查。接下来,我们开始设置免密登录:
# 本地
# 如果您想免密登录 root 管理员
ssh-copy-id root@1.2.3.4
# 如果您想免密登录 deploy 用户
ssh-copy-id deploy@1.2.3.4
如果出现 /usr/bin/ssh-copy-id: ERROR: No identities found 错误,那么加上 -i
参数来指定公钥的位置,如下:
ssh-copy-id -i ~/.ssh/id_rsa.pub deploy@1.2.3.4
现在让我们再次尝试登录云服务器,使用 ssh deploy@1.2.3.4
命令来登录 deploy 用户。理论上,现在不需要输入密码就能成功登录了。后续我们将使用 deploy 用户来安装、配置和部署我们的项目。让我们顺带检查一下远程的 ~/.ssh/authorized_keys 文件,确保里面不存在其他未知的密钥:
# 远程
# 文件里应该只有我们本地的公钥,而没有其他未知的密钥
cat ~/.ssh/authorized_keys
安装 Ruby
在远程安装 Ruby 跟在本地相似:先安装依赖,再用 Ruby 管理工具安装和管理 Ruby。常见的 Ruby 管理工具有 rbenv, asdf, rvm。本文章使用 rbenv 来安装 Ruby,它带有一些方便的插件,可以让我们轻松管理生产中的环境变量。
本文的项目是由 Rails7 构建的,默认采用 Import Maps + Turbo + Stimulus 组合,不再需要 Webpacker, Node.js, Yarn.
如果您的项目需要使用 Webpacker, Node.js, Yarn,可以参考 文献[1] 安装依赖。
第一步,安装依赖。登录远程 deploy 用户,输入以下命令:
# 远程
sudo apt-get update
sudo apt-get install git-core 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
第二步,安装 rbenv,再使用 rbenv 安装 Ruby:
# 远程
# 安装 rbenv
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
git clone https://github.com/rbenv/rbenv-vars.git ~/.rbenv/plugins/rbenv-vars
exec $SHELL
# 安装 Ruby,本文项目的 Ruby 版本号是 3.1.2,请把它改成您的项目所用的 Ruby 版本号(后同)
rbenv install 3.1.2
rbenv global 3.1.2
# 查看 Ruby 版本,检查是否安装成功
ruby -v
安装 Rails
在远程安装 Rails 也很简单。由于 Rails 采用 Bundler 来安装和管理包,我们首先检查远程是否已经安装好 Bundler 工具:
# 远程
# 查看 Bundler 版本,检查是否安装成功
rbenv rehash
bundle -v
# 如果报错显示未找到 Bundler,那么我们需要安装 Bundler
gem install bundler
# 安装完后,再次查看 Bundler 版本,检查是否安装成功
rbenv rehash
bundle -v
下一步,让我们安装 Rails:
# 远程
# 安装 Rails,本文项目的 Rails 版本号是 7.0.8,请把它改成您的项目所用的 Rails 版本号(后同)
gem install rails -v 7.0.8
# 查看 Rails 版本,检查是否安装成功
rbenv rehash
rails -v
配置 Git
我们需要在云服务器上拉取上线我们的新代码,因此需要使用 Git 来做版本控制。为了让云服务器可以连接到我们的项目,我们需要做些配置:
# 远程
# 修改 YOUR_ACCOUNT_NAME 成您的 GitHub 账户名,YOUR_ACCOUNT@EMAIL.com 成您的 GitHub 账户邮箱(后同)
git config --global color.ui true
git config --global user.name "YOUR_ACCOUNT_NAME"
git config --global user.email "YOUR_ACCOUNT@EMAIL.com"
# 生成 ed25519 钥匙对,一直回车即可
ssh-keygen -t ed25519 -C "YOUR_ACCOUNT@EMAIL.com"
接下来,我们需要把新生成的 SSH 密钥添加至我们的 GitHub 账户中,路径一般是 Setting -> SSH and GPG keys -> New SSH key:
# 远程
# 查看 SSH 密钥,将它添加至 GitHub 账户中
cat ~/.ssh/id_ed25519.pub
至此,理论上已经完成了 Git 配置。让我们验证一下:
# 远程
# 尝试连接我们的 GitHub 账户
ssh -T git@github.com
如果连接正确,我们将看到如下信息:Hi YOUR_ACCOUNT_NAME! You've successfully authenticated, but GitHub does not provide shell access.
配置 PostgreSQL 数据库
本人推荐使用 PostgreSQL 作为生产环境的数据库。您可以按照自己项目的实际情况安装和配置数据库。本文的项目使用 PostgreSQL 数据库,因此这里仅介绍该数据库的安装和配置过程:
# 远程
# 安装 PostgreSQL 数据库
sudo apt-get install postgresql postgresql-contrib libpq-dev
# 接着,使用 postgres(超管) 账户来创建一个新的数据库账户 icebob(您可以使用其他名字,一般是您项目的名字),用来管理我们的项目
sudo su - postgres
createuser --pwprompt icebob
# 最后,用 icebob 账号创建项目的数据库 icebob_production(修改成您项目的生产环境的数据库名字)
createdb -O icebob icebob_production
exit
成功配置好 PostgreSQL 数据库后,您可以随时使用 psql -U icebob -W -h 127.0.0.1 -d icebob_production
命令来连接您的数据库。现在,您可以连接试试看,顺便检查一下数据库是否配置成功。
配置 NGINX 和 Passenger
在生产环境中,我们用 NGINX(反向代理服务器) 负责接受 HTTP 请求。这些请求会被交给 Passenger(应用服务器) 处理。Passenger 将请求转交给我们的 Ruby On Rails 项目处理。处理结果将返回到 NGINX ,NGINX 再把结果返回给客户。因此它们之间的关系可以说是 NGINX -> Passenger -> Rails -> Passenger -> NGINX 的线性关系。
关于应用服务器,Ruby On Rails 项目常用的有 Puma, Passenger, Unicorn。并且 Rails 官方默认使用的应用服务器是 Puma(您可以在 Gemfile 文件中看到默认插入了 gem "puma"
),而且 Puma 还有一个优势就是免费。本文项目使用的是 Passenger,主要是因为它配置最简单,部署上线最便捷,免费版本面对简单的项目也足够应对。您可以按照自己的喜好和需求来决定使用哪个应用服务器,网上针对不同应用服务器的教程也非常丰富,后期想要更换也没问题,完全不用担心。
如果您选择使用 Puma 作为您的应用服务器,可以参考 文献[3] 安装配置。
让我们先来安装 NGINX 和 Passenger:
# 远程
# 安装 NGINX 和 Passenger
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger $(lsb_release -cs) main > /etc/apt/sources.list.d/passenger.list'
sudo apt-get update
sudo apt-get install -y nginx-extras libnginx-mod-http-passenger
if [ ! -f /etc/nginx/modules-enabled/50-mod-http-passenger.conf ]; then sudo ln -s /usr/share/nginx/modules-available/mod-http-passenger.load /etc/nginx/modules-enabled/50-mod-http-passenger.conf ; fi
sudo ls /etc/nginx/conf.d/mod-http-passenger.conf
安装好 NGINX 和 Passenger 后,我们要对它们进行一些简单的配置(更高级的配置方式可以去看官方文档)。我们需要使用 nano
或者 vim
命令来新建或修改相关文件,使用您偏好的命令即可,本文将使用 vim
进行:
# 远程
# 配置 Passenger
# 第一步,使用 vim
打开相关配置文件
sudo vim /etc/nginx/conf.d/mod-http-passenger.conf
# 第二步,配置正确的 Ruby 版本,即:将 passenger_ruby 这行配置修改成如下(记得修改 deploy 成您的用户名)
passenger_ruby /home/deploy/.rbenv/shims/ruby;
# 保存修改后的文件,启动 NGINX
sudo service nginx start
现在打开您的浏览器,输入您的云服务器公网 IP 地址,尝试访问一下。理论上,您应该可以看到 “Welcome to nginx!” 显示在网页上,这就说明 NGINX 已经正常运行了。现在是 NGINX 默认的服务配置,我们接下来需要将它替换成我们项目需要的服务配置:
# 远程
# 删除默认的服务配置
sudo rm /etc/nginx/sites-enabled/default
# 新添一个服务配置,修改 YOUR_APP_NAME 成您的项目名(后同)
sudo vim /etc/nginx/sites-enabled/YOUR_APP_NAME
# 基础配置如下,修改 deploy 成您的用户名,修改 YOUR_APP_NAME 成您的项目名(后同)
server {
listen 80;
listen [::]:80;
# 修改 “_” 成您的网站域名(可选)
server_name _;
# 路径 /home/deploy/YOUR_APP_NAME 将与之后的 Capistrano 配置中的 :deploy_to
路径相同
root /home/deploy/YOUR_APP_NAME/current/public;
passenger_enabled on;
passenger_app_env production;
passenger_preload_bundler on;
location /cable {
passenger_app_group_name YOUR_APP_NAME_websocket;
passenger_force_max_concurrent_requests_per_process 0;
}
# 限制请求体的大小,最大接受100MB
client_max_body_size 100m;
location ~ ^/(assets|packs) {
expires max;
gzip_static on;
}
}
# 保存配置文件,重启 NGINX
sudo service nginx reload
# 添加可执行权限,以确保 NGINX 有足够权限访问 passenger 配置文件
chmod o+x $HOME
设置环境变量
我们的 Ruby On Rails 项目需要用到一些隐蔽的环境变量,比如说在 database.yml 中的生产环境数据库参数 ENV["DATABASE_URL"]
或 ENV["DATABASE_PASSWORD"]
,还比如说用于解密其他隐蔽变量的参数 ENV["RAILS_MASTER_KEY"]
等。这些关键且重要的环境变量是要谨慎保存并且不可被外界获取到的。
通常,我们采用两种方式来设置和管理这些隐蔽的环境变量:一种是 rbenv 带的 .rbenv-vars,另一种是 Rails 带的 credentials ( 文献[4] ) 。
采用 .rbenv-vars
如果您采用第一种方式,那么您需要在云服务器上的 Ruby On Rails 项目根目录,创建和编辑 .rbenv-vars 文件,将您的环境变量在该文件内进行设置和管理。当我们想要在项目内使用这些环境变量时,使用 ENV["YOUR_ENV_VAR_NAME"]
(把 YOUR_ENV_VAR_NAME 改成您的环境变量名称) 来获取。
项目根目录上的 .rbenv-vars 文件内的环境变量,一般默认是各环境共享的、通用的。假如您的项目分为一个 production 文件夹(生产环境使用)和一个 test 文件夹(测试环境使用),那么您可以分别在这两个文件夹中创建和编辑 .rbenv-vars 文件。这样一来,不同环境下的环境变量就是自定的、不同的。
# 远程
# 如果您还没有项目的根目录,那么需要新建一个,修改 deploy 成您的用户名,修改 YOUR_APP_NAME 成您的项目名(后同)
mkdir /home/deploy/YOUR_APP_NAME
# 使用 vim
新建或修改 .rbenv-vars 文件
vim /home/deploy/YOUR_APP_NAME/.rbenv-vars
# 举个例子,假设您要使用 ENV["DATABASE_URL"]
来配置项目数据库参数,那么我们需要添加环境变量 DATABASE_URL
# 修改 YOUR_ACCOUNT_NAME 成您的数据库账户名,YOUR_ACCOUNT_PASSWORD 成您的数据库账户密码,YOUR_DATABASE_NAME 成您的数据库名字
DATABASE_URL=postgresql://YOUR_ACCOUNT_NAME:YOUR_ACCOUNT_PASSWORD@127.0.0.1/YOUR_DATABASE_NAME
# 用于解密的环境变量 RAILS_MASTER_KEY
RAILS_MASTER_KEY=YOUR_MASTER_KEY
采用 credentials
如果您采用第二种方式,那么您将使用 rails credentials:edit
命令来打开和编辑 config/credentials.yml.enc 文件,您的环境变量将在这个文件内进行设置和管理。当您要使用它们时,使用 Rails.application.credentials.dig(:YOUR_ENV_VAR_NAME)
来获取。
假如您使用 VS Code 来编辑文件或代码,那么可以在上述命令前加入编辑器参数,指定用 VS Code 来打开和编辑 config/credentials.yml.enc 文件:EDITOR="code --wait" rails credentials:edit
请注意:config/credentials.yml.enc 文件内的环境变量,一般默认是各环境共享的、通用的。假如您想要为生产环境(production)设置不同的、独立的环境变量,那么请使用 rails credentials:edit -e production
命令来创建和打开编辑 config/credentials/production.yml.enc 文件。这个文件内存储的是生产环境特有的、独立的环境变量。
在第二种方式中,以 .yml.enc 作为后缀的文件是环境变量的存储文件。并且为了安全,这些文件默认情况下是被加密的。您可以用自己的编辑器,例如 VS Code,来直接打开这些文件(不用 rails credentials:edit
命令的方式),您就会发现里面的内容是被加密的。那为什么用 rails
命令就能正确打开这些文件呢?
因为解密的密码也存储在我们的项目之中。解密 config/credentials.yml.enc 文件的密码存储在 config/master.key 文件中。解密 config/credentials/production.yml.enc 文件的密码存储在 config/credentials/production.key 文件中。
您可以通过 scp
命令把 .key 文件拷贝到云服务器的项目目录内,可解决因找不到解密密码导致被加密后的环境变量无法被获取的错误。
如果您使用 Capistrano 部署工具,那么可以拷贝至 /home/deploy/YOUR_APP_NAME/shared/config(修改 deploy 成您的用户名,修改 YOUR_APP_NAME 成您的项目名) 目录内,并在 config/deploy.rb 中配置 :linked_files
共享文件,详见
配置 Capistrano。
并且需要在 config/environments/production.rb 中打开 config.request_master_key = true
配置。
千万不要将这些 .key 文件上传或提交到公开的线上,比如说您的 GitHub 仓库!请将它们添加至您项目的 .gitignore 文件中!!!
部署上线
远程的基础环境及配置,我们已经准备完成了。接下来,我们将会使用 Capistrano 完成一键部署上线我们的项目代码。在这个环节,您可以使用自己熟悉的方式来上线代码,包括但不限于传统的 Git 推拉方式等。本文介绍使用 Capistrano,它可以帮助我们方便快捷地完成生产环境上的代码版本管理。
安装 Capistrano
我们需要在 Ruby On Rails 项目中添加相应的 Gems。一般而言,我们都是在开发环境上修改提交代码,然后再到生产环境中部署上线新代码,所以 Capistrano 的 Gems,我们只需要添加在开发环境中即可。如果您生产环境或其他环境中需要用到 Capistrano,请将相关 Gems 添加到相应的环境中,或者添加至全局环境中:
# 本地
# 打开 Gemfile,添加以下 Gems
group :development do
gem 'capistrano', '~> 3.17', require: false
gem 'capistrano-rails', '~> 1.6', require: false
gem 'capistrano-passenger', '~> 0.2.1'
gem 'capistrano-rbenv', '~> 2.2'
# 如果您使用 net-ssh 5.0 或更高版本,请添加以下 Gems
# net-ssh 5.0 and later requires the following gems for ed25519 support
gem 'ed25519', '>= 1.2', '< 2.0'
gem 'bcrypt_pbkdf', '>= 1.0', '< 2.0'
end
# 安装和初始化生产环境的 Capistrano
bundle install
cap install STAGES=production
安装完成后,我们应该会得到 3 个新的关键配置文件:
- Capfile
- config/deploy.rb
- config/deploy/production.rb
配置 Capistrano
我们先来编辑 Capfile 文件,修改或添加以下内容:
# 本地
# 打开修改 Capfile 文件
# 启用相关 Gems
require 'capistrano/rails'
require 'capistrano/passenger'
require 'capistrano/rbenv'
# 设置正确的 Ruby 版本,本文项目的 Ruby 版本号是 3.1.2,请把它改成您的项目所用的 Ruby 版本号(后同)
set :rbenv_type, :user
set :rbenv_ruby, '3.1.2'
然后,我们来编辑 config/deploy.rb 文件。在这个文件中,我们将配置项目名称和 Git 路径以及分支等。今后跟环境变量、部署流程、共享文件等相关的配置和设置,几乎都在这个文件中编辑修改。建议您查看该文件里的内容,对每项设置有个大概的了解。
# 本地
# 打开修改 config/deploy.rb 文件
# 设置项目名称,修改 YOUR_APP_NAME 成您的项目名(后同)
set :application, "YOUR_APP_NAME"
# 设置 Git 路径
set :repo_url, "git@github.com:username/YOUR_APP_NAME.git"
# 设置 Git 分支,Capistrano 默认是 master 分支。由于新的 GitHub 项目默认主分支是 main 分支,您可以设置 Capistrano 默认分支为 main 分支(可选,且不与下条配置重复)
set :branch, 'main'
# 进一步,如果您希望每次部署都自由指定 Git 分支,可以配置以下代码(可选,且不与上条配置重复)
ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp
# 设置部署路径,修改 deploy 成您的远程用户名(后同)
# 这个路径与之前的 NGINX 配置中的 root
路径相同
set :deploy_to, "/home/deploy/#{fetch :application}"
# 设置共享文件,如果您使用 credentials 设置环境变量,那您可能需要此设置
append :linked_files, "config/master.key", "config/credentials/production.key"
# 设置共享文件夹
append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', '.bundle', 'public/system', 'public/uploads'
# 默认保留最近5次的发布版本
set :keep_releases, 5
最后,我们来编辑 config/deploy/production.rb 文件,修改或添加以下内容:
# 本地
# 打开修改 config/deploy/production.rb 文件
# 修改 1.2.3.4
成您的云服务器公网IP,修改 deploy 成您的远程用户名
server '1.2.3.4', user: 'deploy', roles: %w{app db web}
上线代码
现在我们可以部署上线我们的项目至生产环境了:
# 本地
# 一键部署,修改 deploy 成您的远程用户名
cap production deploy
现在打开您的浏览器,输入您的云服务器公网 IP 地址或网站域名,尝试访问一下。理论上,您的项目已经成功完成部署上线了!恭喜!!!
常见问题
- 遇见 (ExecJS::RuntimeUnavailable): Could not find a JavaScript runtime 错误
- 遇见 Nginx deny permission 错误
- 遇见 Redis::CannotConnectError: Connection refused 错误
-
在云服务器上输入命令:
redis-cli
检查是否已安装 redis。
如果没有安装,运行sudo apt-get install redis-server
进行安装。 -
在云服务器上输入命令:
ps aux | grep redis
检查 redis 是否启动服务。
如果没有启动服务,运行redis-server
启动服务。
答:在云服务器上安装 Node.js:sudo apt-get install nodejs
答:在云服务器上输入命令:chmod o+x $HOME
参考文献
- Deploy Ruby On Rails. GO RAILS. https://gorails.com/deploy/ubuntu/22.04
- 3 Steps to Perform SSH Login Without Password Using ssh-keygen & ssh-copy-id. THE GEEK STUFF. https://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-password-using-ssh-keygen-ssh-copy-id/
- Deploying a Rails App on Ubuntu 20.04 LTS with Capistrano, Nginx, and Puma. MATTEW HOELTER. https://www.matthewhoelter.com/2020/11/10/deploying-ruby-on-rails-for-ubuntu-2004.html
- Securing Rails Applications. RAILS GUIDES. https://guides.rubyonrails.org/v7.0/security.html#custom-credentials
- The Complete Guide to Ruby on Rails Encrypted Credentials. WEB CRUNCH. https://webcrunch.com/posts/the-complete-guide-to-ruby-on-rails-encrypted-credentials