Update docker-entrypoint.sh
Browse files- 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
|
| 23 |
-
--
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
--requirepass "${REDIS_PASSWORD}" &
|
| 25 |
else
|
| 26 |
-
redis-server
|
| 27 |
-
--
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 55 |
-
|
| 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 |
-
|
| 63 |
-
|
|
|
|
|
|
|
|
|
|
| 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} ..."
|