Upload 3 files
Browse files- Dockerfile +4 -1
- entrypoint.sh +11 -7
- sync-script.sh +32 -12
Dockerfile
CHANGED
@@ -9,7 +9,10 @@ RUN apk update && apk add --no-cache \
|
|
9 |
python3 \
|
10 |
py3-pip \
|
11 |
tar \
|
12 |
-
bash
|
|
|
|
|
|
|
13 |
|
14 |
RUN python3 -m venv /app/venv && \
|
15 |
/app/venv/bin/pip install --no-cache-dir webdavclient3
|
|
|
9 |
python3 \
|
10 |
py3-pip \
|
11 |
tar \
|
12 |
+
bash \
|
13 |
+
rsync \
|
14 |
+
coreutils \
|
15 |
+
findutils
|
16 |
|
17 |
RUN python3 -m venv /app/venv && \
|
18 |
/app/venv/bin/pip install --no-cache-dir webdavclient3
|
entrypoint.sh
CHANGED
@@ -19,6 +19,8 @@ BACKUP_FILENAME="${BACKUP_FILENAME:-tgdrive_db_backup.tar.gz}"
|
|
19 |
|
20 |
mkdir -p "$DB_PATH" 2>/dev/null || true
|
21 |
mkdir -p "$BACKUP_PATH" 2>/dev/null || true
|
|
|
|
|
22 |
|
23 |
log "数据库路径: ${DB_PATH}"
|
24 |
log "备份路径: ${BACKUP_PATH}"
|
@@ -28,13 +30,15 @@ log "备份文件名: ${BACKUP_FILENAME}"
|
|
28 |
if [ -n "$WEBDAV_URL" ] && [ -n "$WEBDAV_USERNAME" ] && [ -n "$WEBDAV_PASSWORD" ]; then
|
29 |
log "检测到WebDAV配置,尝试初始同步..."
|
30 |
|
31 |
-
/app/sync-script.sh restore || log "首次恢复尝试失败,可能是首次运行或WebDAV
|
32 |
|
33 |
log "设置定时同步任务..."
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
|
|
|
|
38 |
|
39 |
log "后台同步服务已启动,每${SYNC_INTERVAL}分钟执行一次"
|
40 |
else
|
@@ -46,8 +50,8 @@ log "tgDrive 同步版本启动成功"
|
|
46 |
trap_handler() {
|
47 |
log "接收到停止信号,执行备份..."
|
48 |
if [ -n "$WEBDAV_URL" ] && [ -n "$WEBDAV_USERNAME" ] && [ -n "$WEBDAV_PASSWORD" ]; then
|
49 |
-
/app/sync-script.sh backup
|
50 |
-
log "
|
51 |
else
|
52 |
log "未配置WebDAV,跳过备份"
|
53 |
fi
|
|
|
19 |
|
20 |
mkdir -p "$DB_PATH" 2>/dev/null || true
|
21 |
mkdir -p "$BACKUP_PATH" 2>/dev/null || true
|
22 |
+
chmod -R 777 "$DB_PATH" 2>/dev/null || true
|
23 |
+
chmod -R 777 "$BACKUP_PATH" 2>/dev/null || true
|
24 |
|
25 |
log "数据库路径: ${DB_PATH}"
|
26 |
log "备份路径: ${BACKUP_PATH}"
|
|
|
30 |
if [ -n "$WEBDAV_URL" ] && [ -n "$WEBDAV_USERNAME" ] && [ -n "$WEBDAV_PASSWORD" ]; then
|
31 |
log "检测到WebDAV配置,尝试初始同步..."
|
32 |
|
33 |
+
/app/sync-script.sh restore || log "首次恢复尝试失败,可能是首次运行或WebDAV上没有备份或权限问题"
|
34 |
|
35 |
log "设置定时同步任务..."
|
36 |
+
(
|
37 |
+
while true; do
|
38 |
+
sleep $((SYNC_INTERVAL * 60))
|
39 |
+
/app/sync-script.sh sync >> /app/logs/sync_cron.log 2>&1 || log "同步任务执行失败" >> /app/logs/sync_cron.log 2>&1
|
40 |
+
done
|
41 |
+
) &
|
42 |
|
43 |
log "后台同步服务已启动,每${SYNC_INTERVAL}分钟执行一次"
|
44 |
else
|
|
|
50 |
trap_handler() {
|
51 |
log "接收到停止信号,执行备份..."
|
52 |
if [ -n "$WEBDAV_URL" ] && [ -n "$WEBDAV_USERNAME" ] && [ -n "$WEBDAV_PASSWORD" ]; then
|
53 |
+
/app/sync-script.sh backup || log "备份过程中遇到错误,可能是权限问题"
|
54 |
+
log "备份尝试完成,容器即将停止"
|
55 |
else
|
56 |
log "未配置WebDAV,跳过备份"
|
57 |
fi
|
sync-script.sh
CHANGED
@@ -143,26 +143,46 @@ restore_db() {
|
|
143 |
if [ -d "$DB_PATH" ] && [ "$(ls -A $DB_PATH 2>/dev/null)" ]; then
|
144 |
local timestamp=$(date +%Y%m%d%H%M%S)
|
145 |
if [[ "$DB_PATH" == "/app/db" ]]; then
|
146 |
-
tar -czf "${BACKUP_PATH}/db_before_restore_${timestamp}.tar.gz" -C /app db
|
147 |
else
|
148 |
-
tar -czf "${BACKUP_PATH}/db_before_restore_${timestamp}.tar.gz" -C $(dirname "$DB_PATH") $(basename "$DB_PATH")
|
149 |
fi
|
150 |
-
log "
|
151 |
fi
|
152 |
|
153 |
-
|
154 |
-
mkdir -p
|
155 |
|
156 |
-
|
157 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
158 |
else
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
|
|
163 |
fi
|
164 |
|
165 |
-
|
|
|
|
|
166 |
return 0
|
167 |
else
|
168 |
log "错误: 备份文件不存在,无法恢复数据库"
|
|
|
143 |
if [ -d "$DB_PATH" ] && [ "$(ls -A $DB_PATH 2>/dev/null)" ]; then
|
144 |
local timestamp=$(date +%Y%m%d%H%M%S)
|
145 |
if [[ "$DB_PATH" == "/app/db" ]]; then
|
146 |
+
tar -czf "${BACKUP_PATH}/db_before_restore_${timestamp}.tar.gz" -C /app db 2>/dev/null || log "无法创建当前数据库备份,继续恢复..."
|
147 |
else
|
148 |
+
tar -czf "${BACKUP_PATH}/db_before_restore_${timestamp}.tar.gz" -C $(dirname "$DB_PATH") $(basename "$DB_PATH") 2>/dev/null || log "无法创建当前数据库备份,继续恢复..."
|
149 |
fi
|
150 |
+
log "尝试备份当前数据库到 ${BACKUP_PATH}/db_before_restore_${timestamp}.tar.gz"
|
151 |
fi
|
152 |
|
153 |
+
# 创建临时恢复目录
|
154 |
+
mkdir -p /tmp/tgdrive_restore 2>/dev/null || true
|
155 |
|
156 |
+
# 解压备份文件到临时目录
|
157 |
+
tar -xzf "${BACKUP_PATH}/${BACKUP_FILENAME}" -C /tmp/tgdrive_restore 2>/dev/null || {
|
158 |
+
log "解压备份文件失败,可能是格式不正确"
|
159 |
+
rm -rf /tmp/tgdrive_restore 2>/dev/null || true
|
160 |
+
return 1
|
161 |
+
}
|
162 |
+
|
163 |
+
# 确保数据库目录存在
|
164 |
+
mkdir -p "$DB_PATH" 2>/dev/null || true
|
165 |
+
|
166 |
+
# 清空数据库目录内容(逐个文件删除而不是删除整个目录)
|
167 |
+
find "$DB_PATH" -mindepth 1 -delete 2>/dev/null || log "无法清空数据库目录,将尝试直接覆盖..."
|
168 |
+
|
169 |
+
# 复制恢复的文件到数据库目录
|
170 |
+
if [ -d "/tmp/tgdrive_restore/db" ]; then
|
171 |
+
cp -rf /tmp/tgdrive_restore/db/* "$DB_PATH"/ 2>/dev/null || {
|
172 |
+
log "复制恢复文件失败,尝试使用rsync..."
|
173 |
+
which rsync >/dev/null 2>&1 && rsync -a /tmp/tgdrive_restore/db/ "$DB_PATH"/ 2>/dev/null
|
174 |
+
}
|
175 |
else
|
176 |
+
log "备份中找不到db目录,尝试直接复制临时目录内容..."
|
177 |
+
cp -rf /tmp/tgdrive_restore/* "$DB_PATH"/ 2>/dev/null || {
|
178 |
+
log "复制恢复文件失败,尝试使用rsync..."
|
179 |
+
which rsync >/dev/null 2>&1 && rsync -a /tmp/tgdrive_restore/ "$DB_PATH"/ 2>/dev/null
|
180 |
+
}
|
181 |
fi
|
182 |
|
183 |
+
rm -rf /tmp/tgdrive_restore 2>/dev/null || true
|
184 |
+
|
185 |
+
log "数据库已尝试恢复到 ${DB_PATH}"
|
186 |
return 0
|
187 |
else
|
188 |
log "错误: 备份文件不存在,无法恢复数据库"
|