如何把Rails7项目部署到ubuntu服务器上

560 阅读3分钟

登录服务器

ssh ubuntu@1.2.3.4 # 替换的你的主机ip
ssh deploy@1.2.3.4

增加deploy用户

adduser deploy
adduser deploy 
sudomkdir /homde/deploy/certs # 后面放ssl证书exit

Mac客户端使用ssh-copy-id快速登录

brew install ssh-copy-idssh-copy-id deploy@1.2.3.4 # 替换的你的主机ip

安装必要的环境依赖

# Adding Node.js repositorycurl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -# Adding Yarn repositorycurl -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.listsudo add-apt-repository ppa:chris-lea/redis-server# Refresh our packages list with the new repositoriessudo apt-get update# Install our dependencies for compiiling Ruby along with Node.js and Yarnsudo 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 dirmngr gnupg apt-transport-https ca-certificates redis-server redis-tools nodejs yarn

安装Ruby

git clone https://github.com/rbenv/rbenv.git ~/.rbenvecho 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrcecho 'eval "$(rbenv init -)"' >> ~/.bashrcgit clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-buildecho 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrcgit clone https://github.com/rbenv/rbenv-vars.git ~/.rbenv/plugins/rbenv-varsexec $SHELLrbenv install 2.7.3rbenv global 2.7.3ruby -v# ruby 2.7.3

安装bundler并配置代理

gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/​# This installs the latest Bundler, currently 2.x.gem install bundler# For older apps that require Bundler 1.x, you can install it as well.gem install bundler -v 1.17.3# Test and make sure bundler is installed correctly, you should see a version number.bundle -v# Bundler version 2.0bundle config mirror.https://rubygems.org https://gems.ruby-china.com
# 如果bundle not found
rbenv rehash

Installing NGINX & Passenger

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger focal main > /etc/apt/sources.list.d/passenger.list'sudo apt-get updatesudo apt-get install -y nginx-extras libnginx-mod-http-passengerif [ ! -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 ; fisudo ls /etc/nginx/conf.d/mod-http-passenger.conf

change the passenger_ruby

sudo vim /etc/nginx/conf.d/mod-http-passenger.confpassenger_ruby /home/deploy/.rbenv/shims/ruby;

启动Nginx

sudo service nginx start

配置Nginx(后面所有步骤的myapp请根据情况更改)

sudo rm /etc/nginx/sites-enabled/default
sudo vim /etc/nginx/sites-enabled/myapp

server {  listen 80;  listen [::]:80;​  server_name www.rubyc.cn;  root /home/deploy/myapp/current/public;​  passenger_enabled on;  passenger_app_env production;​  location /cable {    passenger_app_group_name myapp_websocket;    passenger_force_max_concurrent_requests_per_process 0;  }​  # Allow uploads up to 100MB in size  client_max_body_size 100m;​  location ~ ^/(assets|packs) {    expires max;    gzip_static on;  }}

重启Nginx

sudo service nginx reloadsudo service nginx start

查看Nginx是否启动

passenger-status # 如无报错则说明正常运行

安装PostgreSQL Database

sudo apt-get install postgresql postgresql-contrib libpq-devsudo su - postgrescreateuser --pwprompt deploy# Qq759337828pgsql..createdb -O deploy myappexit​​You can manually connect to your database anytime by running psql -U deploy -W -h 127.0.0.1 -d myapp. Make sure to use 127.0.0.1 when connecting to the database instead of localhost.

安装 MySQL Database(把下面的password替换成你想设置的密码,后面步骤要用到)

sudo apt-get install mysql-server mysql-client libmysqlclient-devsudo mysql_secure_installation# Open the MySQL CLI to create the user and databasemysql -u root -p​​​CREATE DATABASE IF NOT EXISTS myapp;CREATE USER IF NOT EXISTS 'deploy'@'localhost' IDENTIFIED BY 'password';CREATE USER IF NOT EXISTS 'deploy'@'%' IDENTIFIED BY 'password';GRANT ALL PRIVILEGES ON myapp.* TO 'deploy'@'localhost';GRANT ALL PRIVILEGES ON myapp.* TO 'deploy'@'%';FLUSH PRIVILEGES;\q

如果你的项目使用mysql或pg,请确保你的Gemfile文件中有相关gem(根据需要添加或者删除)

gem "pg", "~> 1.1"gem "mysql2"

配置database连接信息,以MySQL为例(如果是pg应该不需要修改代码,因为默认生成的是pg配置信息)

# config/database.ymldefault: &default  adapter: mysql2  encoding: utf8  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>  username: root  password:    socket: /tmp/mysql.sock

把本地项目推到你的代码管理仓库(已推送请忽略)

把服务器的id_rsa.pub添加到你代码仓库的delopy key中

# 服务器运行ssh-keygen -t rsa # 一直按Enter键即可cat ~/.ssh/id_rsa.pub # 把这个打印出的秘文添加到代码仓库的delopy key中

本地项目安装Setting Up Capistrano

gem 'capistrano', '~> 3.11'gem 'capistrano-rails', '~> 1.4'gem 'capistrano-passenger', '~> 0.2.0'gem 'capistrano-rbenv', '~> 2.1', '>= 2.1.4'​bundlecap install STAGES=production​​# Capfilerequire 'capistrano/rails'require 'capistrano/passenger'require 'capistrano/rbenv'set :rbenv_type, :userset :rbenv_ruby, '3.1.1'​# config/deploy.rb# config valid for current version and patch releases of Capistranolock "~> 3.17.0"set :application, "myapp"set :repo_url, "your_repo_url"​# Default branch is :master# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp​# Default deploy_to directory is /var/www/my_app_nameset :deploy_to, "/home/deploy/#{fetch :application}"​# Default value for :format is :airbrussh.# set :format, :airbrussh​# You can configure the Airbrussh format using :format_options.# These are the defaults.# set :format_options, command_output: true, log_file: "log/capistrano.log", color: :auto, truncate: :auto​# Default value for :pty is false# set :pty, true​# Default value for :linked_files is []append :linked_files, "config/database.yml", 'config/master.key'​# Default value for linked_dirs is []append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets",'vendor/bundle', "tmp/webpacker",'.bundle', "public/system", "vendor", "storage", 'public/uploads'​# Default value for default_env is {}# set :default_env, { path: "/opt/ruby/bin:$PATH" }​# Default value for local_user is ENV['USER']# set :local_user, -> { `git config user.name`.chomp }​# Default value for keep_releases is 5set :keep_releases, 5​# Uncomment the following to require manually verifying the host key before first deploy.# set :ssh_options, verify_host_key: :secure​================================================

服务器主机配置相关参数(请将👇的相关信息按照你主机的信息填写)

sudo vim /home/deploy/myapp/.rbenv-vars

# For PostgresDATABASE_URL=postgresql://deploy:PASSWORD@127.0.0.1/myapp​# For MySQLDATABASE_URL=mysql2://deploy:Password@localhost/myapp​RAILS_MASTER_KEY=xxx(下个步骤生成)SECRET_KEY_BASE=yyyy(下个步骤生成)​# etc...

项目生成master.key

EDITOR="vim" rails credentials:editsecret_key_base:                     de99780361eb9ddc18262d723a18ba038ad44703fca4b34936b16a90ef8c7a53cb9d04d41e9788fc9d5431b1e1a45a754ec448c46ab7e9d55f0c15e15a32d2f6# 把这的秘钥替换到yyyy​# 查看master.keycat master.key# 把结果替换上面的xxx

项目启用master.key

# config/environments/production.rb 
config.require_master_key = true

检查cap

cap production deploy:check # 如有报错请根据提示修改

部署

cap production deploy # 如有报错请根据提示修改

大功告成

配置SSL(HTTPS)

先把你的ssl证书上传到服务器的/home/deploy/目录下

sudo vim /etc/nginx/sites-enabled/myapp​server {    listen 443 ssl;​    server_name your_domain;    ssl_certificate your_domain.crt;    ssl_certificate_key your_domain.key;​    ssl_session_timeout 5m;    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;    ssl_protocols TLSv1.2 TLSv1.3;    ssl_prefer_server_ciphers on;​    root /home/deploy/myapp/current/public;    passenger_enabled on;    passenger_app_env production;​    location /cable {      passenger_app_group_name myapp_websocket;      passenger_force_max_concurrent_requests_per_process 0;    }​    # Allow uploads up to 100MB in size    client_max_body_size 100m;    location ~ ^/(assets|packs) {      expires max;      gzip_static on;    }}server {    listen 80;    #填写绑定证书的域名    server_name your_domain;     #把http的域名请求转成https    return 301 https://$host$request_uri; }

可能遇到的问题(修改项目文件后及时提交到git)

  1. Error: The application encountered the following error: You have already activated strscan 1.0.3, but your Gemfile requires strscan 3.0.1. Since strscan is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports strscan as a default gem. (Gem::LoadError)

    解决办法:

    # Gemfile.lock 找到strscan的3.0.1改成1.0.3,改完要及时提交到gitstrscan (3.0.1)改成下面的strscan (1.0.3)
    
  2. 访问项目时报错

    sudo cat /var/log/nginx/error.log # 看一下报错原因,根据报错原因修改
    
  3. Error: The application encountered the following error

    可能的原因

    3.1 你没启动nginx

    sudo service nginx start