Skip to content

Docker 部署

本文说明 OARS 前后端容器化部署方式。当前交付支持两种路径:

  • Docker Compose:适合客户服务器或标准容器环境。
  • Podman 脚本:适合本地验证或没有 podman compose 的环境。

目录结构

容器部署文件位于源码根目录:

text
deploy/docker/
├── backend.Dockerfile
├── frontend.Dockerfile
├── frontend.nginx.conf.template
├── docker-compose.yml
├── .env.example
├── podman-build.sh
├── podman-up.sh
├── podman-down.sh
└── podman-smoke-test.sh

镜像组成

镜像构建文件内容
oars-backend:<tag>backend.DockerfileJava 21 运行时,启动 oars-app Spring Boot 服务
oars-frontend:<tag>frontend.DockerfileNginx 静态站点,代理 /oars 到后端

前端镜像构建时默认把 VITE_GLOB_API_URL 设置为 /oars。前端 Nginx 会把 /oars/ 反向代理到后端容器,因此客户环境通常只需要暴露前端端口。

环境变量

先复制环境模板:

bash
cp deploy/docker/.env.example deploy/docker/.env

关键变量:

变量默认值说明
OARS_IMAGE_TAGlocal后端和前端镜像标签
OARS_FRONTEND_PORT18088宿主机前端端口
OARS_BACKEND_PORT18080宿主机后端端口
OARS_MYSQL_PORT13306宿主机 MySQL 端口
OARS_REDIS_PORT16379宿主机 Redis 端口
OARS_MYSQL_DATABASEoarsMySQL 数据库名
OARS_MYSQL_ROOT_PASSWORDoars_root_passwordMySQL root 密码
OARS_REDIS_PASSWORDredis123Redis 密码
OARS_JWT_SECRET示例值JWT 密钥,生产必须修改
OARS_UPLOAD_DIR/app/uploads后端容器内上传目录
OARS_JAVA_OPTS-Xms512m -Xmx1024mJVM 参数

生产环境必须替换数据库密码、Redis 密码和 JWT 密钥。

Docker Compose 部署

在源码根目录执行:

bash
cp deploy/docker/.env.example deploy/docker/.env
docker compose --env-file deploy/docker/.env -f deploy/docker/docker-compose.yml up -d --build

访问:

  • 前端:http://127.0.0.1:18088/
  • 后端健康检查:http://127.0.0.1:18080/oars/actuator/health

停止:

bash
docker compose --env-file deploy/docker/.env -f deploy/docker/docker-compose.yml down

如需同时删除数据卷,执行前必须确认已备份数据库和上传文件:

bash
docker compose --env-file deploy/docker/.env -f deploy/docker/docker-compose.yml down -v

Podman 本地部署

没有 podman compose 时,使用仓库内脚本直接创建网络、数据卷和容器:

bash
cp deploy/docker/.env.example deploy/docker/.env
deploy/docker/podman-up.sh

脚本会执行以下操作:

  1. 构建 oars-backend:<tag>oars-frontend:<tag>
  2. 创建 oars-net 网络。
  3. 创建 MySQL、Redis、上传目录和日志数据卷。
  4. 启动 MySQL、Redis、后端和前端容器。
  5. 等待后端健康检查和前端页面可访问。

验证:

bash
deploy/docker/podman-smoke-test.sh

停止:

bash
deploy/docker/podman-down.sh

数据卷

数据卷内容
oars-mysql-dataMySQL 数据
oars-redis-dataRedis AOF 数据
oars-upload-dataOARS 上传文件
oars-backend-logs后端日志

升级、回滚或删除容器前,必须先备份 oars-mysql-dataoars-upload-data

配置覆盖

后端容器通过环境变量覆盖生产配置:

text
SPRING_DATASOURCE_URL
SPRING_DATASOURCE_USERNAME
SPRING_DATASOURCE_PASSWORD
SPRING_DATA_REDIS_HOST
SPRING_DATA_REDIS_PORT
SPRING_DATA_REDIS_PASSWORD
JWT_SECRET
FILE_STORAGE_LOCAL_PATH
JAVA_OPTS

前端容器运行时通过 Nginx 模板读取:

text
OARS_BACKEND_UPSTREAM=oars-backend:8080

如客户使用外部数据库或 Redis,可以删除 Compose 中对应服务,改为把后端环境变量指向外部地址。

升级流程

客户环境升级按以下顺序执行:

  1. 备份 MySQL 数据和上传文件。
  2. 拉取或合并新的客户源码 tag。
  3. 更新 deploy/docker/.env 中的镜像标签。
  4. 重新构建镜像。
  5. 启动新容器,让 Flyway 执行数据库迁移。
  6. 执行健康检查和关键业务回归。

Docker Compose:

bash
docker compose --env-file deploy/docker/.env -f deploy/docker/docker-compose.yml up -d --build

Podman:

bash
deploy/docker/podman-up.sh
deploy/docker/podman-smoke-test.sh

回滚边界

源码和镜像可以回退到上一客户 tag 后重新部署。数据库不能通过删除迁移记录回滚;生产环境应使用备份恢复,或追加前向修复脚本。

podman-down.shdocker compose down 默认只删除容器,不删除数据卷。

常见问题

前端能打开但接口不通

检查前端容器内 Nginx 代理目标:

bash
podman exec oars-frontend env | grep OARS_BACKEND_UPSTREAM
podman exec oars-frontend wget -qO- http://oars-backend:8080/oars/actuator/health

后端启动失败

查看日志:

bash
podman logs --tail 200 oars-backend

重点检查数据库地址、Redis 密码、Flyway 迁移和上传目录权限。

端口冲突

修改 deploy/docker/.env 中的宿主机端口,例如 OARS_FRONTEND_PORTOARS_BACKEND_PORTOARS_MYSQL_PORTOARS_REDIS_PORT