hequ commited on
Commit
8783c2d
·
verified ·
1 Parent(s): 753e568

Update docker-entrypoint.sh

Browse files
Files changed (1) hide show
  1. docker-entrypoint.sh +65 -16
docker-entrypoint.sh CHANGED
@@ -6,8 +6,38 @@ set -e
6
  TS() { date "+%Y-%m-%d %H:%M:%S"; }
7
  log() { echo "[$(TS)] [entrypoint] $*"; }
8
 
 
 
 
9
  mkdir -p /app/logs /app/data /app/temp
 
 
 
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  REDIS_HOST="${REDIS_HOST:-127.0.0.1}"
12
  REDIS_PORT="${REDIS_PORT:-6379}"
13
 
@@ -19,17 +49,28 @@ esac
19
  if [ "$start_internal_redis" = "true" ]; then
20
  log "Starting embedded Redis on 127.0.0.1:${REDIS_PORT} ..."
21
  if [ -n "${REDIS_PASSWORD:-}" ]; then
22
- redis-server --port "${REDIS_PORT}" --bind 127.0.0.1 \
23
- --appendonly yes --appendfsync everysec --save 60 1 \
 
 
 
 
 
24
  --requirepass "${REDIS_PASSWORD}" &
25
  else
26
- redis-server --port "${REDIS_PORT}" --bind 127.0.0.1 \
27
- --appendonly yes --appendfsync everysec --save 60 1 &
 
 
 
 
 
28
  fi
29
  else
30
  log "Using EXTERNAL Redis at ${REDIS_HOST}:${REDIS_PORT}, skip embedded Redis."
31
  fi
32
 
 
33
  log "Waiting for Redis on ${REDIS_HOST}:${REDIS_PORT} ..."
34
  i=0
35
  while :; do
@@ -51,34 +92,42 @@ while :; do
51
  done
52
  log "Redis is ready."
53
 
54
- HF_TOKEN="${HF_TOKEN:-}"
55
- DATASET_ID="${DATASET_ID:-}"
56
-
57
- # 显式导出给子进程(备份脚本需要)
58
- export HF_TOKEN DATASET_ID
59
- export SYNC_INTERVAL MAX_BACKUPS BACKUP_PREFIX BACKUP_PATHS BACKUP_EXCLUDE
60
-
61
  if [ -n "$HF_TOKEN" ] && [ -n "$DATASET_ID" ]; then
62
- /app/tools/hf-backup.sh restore || log "Restore skipped/failed, continue."
63
- /app/tools/hf-backup.sh daemon >/app/logs/hf-backup.log 2>&1 &
 
 
 
64
  log "启动 HF Dataset 备份服务(间隔 ${SYNC_INTERVAL:-3600}s,保留 ${MAX_BACKUPS:-10} 份)"
65
  else
66
- log "未配置 HF_TOKEN/DATASET_ID,跳过备份/恢复。"
67
  fi
68
 
 
 
 
69
  if [ "${FORCE_ADMIN_RESET:-false}" = "true" ]; then
70
  log "FORCE_ADMIN_RESET=true, remove /app/data/init.json"
71
  rm -f /app/data/init.json
72
  fi
73
 
 
 
 
74
  if [ -n "${ADMIN_USERNAME:-}" ] && [ -n "${ADMIN_PASSWORD:-}" ]; then
75
  log "Bootstrapping admin user: ${ADMIN_USERNAME}"
76
  else
77
  log "ADMIN_USERNAME/ADMIN_PASSWORD 未设置,将按已有 init.json 或默认逻辑处理。"
78
  fi
79
-
80
- # 你的应用启动流程(保持和你项目一致)
81
  npm run setup
 
 
 
 
82
  HOST="${HOST:-0.0.0.0}"
83
  PORT="${PORT:-7860}"
84
  log "Starting app on ${HOST}:${PORT} ..."
 
6
  TS() { date "+%Y-%m-%d %H:%M:%S"; }
7
  log() { echo "[$(TS)] [entrypoint] $*"; }
8
 
9
+ # -----------------------------------------------------------------------------
10
+ # 基础目录
11
+ # -----------------------------------------------------------------------------
12
  mkdir -p /app/logs /app/data /app/temp
13
+ # Redis 数据目录放在 /app/data/redis,这样能随备份一起保存/恢复
14
+ REDIS_DIR="${REDIS_DIR:-/app/data/redis}"
15
+ mkdir -p "${REDIS_DIR}"
16
 
17
+ # -----------------------------------------------------------------------------
18
+ # 导出备份相关环境变量(给子进程可见)
19
+ # -----------------------------------------------------------------------------
20
+ export HF_TOKEN="${HF_TOKEN:-}"
21
+ export DATASET_ID="${DATASET_ID:-}"
22
+ export SYNC_INTERVAL MAX_BACKUPS BACKUP_PREFIX BACKUP_PATHS BACKUP_EXCLUDE
23
+
24
+ # 若未指定,给出对持久化友好的默认值(相对路径,配合 tar -C /)
25
+ BACKUP_PATHS="${BACKUP_PATHS:-app/data,app/data/redis}"
26
+ BACKUP_EXCLUDE="${BACKUP_EXCLUDE:-*.tmp,*.cache,**/.DS_Store}"
27
+ export BACKUP_PATHS BACKUP_EXCLUDE
28
+
29
+ # -----------------------------------------------------------------------------
30
+ # 在任何服务启动前先尝试恢复数据(包含 Redis 的 RDB/AOF)
31
+ # -----------------------------------------------------------------------------
32
+ if [ -n "$HF_TOKEN" ] && [ -n "$DATASET_ID" ]; then
33
+ /app/tools/hf-backup.sh restore || log "Restore skipped/failed, continue."
34
+ else
35
+ log "未配置 HF_TOKEN/DATASET_ID,跳过恢复。"
36
+ fi
37
+
38
+ # -----------------------------------------------------------------------------
39
+ # 启动(内置或外置)Redis
40
+ # -----------------------------------------------------------------------------
41
  REDIS_HOST="${REDIS_HOST:-127.0.0.1}"
42
  REDIS_PORT="${REDIS_PORT:-6379}"
43
 
 
49
  if [ "$start_internal_redis" = "true" ]; then
50
  log "Starting embedded Redis on 127.0.0.1:${REDIS_PORT} ..."
51
  if [ -n "${REDIS_PASSWORD:-}" ]; then
52
+ redis-server \
53
+ --port "${REDIS_PORT}" --bind 127.0.0.1 \
54
+ --dir "${REDIS_DIR}" \
55
+ --dbfilename dump.rdb \
56
+ --appendonly yes --appendfilename appendonly.aof \
57
+ --appendfsync everysec \
58
+ --save 60 1 \
59
  --requirepass "${REDIS_PASSWORD}" &
60
  else
61
+ redis-server \
62
+ --port "${REDIS_PORT}" --bind 127.0.0.1 \
63
+ --dir "${REDIS_DIR}" \
64
+ --dbfilename dump.rdb \
65
+ --appendonly yes --appendfilename appendonly.aof \
66
+ --appendfsync everysec \
67
+ --save 60 1 &
68
  fi
69
  else
70
  log "Using EXTERNAL Redis at ${REDIS_HOST}:${REDIS_PORT}, skip embedded Redis."
71
  fi
72
 
73
+ # 等待 Redis 就绪
74
  log "Waiting for Redis on ${REDIS_HOST}:${REDIS_PORT} ..."
75
  i=0
76
  while :; do
 
92
  done
93
  log "Redis is ready."
94
 
95
+ # -----------------------------------------------------------------------------
96
+ # 备份守护进程(可选:开机先做一份一次性备份)
97
+ # BACKUP_ON_START=true 时,先执行一次上传,随后开启守护
98
+ # -----------------------------------------------------------------------------
 
 
 
99
  if [ -n "$HF_TOKEN" ] && [ -n "$DATASET_ID" ]; then
100
+ if [ "${BACKUP_ON_START:-false}" = "true" ]; then
101
+ /app/tools/hf-backup.sh once || log "First backup failed (ignored)."
102
+ fi
103
+ # 同时输出到控制台和日志文件,便于在 HF 控制台直接看到
104
+ /app/tools/hf-backup.sh daemon 2>&1 | tee -a /app/logs/hf-backup.log &
105
  log "启动 HF Dataset 备份服务(间隔 ${SYNC_INTERVAL:-3600}s,保留 ${MAX_BACKUPS:-10} 份)"
106
  else
107
+ log "未配置 HF_TOKEN/DATASET_ID,跳过备份守护进程。"
108
  fi
109
 
110
+ # -----------------------------------------------------------------------------
111
+ # 可选:强制重置管理员(会删除 init.json)
112
+ # -----------------------------------------------------------------------------
113
  if [ "${FORCE_ADMIN_RESET:-false}" = "true" ]; then
114
  log "FORCE_ADMIN_RESET=true, remove /app/data/init.json"
115
  rm -f /app/data/init.json
116
  fi
117
 
118
+ # -----------------------------------------------------------------------------
119
+ # 初始化管理员 / 应用准备
120
+ # -----------------------------------------------------------------------------
121
  if [ -n "${ADMIN_USERNAME:-}" ] && [ -n "${ADMIN_PASSWORD:-}" ]; then
122
  log "Bootstrapping admin user: ${ADMIN_USERNAME}"
123
  else
124
  log "ADMIN_USERNAME/ADMIN_PASSWORD 未设置,将按已有 init.json 或默认逻辑处理。"
125
  fi
 
 
126
  npm run setup
127
+
128
+ # -----------------------------------------------------------------------------
129
+ # 启动应用
130
+ # -----------------------------------------------------------------------------
131
  HOST="${HOST:-0.0.0.0}"
132
  PORT="${PORT:-7860}"
133
  log "Starting app on ${HOST}:${PORT} ..."