diff --git a/apps/jianmu/2.8.2/.env.sample b/apps/jianmu/2.8.2/.env.sample index 40ee2030d..c9117e279 100644 --- a/apps/jianmu/2.8.2/.env.sample +++ b/apps/jianmu/2.8.2/.env.sample @@ -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 diff --git a/apps/jianmu/2.8.2/data.yml b/apps/jianmu/2.8.2/data.yml index 2b8d524b5..6781d9a34 100644 --- a/apps/jianmu/2.8.2/data.yml +++ b/apps/jianmu/2.8.2/data.yml @@ -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 diff --git a/apps/jianmu/2.8.2/scripts/upgrade.sh b/apps/jianmu/2.8.2/scripts/upgrade.sh index 56aba06a8..db3b96062 100755 --- a/apps/jianmu/2.8.2/scripts/upgrade.sh +++ b/apps/jianmu/2.8.2/scripts/upgrade.sh @@ -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 diff --git a/apps/jianmu/README.md b/apps/jianmu/README.md index 79f51288a..80df0f7f1 100644 --- a/apps/jianmu/README.md +++ b/apps/jianmu/README.md @@ -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 自动合并白名单。 ## 参考资料 diff --git a/apps/jianmu/latest/.env.sample b/apps/jianmu/latest/.env.sample index 40ee2030d..c9117e279 100644 --- a/apps/jianmu/latest/.env.sample +++ b/apps/jianmu/latest/.env.sample @@ -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 diff --git a/apps/jianmu/latest/data.yml b/apps/jianmu/latest/data.yml index 2b8d524b5..6781d9a34 100644 --- a/apps/jianmu/latest/data.yml +++ b/apps/jianmu/latest/data.yml @@ -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 diff --git a/apps/jianmu/latest/scripts/upgrade.sh b/apps/jianmu/latest/scripts/upgrade.sh index 56aba06a8..db3b96062 100755 --- a/apps/jianmu/latest/scripts/upgrade.sh +++ b/apps/jianmu/latest/scripts/upgrade.sh @@ -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