Merge pull request #5836 from okxlin/maint-pr-5816-dokku

Update Dokku to 0.38.27
This commit is contained in:
okxlin
2026-08-13 02:18:05 +08:00
committed by GitHub
20 changed files with 183 additions and 380 deletions
-101
View File
@@ -1,101 +0,0 @@
additionalProperties:
formFields:
- default: 8080
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Application HTTP Port
labelZh: 应用 HTTP 端口
label:
en: Application HTTP Port
zh: 应用 HTTP 端口
zh-Hant: 應用程式 HTTP 連接埠
ja: アプリ HTTP ポート
ko: 애플리케이션 HTTP 포트
ru: HTTP-порт приложений
ms: Port HTTP Aplikasi
pt-br: Porta HTTP das Aplicações
required: true
rule: paramPort
type: number
- default: 8443
edit: true
envKey: PANEL_APP_PORT_HTTPS
labelEn: Application HTTPS Port
labelZh: 应用 HTTPS 端口
label:
en: Application HTTPS Port
zh: 应用 HTTPS 端口
zh-Hant: 應用程式 HTTPS 連接埠
ja: アプリ HTTPS ポート
ko: 애플리케이션 HTTPS 포트
ru: HTTPS-порт приложений
ms: Port HTTPS Aplikasi
pt-br: Porta HTTPS das Aplicações
required: true
rule: paramPort
type: number
- default: 3022
edit: true
envKey: PANEL_APP_PORT_SSH
labelEn: Git SSH Port
labelZh: Git SSH 端口
label:
en: Git SSH Port
zh: Git SSH 端口
zh-Hant: Git SSH 連接埠
ja: Git SSH ポート
ko: Git SSH 포트
ru: Порт Git SSH
ms: Port Git SSH
pt-br: Porta Git SSH
required: true
rule: paramPort
type: number
- default: dokku.me
edit: true
envKey: DOKKU_HOSTNAME
labelEn: Global Hostname
labelZh: 全局域名
label:
en: Global Hostname
zh: 全局域名
zh-Hant: 全域主機名稱
ja: グローバルホスト名
ko: 전역 호스트 이름
ru: Глобальное имя хоста
ms: Nama Hos Global
pt-br: Nome de Host Global
required: true
type: text
- default: /var/lib/dokku
edit: true
envKey: APP_DATA_DIR
labelEn: Data Directory
labelZh: 数据目录
label:
en: Data Directory
zh: 数据目录
zh-Hant: 資料目錄
ja: データディレクトリ
ko: 데이터 디렉터리
ru: Каталог данных
ms: Direktori Data
pt-br: Diretório de Dados
required: true
type: text
- default: Asia/Shanghai
edit: true
envKey: TZ
labelEn: Timezone
labelZh: 时区
label:
en: Timezone
zh: 时区
zh-Hant: 時區
ja: タイムゾーン
ko: 시간대
ru: Часовой пояс
ms: Zon Waktu
pt-br: Fuso Horário
required: true
type: text
-20
View File
@@ -1,20 +0,0 @@
services:
dokku:
image: "dokku/dokku:0.38.26@sha256:0128539691d4fe8529f83dadd0a500f5f71ba0a6c003c59b8119fc3614d027ec"
container_name: ${CONTAINER_NAME}
restart: unless-stopped
network_mode: bridge
environment:
- DOKKU_HOSTNAME=${DOKKU_HOSTNAME}
- DOKKU_HOST_ROOT=${APP_DATA_DIR}/home/dokku
- DOKKU_LIB_HOST_ROOT=${APP_DATA_DIR}/var/lib/dokku
- TZ=${TZ}
volumes:
- "${APP_DATA_DIR}:/mnt/dokku"
- "/var/run/docker.sock:/var/run/docker.sock"
ports:
- "${PANEL_APP_PORT_SSH}:22"
- "${PANEL_APP_PORT_HTTP}:80"
- "${PANEL_APP_PORT_HTTPS}:443"
labels:
createdBy: "Apps"
-58
View File
@@ -1,58 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
read_env_value() {
local key="$1"
[[ -f "$ENV_FILE" ]] || return 0
local value
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
case "$value" in
\"*\") value="${value#\"}"; value="${value%\"}" ;;
\'*\') value="${value#\'}"; value="${value%\'}" ;;
esac
printf '%s\n' "$value"
}
configured_value() {
local key="$1"
local default_value="$2"
local value
value="${!key:-}"
if [[ -z "$value" ]]; then
value="$(read_env_value "$key")"
fi
printf '%s\n' "${value:-$default_value}"
}
resolve_app_path() {
local raw="$1"
if [[ "$raw" = /* ]]; then
printf '%s\n' "$raw"
else
printf '%s\n' "$ROOT_DIR/${raw#./}"
fi
}
ensure_dir() {
local path
path="$(resolve_app_path "$(configured_value "$1" "$2")")"
mkdir -p "$path"
}
ensure_file_parent() {
local path
local parent
path="$(resolve_app_path "$(configured_value "$1" "$2")")"
parent="$(dirname "$path")"
mkdir -p "$parent"
}
DATA_DIR="$(configured_value APP_DATA_DIR /var/lib/dokku)"
if [[ "$DATA_DIR" != /* ]]; then
echo "APP_DATA_DIR must be an absolute host path for Dokku" >&2
exit 1
fi
mkdir -p "$DATA_DIR"
-2
View File
@@ -1,2 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
@@ -1,7 +1,6 @@
CONTAINER_NAME=dokku-compose-check
PANEL_APP_PORT_HTTP=8080
PANEL_APP_PORT_HTTPS=8443
PANEL_APP_PORT_SSH=3022
DOKKU_HOSTNAME=dokku.me
APP_DATA_DIR=/var/lib/dokku
TZ=Asia/Shanghai
CONTAINER_NAME=dokku-compose-check
+85
View File
@@ -0,0 +1,85 @@
additionalProperties:
formFields:
- default: 8080
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Application HTTP Port
labelZh: 应用 HTTP 端口
label:
en: Application HTTP Port
zh: 应用 HTTP 端口
zh-Hant: 應用程式 HTTP 連接埠
ja: アプリ HTTP ポート
ko: 애플리케이션 HTTP 포트
ru: HTTP-порт приложений
ms: Port HTTP Aplikasi
pt-br: Porta HTTP das Aplicações
required: true
rule: paramPort
type: number
- default: 8443
edit: true
envKey: PANEL_APP_PORT_HTTPS
labelEn: Application HTTPS Port
labelZh: 应用 HTTPS 端口
label:
en: Application HTTPS Port
zh: 应用 HTTPS 端口
zh-Hant: 應用程式 HTTPS 連接埠
ja: アプリ HTTPS ポート
ko: 애플리케이션 HTTPS 포트
ru: HTTPS-порт приложений
ms: Port HTTPS Aplikasi
pt-br: Porta HTTPS das Aplicações
required: true
rule: paramPort
type: number
- default: 3022
edit: true
envKey: PANEL_APP_PORT_SSH
labelEn: Git SSH Port
labelZh: Git SSH 端口
label:
en: Git SSH Port
zh: Git SSH 端口
zh-Hant: Git SSH 連接埠
ja: Git SSH ポート
ko: Git SSH 포트
ru: Порт Git SSH
ms: Port Git SSH
pt-br: Porta Git SSH
required: true
rule: paramPort
type: number
- default: dokku.me
edit: true
envKey: DOKKU_HOSTNAME
labelEn: Global Hostname
labelZh: 全局域名
label:
en: Global Hostname
zh: 全局域名
zh-Hant: 全域主機名稱
ja: グローバルホスト名
ko: 전역 호스트 이름
ru: Глобальное имя хоста
ms: Nama Hos Global
pt-br: Nome de Host Global
required: true
type: text
- default: Asia/Shanghai
edit: true
envKey: TZ
labelEn: Timezone
labelZh: 时区
label:
en: Timezone
zh: 时区
zh-Hant: 時區
ja: タイムゾーン
ko: 시간대
ru: Часовой пояс
ms: Zon Waktu
pt-br: Fuso Horário
required: true
type: text
@@ -1,16 +1,16 @@
services:
dokku:
image: "dokku/dokku:latest"
image: "dokku/dokku:0.38.27@sha256:4fb49b29f643265945ef5da3878c7933205a9b60a1ac767f821834c802a56065"
container_name: ${CONTAINER_NAME}
restart: unless-stopped
network_mode: bridge
environment:
- DOKKU_HOSTNAME=${DOKKU_HOSTNAME}
- DOKKU_HOST_ROOT=${APP_DATA_DIR}/home/dokku
- DOKKU_LIB_HOST_ROOT=${APP_DATA_DIR}/var/lib/dokku
- DOKKU_HOST_ROOT=/var/lib/dokku/home/dokku
- DOKKU_LIB_HOST_ROOT=/var/lib/dokku/var/lib/dokku
- TZ=${TZ}
volumes:
- "${APP_DATA_DIR}:/mnt/dokku"
- "/var/lib/dokku:/mnt/dokku"
- "/var/run/docker.sock:/var/run/docker.sock"
ports:
- "${PANEL_APP_PORT_SSH}:22"
+11
View File
@@ -0,0 +1,11 @@
#!/usr/bin/env bash
set -euo pipefail
DOKKU_DATA_DIR=/var/lib/dokku
if [[ -L "$DOKKU_DATA_DIR" ]]; then
echo "Refusing to use symbolic link as Dokku data directory: $DOKKU_DATA_DIR" >&2
exit 1
fi
mkdir -p -- "$DOKKU_DATA_DIR"
+44
View File
@@ -0,0 +1,44 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
DOKKU_DATA_DIR=/var/lib/dokku
read_legacy_data_dir() {
[[ -f "$ENV_FILE" ]] || return 0
local line value=''
while IFS= read -r line || [[ -n "$line" ]]; do
case "$line" in
APP_DATA_DIR=*) value="${line#APP_DATA_DIR=}" ;;
esac
done < "$ENV_FILE"
[[ "$value" != *$'\n'* && "$value" != *$'\r'* ]] || {
echo "Invalid APP_DATA_DIR value in $ENV_FILE" >&2
return 1
}
case "$value" in
\"*\") value="${value#\"}"; value="${value%\"}" ;;
\'*\') value="${value#\'}"; value="${value%\'}" ;;
esac
printf '%s\n' "$value"
}
legacy_data_dir="${APP_DATA_DIR:-$(read_legacy_data_dir)}"
if [[ -n "$legacy_data_dir" && "$legacy_data_dir" != "$DOKKU_DATA_DIR" ]]; then
cat >&2 <<EOF
Dokku upgrade stopped: this installation uses legacy APP_DATA_DIR=$legacy_data_dir.
Dokku's official container contract requires the host path $DOKKU_DATA_DIR.
Back up and migrate the complete legacy directory to $DOKKU_DATA_DIR, then set the current 1Panel app's Data Directory to $DOKKU_DATA_DIR before retrying the upgrade.
No application data was moved automatically.
EOF
exit 1
fi
if [[ -L "$DOKKU_DATA_DIR" ]]; then
echo "Refusing to use symbolic link as Dokku data directory: $DOKKU_DATA_DIR" >&2
exit 1
fi
mkdir -p -- "$DOKKU_DATA_DIR"
+15 -3
View File
@@ -20,9 +20,15 @@ Dokku 是面向单机服务器的开源 PaaS,可通过 Git 推送、Dockerfile
## 数据持久化
- `APP_DATA_DIR` 必须是宿主机绝对路径,默认 `/var/lib/dokku`。
- 该目录挂载到 `/mnt/dokku`,保存 Git 仓库、插件、配置、服务数据和 SSH 状态。
- 升级前应备份整个目录,并同时备份 Dokku 创建的应用容器、卷和数据库插件数据。
- Dokku 按官方容器部署契约固定使用宿主机 `/var/lib/dokku`,并将其挂载到容器内 `/mnt/dokku`。
- 该目录保存 Git 仓库、插件、配置、服务数据和 SSH 状态。为避免不同 Dokku 实例共享并覆盖同一状态,本应用限制为单实例,且不提供自定义数据目录表单。
- 升级前应备份整个 `/var/lib/dokku`,并同时备份 Dokku 创建的应用容器、卷和数据库插件数据。
### 旧版自定义路径迁移
早期包允许通过 `APP_DATA_DIR` 指定其他宿主机路径。新版本不会自动移动这类持久化数据,也不会在路径不一致时静默启动一个空的 `/var/lib/dokku`。
升级前请停止 Dokku,完整备份旧目录,将其中的全部内容迁移到 `/var/lib/dokku`,并确认属主、权限以及插件和 SSH 状态无误。然后在当前旧版本的 1Panel 应用参数中,将“数据目录”改为 `/var/lib/dokku`,确认当前实例可正常启动后再选择升级。不要只手工修改安装目录的 `.env`,因为 1Panel 在升级时会从已保存的应用参数重写该文件。若检测到其他非空路径,`upgrade.sh` 会明确中止。
## 高风险权限说明
@@ -30,6 +36,12 @@ Dokku 的核心功能必须挂载宿主机 `/var/run/docker.sock`。这相当于
仅在专用或充分受信任的服务器上安装。不要向不受信任用户开放 Dokku SSH 权限,不要安装来源不明的插件。卸载 Dokku 应用不会自动删除它创建的子容器、镜像、网络和卷,需要管理员按上游流程审计后手工清理。
## 镜像安全提示
当前镜像的 Docker 相关工具包含 Trivy 标记为 High 的 Moby/Docker 与 Go 标准库问题,其中包括授权插件绕过、针对恶意容器镜像执行 `docker cp`/压缩归档上传时的宿主机代码执行或文件覆盖风险,以及符号链接目录遍历风险。由于 Dokku 必须直接访问宿主机 Docker Socket,这些问题不能按普通低权限容器处理。
仅部署受信任镜像和应用源码;不要对不受信任容器执行 `docker cp` 或压缩归档上传;不要向不受信任用户授予 Dokku SSH、插件安装或 Docker 操作权限。后续 Dokku 镜像包含已修复的 Docker/Go 工具链后应尽快升级。
## 端口与网络风险
- Dokku 部署的应用可能创建额外端口和 Docker 网络,这些资源不会自动出现在当前应用包的 Compose 文件中。
+23 -19
View File
@@ -1,33 +1,37 @@
name: Dokku
tags:
- DevOps
- PaaS
- DevOps
- Server
title: 基于 Docker 的单机应用部署与生命周期管理平台
description: 基于 Docker 的单机应用部署与生命周期管理平台
additionalProperties:
key: dokku
name: Dokku
tags:
- DevOps
- Server
- DevOps
- Server
type: tool
website: https://dokku.com
document: https://dokku.com/docs/getting-started/install/docker/
github: https://github.com/dokku/dokku
shortDescZh: 基于 Docker 的单机应用部署与生命周期管理平台
shortDescEn: Docker-powered platform for building, deploying, and managing applications on one server
shortDescEn: Docker-powered platform for building, deploying, and managing applications
on one server
crossVersionUpdate: true
limit: 1
architectures:
- amd64
- arm64
description:
en: Build, deploy, and manage applications on a single server through Git pushes, Docker, buildpacks, and plugins.
en: Build, deploy, and manage applications on a single server through Git pushes,
Docker, buildpacks, and plugins.
zh: 通过 Git 推送、Docker、Buildpack 和插件在单台服务器上构建、部署和管理应用。
zh-Hant: 透過 Git 推送、Docker、Buildpack 和外掛在單台伺服器上建置、部署和管理應用程式。
ja: Gitプッシュ、Docker、Buildpack、プラグインを使用して単一サーバー上のアプリケーションを構築・デプロイ・管理します。
ko: Git 푸시, Docker, 빌드팩 및 플러그인을 통해 단일 서버에서 애플리케이션을 빌드, 배포 및 관리합니다.
ru: Создавайте, развертывайте и управляйте приложениями на одном сервере с помощью Git, Docker, buildpack и плагинов.
ms: Bina, gunakan dan urus aplikasi pada satu pelayan melalui Git, Docker, buildpack dan pemalam.
pt-br: Crie, implante e gerencie aplicações em um único servidor com Git, Docker, buildpacks e plugins.
type: tool
crossVersionUpdate: true
limit: 1
recommend: 0
website: https://dokku.com
github: https://github.com/dokku/dokku
document: https://dokku.com/docs/getting-started/install/docker/
architectures:
- amd64
- arm64
ru: Создавайте, развертывайте и управляйте приложениями на одном сервере с помощью
Git, Docker, buildpack и плагинов.
ms: Bina, gunakan dan urus aplikasi pada satu pelayan melalui Git, Docker, buildpack
dan pemalam.
pt-br: Crie, implante e gerencie aplicações em um único servidor com Git, Docker,
buildpacks e plugins.
-7
View File
@@ -1,7 +0,0 @@
PANEL_APP_PORT_HTTP=8080
PANEL_APP_PORT_HTTPS=8443
PANEL_APP_PORT_SSH=3022
DOKKU_HOSTNAME=dokku.me
APP_DATA_DIR=/var/lib/dokku
TZ=Asia/Shanghai
CONTAINER_NAME=dokku-compose-check
-101
View File
@@ -1,101 +0,0 @@
additionalProperties:
formFields:
- default: 8080
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Application HTTP Port
labelZh: 应用 HTTP 端口
label:
en: Application HTTP Port
zh: 应用 HTTP 端口
zh-Hant: 應用程式 HTTP 連接埠
ja: アプリ HTTP ポート
ko: 애플리케이션 HTTP 포트
ru: HTTP-порт приложений
ms: Port HTTP Aplikasi
pt-br: Porta HTTP das Aplicações
required: true
rule: paramPort
type: number
- default: 8443
edit: true
envKey: PANEL_APP_PORT_HTTPS
labelEn: Application HTTPS Port
labelZh: 应用 HTTPS 端口
label:
en: Application HTTPS Port
zh: 应用 HTTPS 端口
zh-Hant: 應用程式 HTTPS 連接埠
ja: アプリ HTTPS ポート
ko: 애플리케이션 HTTPS 포트
ru: HTTPS-порт приложений
ms: Port HTTPS Aplikasi
pt-br: Porta HTTPS das Aplicações
required: true
rule: paramPort
type: number
- default: 3022
edit: true
envKey: PANEL_APP_PORT_SSH
labelEn: Git SSH Port
labelZh: Git SSH 端口
label:
en: Git SSH Port
zh: Git SSH 端口
zh-Hant: Git SSH 連接埠
ja: Git SSH ポート
ko: Git SSH 포트
ru: Порт Git SSH
ms: Port Git SSH
pt-br: Porta Git SSH
required: true
rule: paramPort
type: number
- default: dokku.me
edit: true
envKey: DOKKU_HOSTNAME
labelEn: Global Hostname
labelZh: 全局域名
label:
en: Global Hostname
zh: 全局域名
zh-Hant: 全域主機名稱
ja: グローバルホスト名
ko: 전역 호스트 이름
ru: Глобальное имя хоста
ms: Nama Hos Global
pt-br: Nome de Host Global
required: true
type: text
- default: /var/lib/dokku
edit: true
envKey: APP_DATA_DIR
labelEn: Data Directory
labelZh: 数据目录
label:
en: Data Directory
zh: 数据目录
zh-Hant: 資料目錄
ja: データディレクトリ
ko: 데이터 디렉터리
ru: Каталог данных
ms: Direktori Data
pt-br: Diretório de Dados
required: true
type: text
- default: Asia/Shanghai
edit: true
envKey: TZ
labelEn: Timezone
labelZh: 时区
label:
en: Timezone
zh: 时区
zh-Hant: 時區
ja: タイムゾーン
ko: 시간대
ru: Часовой пояс
ms: Zon Waktu
pt-br: Fuso Horário
required: true
type: text
-1
View File
@@ -1 +0,0 @@
-58
View File
@@ -1,58 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
read_env_value() {
local key="$1"
[[ -f "$ENV_FILE" ]] || return 0
local value
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
case "$value" in
\"*\") value="${value#\"}"; value="${value%\"}" ;;
\'*\') value="${value#\'}"; value="${value%\'}" ;;
esac
printf '%s\n' "$value"
}
configured_value() {
local key="$1"
local default_value="$2"
local value
value="${!key:-}"
if [[ -z "$value" ]]; then
value="$(read_env_value "$key")"
fi
printf '%s\n' "${value:-$default_value}"
}
resolve_app_path() {
local raw="$1"
if [[ "$raw" = /* ]]; then
printf '%s\n' "$raw"
else
printf '%s\n' "$ROOT_DIR/${raw#./}"
fi
}
ensure_dir() {
local path
path="$(resolve_app_path "$(configured_value "$1" "$2")")"
mkdir -p "$path"
}
ensure_file_parent() {
local path
local parent
path="$(resolve_app_path "$(configured_value "$1" "$2")")"
parent="$(dirname "$path")"
mkdir -p "$parent"
}
DATA_DIR="$(configured_value APP_DATA_DIR /var/lib/dokku)"
if [[ "$DATA_DIR" != /* ]]; then
echo "APP_DATA_DIR must be an absolute host path for Dokku" >&2
exit 1
fi
mkdir -p "$DATA_DIR"
-2
View File
@@ -1,2 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
-2
View File
@@ -1,2 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB