所有企业都面临的一个需求就是需要开发/运维人员连接线上生产库进行数据查询或解决线上问题,但又担心开发人员查询线上敏感数据甚至拖库。一般做法都是:
- 通过限制查询人员、限制查询的表和字段。
- 使用跳板机,所有查询都要在跳板机上进行。进出数据文件要过审查机制。
- 使用第三方系统,记录每人的查询语句,并限制查询。
从上向下规则是越来越严。第一级直接由DBA进行查询账号权限限制即可,第二级推荐使用开源的JumpServer 。 第三级我在网上搜了下发现基本都是基于WEB的系统,查询语句入库限制查询结果。但能支持的数据库只有MySql没有发现能支持微软SqlServer的。 本项目就是在这个基础上准备开发的。
- 多账号登录,强制二次验证【OTP】。
- 查询的目标数据库支持SqlServer和MySql。使用druid数据库连接池
- 数据库记录每次SQL执行脚本,后台可查询用户查询日志
- 查询结果支持仿excel方式展示和table方式展示,同时支持结果的csv格式导出
- 脚本输入框语法高亮,表名字段名智能提醒。
- 存储过程查看。
- 用户权限分组。数据库服务器分组
.
├── front/ # React 前端 + Nginx 镜像
├── server/ # Spring Boot 服务端 + Maven 构建
├── deploy/ # 部署相关文件,例如数据库初始化 SQL
├── docker-compose.yml # 运行数据库、服务端、前端三个容器
└── .github/workflows/ # Git tag 触发的镜像发布流程
推送 Git tag 后,GitHub Actions 会自动构建并推送两个镜像到 GHCR:
git tag v0.9.0
git push origin v0.9.0默认镜像名:
ghcr.io/guohai163/java-sql-web-front:<tag>ghcr.io/guohai163/java-sql-web-server:<tag>
复制环境变量模板并按需修改:
cp .env.example .env至少需要确认:
TAG:要部署的镜像版本,例如v0.9.0DB_PASSWORD:MariaDB root 密码PUBLIC_DOMAIN/PUBLIC_HOST:对外访问域名与完整 URL
启动服务:
docker compose up -d容器职责如下:
jsw-front:唯一对外入口,提供静态页面并将后端请求代理到jsw-serverjsw-server:Spring Boot API 服务jsw-db:MariaDB 数据库,首次启动会执行deploy/init.sql
如需兼容极少数仅支持 TLS 1.0 且强制加密的老 MSSQL,可在部署层为 jsw-server 增加:
PROJECT_LEGACY_TLS_ENABLED=true
JAVA_TOOL_OPTIONS="-Djdk.tls.client.protocols=TLSv1,TLSv1.1,TLSv1.2 -Djava.security.properties=/opt/jsw/legacy-tls.security"该模式仅建议用于可信内网环境,且需要同时把对应服务器的“连接安全”配置改为 LEGACY_TLS。
docker-compose.yml 已默认把本地文件挂载到容器内:
./deploy/java-security/legacy-tls.security -> /opt/jsw/legacy-tls.security
仓库提供了一套基于原生 YAML 的 K8s 部署清单:
deploy/k8s/base/deploy/k8s/env/prod.env.examplescripts/deploy-k8s.sh
使用前先复制环境变量模板:
cp deploy/k8s/env/prod.env.example deploy/k8s/env/prod.env至少需要确认:
TAGDB_PASSWORDPUBLIC_DOMAINPUBLIC_HOSTINGRESS_HOSTDB_STORAGE_CLASS(如果集群没有默认 StorageClass)
部署:
bash scripts/deploy-k8s.sh该方案默认部署:
jsw-db:单实例 MariaDB(StatefulSet + PVC)jsw-server:Spring Boot API(Deployment + ClusterIP Service)jsw-front:前端 Nginx(Deployment + ClusterIP Service)Ingress:将外部流量转到jsw-front
如需兼容旧 MSSQL 的 LEGACY_TLS 模式,需要在 jsw-server 的部署环境变量里显式加入:
PROJECT_LEGACY_TLS_ENABLED=true
JAVA_TOOL_OPTIONS=-Djdk.tls.client.protocols=TLSv1,TLSv1.1,TLSv1.2 -Djava.security.properties=/opt/jsw/legacy-tls.security
注意:这会降低当前进程里的 MSSQL TLS 安全基线,仅适用于可信内网老库。
K8s 部署脚本会把:
deploy/java-security/legacy-tls.security
渲染为 ConfigMap 并挂载到:
/opt/jsw/legacy-tls.security
nvm use
cd front
npm ci
npm run build
cd ..
cd server
mvn -DskipTests package
cd ..
docker build -t jsw-front:local ./front
docker build -t jsw-server:local ./server前端默认使用仓库根目录的 .nvmrc,目标 Node 版本为 24。本地开发前端时请在 front/ 目录执行:
npm run dev如果本地后端不是跑在 http://localhost:8002,可以在启动前设置:
VITE_BACKEND_ORIGIN=http://your-server:8002 npm run dev如果是直接用 java -jar 启动服务端,可按下面方式启用旧 MSSQL 的 LEGACY_TLS 模式:
PROJECT_LEGACY_TLS_ENABLED=true \
JAVA_TOOL_OPTIONS="-Djdk.tls.client.protocols=TLSv1,TLSv1.1,TLSv1.2 -Djava.security.properties=/absolute/path/legacy-tls.security" \
java -jar /opt/jsw/program.jar仓库内置了一个给 OpenClaw 使用的查询 skill:
skills/java-sql-web-query/
推荐用一键安装脚本把它安装到全局 ~/.openclaw/skills/:
curl -fsSL https://raw.githubusercontent.com/guohai163/java-sql-web/v2.1.1/scripts/install-openclaw-skill.sh | VERSION=v2.1.1 bash也可以先下载后执行:
curl -fsSL https://raw.githubusercontent.com/guohai163/java-sql-web/v2.1.1/scripts/install-openclaw-skill.sh -o install-openclaw-skill.sh
bash install-openclaw-skill.sh v2.1.1如果 OpenClaw 实际运行时使用的 home 目录和你当前 shell 的 $HOME 不一致,可以显式指定:
OPENCLAW_HOME=/actual/openclaw/home bash install-openclaw-skill.sh v2.1.1安装脚本只负责把 Skill 文件复制到 OPENCLAW_HOME/skills/,还需要在 OPENCLAW_HOME/openclaw.json 里启用并注入运行时变量:
{
"skills": {
"entries": {
"java-sql-web-query": {
"enabled": true,
"env": {
"JSW_BASE_URL": "https://your-jsw.example.com",
"JSW_ACCESS_TOKEN": "jsw_xxx"
}
}
}
}
}配置完成后,刷新或重启 OpenClaw 的 skills 加载,然后可通过:
$java-sql-web-query
显式调用该 skill。
提示:不要只靠“你有什么 skill”这类泛化提问来验证安装结果,模型的自述不一定会实时枚举新装 skill。最稳妥的验证方式是直接显式调用 $java-sql-web-query。
-
为了保证系统的安全,首次登录我们需要绑定OTP动态码,可以点击下载安卓或iOS版本客户端。安装好后扫码即可得到6位的动态码。之后每次登录都要求输入该6位动态码。因我们使用HTOP算法来进行安全验证,请控制服务器的时间误差在30秒内,否则可能会提示动态码错误


-
首选我们看如何增加待管理的数据库服务器,选择服务器管理=>增加服务器。在弹层中添加你的服务器相关信息。添加完毕后可以点击[连接...]进行测试配置的测试

-
我们顺便给平台在增加一个用户。点击账号管理=>增加用户,在弹层内输入新用户的账号和密码即可。所有用户首次登录都会强制要求绑定OTP。
-
我们返回前台,看看主界面,主界面分为左右两部分,左侧主要为数据库和表的导航。右侧主要为SQL语句书写区,执行结果展示区。
需要注意的是:- 左侧库下面的表的数据信息部分会进行客户端本地缓存,缓存时长为24小时。可能表的行数不会实时返回到页面上。
- 右侧的SQL输入区支持SQL语法的快速补全,按下键盘的Ctrl键即可进行补全。
- 历史记录区域会按服务器进行区分,并缓存在浏览器本地。换浏览器后历史记录不会带走请注意。
- 对于查询结果,配置文件中可以进行限制一次最大返回条数,如果查询数据超过最大返回条数,客户端会进行弹层提示。
- 点击存储过程,可以快速查看存储过程的创建语句。
-
后台日志:经过几次的试用可以去往后台的查询日志。可以看到用户的数据执行情况。
- 前端脚本部门有计划使用TS进行重写


