hxger commited on
Commit
e1ffe54
·
verified ·
1 Parent(s): c1ccdca

Upload 3 files

Browse files
Files changed (3) hide show
  1. Dockerfile +4 -1
  2. entrypoint.sh +11 -7
  3. 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
- while true; do
35
- sleep $((SYNC_INTERVAL * 60))
36
- /app/sync-script.sh sync >> /app/logs/sync_cron.log 2>&1
37
- done &
 
 
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 "当前数据库已备份到 ${BACKUP_PATH}/db_before_restore_${timestamp}.tar.gz"
151
  fi
152
 
153
- rm -rf "$DB_PATH"
154
- mkdir -p "$DB_PATH"
155
 
156
- if [[ "$DB_PATH" == "/app/db" ]]; then
157
- tar -xzf "${BACKUP_PATH}/${BACKUP_FILENAME}" -C /app
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  else
159
- mkdir -p /tmp/tgdrive_restore
160
- tar -xzf "${BACKUP_PATH}/${BACKUP_FILENAME}" -C /tmp/tgdrive_restore
161
- cp -r /tmp/tgdrive_restore/db/* "$DB_PATH"/
162
- rm -rf /tmp/tgdrive_restore
 
163
  fi
164
 
165
- log "数据库已成功恢复到 ${DB_PATH}"
 
 
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 "错误: 备份文件不存在,无法恢复数据库"