购买便宜的云服务器
需要购买服务器实际操作
配置服务器
登录
不推荐使用「用户名 + 密码」登录,容易忘,且不安全
推荐使用 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`
解决见下篇