网站部署
配置生产环境
- 购买服务器(待完善)
- 配置服务器
登录:使用ssh-copy-id
上传公钥,使用ssh登录
防火墙:推荐开启测试端口,如3000、3001、5000、8000、8080,自行选择是否开启重要端口,因为需要备案,如80,443。
用户权限:推荐只在root用户里安装Docker,为每个应用创建一个独立用户,并加入docker用户组,切忌root管理所有应用。
发行版:推荐使用Ubuntu次新版。
- 配置后端生产环境
步骤:准备一个新用户,准备好 Docker,上传 Dockerfile,上传源代码用 ,Dockerfile 构建运行环境,在运行环境里运行源代码,使用 Nginx 做转发。
版本更新:上传新 Dockerfile,上传新源代码,用 Dockerfile 构建新运行环境,在新环境运行新代码,使用 Nginx 做转发。Nginx会进行负载均衡。
- 配置前端生产环境
- 将代码中的路径替换成CDN路径(尤其是那些静态资源文件,阿里云OSS能够,使得)
- 上传打包好的CSS和JS代码到CDN
- 将html文件上传到后端服务器
- 使用Nginx处理html文件请求
宿主机内部署
添加根路由,创建home的controller,bin/rails g controller home index
,修改config/router.rb
文件。
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
文件。
class HomeController < ApplicationController
def index
render json: {
message: "Welcome!"
}
end
end
部署到宿主机需要将代码从docker容器中复制到宿主机文件中,则在bin文件夹下创建pack_for_host.sh
和set_up_host.sh
文件。并在config文件夹下创建host.Dockerfile
。还需要给脚本添加权限chmod +x bin/pack_for_host.sh
,chmod +x bin/set_up_host.sh
。或者执行chmod +x bin/*.sh
,给所有脚本加上权限。
# 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 的时候在运行
# 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!'
# 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官网。