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

Upload 3 files

Browse files
Files changed (3) hide show
  1. Dockerfile +49 -0
  2. entrypoint.sh +62 -0
  3. sync-script.sh +200 -0
Dockerfile ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM nanyangzesi/tgdrive:latest
2
+
3
+ RUN apk update && apk add --no-cache \
4
+ curl \
5
+ rclone \
6
+ dcron \
7
+ davfs2 \
8
+ ca-certificates \
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
16
+
17
+ WORKDIR /app
18
+
19
+ RUN mkdir -p /app/db
20
+ RUN mkdir -p /app/data
21
+ RUN mkdir -p /app/backup
22
+ RUN mkdir -p /app/logs
23
+ RUN mkdir -p /app/config
24
+
25
+ RUN chmod 777 /app/db
26
+ RUN chmod 777 /app/data
27
+ RUN chmod 777 /app/backup
28
+ RUN chmod 777 /app/logs
29
+ RUN chmod 777 /app/config
30
+
31
+ COPY sync-script.sh /app/
32
+ RUN chmod +x /app/sync-script.sh
33
+
34
+ COPY entrypoint.sh /app/
35
+ RUN chmod +x /app/entrypoint.sh
36
+
37
+ EXPOSE 8085
38
+
39
+ ENV WEBDAV_URL=""
40
+ ENV WEBDAV_USERNAME=""
41
+ ENV WEBDAV_PASSWORD=""
42
+ ENV SYNC_INTERVAL="60"
43
+ ENV PATH="/app/venv/bin:$PATH"
44
+ ENV REMOTE_BACKUP_DIR="tgdrive_backup"
45
+ ENV BACKUP_FILENAME="tgdrive_db_backup.tar.gz"
46
+ ENV DB_PATH="/app/db"
47
+ ENV BACKUP_PATH="/app/backup"
48
+
49
+ ENTRYPOINT ["/app/entrypoint.sh"]
entrypoint.sh ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ mkdir -p /app/logs 2>/dev/null || true
5
+
6
+ log() {
7
+ echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a /app/logs/entrypoint.log 2>/dev/null || echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
8
+ }
9
+
10
+ log "容器启动中..."
11
+
12
+ SYNC_INTERVAL="${SYNC_INTERVAL:-60}"
13
+ log "设置同步间隔: ${SYNC_INTERVAL}分钟"
14
+
15
+ DB_PATH="${DB_PATH:-/app/db}"
16
+ BACKUP_PATH="${BACKUP_PATH:-/app/backup}"
17
+ REMOTE_BACKUP_DIR="${REMOTE_BACKUP_DIR:-tgdrive_backup}"
18
+ 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}"
25
+ log "远程备份目录: ${REMOTE_BACKUP_DIR}"
26
+ log "备份文件名: ${BACKUP_FILENAME}"
27
+
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
41
+ log "未检测到WebDAV配置,跳过同步设置"
42
+ fi
43
+
44
+ log "tgDrive 同步版本启动成功"
45
+
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
54
+ exit 0
55
+ }
56
+
57
+ trap trap_handler SIGTERM SIGINT
58
+
59
+ log "启动tgDrive应用..."
60
+
61
+ cd /app
62
+ exec java -jar app.jar "$@"
sync-script.sh ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ WEBDAV_URL="${WEBDAV_URL}"
5
+ WEBDAV_USERNAME="${WEBDAV_USERNAME}"
6
+ WEBDAV_PASSWORD="${WEBDAV_PASSWORD}"
7
+ DB_PATH="${DB_PATH:-/app/db}"
8
+ BACKUP_PATH="${BACKUP_PATH:-/app/backup}"
9
+ BACKUP_FILENAME="${BACKUP_FILENAME:-tgdrive_db_backup.tar.gz}"
10
+ REMOTE_BACKUP_DIR="${REMOTE_BACKUP_DIR:-tgdrive_backup}"
11
+ CONFIG_FILE="/app/config/sync_config"
12
+ PYTHON_CMD="/app/venv/bin/python3"
13
+
14
+ mkdir -p ${BACKUP_PATH}
15
+ mkdir -p /app/logs
16
+
17
+ log() {
18
+ echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> /app/logs/sync.log 2>/dev/null || true
19
+ echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
20
+ }
21
+
22
+ mkdir -p /app/logs 2>/dev/null || true
23
+ touch /app/logs/sync.log 2>/dev/null || true
24
+
25
+ if [ ! -f "$CONFIG_FILE" ]; then
26
+ log "创建初始配置文件"
27
+ mkdir -p /app/config 2>/dev/null || true
28
+ echo "LAST_SYNC=0" > "$CONFIG_FILE" 2>/dev/null || true
29
+ fi
30
+
31
+ if [ -f "$CONFIG_FILE" ]; then
32
+ source "$CONFIG_FILE" 2>/dev/null || true
33
+ fi
34
+
35
+ if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
36
+ log "错误: WebDAV配置不完整,请设置WEBDAV_URL, WEBDAV_USERNAME, WEBDAV_PASSWORD环境变量"
37
+ exit 1
38
+ fi
39
+
40
+ backup_db() {
41
+ log "开始备份数据库..."
42
+ if [ -d "$DB_PATH" ]; then
43
+ if [[ "$DB_PATH" == "/app/db" ]]; then
44
+ tar -czf "${BACKUP_PATH}/${BACKUP_FILENAME}" -C /app db
45
+ else
46
+ tar -czf "${BACKUP_PATH}/${BACKUP_FILENAME}" -C $(dirname "$DB_PATH") $(basename "$DB_PATH")
47
+ fi
48
+ log "数据库已备份到 ${BACKUP_PATH}/${BACKUP_FILENAME}"
49
+ return 0
50
+ else
51
+ log "警告: 数据库目录不存在"
52
+ return 1
53
+ fi
54
+ }
55
+
56
+ upload_to_webdav() {
57
+ log "开始上传备份到WebDAV (目标目录: ${REMOTE_BACKUP_DIR})..."
58
+
59
+ $PYTHON_CMD -c "
60
+ import webdav3.client as wc
61
+ import os
62
+
63
+ options = {
64
+ 'webdav_hostname': '$WEBDAV_URL',
65
+ 'webdav_login': '$WEBDAV_USERNAME',
66
+ 'webdav_password': '$WEBDAV_PASSWORD',
67
+ 'webdav_timeout': 30
68
+ }
69
+
70
+ client = wc.Client(options)
71
+
72
+ # 检查远程目录是否存在
73
+ if not client.check('$REMOTE_BACKUP_DIR'):
74
+ client.mkdir('$REMOTE_BACKUP_DIR')
75
+
76
+ # 上传文件
77
+ local_path = '${BACKUP_PATH}/${BACKUP_FILENAME}'
78
+ remote_path = '$REMOTE_BACKUP_DIR/${BACKUP_FILENAME}'
79
+
80
+ if os.path.exists(local_path):
81
+ try:
82
+ client.upload_sync(remote_path=remote_path, local_path=local_path)
83
+ print('上传成功')
84
+ except Exception as e:
85
+ print(f'上传失败: {e}')
86
+ else:
87
+ print('本地备份文件不存在')
88
+ "
89
+
90
+ if [ $? -eq 0 ]; then
91
+ log "备份已成功上传到WebDAV (${REMOTE_BACKUP_DIR}/${BACKUP_FILENAME})"
92
+ echo "LAST_SYNC=$(date +%s)" > "$CONFIG_FILE"
93
+ return 0
94
+ else
95
+ log "上传到WebDAV失败"
96
+ return 1
97
+ fi
98
+ }
99
+
100
+ download_from_webdav() {
101
+ log "开始从WebDAV下载备份 (源目录: ${REMOTE_BACKUP_DIR})..."
102
+
103
+ $PYTHON_CMD -c "
104
+ import webdav3.client as wc
105
+ import os
106
+
107
+ options = {
108
+ 'webdav_hostname': '$WEBDAV_URL',
109
+ 'webdav_login': '$WEBDAV_USERNAME',
110
+ 'webdav_password': '$WEBDAV_PASSWORD',
111
+ 'webdav_timeout': 30
112
+ }
113
+
114
+ client = wc.Client(options)
115
+
116
+ # 检查远程文件是否存在
117
+ remote_path = '$REMOTE_BACKUP_DIR/${BACKUP_FILENAME}'
118
+ local_path = '${BACKUP_PATH}/${BACKUP_FILENAME}'
119
+
120
+ if client.check(remote_path):
121
+ try:
122
+ client.download_sync(remote_path=remote_path, local_path=local_path)
123
+ print('下载成功')
124
+ except Exception as e:
125
+ print(f'下载失败: {e}')
126
+ else:
127
+ print('远程备份文件不存在')
128
+ "
129
+
130
+ if [ $? -eq 0 ]; then
131
+ log "备份已成功从WebDAV (${REMOTE_BACKUP_DIR}/${BACKUP_FILENAME}) 下载"
132
+ return 0
133
+ else
134
+ log "从WebDAV下载备份失败"
135
+ return 1
136
+ fi
137
+ }
138
+
139
+ restore_db() {
140
+ log "开始恢复数据库到 ${DB_PATH}..."
141
+
142
+ if [ -f "${BACKUP_PATH}/${BACKUP_FILENAME}" ]; then
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 "错误: 备份文件不存在,无法恢复数据���"
169
+ return 1
170
+ fi
171
+ }
172
+
173
+ case "$1" in
174
+ backup)
175
+ backup_db && upload_to_webdav
176
+ ;;
177
+ restore)
178
+ download_from_webdav && restore_db
179
+ ;;
180
+ sync)
181
+ current_time=$(date +%s)
182
+ download_from_webdav
183
+
184
+ if { [ ! -d "$DB_PATH" ] || [ ! "$(ls -A $DB_PATH 2>/dev/null)" ]; } && [ -f "${BACKUP_PATH}/${BACKUP_FILENAME}" ]; then
185
+ log "检测到本地数据库不存在或为空,开始恢复..."
186
+ restore_db
187
+ fi
188
+
189
+ backup_db && upload_to_webdav
190
+ ;;
191
+ *)
192
+ echo "用法: $0 {backup|restore|sync}"
193
+ echo " backup - 备份数据库并上传到WebDAV"
194
+ echo " restore - 从WebDAV下载备份并恢复数据库"
195
+ echo " sync - 同步数据库(双向)"
196
+ exit 1
197
+ ;;
198
+ esac
199
+
200
+ exit 0