我的博客是用Rust的actix-web框架写成的,为了方便部署,整个应用是放在Docker上运行的。最近更新了博客的代码,从actix-web 3.x升级到了4.x,其它的依赖包也尽可能的更新到了最新版本。在部署的时候发现,上一次更新博客程序已经是2年前了,都已经有点儿忘记之前是怎么部署的了,所以这次捣鼓完赶快写个文档记录一下。
我的各方面需求
由于我的服务器上还跑了其它的很多服务,所以肯定不会让博客应用去直接提供web服务的,而是使用了nginx统一作为web服务器,因此TLS层的加密、日志记录等功能也是由nginx处理了,顺带着一些不会改变的静态资源,我也交给了nginx处理,actix-web只处理逻辑的部分。
起初把sbw-blog放在Docker中跑是由于服务器的系统版本和我的开发电脑相差比较大,依赖不好处理,而如果在服务器上跑Rust编译,一个是资源不够,一个是要把源代码往服务器传,感觉比较麻烦。
另外,博客数据的存储是单独放在一个MariaDB里面的,即sbw-blog所在的Docker环境中只跑一个应用,数据库和nginx都是另外的组件,这样后面为博客做升级或者升级出问题fallback的时候也比较简单,重新起一个对应版本的container就可以了。
我的Dockerfile
Dockerfile主要分为两部分,builder环境和对应的运行环境,builder是利用rust官方的镜像进行编译,这个镜像已经带好了最新版本的rust-release工具链。
编译好之后,将二进制拷贝到运行环境中,我使用的运行环境是bullseye-slim,一个很轻量的运行环境,并且也只安装了必要的组件,加上博客应用后整个镜像不到100MB。
部署新的博客程序
先在Dockerfile目录使用以下命令生成新的镜像
我不想把自己的程序上传到任何地方,即使是Private仓库,所以使用导出镜像的方式进行部署。使用docker save命令将镜像保存到文件,目的是导出给服务器的docker使用。注意这里的docker save和后面的docker load跟相似的docker export/docker import是不同的命令。
然后,把tar包传到服务器之后,先将旧的镜像重新打个tag备份一下,以防升级失败后不好回滚:
在服务器上使用docker load导入新的镜像:
为了方便启动镜像,我使用了docker-compose,以下是大致的内容:
只需要修改image中的镜像tag,就可以方便的启动不同版本的博客应用,回滚非常方便。