坏蛋Dan
知乎@坏蛋Dan
发布时间:2024.1.4

前言

前面我们开发完毕后就可以准备部署到云端了。


部署

这里直接用docker,省事。

如果还不知道如何使用docker,可以看这篇文章:

坏蛋Dan:docker简单入门

首先我们在我们的项目根目录创建一个Dockerfile文件和.dockerignore

其中Dockerfile为:

这里做的事很简单,就是基于rust镜像,执行cargo build --release,然后运行构建的产物,暴露的端口是8000. release/blog-server文件。

.dockeringore

不多说。

接着我们需要修改下配置,回到Rocket.toml文件中

由于我们是要运行在云端的,所以host需要改成0.0.0.0。而数据库连接的host则是后面我们给postgres容器创建的网络,这个host每个人的都是不一样的,需要自行修改,而不是0.0.0.0

这里的host实际上还可以是docker network的别名,可以通过docker network ls找到你的容器network网,然后可以通过docker network inspect [container name]的方式看到容器网络的详细,其中包括了网络的别名,我这里是postgres

然后就可以构建了

构建完之后先到官网去创建一个仓库用来承接我们的镜像

接着去到云服务器上。

我们先pull下来镜像

拉下来后我们先不急着创建容器。

由于我们之前的postgresql数据库已经是运行在云端的了,所以这个时候我就不用docker-compose了,直接通过网络连接它们。

我们先来创建一个network,打通两个容器之间的联系。

可以通过docker network inspect [network name]去查看是否绑定成功

绑定完之后我们就可以创建和运行项目容器了

这一段很简单,将容器端口映射到服务器上,然后绑定到前面创建的docker网络上

然后我们可以通过log看下是否运行成功

那么现在就可以了,我们去测试下

可以连接的上

这样就部署完毕了


安全问题

这里有一个安全问题,我们的dockerfile或者docker-compose.yml以及Rocket.toml文件都会跟着打包到

docker镜像中,如果你不是放到docker hub private里而是默认public里的话,别人是可以直接下载并且通过docker exec的方式进入到容器里并且查看到上面几个文件内容的。

所以要么你每个月花35刀放到docker hub私有仓库里,要么我们就不要把重要的东西比如秘钥、数据库url端口等硬编码到这几个文件中。

那么要怎么解决这个问题呢?我们实际上可以通过环境变量的方式去实现

  1. 首先我们先去掉Rocket.toml等文件中重要的硬编码内容。
  2. 设置环境变量,然后通过环境变量的方式去传入,不过在这之前,我们要修改下项目里的代码,毕竟现在是通过环境变量的方式传入,是不会被自动识别的。

这里我的数据库环境变量是ROCKET_DB,通过std::env::var的方式获取,然后合并到全局的config里。

  1. 然后我们docker build以及push到仓库里。
  2. 运行容器的时候传入环境变量`

这样就可以了。

总结

那么这整个流程就差不多了。

这里其实应该本机也是一套postgres容器,这样搭配docker-compose开发和部署就会很舒服。。。

编辑于 2023-09-24 22:29・IP 属地广东