美文网首页
自动部署升级更新服务器

自动部署升级更新服务器

作者: zhyuzh3d | 来源:发表于2023-06-05 12:05 被阅读0次

    项目有开发测试服务器和正式服务器,每次更新都有点麻烦:

    • 备份当前的Web页面资源和后端服务程序
    • 从测试服务器复制Web页面资源和后端服务程序到正式服务器
    • 关闭当前后端服务器并重启新的
    • 如果出现问题还要快速回滚:从备份文件夹拷贝回来,再重启后端服务

    如何让这一切自动化实现?下面以一个golang的web站点为例,目录对照如下:

    内容 测试服务器 正式服务器
    域名或IP x2.domain.com x.domain.com
    Web页面资源文件夹 /root/server2/web/build/ /root/server/web/build/
    Golang服务器程序文件 /root/server2/web/goserver /root/server2/web/goserver
    备份文件夹 ... /root/bak/
    后端服务器运行端口 ... 8000

    Web页面资源使用nginx自动提供,不需要重启。

    自动部署新版的脚本

    如下编写一个update.sh脚本文件,更新只要执行sh update.sh即可,注意最好都使用绝对路径,避免从其他文件夹运行脚本出错。

    baktime=$(date +%Y-%m-%d-%H-%M)
    mkdir -p /root/bak/server_$baktime/web/
    cp -r /root/server/web/build/ /root/bak/server_$baktime/web/
    cp /root/server/goserver /root/bak/server_$baktime/
    
    scp -r root@x2.domain.cn:/root/server/web/build/ /root/server/web/
    yes | mv -f /root/server/server server_$baktime
    scp root@x2.domain.cn:/root/server/goserver /root/server/goserver
    
    chmod 777 /root/server/goserver
    lsof -i :8000 | grep goserver | awk '{print $2}' | xargs kill -7
    nohup /root/server/goserver --mod=pro >/root/server/goserver.log 2>&1 & disown
    
    • baktime=$(date +%Y-%m-%d-%H-%M)创建时间变量精确到分钟,用来做备份文件夹名称
    • mkdir,创建文件夹,-p创建多层目录;
    • cp,复制到备份文件夹
    • scp,使用ssh远程复制,会提示输入测试服务器密码,要想永久自动输入密码,先执行下面两个命令:
      • ssh-keygen建议输入一个新文件名/root/.ssh/xxx
      • ssh-copy-id root@x2.shiyancang.cn需要登录密码就能添加成功
    • yes行,先重命名当前的goserver文件,避免出现Text is busy文件被占用无法复制的问题。
    • chmod行,给予复制过来的新文件可执行权限
    • lsof行,使用管道直接关闭掉8000端口的goserver程序
    • nohup行,后台重启goserver后端服务

    自动回滚老版的脚本

    同样创建rollbak.sh文件如下,回滚执行sh rollbak.sh然后输入需要回滚的备份文件夹名称即可。

    echo "> 可用备份:"
    ls /root/bak/
    echo "> 请输入或复制粘贴需要回滚的备份完整名称:"
    read bakfolder
    
    echo "正在从 $bakfolder 回滚build文件夹和goserver执行文件"
    cp -r /root/bak/$bakfolder/web/build /root/server/web/
    baktime=$(date +%Y-%m-%d-%H-%M)
    yes | mv -f /root/server/goserver goserver_rollbak_$baktime
    cp /root/bak/$bakfolder/server /root/server/server
    
    echo "> 正在重新启动zerver服务器程序..."
    chmod 777 /root/server/server
    lsof -i :3031 | grep server | awk '{print $2}' | xargs kill -7
    nohup /root/server/goserver --mod=pro >/root/server/goserver.log 2>&1 & disown
    echo "> 回滚已经完成!"
    

    这里仍然把现有的goserver文件重命名为时间戳文件名备用。


    END

    相关文章

      网友评论

          本文标题:自动部署升级更新服务器

          本文链接:https://www.haomeiwen.com/subject/zfosedtx.html