Spaces:
Paused
Paused
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 "错误: 备份文件不存在,无法恢复数据库"
|