实战篇笔记-山竹记账后端(四)


购买便宜的云服务器

需要购买服务器实际操作

配置服务器

登录

  • 不推荐使用「用户名 + 密码」登录,容易忘,且不安全

  • 推荐使用 ssh-copy-id 上传公钥,使用 ssh 登录

  • 具体教程请自己搜索(不同系统命令不同)

防火墙

  • 推荐开启测试端口,如 3000、3001、5000、8000、8080

  • 自行选择是否开启重要端口,因为需要备案,如 80、443

用户权限

  • 推荐只在 root 用户里安装 Docker 即可

  • 每个应用创建一个独立用户,并加入 docker 用户组

  • 切忌用 root 管理所有应用

# 创建独立用户 ubuntu add user to group
adduser mangosteen
# ubuntu install docker
apt-get update
# 用户授权
# 登录 root 账号
ssh root@服务器ip
# 创建 /home/mangosteen/.ssh 目录
mkdir /home/mangosteen/.ssh
# 复制 authorized_keys 文件到刚创建的目录
cp ~/.ssh/authorized_keys /home/mangosteen/.ssh
cd /home/mangosteen
chown -R mangosteen:mangosteen .ssh
# 登录成功
ssh mangosteen@服务器ip

部署思路

步骤

  • 准备一个新用户(看上文)

  • 准备好 Docker(看上文)

  • 上传 Dockerfile

  • 上传源代码

  • 用 Dockerfile 构建运行环境

  • 在运行环境里运行源代码

  • 使用 Nginx 做转发

版本更新

  • 上传新 Dockerfile

  • 上传新源代码

  • 用 Dockerfile 构建新运行环境

  • 在新环境运行新代码

  • 使用 Nginx 做转发

配置前端生产环境

  • 将代码中的路径替换成 CDN 路径

  • 上传打包好的 CSS 和 JS 代码到 CDN

  • 将 html 文件上传到后端服务器

  • 使用 Nginx 处理 html 文件请求

在宿主机里部署

bin 目录新建 pack_for_host.sh, setup_host.sh

# pack_for_host.sh
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 *
mkdir -p $deploy_dir
cp $current_dir/../config/host.Dockerfile $deploy_dir/Dockerfile
cp $current_dir/setup_host.sh $deploy_dir/
mv $dist $deploy_dir
echo $time > $deploy_dir/version
echo 'DONE!'

# setup_host.sh
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 'DONE!'

config 目录新建 host.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 ./
RUN bundle config set --local without 'development test'
RUN bundle install
ENTRYPOINT bundle exec puma

开发容器终端运行

chmod +x bin/*.sh
bin/pack_for_host.sh

回到 windows oh-my-env 目录,会看到打包好的 mangosteen_deploy,使用 cmder 或 git bash 运行

mangosteen_deploy/setup_host.sh

这个时候 docker ps -a 发现启动失败了

使用 docker logs [CONTAINER ID] 查看原因

! Unable to load application: ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `bin/rails credentials:edit`

解决见下篇


文章作者: April-cl
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 April-cl !
  目录