hequ commited on
Commit
d85e519
·
verified ·
1 Parent(s): 6326a97

Update docker-entrypoint.sh

Browse files
Files changed (1) hide show
  1. docker-entrypoint.sh +104 -34
docker-entrypoint.sh CHANGED
@@ -1,39 +1,109 @@
1
  #!/usr/bin/env sh
2
- set -euo pipefail
3
-
4
- export HOST="${HOST:-0.0.0.0}"
5
- export PORT="${PORT:-7860}"
6
-
7
- mkdir -p /data/logs /data/data
8
- if [ ! -L /app/logs ]; then
9
- rm -rf /app/logs && ln -s /data/logs /app/logs
10
- fi
11
- if [ ! -L /app/data ]; then
12
- rm -rf /app/data && ln -s /data/data /app/data
13
- fi
14
-
15
- export REDIS_HOST="${REDIS_HOST:-127.0.0.1}"
16
- export REDIS_PORT="${REDIS_PORT:-6379}"
17
- export REDIS_PASSWORD="${REDIS_PASSWORD:-}"
18
-
19
- redis-server --bind 127.0.0.1 --port "${REDIS_PORT}" \
20
- --save 60 1 --appendonly yes --appendfsync everysec &
21
-
22
- echo "[entrypoint] Waiting for Redis on ${REDIS_HOST}:${REDIS_PORT} ..."
23
- for i in $(seq 1 60); do
24
- if redis-cli -h "${REDIS_HOST}" -p "${REDIS_PORT}" ping >/dev/null 2>&1; then
25
- echo "[entrypoint] Redis is ready."
26
- break
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  fi
28
- sleep 0.5
29
- done
30
 
31
- if [ -n "${HF_TOKEN:-}" ] && [ -n "${DATASET_ID:-}" ]; then
32
- echo "[entrypoint] 启动 HF Dataset 备份服务(间隔 ${SYNC_INTERVAL:-3600}s,保留 ${MAX_BACKUPS:-10} 份)"
33
- /bin/sh /app/tools/hf-backup.sh > /app/logs/hf-backup.log 2>&1 &
34
- else
35
- echo "[entrypoint] 未设置 HF_TOKEN/DATASET_ID,跳过备份服务"
36
- fi
37
 
38
- echo "[entrypoint] Starting app on 0.0.0.0:${PORT} ..."
39
  exec "$@"
 
1
  #!/usr/bin/env sh
2
+ set -eu
3
+
4
+ log() { printf '%s %s\n' "$(date '+[%Y-%m-%d %H:%M:%S]')" "$*"; }
5
+ die() { log "FATAL: $*"; exit 1; }
6
+
7
+ APP_DIR="/app"
8
+ LOG_DIR="$APP_DIR/logs"
9
+ DATA_DIR="$APP_DIR/data"
10
+ TMP_DIR="$APP_DIR/temp"
11
+ mkdir -p "$LOG_DIR" "$DATA_DIR" "$TMP_DIR"
12
+
13
+ : "${HOST:=0.0.0.0}"
14
+ : "${PORT:=7860}"
15
+ : "${EMBEDDED_REDIS:=1}" # 设为 0 可关闭容器内置 Redis(改用外部 Redis)
16
+ : "${REDIS_HOST:=127.0.0.1}"
17
+ : "${REDIS_PORT:=6379}"
18
+ : "${SYNC_INTERVAL:=3600}"
19
+ : "${MAX_BACKUPS:=10}"
20
+ : "${BACKUP_PATHS:=/app/data}" # 备份路径,逗号分隔
21
+ : "${JWT_SECRET:=}"
22
+ : "${ENCRYPTION_KEY:=}"
23
+
24
+ REDIS_PID=""
25
+ BACKUP_PID=""
26
+ cleanup() {
27
+ log "[entrypoint] Caught signal, shutting down..."
28
+ [ -n "$BACKUP_PID" ] && kill "$BACKUP_PID" 2>/dev/null || true
29
+ if [ -n "$REDIS_PID" ]; then
30
+ redis-cli ${REDIS_PASSWORD:+-a "$REDIS_PASSWORD"} -h 127.0.0.1 -p "$REDIS_PORT" shutdown 2>/dev/null || true
31
+ fi
32
+ }
33
+ trap cleanup INT TERM
34
+
35
+ start_redis() {
36
+ if [ "$EMBEDDED_REDIS" = "1" ]; then
37
+ log "[entrypoint] Waiting for Redis on 127.0.0.1:${REDIS_PORT} ..."
38
+ ARGS="--port ${REDIS_PORT} --bind 127.0.0.1 --save 60 1 --appendonly yes --appendfsync everysec"
39
+ if [ -n "${REDIS_PASSWORD:-}" ]; then
40
+ ARGS="$ARGS --requirepass ${REDIS_PASSWORD}"
41
+ fi
42
+ redis-server $ARGS --daemonize yes
43
+ REDIS_PID="$(pgrep -xo redis-server || true)"
44
+
45
+ # 等待就绪
46
+ i=0
47
+ until redis-cli ${REDIS_PASSWORD:+-a "$REDIS_PASSWORD"} -h 127.0.0.1 -p "$REDIS_PORT" ping >/dev/null 2>&1; do
48
+ i=$((i+1)); [ "$i" -gt 60 ] && die "Redis failed to start in time"
49
+ sleep 1
50
+ done
51
+ log "[entrypoint] Redis is ready."
52
+ else
53
+ log "[entrypoint] EMBEDDED_REDIS=0, skip internal Redis."
54
+ fi
55
+ }
56
+
57
+ bootstrap_admin() {
58
+ if [ -n "${ADMIN_USERNAME:-}" ] && [ -n "${ADMIN_PASSWORD:-}" ]; then
59
+ if [ ! -f "$DATA_DIR/.admin_bootstrapped" ]; then
60
+ log "[entrypoint] Bootstrapping admin user: ${ADMIN_USERNAME}"
61
+ ADMIN_USERNAME="${ADMIN_USERNAME}" \
62
+ ADMIN_PASSWORD="${ADMIN_PASSWORD}" \
63
+ npm run setup || log "[entrypoint] WARN: npm run setup returned non-zero (may already exist)"
64
+ touch "$DATA_DIR/.admin_bootstrapped"
65
+ log "[entrypoint] Admin bootstrap done."
66
+ else
67
+ log "[entrypoint] Admin already bootstrapped, skip."
68
+ fi
69
+ else
70
+ log "[entrypoint] ADMIN_USERNAME / ADMIN_PASSWORD not set, skip admin bootstrap."
71
+ fi
72
+ }
73
+
74
+ start_hf_backup() {
75
+ if [ -n "${HF_TOKEN:-}" ] && [ -n "${DATASET_ID:-}" ]; then
76
+ if [ -x "$APP_DIR/tools/hf-backup.sh" ]; then
77
+ log "[entrypoint] 启动 HF Dataset 备份服务(间隔 ${SYNC_INTERVAL}s,保留 ${MAX_BACKUPS} 份)"
78
+ # 以后台守护方式运行,日志写入文件
79
+ HF_TOKEN="$HF_TOKEN" \
80
+ DATASET_ID="$DATASET_ID" \
81
+ SYNC_INTERVAL="$SYNC_INTERVAL" \
82
+ MAX_BACKUPS="$MAX_BACKUPS" \
83
+ BACKUP_PATHS="$BACKUP_PATHS" \
84
+ nohup "$APP_DIR/tools/hf-backup.sh" >>"$LOG_DIR/hf-backup.log" 2>&1 &
85
+ BACKUP_PID="$!"
86
+ else
87
+ log "[entrypoint] WARN: tools/hf-backup.sh 不存在或不可执行,跳过备份。"
88
+ fi
89
+ else
90
+ log "[entrypoint] 未配置 HF_TOKEN 或 DATASET_ID,跳过备份。"
91
+ fi
92
+ }
93
+
94
+ check_secrets() {
95
+ if [ -z "$JWT_SECRET" ] || [ "${#JWT_SECRET}" -lt 32 ]; then
96
+ log "[entrypoint] WARN: JWT_SECRET 未设置或长度 < 32,建议设置一个 32+ 位随机字符串。"
97
+ fi
98
+ if [ -z "$ENCRYPTION_KEY" ] || [ "${#ENCRYPTION_KEY}" -ne 32 ]; then
99
+ log "[entrypoint] WARN: ENCRYPTION_KEY 未设置或长度不是 32,建议设置为 32 位随机字符串(AES-256 密钥)。"
100
  fi
101
+ }
 
102
 
103
+ check_secrets
104
+ start_redis
105
+ bootstrap_admin
106
+ start_hf_backup
 
 
107
 
108
+ log "[entrypoint] Starting app on ${HOST}:${PORT} ..."
109
  exec "$@"