Update sync_data.sh
Browse files- 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 "
|
| 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 "
|
| 27 |
-
source "
|
| 28 |
fi
|
| 29 |
|
| 30 |
# 下载最新备份并恢复
|
| 31 |
restore_backup() {
|
| 32 |
-
echo "
|
| 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'
|
| 56 |
sys.exit(1)
|
| 57 |
|
| 58 |
-
backups = [file for file in files if file.endswith('.tar.gz') and file.startswith('
|
| 59 |
if not backups:
|
| 60 |
-
print('
|
| 61 |
sys.exit()
|
| 62 |
|
| 63 |
latest_backup = sorted(backups)[-1]
|
| 64 |
backup_file_path = f'/tmp/{latest_backup}'
|
| 65 |
-
print(f'
|
| 66 |
|
| 67 |
try:
|
| 68 |
client.download_file(latest_backup, backup_file_path)
|
| 69 |
-
print(f'
|
| 70 |
except Exception as e:
|
| 71 |
-
print(f'
|
| 72 |
sys.exit(1)
|
| 73 |
|
| 74 |
if os.path.exists(backup_file_path):
|
| 75 |
if os.path.exists(CLOUDREVE_DATA_DIR):
|
| 76 |
-
print(f\"
|
| 77 |
shutil.rmtree(CLOUDREVE_DATA_DIR)
|
| 78 |
os.makedirs(CLOUDREVE_DATA_DIR, exist_ok=True)
|
| 79 |
-
print(f\"
|
| 80 |
try:
|
| 81 |
with tarfile.open(backup_file_path, 'r:gz') as tar:
|
| 82 |
tar.extractall(CLOUDREVE_DATA_DIR)
|
| 83 |
-
print(f'
|
| 84 |
except Exception as e:
|
| 85 |
-
print(f'
|
| 86 |
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
else:
|
| 88 |
-
print('
|
| 89 |
"
|
| 90 |
}
|
| 91 |
|
| 92 |
# 首次启动时下载最新备份
|
| 93 |
-
echo "
|
| 94 |
restore_backup
|
| 95 |
|
| 96 |
-
#
|
| 97 |
sleep 30
|
| 98 |
|
| 99 |
# 启动程序 (根据您的日志,您运行的是 Cloudreve)
|
| 100 |
-
./cloudreve -c
|
| 101 |
|
| 102 |
# 同步函数
|
| 103 |
sync_data() {
|
| 104 |
while true; do
|
| 105 |
-
echo "
|
| 106 |
|
| 107 |
if [ ! -d "$CLOUDREVE_DATA_DIR" ]; then
|
| 108 |
mkdir -p "$CLOUDREVE_DATA_DIR"
|
| 109 |
-
echo "
|
| 110 |
fi
|
| 111 |
|
| 112 |
timestamp=$(date +%Y%m%d_%H%M%S)
|
| 113 |
-
backup_file="
|
| 114 |
backup_file_path="/tmp/${backup_file}"
|
| 115 |
|
| 116 |
-
echo "
|
| 117 |
-
#
|
| 118 |
-
tar -czf "${backup_file_path}"
|
| 119 |
|
| 120 |
if [ -f "${backup_file_path}" ]; then
|
| 121 |
-
echo "
|
| 122 |
curl -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -T "${backup_file_path}" "${FULL_WEBDAV_URL}/${backup_file}"
|
| 123 |
if [ $? -eq 0 ]; then
|
| 124 |
-
echo "
|
| 125 |
else
|
| 126 |
-
echo "
|
| 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('
|
| 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'
|
| 153 |
except Exception as e:
|
| 154 |
-
print(f'
|
| 155 |
except Exception as e:
|
| 156 |
-
print(f'
|
| 157 |
" 2>&1
|
| 158 |
|
| 159 |
rm -f "${backup_file_path}"
|
| 160 |
else
|
| 161 |
-
echo "
|
| 162 |
fi
|
| 163 |
|
|
|
|
| 164 |
SYNC_INTERVAL=${SYNC_INTERVAL:-600}
|
| 165 |
-
echo "
|
| 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 |
}
|