fix: use store runtime selector for jianmu db

This commit is contained in:
okxlin
2026-07-06 15:54:56 +08:00
parent 009fff7125
commit 3bc8f62013
7 changed files with 217 additions and 36 deletions
+1
View File
@@ -1,5 +1,6 @@
PANEL_APP_PORT_HTTP=18080
APP_DATA_DIR=./data
PANEL_DB_TYPE=mysql
PANEL_DB_HOST=mysql
PANEL_DB_PORT=3306
PANEL_DB_NAME=jianmu
+35 -13
View File
@@ -34,21 +34,43 @@ additionalProperties:
required: true
type: text
- default: mysql
edit: true
envKey: PANEL_DB_HOST
labelEn: Database Host or App Name
labelZh: 数据库主机或应用名
envKey: PANEL_DB_TYPE
labelEn: Database Service
labelZh: 数据库服务
label:
en: Database Host or App Name
zh: 数据库主机或应用名
zh-Hant: 數據庫主機或應用名
ja: データベースホストまたはアプリ名
ko: 데이터베이스 호스트 또는 앱 이름
ru: Хост базы данных или имя приложения
ms: Hos pangkalan data atau nama aplikasi
pt-br: Host do banco de dados ou nome do aplicativo
en: Database Service
zh: 数据库服务
zh-Hant: 數據庫服務
ja: データベースサービス
ko: 데이터베이스 서비스
ru: Сервис базы данных
ms: Perkhidmatan Pangkalan Data
pt-br: Serviço de Banco de Dados
required: true
type: text
type: apps
values:
- label: "MySQL"
value: mysql
- label: "LocalMySQL"
value: localmysql
- label: "MariaDB"
value: mariadb
child:
default: ""
envKey: PANEL_DB_HOST
labelEn: Database Service
labelZh: 数据库服务
label:
en: Database Service
zh: 数据库服务
zh-Hant: 數據庫服務
ja: データベースサービス
ko: 데이터베이스 서비스
ru: Сервис базы данных
ms: Perkhidmatan Pangkalan Data
pt-br: Serviço de Banco de Dados
required: true
type: service
- default: 3306
edit: true
envKey: PANEL_DB_PORT
+68 -1
View File
@@ -3,6 +3,72 @@ set -euo pipefail
ENV_FILE="${ENV_FILE:-./.env}"
escape_sql_string() {
local value="${1:-}"
printf "%s" "${value//\'/\'\'}"
}
infer_db_type_from_host() {
local host_value="${1:-}"
local agent_db="/opt/1panel/db/agent.db"
if [[ -n "$host_value" && -f "$agent_db" ]] && command -v sqlite3 >/dev/null 2>&1; then
local host_sql
local detected
host_sql="$(escape_sql_string "$host_value")"
detected="$(
sqlite3 "$agent_db" "
SELECT apps.key
FROM app_installs
JOIN apps ON apps.id = app_installs.app_id
WHERE apps.key IN ('mysql', 'localmysql', 'mariadb')
AND (
app_installs.name = '${host_sql}'
OR app_installs.service_name = '${host_sql}'
OR app_installs.container_name = '${host_sql}'
)
ORDER BY app_installs.id DESC
LIMIT 1;
"
)"
if [[ -n "$detected" ]]; then
printf '%s\n' "$detected"
return
fi
fi
case "$host_value" in
*localmysql*)
printf 'localmysql\n'
;;
*mariadb*)
printf 'mariadb\n'
;;
*)
printf 'mysql\n'
;;
esac
}
migrate_db_type() {
if [[ ! -f "$ENV_FILE" ]]; then
echo "$ENV_FILE not found; skipped PANEL_DB_TYPE migration"
return
fi
if grep -qE '^PANEL_DB_TYPE=' "$ENV_FILE"; then
echo "PANEL_DB_TYPE already exists"
return
fi
local current_host
local detected_type
current_host="$(sed -n -E 's/^PANEL_DB_HOST=//p' "$ENV_FILE" | tail -n 1)"
detected_type="$(infer_db_type_from_host "$current_host")"
printf 'PANEL_DB_TYPE=%s\n' "$detected_type" >> "$ENV_FILE"
echo "Added PANEL_DB_TYPE=$detected_type"
}
migrate_db_port() {
if [[ ! -f "$ENV_FILE" ]]; then
echo "$ENV_FILE not found; skipped PANEL_DB_PORT migration"
@@ -26,9 +92,10 @@ migrate_db_port() {
echo "Added default PANEL_DB_PORT"
}
migrate_db_type
migrate_db_port
echo "Jianmu is currently pinned to the verified official image line ui/server v2.8.2 and worker v1.0.13."
echo "Automatic in-place app upgrades are intentionally disabled for this package."
echo "Back up APP_DATA_DIR, the external MySQL database, and the configured Jianmu secrets before changing packaged versions or rotating credentials."
echo "Back up APP_DATA_DIR, the MySQL-compatible database, and the configured Jianmu secrets before changing packaged versions or rotating credentials."
exit 0
+9 -8
View File
@@ -25,13 +25,13 @@ Jianmu is an open source no-code and low-code DevOps workflow platform for graph
- Graphical DevOps workflow orchestration
- Official three-service topology with Web UI, Java server, and Docker worker
- External MySQL 8 dependency support
- Reuse 1Panel store-managed MySQL-compatible runtimes through the install form selector
- Docker worker execution on the host through the Docker socket
## 部署说明
- 本应用基于官方源码仓库 `jianmu-dev/jianmu` 和官方 deploy 仓库 `jianmu-dev/jianmu-deploy` 适配。
- 保留官方 `web + ci-server + worker` 三服务拓扑,但移除官方 compose 中自带的 MySQL 容器,优先改为复用 1Panel 管理的 MySQL 8 服务实例。
- 保留官方 `web + ci-server + worker` 三服务拓扑,但移除官方 compose 中自带的 MySQL 容器,优先改为复用 1Panel 管理的 MySQL / LocalMySQL / MariaDB 服务实例。
- 官方 deploy 示例默认使用固定弱口令 `admin/123456`、`worker-secret` 和 MySQL `123456`;本适配改为表单化或随机化处理 `JIANMU_API_ADMINPASSWD`、`JIANMU_API_JWTSECRET` 和 `JIANMU_WORKER_SECRET`。
- 版本目录 `2.8.2` 与 `latest` 当前都固定到同一官方发布线:`jianmu-ui:v2.8.2`、`jianmu-server:v2.8.2`、`jianmu-worker-docker:v1.0.13`。
- 官方镜像来自 deploy compose 使用的 `docker.jianmuhub.com/jianmu/*` 命名空间,并已核实 `amd64` / `arm64` 可拉取。
@@ -54,7 +54,8 @@ Jianmu is an open source no-code and low-code DevOps workflow platform for graph
| 变量 | 说明 | 默认值 | 必填 |
| --- | --- | --- | --- |
| `PANEL_DB_HOST` | MySQL 主机、1Panel MySQL 应用安装名、服务名或容器名 | `mysql` | 是 |
| `PANEL_DB_TYPE` | 安装表单中的数据库类型选择器,支持 `mysql` / `localmysql` / `mariadb` | `mysql` | 是 |
| `PANEL_DB_HOST` | 由 1Panel 商店数据库 service 选择器注入的服务名;也兼容旧安装里手工填写的主机名或 IP | `mysql` | 是 |
| `PANEL_DB_PORT` | MySQL 端口 | `3306` | 是 |
| `PANEL_DB_NAME` | Jianmu 数据库名 | `jianmu` | 是 |
| `PANEL_DB_USER` | Jianmu 数据库用户 | `jianmu` | 是 |
@@ -69,9 +70,9 @@ Jianmu is an open source no-code and low-code DevOps workflow platform for graph
## 使用说明
- 推荐优先把 `PANEL_DB_HOST` 填成 1Panel 管理的 MySQL 应用安装名,例如 `mysql-prod`、`mysql-jianmu`,这样初始化脚本可以自动解析到对应容器并补建 Jianmu 所需的数据库和用户。
- 如果使用 `localmysql` 或其他 1Panel 管理的 MySQL / MariaDB runtime,也可以直接填写它的安装名、服务名或容器名;本包会在安装阶段自动探测并完成建库、建用户和授权。
- 如果填写的是普通外部 MySQL 主机名或 IP,本包不会尝试猜测 root 凭据;此时请提前手工创建 `PANEL_DB_NAME`、`PANEL_DB_USER` 和对应权限。
- 安装表单中请先选择数据库类型,再从下一级 service 列表选择具体的 1Panel 商店数据库实例;当前已适配 `MySQL`、`LocalMySQL` 和 `MariaDB`。
- 如果选择的是 1Panel 管理的 MySQL 兼容 runtime,本包会在安装阶段自动探测对应容器并完成 Jianmu 所需的建库、建用户和授权。
- 旧安装如果已经把 `PANEL_DB_HOST` 手工写成外部 MySQL 主机名或 IP,本次升级不会覆盖该值;这类外部数据库场景仍需提前手工创建 `PANEL_DB_NAME`、`PANEL_DB_USER` 和对应权限。
- 如果宿主机 Docker 套接字不是默认 `/var/run/docker.sock`,请把 `DOCKER_SOCK_PATH` 改成真实路径。
- 官方 README 提到 Ubuntu 等场景也可以改成 Docker TCP;当前适配只封装了本地 Socket 路径方案,没有默认开放远程 Docker TCP。
- 如果需要公网访问,请在 1Panel 或外部反向代理层补 HTTPS、鉴权和网络隔离。
@@ -82,8 +83,8 @@ Jianmu is an open source no-code and low-code DevOps workflow platform for graph
- 这是一个多服务、外部数据库、带 Docker Socket 权限的高联动应用,排障与升级复杂度高于普通单容器应用。
- 当前包固定到官方 `v2.8.2` / `v1.0.13` 镜像线,`latest` 目录也同样固定到该发布线。
- 自动 in-place 升级暂未放开;`upgrade.sh` 只输出明确提醒,不做破坏性迁移。
- 升级前请备份 `APP_DATA_DIR`、外部 MySQL 数据,以及安装时使用的 `JIANMU_API_JWTSECRET` / `JIANMU_WORKER_SECRET`。
- `upgrade.sh` 会兼容把旧测试包里的 `DB_PORT` 迁移为 `PANEL_DB_PORT`,避免早期试装环境在后续重装或升级时丢失数据库端口配置。
- 升级前请备份 `APP_DATA_DIR`、MySQL 兼容数据库数据,以及安装时使用的 `JIANMU_API_JWTSECRET` / `JIANMU_WORKER_SECRET`。
- `upgrade.sh` 会兼容把旧测试包里的 `DB_PORT` 迁移为 `PANEL_DB_PORT`,并尽量根据旧 `PANEL_DB_HOST` 自动推断补齐 `PANEL_DB_TYPE`,避免已绑定 `localmysql` / `mariadb` 的老安装在升级后无法于表单中正确回显商店 runtime。
- 由于存在 Docker Socket 权限、外部数据库依赖和升级联动风险,本应用不加入 Renovate 自动合并白名单。
## 参考资料
+1
View File
@@ -1,5 +1,6 @@
PANEL_APP_PORT_HTTP=18080
APP_DATA_DIR=./data
PANEL_DB_TYPE=mysql
PANEL_DB_HOST=mysql
PANEL_DB_PORT=3306
PANEL_DB_NAME=jianmu
+35 -13
View File
@@ -34,21 +34,43 @@ additionalProperties:
required: true
type: text
- default: mysql
edit: true
envKey: PANEL_DB_HOST
labelEn: Database Host or App Name
labelZh: 数据库主机或应用名
envKey: PANEL_DB_TYPE
labelEn: Database Service
labelZh: 数据库服务
label:
en: Database Host or App Name
zh: 数据库主机或应用名
zh-Hant: 數據庫主機或應用名
ja: データベースホストまたはアプリ名
ko: 데이터베이스 호스트 또는 앱 이름
ru: Хост базы данных или имя приложения
ms: Hos pangkalan data atau nama aplikasi
pt-br: Host do banco de dados ou nome do aplicativo
en: Database Service
zh: 数据库服务
zh-Hant: 數據庫服務
ja: データベースサービス
ko: 데이터베이스 서비스
ru: Сервис базы данных
ms: Perkhidmatan Pangkalan Data
pt-br: Serviço de Banco de Dados
required: true
type: text
type: apps
values:
- label: "MySQL"
value: mysql
- label: "LocalMySQL"
value: localmysql
- label: "MariaDB"
value: mariadb
child:
default: ""
envKey: PANEL_DB_HOST
labelEn: Database Service
labelZh: 数据库服务
label:
en: Database Service
zh: 数据库服务
zh-Hant: 數據庫服務
ja: データベースサービス
ko: 데이터베이스 서비스
ru: Сервис базы данных
ms: Perkhidmatan Pangkalan Data
pt-br: Serviço de Banco de Dados
required: true
type: service
- default: 3306
edit: true
envKey: PANEL_DB_PORT
+68 -1
View File
@@ -3,6 +3,72 @@ set -euo pipefail
ENV_FILE="${ENV_FILE:-./.env}"
escape_sql_string() {
local value="${1:-}"
printf "%s" "${value//\'/\'\'}"
}
infer_db_type_from_host() {
local host_value="${1:-}"
local agent_db="/opt/1panel/db/agent.db"
if [[ -n "$host_value" && -f "$agent_db" ]] && command -v sqlite3 >/dev/null 2>&1; then
local host_sql
local detected
host_sql="$(escape_sql_string "$host_value")"
detected="$(
sqlite3 "$agent_db" "
SELECT apps.key
FROM app_installs
JOIN apps ON apps.id = app_installs.app_id
WHERE apps.key IN ('mysql', 'localmysql', 'mariadb')
AND (
app_installs.name = '${host_sql}'
OR app_installs.service_name = '${host_sql}'
OR app_installs.container_name = '${host_sql}'
)
ORDER BY app_installs.id DESC
LIMIT 1;
"
)"
if [[ -n "$detected" ]]; then
printf '%s\n' "$detected"
return
fi
fi
case "$host_value" in
*localmysql*)
printf 'localmysql\n'
;;
*mariadb*)
printf 'mariadb\n'
;;
*)
printf 'mysql\n'
;;
esac
}
migrate_db_type() {
if [[ ! -f "$ENV_FILE" ]]; then
echo "$ENV_FILE not found; skipped PANEL_DB_TYPE migration"
return
fi
if grep -qE '^PANEL_DB_TYPE=' "$ENV_FILE"; then
echo "PANEL_DB_TYPE already exists"
return
fi
local current_host
local detected_type
current_host="$(sed -n -E 's/^PANEL_DB_HOST=//p' "$ENV_FILE" | tail -n 1)"
detected_type="$(infer_db_type_from_host "$current_host")"
printf 'PANEL_DB_TYPE=%s\n' "$detected_type" >> "$ENV_FILE"
echo "Added PANEL_DB_TYPE=$detected_type"
}
migrate_db_port() {
if [[ ! -f "$ENV_FILE" ]]; then
echo "$ENV_FILE not found; skipped PANEL_DB_PORT migration"
@@ -26,9 +92,10 @@ migrate_db_port() {
echo "Added default PANEL_DB_PORT"
}
migrate_db_type
migrate_db_port
echo "Jianmu is currently pinned to the verified official image line ui/server v2.8.2 and worker v1.0.13."
echo "Automatic in-place app upgrades are intentionally disabled for this package."
echo "Back up APP_DATA_DIR, the external MySQL database, and the configured Jianmu secrets before changing packaged versions or rotating credentials."
echo "Back up APP_DATA_DIR, the MySQL-compatible database, and the configured Jianmu secrets before changing packaged versions or rotating credentials."
exit 0