使用 用 Docker Compose + Cloudflare Tunnel 把 Spring Boot + Vue 项目部署
场景:CentOS 7.8 虚拟机是 NAT(无公网入方向端口映射),但需要让站点用域名公网可访问。
本文仅保留关键步骤、关键命令与踩坑点。
## 1. 最终架构(3 行讲清楚)
- Docker Compose 启动:`mysql + redis + backend(Spring Boot) + web(nginx+前端)`
- `web` 对外暴露 `80`,并反代:`/api`、`/ws` 到 `backend:8080`
- Cloudflare Tunnel:把公网域名 `https://.example.com` 映射到 VM 的 `http://127.0.0.1:80`
---
## 2. 部署目录约定
- 项目根目录:`/opt/VideoWeb-master/`
- Compose 目录:`/opt/VideoWeb-master/deploy/docker/`
- SQL 文件:`/opt/VideoWeb-master/sql/tik_tube.sql`
---
## 3. 一键启动(Docker Compose)
### 3.1 上传代码(推荐压缩包)
Windows 打包 `VideoWeb-master.zip` → 上传 VM `/opt/` → 解压:
```bash
cd /opt
unzip VideoWeb-master.zip
```
### 3.2 配置 `.env`
```bash
cd /opt/VideoWeb-master/deploy/docker
cp .env.example .env
vi .env
```
### 3.3 启动
```bash
cd /opt/VideoWeb-master/deploy/docker
docker compose up -d --build
docker compose ps
curl -I http://127.0.0.1/
```
API 反代验证(返回 401 也算 OK):
```bash
curl -i http://127.0.0.1/api/admin/system/info
```
---
## 4. 后续更新(只重建一个服务)
```bash
cd /opt/VideoWeb-master/deploy/docker
# 只更新前端
docker compose up -d --build web
# 只更新后端
docker compose up -d --build backend
```
---
## 5. Cloudflare Tunnel(公网域名)
### 5.1 安装 cloudflared
```bash
sudo mkdir -p /usr/local/bin
curl -L -o /usr/local/bin/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
sudo chmod +x /usr/local/bin/cloudflared
cloudflared --version
```
### 5.2 登录(若 VM 登录超时:用 Windows 下载 cert.pem 再上传)
```bash
cloudflared tunnel login
mkdir -p /root/.cloudflared
mv /root/cert.pem /root/.cloudflared/cert.pem
chmod 600 /root/.cloudflared/cert.pem
```
### 5.3 创建 tunnel + 配置 + 绑定域名
```bash
cloudflared tunnel create streamverse
```
写 `/etc/cloudflared/config.yml`(把 `<TUNNEL_UUID>` 替换成你自己的):
```yml
tunnel: <TUNNEL_UUID>
credentials-file: /root/.cloudflared/<TUNNEL_UUID>.json
# 建议 http2(TCP),更适合 NAT/UDP 不稳定网络
protocol: http2
# 注意:某些版本 edge-ip-version 必须是字符串,否则会报 expected string found int
edge-ip-version: "4"
ingress:
- hostname: sv.example.com
service: http://127.0.0.1:80
- service: http_status:404
```
绑定 DNS:
```bash
cloudflared tunnel route dns streamverse sv.example.com
```
### 5.4 systemd 常驻(开机自启)
```bash
cloudflared service install
systemctl enable --now cloudflared
systemctl status cloudflared --no-pager
```
验证是否为 http2:
```bash
journalctl -u cloudflared -n 50 --no-pager | grep -E "Initial protocol|protocol=" || true
```
---
## 6. 重启自动恢复
Docker 与容器:
```bash
systemctl enable --now docker
cd /opt/VideoWeb-master/deploy/docker && docker compose ps
```
cloudflared:
```bash
systemctl status cloudflared --no-pager
```
---
## 7. 最常见 3 个坑
- **80 端口被占用**:宿主机 nginx 占用 80 → `systemctl stop nginx && systemctl disable nginx`
- **/api 全 404**:nginx `proxy_pass` 尾部 `/` 导致路径被改写 → `proxy_pass http://backend:8080;`
- **Tunnel 断线/超时**:QUIC/UDP 不稳定 → `protocol: http2`;`edge-ip-version: "4"`
---
## 8. 一句话总结
Docker 负责把服务“跑起来”,Cloudflare Tunnel 负责把 NAT 环境的服务“暴露到公网”。
更多推荐

所有评论(0)