跳到主要内容

Docker 单容器部署

单容器方式适合快速体验或轻量使用,默认选择 H2 内置数据库。官方 latest 镜像同时提供 linux/amd64linux/arm64

需要 MySQL 和长期运行时,优先使用 Docker Compose 部署

1. 创建持久化目录

mkdir -p surveyking/{config,db,files,logs}
cd surveyking

四个目录都要保留:

目录内容
config初始化状态、数据库和运行配置
dbH2 数据库
files上传的图片和附件
logs运行日志

2. 启动容器

docker run -d \
--name surveyking \
--restart unless-stopped \
-p 1991:1991 \
-e SERVER_PORT=1991 \
-e JAVA_OPTS='-Xms256m -Xmx1g -Dfile.encoding=UTF-8' \
-v "$PWD/config:/app/config" \
-v "$PWD/db:/app/db" \
-v "$PWD/files:/app/files" \
-v "$PWD/logs:/app/logs" \
surveyking/surveyking:latest

查看启动日志:

docker logs -f surveyking

3. 完成初始化

打开:

http://localhost:1991

第一次进入 /setup 后选择 H2 内置数据库,填写系统信息并完成初始化。然后使用 admin / 123456 登录并立即修改密码。

4. 修改登录密码

已经知道当前密码时,直接在页面中修改:

  1. 点击右上角头像,进入 账号设置 → 账号安全
  2. 账户密码 右侧点击 修改
  3. 输入旧密码、新密码和确认密码,点击 确认修改
  4. 退出登录,再使用新密码登录,确认修改成功。

新密码必须为 8 ~ 16 位,同时包含大写字母、小写字母和数字,并且只能使用字母和数字。首次登录时,旧密码为 123456

如果忘记了当前密码,按下面的步骤重置。

忘记 admin 密码

如果还有其他超级管理员账号,可以登录该账号,进入 系统管理 → 用户管理,找到登录账号为 admin 的用户,点击 更多 → 重置密码,设置符合上述要求的新密码。

如果所有管理员都无法登录,需要由有服务器和数据库管理权限的人员操作。先确认部署使用的是 H2 还是 MySQL,再选择对应步骤连接数据库;两种数据库使用相同的重置 SQL。

先备份再重置

不要通过删除数据库文件、重新进入 /setup 初始化,或重新导入 init-h2.sql / init-mysql.sql 来重置密码,这些操作可能导致已有数据丢失。下面只修改目标账号的密码。

内置 H2:停止应用并连接原数据库

以下命令适用于本文的官方镜像部署,应用容器名为 surveyking,数据库目录为 /app/db。如果容器名或路径不同,请替换为实际值。

先查看挂载信息,确认 /app/db 对应的是正在使用的数据库目录:

docker inspect surveyking --format '{{json .Mounts}}'

停止应用,再把数据库和配置复制到宿主机的备份目录:

docker stop surveyking
backup_dir="./surveyking-password-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$backup_dir"
docker cp surveyking:/app/db "$backup_dir/db"
docker cp surveyking:/app/config "$backup_dir/config"

确认命令执行成功、备份中包含原来的 .mv.db 文件后,再进行下一步。应用应保持停止,直到数据库修改完成。

使用原容器的镜像和挂载目录启动临时 H2 命令行工具,确保使用与应用一致的 H2 版本:

docker run --rm -it \
--volumes-from surveyking \
--entrypoint java \
"$(docker inspect surveyking --format '{{.Image}}')" \
-Dloader.main=org.h2.tools.Shell \
-cp /app/surveyking.jar \
org.springframework.boot.loader.PropertiesLauncher

按提示填写连接信息。未自定义 H2 配置时,使用以下值:

提示输入值
URLjdbc:h2:/app/db/surveyking;MODE=MySQL;NON_KEYWORDS=USER;IFEXISTS=TRUE
Driverorg.h2.Driver
Usersa
Passwordsa

这里的 sa / sa 是 H2 数据库账号,不是网页的 admin 账号。如果改过数据库配置,以实际的 spring.datasource.* 配置为准;临时工具不会自动读取应用配置。URL 中不带 .mv.db 后缀,保留 IFEXISTS=TRUE,避免路径填错时创建空数据库。

连接成功出现 sql> 后,继续 执行重置 SQL。如果提示文件不存在、数据库被占用或账号密码错误,应先检查路径、应用是否已停止和数据库配置,不要删除数据库文件或锁文件。旧镜像的 JAR 或数据库路径可能不同,应按原容器的实际路径调整命令。

外部 MySQL:备份并连接应用数据库

先使用数据库管理工具或 mysqldump 备份 SurveyKing 数据库,并确认备份成功。不要在 MySQL 运行时直接复制其数据目录作为备份。

如果按本站 Docker Compose 部署 文档安装,在宿主机执行:

docker exec -it surveyking-mysql mysql -u root -p surveyking

按提示输入 .env 中的 MYSQL_ROOT_PASSWORD。这里需要的是 MySQL 密码,不是忘记的 admin 登录密码。如果使用已有 MySQL 实例,请通过数据库客户端,按实际地址、数据库名和账号连接。

连接成功出现 mysql> 后,继续执行下面的 SQL。

执行重置 SQL

以下 SQL 适用于 H2 和 MySQL,必须在数据库客户端中执行。先查询账号:

SELECT id, auth_account, auth_type, user_type, status
FROM t_account
WHERE auth_account = 'admin'
AND auth_type = 'PWD'
AND user_type = 'SysUser'
AND is_deleted = 0;

确认只返回一条目标管理员记录,且 status1(启用),再执行重置。如果没有记录、多于一条或账号已停用,应先核对数据库、账号名称和账号状态,不要直接去掉查询条件。

UPDATE t_account
SET auth_secret = '$2a$10$vZk9P3XtbD2KrdLbQYPvBuPAkkUda0OlkDg7io1Q6VEtfFPig/tqO'
WHERE auth_account = 'admin'
AND auth_type = 'PWD'
AND user_type = 'SysUser'
AND is_deleted = 0;

COMMIT;

这段 BCrypt 哈希对应临时密码 123456。请完整复制,不要把 auth_secret 直接改成明文密码,也不要把包含 $ 的 SQL 放进 Shell 双引号中执行,以免被变量展开后破坏哈希。

确认更新的是一条目标记录;如果提示没有变更,先检查该账号是否已经使用此临时密码。输入 exit 退出数据库客户端。使用 H2 时,必须先退出临时工具,再启动原应用容器:

docker start surveyking

随后使用 admin / 123456 登录,立即按 修改登录密码 设置自己的新密码,并重新登录验证。保留备份,确认系统恢复正常后再按备份保留策略处理。

服务管理

操作命令
查看状态docker ps --filter name=surveyking
查看日志docker logs -f surveyking
停止docker stop surveyking
启动docker start surveyking
重启docker restart surveyking

修改宿主机端口

如果 1991 被占用,删除并按原参数重建容器,只把端口映射改为:

-p 8080:1991

之后访问 http://localhost:8080。不要把容器内部端口一起改掉。

升级镜像

先从系统导出备份,并确认四个挂载目录存在,然后执行:

docker pull surveyking/surveyking:latest
docker stop surveyking
docker rm surveyking

再使用原来的 docker run 命令创建容器。只删除容器不会删除宿主机挂载目录,但路径写错会表现为一个全新的系统,重建前请仔细核对 $PWD

常见问题

为什么重建容器后又进入 /setup?

通常是没有重新挂载原来的 config,或者在另一个目录执行了命令。检查容器的挂载:

docker inspect surveyking --format '{{json .Mounts}}'
SELinux 系统提示目录没有权限怎么办?

在 Fedora、Rocky Linux、AlmaLinux 等启用 SELinux 的系统上,可以给卷挂载加 :Z,例如:

-v "$PWD/files:/app/files:Z"

configdbfileslogs 使用相同处理,然后重建容器。