本地开发环境
Crest v1.5.7 本地开发环境搭建:拉代码、导数据库、配置本地变量、启动前后端、打包和排查常见问题。
本页适用于首次搭建 Crest v1.5.7 开发环境的开发者,说明源码获取、元数据库准备、本地配置、服务启动、打包和常见问题处理。
开发环境不要求本机有 Docker。只要本机或内网有一套可连接的 MySQL 8.x,就可以启动后端和前端。v1.5.7 延续前后端分离形态:仅改后端时,可以复用发布的前端镜像或已有前端环境;仅改前端时,可以复用发布的后端镜像或内网后端服务。
先分清两类数据库
Crest 本身需要一个 MySQL 元数据库,用来保存用户、权限、数据源配置、数据集、图表、仪表盘和大屏。你在页面里新建的“数据源”是业务数据源,可能是 MySQL、Oracle、OceanBase、Excel 或 API。开发环境里最先要准备的是 Crest 元数据库,不是业务数据源。
v1.5.7 支持前后端分离开发
前端开发只需要能访问一个可用后端;后端开发只需要能连接 Crest 元数据库。只有验证镜像、安装包、网关转发或发布流程时,才需要同时构建前端和后端。
最常用的开发流程
如团队已提供 v1.5.7 开发库 dump,建议按以下流程搭建:
拉代码
克隆 Crest,切到 v1.5.7,再从 tag 建自己的开发分支。
导入元数据库
新建本地 crest 库,把团队提供的 v1.5.7 dump 导进去。
写本地环境变量
新建 .local/crest-dev-env.sh。数据库地址、账号、密码、加密密钥、文件目录都写在这里,不改仓库里的 application*.yml。
关闭本地不需要的功能
导入完整 dump 后关闭 Flyway;本地不调 SSO 时关闭 SSO;业务数据源连不到时改成内网可访问地址。
启动服务
后端启动 io.crest.CoreApplication,前端启动 pnpm dev。本地默认访问 http://localhost:8080。
没有 dump 时,可以使用空库初始化。该方式由 Flyway 创建基础表结构,页面中只包含初始化数据和可选演示资源。
1. 准备工具
| 工具 | 版本 | 用途 |
|---|---|---|
| JDK | 21 | 编译和运行后端 |
| Maven | 3.9.x | 构建 Java 模块 |
| Node.js | 22.x | 前端开发和构建 |
| pnpm | 11.1.2 | 安装前端依赖 |
| MySQL | 8.0 / 8.4 | Crest 元数据库 |
| Docker | 可选 | 只在构建镜像或验证安装包时需要 |
检查本机工具版本:
java -version
mvn -version
node -v
pnpm -v
mysql --version没有 pnpm 时,用 Corepack 安装仓库要求的版本:
corepack enable
corepack prepare pnpm@11.1.2 --activateMaven 命令统一使用仓库内的 settings:
mvn -s .mvn/settings.xml ...不应为 Crest 修改全局 Maven 配置。全局配置会影响同一台机器上的其他 Java 项目。
2. 拉取 v1.5.7 源码
git clone https://github.com/sevoniva/Crest.git
cd Crest
git checkout v1.5.7
git switch -c feat/my-local-workv1.5.7 是本页对应的版本。排查问题时不应混用 main、其他功能分支或旧版本 dump,避免数据库结构与代码版本不一致。
打开项目:
code .VS Code 至少安装这些扩展:
| 扩展 | 用途 |
|---|---|
| Extension Pack for Java | 识别 Maven 模块、运行后端入口 |
| Maven for Java | 查看 Maven 生命周期和依赖 |
| Vue - Official | Vue 3 和 TypeScript 支持 |
| ESLint | 前端代码检查 |
| YAML | 编辑配置文件 |
如果后端调试较多,也可以用 IntelliJ IDEA 打开根目录 pom.xml。
3. 准备 Crest 元数据库
先创建一个独立元数据库。这里的 crest 是本地开发库名,可按团队规范调整为 crest_dev_<name>。
CREATE DATABASE IF NOT EXISTS crest
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;如果当前 MySQL 不支持 utf8mb4_0900_ai_ci,使用:
CREATE DATABASE IF NOT EXISTS crest
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;检查当前数据库是不是标准 MySQL:
SELECT VERSION();
SELECT @@version_comment;
SELECT GET_LOCK('crest_dev_check', 1);
SELECT RELEASE_LOCK('crest_dev_check');GET_LOCK() 返回 1 时,适合使用 Flyway 自动初始化。若返回 FUNCTION GET_LOCK does not exist,通常说明当前数据库不是完整 MySQL 能力,或 MySQL 兼容层不支持命名锁。此时应更换标准 MySQL,或手工导入初始化 SQL 后关闭 Flyway。
4. 导入数据
方案 A:有 v1.5.7 开发库 dump
这是团队协作场景下的推荐方式。dump 通常已经包含管理员、菜单、权限、示例数据源、数据集、仪表盘和数据大屏。
mysql -h127.0.0.1 -P3306 -uroot -p -e "
DROP DATABASE IF EXISTS crest;
CREATE DATABASE crest DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
"
mysql -h127.0.0.1 -P3306 -uroot -p crest < crest-v1.5.7-dev.sql导入完整 dump 后,本地启动必须关闭 Flyway:
export SPRING_FLYWAY_ENABLED=false同时确认运行密钥。dump 里的数据源密码、SSO Client Secret 等敏感配置是加密保存的,运行时密钥要和 dump 来源环境一致。
| dump 来源 | 本地要保留的密钥 |
|---|---|
| 标准加密模式 | CREST_AES_KEY、CREST_AES_IV |
| 国密模式 | CREST_CRYPTO_MODE=sm-suite、CREST_SM4_KEY,同时保留原 AES 配置以兼容历史数据 |
密钥不一致时,后端可以启动,但保存过的业务数据源可能连接失败。
方案 B:没有 dump,空库初始化
没有开发库 dump 时,让 Flyway 在空库上初始化。
export SPRING_FLYWAY_ENABLED=true
export CREST_LOAD_DEMO=true
export CREST_FLYWAY_LOCATIONS='classpath:db/migration,classpath:db/demo-migration'这会执行:
core/core-backend/src/main/resources/db/migration/V1.5.0.1__initial_schema.sql
core/core-backend/src/main/resources/db/demo-migration/V1.5.0.2__demo_resources.sql如需最小化初始化,不加载演示数据:
export SPRING_FLYWAY_ENABLED=true
export CREST_LOAD_DEMO=false
export CREST_FLYWAY_LOCATIONS='classpath:db/migration'首次启动成功后,元数据库里会出现 crest_schema_version 表。
方案 C:数据库不支持 GET_LOCK
仅在本地验证且无法更换标准 MySQL 时,才建议手工导入初始化 SQL:
mysql -h127.0.0.1 -P3306 -uroot -p crest \
< core/core-backend/src/main/resources/db/migration/V1.5.0.1__initial_schema.sql需要演示资源时再导入:
mysql -h127.0.0.1 -P3306 -uroot -p crest \
< core/core-backend/src/main/resources/db/demo-migration/V1.5.0.2__demo_resources.sql手动导入后也要关闭 Flyway:
export SPRING_FLYWAY_ENABLED=false5. 写本地环境变量
本地配置放在 .local/crest-dev-env.sh。这个目录已经在 .gitignore 里,不会被提交。
mkdir -p .local .runtime/{excel,exportData,ehcache,logs}
touch .local/crest-dev-env.sh把下面内容写进去。先按自己的数据库密码改 CREST_DB_PASSWORD。
export SPRING_PROFILES_ACTIVE=standalone
export SERVER_PORT=8100
export CREST_DB_URL='jdbc:mysql://127.0.0.1:3306/crest?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai'
export CREST_DB_USERNAME='root'
export CREST_DB_PASSWORD='your_mysql_password'
export CREST_ORIGIN_LIST='http://localhost:8080,http://127.0.0.1:8080,http://localhost:8100,http://127.0.0.1:8100'
export CREST_INITIAL_PASSWORD='Crest_dev_2026'
export CREST_PATH_EXCEL="$PWD/.runtime/excel"
export CREST_PATH_EXPORT_DATA="$PWD/.runtime/exportData"
export CREST_PATH_EHCACHE="$PWD/.runtime/ehcache"
export CREST_LOG_PATH="$PWD/.runtime/logs"如导入团队 dump,在同一个文件里继续写:
export SPRING_FLYWAY_ENABLED=false
export CREST_LOAD_DEMO=false
export CREST_FLYWAY_LOCATIONS='classpath:db/migration'
export CREST_CRYPTO_MODE='standard'
export CREST_AES_KEY='replace_with_dump_source_aes_key'
export CREST_AES_IV='replace_with_dump_source_aes_iv'
export CREST_SM4_KEY=''如使用空库初始化,在同一个文件里写:
export SPRING_FLYWAY_ENABLED=true
export CREST_LOAD_DEMO=true
export CREST_FLYWAY_LOCATIONS='classpath:db/migration,classpath:db/demo-migration'
export CREST_CRYPTO_MODE='standard'
export CREST_AES_KEY='12345678901234567890123456789012'
export CREST_AES_IV='1234567890123456'
export CREST_SM4_KEY=''上面这组 AES 值只适合本机新库。共享环境、测试环境和生产环境必须使用独立密钥。
加载配置:
source .local/crest-dev-env.sh本页涉及的核心变量来自这些源码配置:
| 变量 | 源码位置 | 说明 |
|---|---|---|
CREST_DB_URL | core/core-backend/src/main/resources/application-standalone.yml | 后端连接 Crest 元数据库 |
SPRING_FLYWAY_ENABLED | Spring Boot 标准变量 | 控制 spring.flyway.enabled |
CREST_FLYWAY_LOCATIONS | application-standalone.yml | 控制是否加载演示迁移 |
CREST_LOAD_DEMO | application.yml、application-standalone.yml | 控制演示资源开关 |
CREST_AES_KEY / CREST_AES_IV | application.yml | 标准模式下加密敏感配置 |
CREST_CRYPTO_MODE / CREST_SM4_KEY | application.yml | 国密模式配置 |
CREST_INITIAL_PASSWORD | application.yml | 空库初始化时的管理员初始密码 |
6. 本地常用关闭项
| 项 | 什么时候关 | 怎么关 |
|---|---|---|
| Flyway | 已经导入完整 dump | SPRING_FLYWAY_ENABLED=false |
| 演示数据 | dump 里已有数据,或只想要纯净库 | CREST_LOAD_DEMO=false |
| 演示迁移目录 | 不需要演示资源 | CREST_FLYWAY_LOCATIONS=classpath:db/migration |
| SSO | 本地不调单点登录 | 在本地库里关闭 SSO |
| 旧业务数据源地址 | dump 里的源库本机连不上 | 到页面里把数据源改成可访问的内网地址 |
关闭本地库里的 SSO:
UPDATE sys_setting SET pval = 'false' WHERE pkey = 'sso.enabled';
UPDATE auth_sso_provider SET enabled = 0;以上 SQL 仅用于本地开发库,不应在共享测试库或生产库直接执行。
7. 启动后端
入口类:
core/core-backend/src/main/java/io/crest/CoreApplication.javaVS Code 启动
最稳的方式是在 VS Code 终端里启动。这样 .local/crest-dev-env.sh 一定能生效。
source .local/crest-dev-env.sh
mvn -s .mvn/settings.xml \
-pl :core-backend -am \
spring-boot:run \
-Dspring-boot.run.profiles=standalone \
-Dmaven.antrun.skip=true如使用 VS Code 的 Run 按钮启动后端,可以新建 .vscode/launch.json。.vscode 已被仓库忽略,不应提交。
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Crest Backend",
"request": "launch",
"mainClass": "io.crest.CoreApplication",
"projectName": "core-backend",
"env": {
"SPRING_PROFILES_ACTIVE": "standalone",
"SERVER_PORT": "8100",
"CREST_DB_URL": "jdbc:mysql://127.0.0.1:3306/crest?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai",
"CREST_DB_USERNAME": "root",
"CREST_DB_PASSWORD": "your_mysql_password",
"SPRING_FLYWAY_ENABLED": "false",
"CREST_LOAD_DEMO": "false",
"CREST_CRYPTO_MODE": "standard",
"CREST_AES_KEY": "replace_with_dump_source_aes_key",
"CREST_AES_IV": "replace_with_dump_source_aes_iv",
"CREST_SM4_KEY": "",
"CREST_INITIAL_PASSWORD": "Crest_dev_2026",
"CREST_ORIGIN_LIST": "http://localhost:8080,http://127.0.0.1:8080",
"CREST_PATH_EXCEL": "${workspaceFolder}/.runtime/excel",
"CREST_PATH_EXPORT_DATA": "${workspaceFolder}/.runtime/exportData",
"CREST_PATH_EHCACHE": "${workspaceFolder}/.runtime/ehcache",
"CREST_LOG_PATH": "${workspaceFolder}/.runtime/logs"
}
}
]
}如使用空库初始化,将 SPRING_FLYWAY_ENABLED 和 CREST_LOAD_DEMO 改成 true,并将 AES 值替换为本机新库使用的值。
IDEA 启动
用 IntelliJ IDEA 打开根目录 pom.xml 后,新建 Spring Boot 运行配置:
| 配置项 | 值 |
|---|---|
| Main class | io.crest.CoreApplication |
| Active profiles | standalone |
| JDK | 21 |
| Environment variables | 粘贴 .local/crest-dev-env.sh 中的变量 |
| Working directory | 项目根目录 |
启动后检查:
curl http://localhost:8100/v3/api-docs能返回 OpenAPI JSON,说明后端服务已启动。浏览器也可以访问:
http://localhost:8100/doc.htmlJAR 方式启动
仅在验证打包产物时需要使用该方式启动。
source .local/crest-dev-env.sh
./run.sh start
tail -f logs/stdout.log停止:
./run.sh stop./run.sh start 依赖 core/core-backend/target/CoreApplication.jar,所以要先完成后端打包。
8. 启动前端
cd core/core-frontend
pnpm install --frozen-lockfile
pnpm dev访问:
http://localhost:8080如果 8080 被占用,Vite 可能自动切到 8081 或其他本地端口。v1.5.6 已兼容本地开发端口变化,登录请求不应因为端口从 8080 切到 8081 就被 CORS 拦截。若使用自定义域名、内网 IP 或代理地址访问前端,再按实际访问地址补充 CREST_ORIGIN_LIST。
开发代理在:
core/core-frontend/config/dev.ts默认代理到:
target: 'http://localhost:8100'如果后端部署在内网机器,例如 http://192.168.1.20:8100,可临时修改该 target。提交前必须确认未提交个人内网地址:
git diff -- core/core-frontend/config/dev.ts登录账号:
| 数据来源 | 登录方式 |
|---|---|
| 导入团队 dump | 用 dump 里的管理员密码 |
| 空库初始化 | 用户名 admin,密码为 CREST_INITIAL_PASSWORD |
如果页面跳到 SSO 登录,先按前文 SQL 关闭本地 SSO。
v1.5.6 起统一登录入口。本地账号、管理员账号和应急登录都从同一登录页进入;旧 token 损坏或过期时,刷新页面后应回到登录页,而不是停留在空白页面。
v1.5.7 本地联调建议额外验证:
| 功能 | 验证方式 |
|---|---|
| MySQL 数据集缓存 | 创建 MySQL 数据源和数据集,切换缓存读取,执行立即更新,检查源数据行数、缓存行数和一致性状态 |
| 增量缓存 | 选择增量字段,执行一次同步;切换增量字段或更新方式后,确认水位按新配置重新计算 |
| API JsonPath | 配置返回路径为 $data.dataList 的 API 表,确认字段按子节点解析且字段选择可编辑 |
| API Authorization | 在请求头中配置标准 Authorization,确认测试请求和数据集预览都能返回 |
| 公开分享链接 | 登录后台后访问 /link/:uuid,确认进入分享展示页,而不是跳转工作台 |
9. v1.5.7 前后端分离开发场景
只改前端
前端开发需要一个可访问后端。后端可来自三种来源:
| 后端来源 | 适合场景 | 前端需要做什么 |
|---|---|---|
| 本机后端 | 同时调接口和页面 | 保持 target: 'http://localhost:8100' |
| 内网后端 | 只改页面、样式、交互 | 把 config/dev.ts 的 target 改成内网后端地址 |
| 发布后端镜像 | 本机有 Docker,但不想编译 Java | 运行 ghcr.io/sevoniva/crest-service:v1.5.7,前端代理到该服务 |
提交前应确认未提交个人内网地址:
git diff -- core/core-frontend/config/dev.ts只改后端
后端开发不要求本机有 Node.js、pnpm 或前端 dist。按前文配置好 MySQL、Flyway、加密密钥和文件目录后,可以直接启动 io.crest.CoreApplication。
如果需要浏览器页面配合验证,有两种方式:
| 方式 | 说明 |
|---|---|
| 使用已有前端环境 | 前端代理到你的后端端口 |
| 使用发布前端镜像 | 运行 ghcr.io/sevoniva/crest-web:v1.5.7,让网关转发到你的后端 |
后端独立打包时使用 -Dcrest.copy.frontend.skip=true,避免 Maven 因为没有前端 dist 而失败。
验证前后端分离镜像
需要验证镜像、Nginx 转发、WebSocket、健康检查或监控时,再同时构建前端和后端:
cd core/core-frontend
pnpm install --frozen-lockfile
pnpm run build:base
cd ../..
mvn -s .mvn/settings.xml \
-pl :core-backend -am \
clean package \
-Pstandalone \
-DskipTests \
-Dmaven.test.skip=true \
-Dcrest.copy.frontend.skip=true
docker build -f Dockerfile.backend -t crest-service:local .
docker build -f Dockerfile.frontend -t crest-web:local .本机没有 Docker 时,不影响前端或后端源码开发。镜像构建可以交给 CI 或具备 Docker 的构建环境。
10. 开发时经常要改什么
| 场景 | 改哪里 | 注意事项 |
|---|---|---|
| 本地 MySQL 密码变了 | .local/crest-dev-env.sh 的 CREST_DB_PASSWORD | 不改 application-standalone.yml |
后端端口不是 8100 | SERVER_PORT 和前端 config/dev.ts | 两边端口要一致 |
| dump 来自国密环境 | CREST_CRYPTO_MODE=sm-suite、CREST_SM4_KEY | 密钥必须和 dump 来源一致 |
| 业务数据源连不上 | Crest 页面里的“数据源”配置 | 避免把 Crest 元数据库当成业务数据源修改 |
| 不加载演示资源 | CREST_LOAD_DEMO=false、CREST_FLYWAY_LOCATIONS=classpath:db/migration | 只对空库初始化有意义 |
| 导入完整 dump | SPRING_FLYWAY_ENABLED=false | 防止重复迁移 |
| 文件上传或导出路径报错 | CREST_PATH_EXCEL、CREST_PATH_EXPORT_DATA、CREST_PATH_EHCACHE | 指向 .runtime,避免写入 /opt/crest |
开发业务页面时,优先在系统里改数据源连接、数据集和仪表盘配置。只有确认是产品逻辑问题,再改代码。
11. 打包
没有 Docker,只打后端 JAR
只验证后端产物时,不需要构建前端:
mvn -s .mvn/settings.xml \
-pl :core-backend -am \
clean package \
-Pstandalone \
-DskipTests \
-Dmaven.test.skip=true \
-Dcrest.copy.frontend.skip=true产物:
core/core-backend/target/CoreApplication.jar需要内嵌前端静态资源
只有验证旧式内嵌静态资源 JAR 时,才先构建前端:
cd core/core-frontend
pnpm install --frozen-lockfile
pnpm run build:base
cd ../..再打后端包,不使用 -Dcrest.copy.frontend.skip=true:
mvn -s .mvn/settings.xml \
-pl :core-backend -am \
clean package \
-Pstandalone \
-DskipTests \
-Dmaven.test.skip=true产物:
core/core-backend/target/CoreApplication.jar这种方式会把 core/core-frontend/dist 复制到后端静态资源目录。v1.5.7 的正式发布镜像采用前后端分离,日常后端开发一般不需要这样打包。
只做后端编译检查
改动 Java 代码后,如仅需编译校验:
mvn -s .mvn/settings.xml \
-pl :core-backend -am \
test-compile \
-DskipTests \
-Dmaven.test.skip=true \
-Dmaven.antrun.skip=true有 Docker,构建前后端镜像
docker build -f Dockerfile.backend -t ghcr.io/sevoniva/crest-service:local .
docker build -f Dockerfile.frontend -t ghcr.io/sevoniva/crest-web:local .构建前端镜像前,必须先执行 pnpm run build:base,确保 core/core-frontend/dist 已存在。
12. 常见问题
启动时报 FUNCTION GET_LOCK does not exist
Flyway 在 MySQL 上会用 GET_LOCK() 做迁移锁。当前数据库不支持这个函数时,迁移会失败。
处理顺序:
- 优先换标准 MySQL 8.x。
- 如果只是本地临时验证,手动导入初始化 SQL。
- 手动导入后设置
SPRING_FLYWAY_ENABLED=false。 - 不应自行创建同名函数绕过迁移锁。
导入 dump 后业务数据源连接失败
按这个顺序查:
CREST_AES_KEY和CREST_AES_IV是否与 dump 来源一致。- dump 是否来自国密环境;如果是,
CREST_SM4_KEY是否一致。 - 数据源地址是否是旧内网地址,本机是否能访问。
- 数据源账号是否限制来源 IP。
建议在 Crest 的“数据源”页面打开对应数据源,改为当前内网可访问地址,重新填写密码并保存。
后端能启动,前端接口全部失败
先确认后端:
curl http://localhost:8100/v3/api-docs再确认前端代理:
core/core-frontend/config/dev.ts后端如果不是 8100,前端 target 也要改。
登录后一直跳 SSO
本地库里关闭 SSO:
UPDATE sys_setting SET pval = 'false' WHERE pkey = 'sso.enabled';
UPDATE auth_sso_provider SET enabled = 0;然后重启后端,刷新前端页面。
空库初始化后管理员密码不对
空库初始化时,管理员 admin 的密码来自 CREST_INITIAL_PASSWORD。如果启动时没有配置该变量,后端会拒绝创建初始密码。
确认当前终端已经加载本地配置:
echo $CREST_INITIAL_PASSWORD打包时报前端 dist 不存在
仅打后端 JAR 时,优先加上 -Dcrest.copy.frontend.skip=true。只有打内嵌静态资源 JAR 或构建前端镜像时,才需要先生成前端 dist。
生成前端 dist:
cd core/core-frontend
pnpm install --frozen-lockfile
pnpm run build:base
cd ../..再执行对应的 Maven 打包或前端镜像构建命令。
13. 提交前检查
这些内容不能提交:
.local/
.runtime/
logs/
*.pid
core/core-frontend/node_modules/
core/core-frontend/dist/
core/core-backend/target/
.vscode/
.idea/
.flattened-pom.xml提交前执行:
git status --short
git diff --stat确认没有提交数据库密码、Token、证书、个人内网地址、临时 dump、运行日志和打包产物。