一、项目介绍
SurveyKing(中文名“卷王问卷”)是一款AI驱动的企业级开源问卷调查与在线考试系统。它由国人开发者团队打造,定位为 SurveyMonkey 等国际主流问卷平台的开源自托管替代方案,一个系统即可覆盖问卷调查、在线考试、360度评估、心理测评、投票评选等多种业务场景。
支持40+种题型,涵盖填空、选择、下拉、级联、矩阵、分页、签名、题组、图片/音频/视频多媒体题目等。题型配置精细度远超一般问卷平台——以单选填空为例,一个选项可设置多个填空,每个填空独立控制数据类型、数据范围和校验规则,还支持公式联动计算。

二、搭建教程
新手请参考:玩转绿联NAS:小白入坑之如何使用Docker compose搭建项目?
1、先在文件管理器docker文件夹中新建文件夹surveyking,然后在docker创建项目surveyking;


2、创建环境变量;
- 本地电脑新建一个txt文件,并粘贴内容;
SURVEYKING_PORT=1991
MYSQL_ROOT_PASSWORD=请替换为强密码

- 保存,更改拓展名为:.env;

- 上传到刚刚新建的surveyking目录;

3、粘贴docker compose;
# ============================================================
# SurveyKing(卷王问卷)Docker Compose 部署配置
# 适用环境:开发测试 / 生产单机部署
# 前置要求:需在同级目录准备 .env 文件定义环境变量
# ============================================================
services:
# ----------------------------------------------------------
# 服务1:MySQL 8.0 数据库(存放问卷、考试、用户等核心数据)
# ----------------------------------------------------------
mysql:
image: mysql:8.0 # 使用官方 MySQL 8.0 镜像,稳定且性能优秀
container_name: surveyking-mysql # 固定容器名,便于容器间通信和日志定位
restart: unless-stopped # 策略:除非手动停止,否则异常退出时自动重启(适合生产环境)
# 容器启动时的 MySQL 服务参数(覆盖默认配置)
command:
- --character-set-server=utf8mb4 # 字符集设为 utf8mb4,完整支持 Unicode(含 Emoji 及生僻汉字)
- --collation-server=utf8mb4_unicode_ci # 排序规则设为 utf8mb4_unicode_ci,基于 Unicode 标准排序,多语言更准确
environment:
# 以下变量从 .env 文件读取,避免敏感信息硬编码在 compose 文件中
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # Root 密码(必填,请务必在 .env 中设置强密码)
MYSQL_DATABASE: surveyking # 容器启动时自动创建的数据库名称(SurveyKing 默认连接此库)
TZ: Asia/Shanghai # 设置数据库内部时区为东八区,确保时间戳与业务一致
volumes:
# 挂载自定义 MySQL 配置文件(只读),如需调整 SQL_MODE 或最大连接数,可在此目录添加 .cnf 文件
- ./mysql/conf:/etc/mysql/conf.d:ro
# 挂载数据存储目录(持久化),即使容器删除重建,已有数据也不会丢失
- ./mysql/data:/var/lib/mysql
# 健康检查(关键配置):确保数据库完全启动且可正常响应 ping 后再被其他服务依赖
healthcheck:
# 使用 mysqladmin ping 检测连通性;注意这里使用 $$ 转义环境变量,防止被 Compose 提前解析
test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p$${MYSQL_ROOT_PASSWORD} --silent"]
interval: 10s # 每 10 秒执行一次健康检查
timeout: 5s # 单次检查超时时间为 5 秒
retries: 12 # 连续失败 12 次(即 120 秒)后标记为不健康
start_period: 30s # 容器启动后等待 30 秒再开始检查,避免初始化阶段资源竞争导致误判
# ----------------------------------------------------------
# 服务2:SurveyKing 主应用(问卷/考试/测评核心服务)
# ----------------------------------------------------------
surveyking:
image: surveyking/surveyking:latest # 使用官方最新稳定镜像(生产环境建议固定为具体版本号,如 v4.x.x)
container_name: surveyking-app # 固定容器名,便于在日志和网络中定位
restart: unless-stopped # 同 MySQL,保证服务高可用
environment:
SERVER_PORT: "1991" # 容器内部 Spring Boot 监听的端口(与镜像默认保持一致)
# JVM 参数:初始堆 256M,最大堆 1G(可根据服务器实际内存调整,建议不超过容器内存限制的 60%)
# -Dfile.encoding=UTF-8 强制文件编码,避免 Windows/Linux 环境下中文乱码
JAVA_OPTS: "-Xms256m -Xmx1g -Dfile.encoding=UTF-8"
TZ: Asia/Shanghai # 应用业务时区,影响日志时间、问卷发布时间等
ports:
# 宿主机端口映射:默认暴露 1991 端口,可通过 .env 中的 SURVEYKING_PORT 变量自定义宿主机端口
# 例:若 SURVEYKING_PORT=8080,则宿主机访问 8080 映射到容器 1991
- "${SURVEYKING_PORT:-1991}:1991"
volumes:
# 挂载应用配置目录(存放 application.yml 或自定义 properties),用于覆盖镜像内的默认配置
- ./config:/app/config
# 挂载内置 H2 数据库目录(若切换为 MySQL,此目录可存储部分缓存或迁移临时文件,建议保留)
- ./db:/app/db
# 挂载文件存储目录(核心目录):存放用户上传的图片、附件、Excel 导入文件、问卷导出 PDF/SPSS 等
- ./files:/app/files
# 挂载日志目录:持久化应用运行日志,便于问题排查和监控
- ./logs:/app/logs
# 启动顺序依赖:严格等待 MySQL 服务通过健康检查(service_healthy)后再启动
# 这有效解决了“数据库未就绪导致应用启动连接失败”的问题
depends_on:
mysql:
condition: service_healthy

4、点击立即部署,等待跑码;

5、点击完成;

6、使用http://NAS_IP:1991/setup进行初始化;
http://NAS_IP:1991/setup
7、系统初始化:我们内建mysql,所以直接选择mysql,下面内容自动带出,需要修改mysql的密码,密码是你的.env 中设置的密码;




8、下一步;

9、点击开始初始化,等待重启完成;


10、输入默认的账号密码进行登录;
账号:admin
密码:123456

11、后台管理界面;




12、外网使用记得修改默认密码,并设置好防火墙;


三、参考文档
1、项目官网:https://surveyking.cn/
2、开源文档:https://surveyking.cn/open-source/quickstart/
3、GitHub地址:https://github.com/javahuang/SurveyKing
4、Gitee地址:https://gitee.com/surveyking/surveyking








