hequ commited on
Commit
5bfb40b
·
verified ·
1 Parent(s): d85e519

Update docker-entrypoint.sh

Browse files
Files changed (1) hide show
  1. docker-entrypoint.sh +65 -93
docker-entrypoint.sh CHANGED
@@ -1,109 +1,81 @@
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 "$@"
 
 
 
1
+ #!/bin/sh
2
+ # shellcheck shell=sh
3
 
4
+ set -e
 
5
 
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
 
14
+ start_internal_redis="false"
15
+ case "$REDIS_HOST" in
16
+ ""|"127.0.0.1"|"localhost") start_internal_redis="true" ;;
17
+ esac
 
 
 
 
 
18
 
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
36
+ if [ -n "${REDIS_PASSWORD:-}" ]; then
37
+ if redis-cli -h "${REDIS_HOST}" -p "${REDIS_PORT}" -a "${REDIS_PASSWORD}" ping >/dev/null 2>&1; then
38
+ break
 
 
 
 
 
39
  fi
40
  else
41
+ if redis-cli -h "${REDIS_HOST}" -p "${REDIS_PORT}" ping >/dev/null 2>&1; then
42
+ break
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  fi
 
 
44
  fi
45
+ i=$((i+1))
46
+ if [ "$i" -ge 60 ]; then
47
+ log "Redis not ready after 60s, exit."
48
+ exit 1
 
 
 
 
49
  fi
50
+ sleep 1
51
+ done
52
+ log "Redis is ready."
53
+
54
+ HF_TOKEN="${HF_TOKEN:-}"
55
+ DATASET_ID="${DATASET_ID:-}"
56
+
57
+ if [ -n "$HF_TOKEN" ] && [ -n "$DATASET_ID" ]; then
58
+ export HF_TOKEN DATASET_ID
59
+ /app/tools/hf-backup.sh restore || log "Restore skipped/failed, continue."
60
+ /app/tools/hf-backup.sh daemon >/app/logs/hf-backup.log 2>&1 &
61
+ log "启动 HF Dataset 备份服务(间隔 ${SYNC_INTERVAL:-3600}s,保留 ${MAX_BACKUPS:-10} 份)"
62
+ else
63
+ log "未配置 HF_TOKEN/DATASET_ID,跳过备份/恢复。"
64
+ fi
65
+
66
+ if [ "${FORCE_ADMIN_RESET:-false}" = "true" ]; then
67
+ log "FORCE_ADMIN_RESET=true, remove /app/data/init.json"
68
+ rm -f /app/data/init.json
69
+ fi
70
 
71
+ if [ -n "${ADMIN_USERNAME:-}" ] && [ -n "${ADMIN_PASSWORD:-}" ]; then
72
+ log "Bootstrapping admin user: ${ADMIN_USERNAME}"
73
+ else
74
+ log "ADMIN_USERNAME/ADMIN_PASSWORD 未设置,将按已有 init.json 或默认逻辑处理。"
75
+ fi
76
+ npm run setup
77
 
78
+ HOST="${HOST:-0.0.0.0}"
79
+ PORT="${PORT:-7860}"
80
+ log "Starting app on ${HOST}:${PORT} ..."
81
+ exec node src/app.js