场景: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 环境的服务“暴露到公网”。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐