Skip to content

网站部署

配置生产环境

  • 购买服务器(待完善)
  • 配置服务器

登录:使用ssh-copy-id上传公钥,使用ssh登录

防火墙:推荐开启测试端口,如3000、3001、5000、8000、8080,自行选择是否开启重要端口,因为需要备案,如80,443。

用户权限:推荐只在root用户里安装Docker,为每个应用创建一个独立用户,并加入docker用户组,切忌root管理所有应用。

发行版:推荐使用Ubuntu次新版

  • 配置后端生产环境

步骤:准备一个新用户,准备好 Docker,上传 Dockerfile,上传源代码用 ,Dockerfile 构建运行环境,在运行环境里运行源代码,使用 Nginx 做转发。

版本更新:上传新 Dockerfile,上传新源代码,用 Dockerfile 构建新运行环境,在新环境运行新代码,使用 Nginx 做转发。Nginx会进行负载均衡。

  • 配置前端生产环境
  1. 将代码中的路径替换成CDN路径(尤其是那些静态资源文件,阿里云OSS能够,使得
  2. 上传打包好的CSS和JS代码到CDN
  3. 将html文件上传到后端服务器
  4. 使用Nginx处理html文件请求

宿主机内部署

添加根路由,创建home的controller,bin/rails g controller home index,修改config/router.rb文件。

ruby
Rails.application.routes.draw do
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
  
  # Defines the root path route ("/")
  # root "articles#index"
  get '/' ,to: 'home#index'
  
  namespace :api do
    namespace :v1 do
      resources :validation_codes, only: [:create]
      resource :session, only: [:create, :destory]
      resource :me, only: [:show]
      resources :items
      resources :tags
    end
  end
end

在修改contollers/home_contoller.rb文件。

ruby
class HomeController < ApplicationController
  def index
    render json: {
      message: "Welcome!"
    }
  end
end

部署到宿主机需要将代码从docker容器中复制到宿主机文件中,则在bin文件夹下创建pack_for_host.shset_up_host.sh文件。并在config文件夹下创建host.Dockerfile。还需要给脚本添加权限chmod +x bin/pack_for_host.shchmod +x bin/set_up_host.sh。或者执行chmod +x bin/*.sh,给所有脚本加上权限。

ruby
# host.Dockerfile给宿主机运行镜像的dockerfile,配置环境
FROM ruby:3.0.0

ENV RAILS_ENV production
# 设置环境生产环境
RUN mkdir /mangosteen
# 设置文件夹
RUN bundle config mirror.https://rubygems.org https://gems.ruby-china.com
# 设置国内镜像源
WORKDIR /mangosteen
# 设置工作目录
ADD mangosteen-*.tar.gz ./
# 解压缩包 mangosteen-*.tar.gz 到当前目录名 *表示随机值
RUN bundle config set --local without 'development test'
# 安装依赖(不安装development test环境的包)
RUN bundle install
ENTRYPOINT bundle exec puma
# 即当运行docker run 的时候在运行
ruby
# pack_for_host.sh 是将代码打包放到宿主机的目录
# 注意修改 oh-my-env 目录名为你的目录名
dir=oh-my-env

time=$(date +'%Y%m%d-%H%M%S')
# 声明时间
dist=tmp/mangosteen-$time.tar.gz
# 打包路径
current_dir=$(dirname $0)
# 当前文件
deploy_dir=/workspaces/$dir/mangosteen_deploy

yes | rm tmp/mangosteen-*.tar.gz; 
yes | rm $deploy_dir/mangosteen-*.tar.gz; 

tar --exclude="tmp/cache/*" -czv -f $dist *
# tmp/cache/*文件下的不打包 * 表示不包含.开头的文件
mkdir -p $deploy_dir
# 创建文件夹
cp $current_dir/../config/host.Dockerfile $deploy_dir/Dockerfile
cp $current_dir/set_up_host.sh $deploy_dir/
mv $dist $deploy_dir
echo $time > $deploy_dir/version
echo 'DONE!'
ruby
# setup_host.sh 是启动docker环境
DB_PASSWORD=123456
# 容器密码
container_name=mangosteen-prod-1
# 容器名称

version=$(cat mangosteen_deploy/version)
# 部署版本

echo 'docker build ...'
docker build mangosteen_deploy -t mangosteen:$version
if [ "$(docker ps -aq -f name=^mangosteen-prod-1$)" ]; then
  echo 'docker rm ...'
  docker rm -f $container_name
fi
echo 'docker run ...'
docker run -d -p 3000:3000 --network=network1 -e DB_PASSWORD=$DB_PASSWORD --name=$container_name mangosteen:$version
# echo 'docker exec ...'
# docker exec -it $container_name bin/rails db:create db:migrate
# 创建 数据库和表
echo 'DONE!'

然后在容器的终端执行bin/pack_for_host.sh,可以发现被复制打包在oh-my-env文件下,如下所示。

然后在新起一个bash的终端执行mangosteen_deloy/setup_host.sh,rails启动报错:缺少secret_base_key需要处理配置密钥处理。可以看到docker面板里已经有容器创建了。

额外补充:masOS由于环境原因安装时会出现Nokogiri版本安装失败的问题,解决方法是在终端输入<font style="color:rgb(54, 70, 78);background-color:rgb(245, 245, 245);">bundle lock --add-platform x86_64-linux</font>,具体内容详见Nokogiri官网