flzta commited on
Commit
1bf034d
·
verified ·
1 Parent(s): f9d08e8

Update sync_data.sh

Browse files
Files changed (1) hide show
  1. sync_data.sh +49 -36
sync_data.sh CHANGED
@@ -8,7 +8,7 @@ BACKUP_RETENTION=${BACKUP_RETENTION:-5}
8
 
9
  # 检查环境变量
10
  if [[ -z "$WEBDAV_URL" ]] || [[ -z "$WEBDAV_USERNAME" ]] || [[ -z "$WEBDAV_PASSWORD" ]]; then
11
- echo "Warning: Backup functionality will not be enabled - missing WEBDAV_URL, WEBDAV_USERNAME, or WEBDAV_PASSWORD"
12
  exit 0
13
  fi
14
 
@@ -19,18 +19,19 @@ if [ -n "$WEBDAV_BACKUP_PATH" ]; then
19
  FULL_WEBDAV_URL="${WEBDAV_URL}/${WEBDAV_BACKUP_PATH}"
20
  fi
21
 
22
- # 设置 Cloudreve 数据目录 (修改为正确的路径)
23
  CLOUDREVE_DATA_DIR="/opt/cloudreve/data"
 
24
 
25
- # 激活虚拟环境
26
- if [ -f "$HOME/venv/bin/activate" ]; then
27
- source "$HOME/venv/bin/activate"
28
  fi
29
 
30
  # 下载最新备份并恢复
31
  restore_backup() {
32
- echo "Starting to download the latest backup from WebDAV..."
33
- WEBDAV_URL="$FULL_WEBDAV_URL" WEBDAV_USERNAME="$WEBDAV_USERNAME" WEBDAV_PASSWORD="$WEBDAV_PASSWORD" CLOUDREVE_DATA_DIR="$CLOUDREVE_DATA_DIR" python3 -c "
34
  import sys
35
  import os
36
  import tarfile
@@ -42,6 +43,7 @@ WEBDAV_URL = os.environ.get('WEBDAV_URL')
42
  WEBDAV_USERNAME = os.environ.get('WEBDAV_USERNAME')
43
  WEBDAV_PASSWORD = os.environ.get('WEBDAV_PASSWORD')
44
  CLOUDREVE_DATA_DIR = os.environ.get('CLOUDREVE_DATA_DIR')
 
45
 
46
  options = {
47
  'webdav_hostname': WEBDAV_URL,
@@ -52,78 +54,88 @@ client = Client(options)
52
  try:
53
  files = client.list()
54
  except Exception as e:
55
- print(f'Error listing WebDAV directory: {e}')
56
  sys.exit(1)
57
 
58
- backups = [file for file in files if file.endswith('.tar.gz') and file.startswith('alist_backup_')]
59
  if not backups:
60
- print('No backup files found on WebDAV.')
61
  sys.exit()
62
 
63
  latest_backup = sorted(backups)[-1]
64
  backup_file_path = f'/tmp/{latest_backup}'
65
- print(f'Latest backup file found: {latest_backup}')
66
 
67
  try:
68
  client.download_file(latest_backup, backup_file_path)
69
- print(f'Successfully downloaded backup file to {backup_file_path}')
70
  except Exception as e:
71
- print(f'Failed to download backup file: {e}')
72
  sys.exit(1)
73
 
74
  if os.path.exists(backup_file_path):
75
  if os.path.exists(CLOUDREVE_DATA_DIR):
76
- print(f\"Deleting existing data directory: {CLOUDREVE_DATA_DIR}\")
77
  shutil.rmtree(CLOUDREVE_DATA_DIR)
78
  os.makedirs(CLOUDREVE_DATA_DIR, exist_ok=True)
79
- print(f\"Extracting backup to: {CLOUDREVE_DATA_DIR}\")
80
  try:
81
  with tarfile.open(backup_file_path, 'r:gz') as tar:
82
  tar.extractall(CLOUDREVE_DATA_DIR)
83
- print(f'Successfully restored backup from {latest_backup}')
84
  except Exception as e:
85
- print(f'Error extracting backup file: {e}')
86
  sys.exit(1)
 
 
 
 
 
 
 
 
 
 
87
  else:
88
- print('Downloaded backup file does not exist.')
89
  "
90
  }
91
 
92
  # 首次启动时下载最新备份
93
- echo "Downloading latest backup from WebDAV..."
94
  restore_backup
95
 
96
- # 等待30秒后启动程序
97
  sleep 30
98
 
99
  # 启动程序 (根据您的日志,您运行的是 Cloudreve)
100
- ./cloudreve -c /opt/cloudreve/conf/cloudreve.ini &
101
 
102
  # 同步函数
103
  sync_data() {
104
  while true; do
105
- echo "Starting sync process at $(date)"
106
 
107
  if [ ! -d "$CLOUDREVE_DATA_DIR" ]; then
108
  mkdir -p "$CLOUDREVE_DATA_DIR"
109
- echo "Data directory created."
110
  fi
111
 
112
  timestamp=$(date +%Y%m%d_%H%M%S)
113
- backup_file="alist_backup_${timestamp}.tar.gz"
114
  backup_file_path="/tmp/${backup_file}"
115
 
116
- echo "Creating backup archive: ${backup_file_path}"
117
- # 压缩数据目录,排除可能存在的临时文件
118
- tar -czf "${backup_file_path}" --exclude='*.tmp' -C "$CLOUDREVE_DATA_DIR" .
119
 
120
  if [ -f "${backup_file_path}" ]; then
121
- echo "Uploading backup to WebDAV: ${FULL_WEBDAV_URL}/${backup_file}"
122
  curl -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -T "${backup_file_path}" "${FULL_WEBDAV_URL}/${backup_file}"
123
  if [ $? -eq 0 ]; then
124
- echo "Successfully uploaded ${backup_file} to WebDAV"
125
  else
126
- echo "Failed to upload ${backup_file} to WebDAV"
127
  fi
128
 
129
  # 清理旧备份文件
@@ -143,26 +155,27 @@ options = {
143
  }
144
  client = Client(options)
145
  try:
146
- backups = sorted([file for file in client.list() if file.endswith('.tar.gz') and file.startswith('alist_backup_')])
147
  if len(backups) > BACKUP_RETENTION:
148
  num_to_delete = len(backups) - BACKUP_RETENTION
149
  for file in backups[:num_to_delete]:
150
  try:
151
  client.clean(file)
152
- print(f'Successfully deleted old backup: {file}')
153
  except Exception as e:
154
- print(f'Error deleting {file}: {e}')
155
  except Exception as e:
156
- print(f'Error managing backups: {e}')
157
  " 2>&1
158
 
159
  rm -f "${backup_file_path}"
160
  else
161
- echo "Failed to create backup archive."
162
  fi
163
 
 
164
  SYNC_INTERVAL=${SYNC_INTERVAL:-600}
165
- echo "Next sync in ${SYNC_INTERVAL} seconds..."
166
  sleep "$SYNC_INTERVAL"
167
  done
168
  }
 
8
 
9
  # 检查环境变量
10
  if [[ -z "$WEBDAV_URL" ]] || [[ -z "$WEBDAV_USERNAME" ]] || [[ -z "$WEBDAV_PASSWORD" ]]; then
11
+ echo "警告:备份功能将不会启用 - 缺少 WEBDAV_URL, WEBDAV_USERNAME, WEBDAV_PASSWORD"
12
  exit 0
13
  fi
14
 
 
19
  FULL_WEBDAV_URL="${WEBDAV_URL}/${WEBDAV_BACKUP_PATH}"
20
  fi
21
 
22
+ # 设置 Cloudreve 数据目录 (根据 Dockerfile 修改)
23
  CLOUDREVE_DATA_DIR="/opt/cloudreve/data"
24
+ CLOUDREVE_CONFIG_FILE="/opt/cloudreve/cloudreve.ini" # 假设这是配置文件路径
25
 
26
+ # 激活虚拟环境 (根据 Dockerfile 修改)
27
+ if [ -f "/opt/venv/bin/activate" ]; then
28
+ source "/opt/venv/bin/activate"
29
  fi
30
 
31
  # 下载最新备份并恢复
32
  restore_backup() {
33
+ echo "开始从 WebDAV 下载最新备份..."
34
+ WEBDAV_URL="$FULL_WEBDAV_URL" WEBDAV_USERNAME="$WEBDAV_USERNAME" WEBDAV_PASSWORD="$WEBDAV_PASSWORD" CLOUDREVE_DATA_DIR="$CLOUDREVE_DATA_DIR" CLOUDREVE_CONFIG_FILE="$CLOUDREVE_CONFIG_FILE" python3 -c "
35
  import sys
36
  import os
37
  import tarfile
 
43
  WEBDAV_USERNAME = os.environ.get('WEBDAV_USERNAME')
44
  WEBDAV_PASSWORD = os.environ.get('WEBDAV_PASSWORD')
45
  CLOUDREVE_DATA_DIR = os.environ.get('CLOUDREVE_DATA_DIR')
46
+ CLOUDREVE_CONFIG_FILE = os.environ.get('CLOUDREVE_CONFIG_FILE') # 添加了配置文件
47
 
48
  options = {
49
  'webdav_hostname': WEBDAV_URL,
 
54
  try:
55
  files = client.list()
56
  except Exception as e:
57
+ print(f'列出 WebDAV 目录时出错: {e}')
58
  sys.exit(1)
59
 
60
+ backups = [file for file in files if file.endswith('.tar.gz') and file.startswith('cloudreve_backup_')]
61
  if not backups:
62
+ print(' WebDAV 上没有找到 Cloudreve 备份文件。')
63
  sys.exit()
64
 
65
  latest_backup = sorted(backups)[-1]
66
  backup_file_path = f'/tmp/{latest_backup}'
67
+ print(f'找到最新的备份文件:{latest_backup}')
68
 
69
  try:
70
  client.download_file(latest_backup, backup_file_path)
71
+ print(f'成功下载备份文件到 {backup_file_path}')
72
  except Exception as e:
73
+ print(f'下载备份文件失败:{e}')
74
  sys.exit(1)
75
 
76
  if os.path.exists(backup_file_path):
77
  if os.path.exists(CLOUDREVE_DATA_DIR):
78
+ print(f\"删除现有的数据目录:{CLOUDREVE_DATA_DIR}\")
79
  shutil.rmtree(CLOUDREVE_DATA_DIR)
80
  os.makedirs(CLOUDREVE_DATA_DIR, exist_ok=True)
81
+ print(f\"将备份解压到:{CLOUDREVE_DATA_DIR}\")
82
  try:
83
  with tarfile.open(backup_file_path, 'r:gz') as tar:
84
  tar.extractall(CLOUDREVE_DATA_DIR)
85
+ print(f'已成功从 {latest_backup} 恢复备份')
86
  except Exception as e:
87
+ print(f'解压备份文件时出错:{e}')
88
  sys.exit(1)
89
+
90
+ # 同时恢复配置文件
91
+ config_file_name = os.path.basename(CLOUDREVE_CONFIG_FILE)
92
+ extracted_config_path = os.path.join(CLOUDREVE_DATA_DIR, config_file_name)
93
+ if os.path.exists(extracted_config_path):
94
+ print(f"将恢复的配置文件移动到 {CLOUDREVE_CONFIG_FILE}")
95
+ shutil.move(extracted_config_path, CLOUDREVE_CONFIG_FILE)
96
+ else:
97
+ print("警告:备份中未找到配置文件。")
98
+
99
  else:
100
+ print('下载的备份文件不存在。')
101
  "
102
  }
103
 
104
  # 首次启动时下载最新备份
105
+ echo "正在从 WebDAV 下载最新备份..."
106
  restore_backup
107
 
108
+ # 等待一段时间以确保 Cloudreve 正常启动
109
  sleep 30
110
 
111
  # 启动程序 (根据您的日志,您运行的是 Cloudreve)
112
+ ./cloudreve -c "$CLOUDREVE_CONFIG_FILE" &
113
 
114
  # 同步函数
115
  sync_data() {
116
  while true; do
117
+ echo "开始同步进程于 $(date)"
118
 
119
  if [ ! -d "$CLOUDREVE_DATA_DIR" ]; then
120
  mkdir -p "$CLOUDREVE_DATA_DIR"
121
+ echo "数据目录已创建。"
122
  fi
123
 
124
  timestamp=$(date +%Y%m%d_%H%M%S)
125
+ backup_file="cloudreve_backup_${timestamp}.tar.gz"
126
  backup_file_path="/tmp/${backup_file}"
127
 
128
+ echo "创建备份归档:${backup_file_path}"
129
+ # 压缩数据目录和配置文件
130
+ tar -czf "${backup_file_path}" -C "$CLOUDREVE_DATA_DIR" . -C "$(dirname "$CLOUDREVE_CONFIG_FILE")" "$(basename "$CLOUDREVE_CONFIG_FILE")"
131
 
132
  if [ -f "${backup_file_path}" ]; then
133
+ echo "正在上传备份到 WebDAV:${FULL_WEBDAV_URL}/${backup_file}"
134
  curl -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -T "${backup_file_path}" "${FULL_WEBDAV_URL}/${backup_file}"
135
  if [ $? -eq 0 ]; then
136
+ echo "成功上传 ${backup_file} WebDAV"
137
  else
138
+ echo "上传 ${backup_file} WebDAV 失败"
139
  fi
140
 
141
  # 清理旧备份文件
 
155
  }
156
  client = Client(options)
157
  try:
158
+ backups = sorted([file for file in client.list() if file.endswith('.tar.gz') and file.startswith('cloudreve_backup_')])
159
  if len(backups) > BACKUP_RETENTION:
160
  num_to_delete = len(backups) - BACKUP_RETENTION
161
  for file in backups[:num_to_delete]:
162
  try:
163
  client.clean(file)
164
+ print(f'成功删除旧备份:{file}')
165
  except Exception as e:
166
+ print(f'删除 {file} 时出错:{e}')
167
  except Exception as e:
168
+ print(f'管理备份时出错:{e}')
169
  " 2>&1
170
 
171
  rm -f "${backup_file_path}"
172
  else
173
+ echo "创建备份归档失败。"
174
  fi
175
 
176
+
177
  SYNC_INTERVAL=${SYNC_INTERVAL:-600}
178
+ echo "下一次同步将在 ${SYNC_INTERVAL} 秒后进行..."
179
  sleep "$SYNC_INTERVAL"
180
  done
181
  }