前言#
前面我们开发完毕后就可以准备部署到云端了。
部署#
这里直接用docker,省事。
如果还不知道如何使用docker,可以看这篇文章:
首先我们在我们的项目根目录创建一个Dockerfile文件和.dockerignore
其中Dockerfile为:
FROM rust:latest
WORKDIR /
COPY . .
RUN cargo build --release
CMD ["/target/release/blog-server"]
EXPOSE 8000这里做的事很简单,就是基于rust镜像,执行cargo build --release,然后运行构建的产物,暴露的端口是8000. release/blog-server文件。
而.dockeringore为
target 不多说。
接着我们需要修改下配置,回到Rocket.toml文件中
[global.databases]
// postgresql://[name]:[password]@[host]:[port]/[db_name]
blog = { url = "postgresql://postgres:dirtydan@172.19.0.2:5432/blog" }
[release]
address = "0.0.0.0" 由于我们是要运行在云端的,所以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
然后就可以构建了
docker build -t [your_docker_name]/[image_name]:[tag] .
构建完之后先到官网去创建一个仓库用来承接我们的镜像

接着去到云服务器上。
我们先pull下来镜像
docker pull [your_docker_name]/[image_name]:[tag] 拉下来后我们先不急着创建容器。
由于我们之前的postgresql数据库已经是运行在云端的了,所以这个时候我就不用docker-compose了,直接通过网络连接它们。
我们先来创建一个network,打通两个容器之间的联系。
docker network create [network_name]
docker network connect --alias postgres [network name] postgres可以通过docker network inspect [network name]去查看是否绑定成功
绑定完之后我们就可以创建和运行项目容器了
docker run -dp 0.0.0.0:8000:8000 --network [network_name] --name blog-server -v blog-server-md:/md [your_docker_name]/[image_name]:[tag]这一段很简单,将容器端口映射到服务器上,然后绑定到前面创建的docker网络上
然后我们可以通过log看下是否运行成功
docker logs [container-name/id] 
那么现在就可以了,我们去测试下


可以连接的上
这样就部署完毕了
安全问题#
这里有一个安全问题,我们的dockerfile或者docker-compose.yml以及Rocket.toml文件都会跟着打包到
docker镜像中,如果你不是放到docker hub private里而是默认public里的话,别人是可以直接下载并且通过docker exec的方式进入到容器里并且查看到上面几个文件内容的。
所以要么你每个月花35刀放到docker hub私有仓库里,要么我们就不要把重要的东西比如秘钥、数据库url端口等硬编码到这几个文件中。
那么要怎么解决这个问题呢?我们实际上可以通过环境变量的方式去实现
- 首先我们先去掉
Rocket.toml等文件中重要的硬编码内容。 - 设置环境变量,然后通过环境变量的方式去传入,不过在这之前,我们要修改下项目里的代码,毕竟现在是通过环境变量的方式传入,是不会被自动识别的。
pub fn get_custom_figment() -> Figment {
let url = env::var("ROCKET_DB").expect("get ROCKET_DB fail");
let databases = map!["blog" => map!["url" => url]];
Figment::from(Config::default())
.join(("databases", databases))
.merge(Toml::file("Rocket.toml").nested())
.merge(Serialized::defaults(MyConfig::default()))
}这里我的数据库环境变量是ROCKET_DB,通过std::env::var的方式获取,然后合并到全局的config里。
-
然后我们
docker build以及push到仓库里。 -
运行容器的时候传入环境变量`
docker run ... -e ROCKET_DB='postgresql://[name]:[password]@[host]:[port]/[db_name]' ...这样就可以了。
总结#
那么这整个流程就差不多了。
这里其实应该本机也是一套postgres容器,这样搭配docker-compose开发和部署就会很舒服。。。
编辑于 2023-09-24 22:29・IP 属地广东
