容器化部署
发行包不含镜像与编排模板;说明自行构建镜像时的依据:JDK 21、数据卷、MR_DB_* 环境变量、授权与机器绑定注意事项,附 Dockerfile 示例。
概述
当前发行包只包含产品 jar、启动脚本和说明文件,不提供官方镜像、Docker Compose 模板或 Helm 包。产品本身是「一个 jar + 外部数据库」,程序支持用环境变量注入数据库连接、授权与机器指纹,所以可以自行编写 Dockerfile 构建镜像。
本文列出构建容器镜像时有依据的要点。下文的 Dockerfile 是按启动脚本的实际命令写成的示例,需要在你的环境中自行验证。
构建要点
| 项目 | 要求 | 依据 |
|---|---|---|
| 基础镜像 | 含 Java 21 及以上的完整运行时,JDK 或 JRE 均可 | 2.0.61 之前的版本运行期会用到 javac,须用 JDK 镜像;启动脚本会检查 Java 版本不低于 21 |
| 工作目录 | 放 jar 的目录,data/、logs/ 在其下生成 |
启动脚本会先切换到 jar 所在目录 |
| 数据卷 | 至少挂载 data/;选用内置 H2、需要保留备份包、驱动、插件、字体时必须持久化 |
见 配置项参考 的目录布局 |
| 配置库 | 推荐外接数据库,通过环境变量注入 | MR_DB_URL 等 |
| 堆内存 | 未设置 -Xmx 时按容器可用内存的百分比自适应(-XX:MaxRAMPercentage,脚本默认 75) |
JDK 21 识别容器内存限制 |
| 内存溢出 | 建议加 -XX:+ExitOnOutOfMemoryError,由容器重启策略拉起 |
启动脚本同样使用该参数 |
| 时区与编码 | -Duser.timezone=Asia/Shanghai、-Dfile.encoding=UTF-8 |
启动脚本固定附加 |
| 健康检查 | GET /api/health,无需登录 |
见 裸机部署 |
环境变量注入数据库连接
设置 MR_DB_URL、MR_DB_USERNAME、MR_DB_PASSWORD 后,程序不再读取 data/work/database.config,也不进入初始化向导,直接连接该库并执行数据库迁移。密码按明文处理,不加密、不写入磁盘,适合从 Secret 或环境变量中注入。
| 变量 | 说明 |
|---|---|
MR_DB_URL |
JDBC URL,如 jdbc:postgresql://db:5432/sight_report?currentSchema=public |
MR_DB_USERNAME |
用户名 |
MR_DB_PASSWORD |
密码 |
注意:设置
MR_DB_URL后系统视为已初始化,不进入初始化向导,初始化接口会拒绝再次初始化。连接全新的空库时,库里没有任何账号,需要同时用环境变量指定首个管理员,否则装完无法登录(见下节)。
首个管理员
用环境变量连接全新空库时,同时设置以下两个变量,程序启动完成后发现库里还没有管理员,就会用它们创建一个:
| 变量 | 说明 |
|---|---|
MR_ADMIN_ACCOUNT |
首个管理员账号 |
MR_ADMIN_PASSWORD |
首个管理员密码,按明文读取,不写入磁盘 |
- 只在库里一个管理员都没有时生效;已有管理员时变量被忽略,不会改密码。创建成功后,建议登录修改密码,并从部署配置里删掉
MR_ADMIN_PASSWORD。 - 也可以用 JVM 参数
-Dmr.admin.account、-Dmr.admin.password提供,环境变量优先。 - 没有管理员、也没设置这两个变量时,启动日志会打出一条错误提示,告诉你怎么补;补上变量重启即可。
- 指定的账号已经作为普通用户存在时不会被自动提升为管理员,日志会提示换一个账号。
- 不想用环境变量时,也可以去掉
MR_DB_*、挂载data/卷,走 初始化向导。忘记管理员密码见同页「应急重置」。
Dockerfile 示例
以下为示例,sight-report.jar 需放在构建上下文中:
FROM eclipse-temurin:21-jdk
WORKDIR /app
COPY sight-report.jar /app/sight-report.jar
VOLUME ["/app/data", "/app/logs"]
EXPOSE 9091
ENTRYPOINT ["java", \
"-XX:MaxRAMPercentage=75", \
"-XX:+ExitOnOutOfMemoryError", \
"-Dfile.encoding=UTF-8", \
"-Duser.timezone=Asia/Shanghai", \
"-jar", "/app/sight-report.jar", \
"--spring.profiles.active=prod"]
运行示例:
docker run -d --name sight-report -p 9091:9091 \
-v sight-data:/app/data -v sight-logs:/app/logs \
-e MR_DB_URL='jdbc:postgresql://db:5432/sight_report?currentSchema=public' \
-e MR_DB_USERNAME=sight_report -e MR_DB_PASSWORD='your_password' \
sight-report:local
Sight Wall 把 jar 名换成 sight-wall.jar,端口换成 9090。
授权与机器绑定
- 授权保存在配置库中,容器重建不会丢失。
- 授权带机器绑定时,容器的机器特征(磁盘序列号、安装目录等)容易随重建改变。源码提供了两个注入点:
MR_MACHINE_FP(注入稳定的机器指纹)和MR_CLUSTER_UID(注入集群标识)。申请授权时,用这些稳定值生成环境信息,见 运行配额与机器绑定。 - 配置库中还没有授权时,程序会读取环境变量
MR_LICENSE_CODE(授权内容)或MR_LICENSE_FILE(授权文件路径)自动注册;两者都未设置时,会读取工作目录下的report-license.txt。适合容器零接触交付。
多副本
多个容器副本等同于集群,需要外接配置库、Redis 与粘性会话,见 集群与高可用。