DPanel 更新脚本

这里有我的自定义网络 DockerBridge,你可以绑定默认网络 bridge,至于 IP 你自己设置自己的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#!/bin/sh

########################################
# DPanel Update Script
# For iStoreOS / OpenWrt
########################################

CONTAINER="dpanel"
IMAGE="dpanel/dpanel:lite"

NETWORK="DockerBridge"
STATIC_IP="172.20.0.15"

DATA_DIR="/root/Configs/DPanel"

FORCE=0

# 检查参数
if [ "$1" = "--force" ]; then
FORCE=1
fi

echo "================================="
echo " DPanel 更新脚本"
echo "================================="
echo ""

if [ "$FORCE" -eq 1 ]; then
echo "[模式] 强制重建模式"
else
echo "[模式] 普通更新模式"
fi

echo ""

# 检查 Docker
if ! command -v docker >/dev/null 2>&1; then
echo "[错误] Docker 未安装"
exit 1
fi

# 检查网络
echo "[1/9] 检查 Docker 网络..."

if ! docker network ls --format '{{.Name}}' | grep -w "$NETWORK" >/dev/null 2>&1; then
echo "[错误] Docker 网络不存在: $NETWORK"
exit 1
fi

echo "网络正常"
echo ""

# 检查数据目录
echo "[2/9] 检查数据目录..."

if [ ! -d "$DATA_DIR" ]; then
echo "[错误] 数据目录不存在:"
echo "$DATA_DIR"
exit 1
fi

echo "数据目录正常"
echo ""

# 获取当前镜像
echo "[3/9] 获取当前镜像信息..."

OLD_IMAGE_ID=$(docker inspect "$CONTAINER" --format '{{.Image}}' 2>/dev/null)

if [ -z "$OLD_IMAGE_ID" ]; then
echo "[错误] 获取当前镜像失败"
exit 1
fi

echo "当前镜像ID:"
echo "$OLD_IMAGE_ID"
echo ""

# 拉取最新镜像
echo "[4/9] 拉取最新镜像..."

docker pull "$IMAGE"

if [ $? -ne 0 ]; then
echo "[错误] 镜像拉取失败"
exit 1
fi

NEW_IMAGE_ID=$(docker images --no-trunc --quiet "$IMAGE" | head -n 1)

if [ -z "$NEW_IMAGE_ID" ]; then
echo "[错误] 获取最新镜像失败"
exit 1
fi

echo ""
echo "最新镜像ID:"
echo "$NEW_IMAGE_ID"
echo ""

# 普通模式判断是否已最新
if [ "$FORCE" -eq 0 ]; then
if [ "$OLD_IMAGE_ID" = "$NEW_IMAGE_ID" ]; then
echo "[提示] 当前已经是最新版本"
exit 0
fi
fi

# 停止旧容器
echo "[5/9] 停止旧容器..."

docker stop "$CONTAINER" >/dev/null 2>&1

echo "旧容器已停止"
echo ""

# 删除旧容器
echo "[6/9] 删除旧容器..."

docker rm "$CONTAINER" >/dev/null 2>&1

echo "旧容器已删除"
echo ""

# 创建新容器
echo "[7/9] 创建新容器..."

docker run -d \
--name="$CONTAINER" \
--hostname="$CONTAINER" \
--restart=unless-stopped \
--network="$NETWORK" \
--ip="$STATIC_IP" \
-v "$DATA_DIR:/dpanel" \
-v /mnt:/mnt \
-v /var/run/docker.sock:/var/run/docker.sock \
"$IMAGE"

if [ $? -ne 0 ]; then
echo ""
echo "[错误] 新容器启动失败"
echo "正在尝试回滚..."

docker run -d \
--name="$CONTAINER" \
--hostname="$CONTAINER" \
--restart=unless-stopped \
--network="$NETWORK" \
--ip="$STATIC_IP" \
-v "$DATA_DIR:/dpanel" \
-v /mnt:/mnt \
-v /var/run/docker.sock:/var/run/docker.sock \
"$OLD_IMAGE_ID"

if [ $? -eq 0 ]; then
echo ""
echo "[回滚成功] 已恢复旧版本"
else
echo ""
echo "[严重错误] 回滚失败"
fi

exit 1
fi

# 等待启动
echo ""
echo "[8/9] 等待容器启动..."

sleep 5

if ! docker ps --format '{{.Names}}' | grep -w "$CONTAINER" >/dev/null 2>&1; then
echo "[错误] 容器未成功运行"
exit 1
fi

echo "容器运行正常"
echo ""

# 清理旧镜像
echo "[9/9] 清理无用镜像..."

docker image prune -f >/dev/null 2>&1

echo ""
echo "================================="
echo " DPanel 更新完成"
echo "================================="
echo ""

docker ps | grep "$CONTAINER"

echo ""
echo "DPanel 地址:"
echo "http://$STATIC_IP:8080"
echo ""