前面我们开发完毕后就可以准备部署到云端了。
这里直接用docker
,省事。
如果还不知道如何使用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
端口等硬编码到这几个文件中。
那么要怎么解决这个问题呢?我们实际上可以通过环境变量的方式去实现
Rocket.toml
等文件中重要的硬编码内容。这里我的数据库环境变量是ROCKET_DB
,通过std::env::var
的方式获取,然后合并到全局的config
里。
docker build
以及push
到仓库里。这样就可以了。
那么这整个流程就差不多了。
这里其实应该本机也是一套postgres
容器,这样搭配docker-compose
开发和部署就会很舒服。。。
编辑于 2023-09-24 22:29・IP 属地广东