|
|
#!/bin/sh |
|
|
|
|
|
|
|
|
set -e |
|
|
|
|
|
TS() { date "+%Y-%m-%d %H:%M:%S"; } |
|
|
log() { echo "[$(TS)] [entrypoint] $*"; } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mkdir -p /app/logs /app/data /app/temp |
|
|
|
|
|
REDIS_DIR="${REDIS_DIR:-/app/data/redis}" |
|
|
mkdir -p "${REDIS_DIR}" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export HF_TOKEN="${HF_TOKEN:-}" |
|
|
export DATASET_ID="${DATASET_ID:-}" |
|
|
export SYNC_INTERVAL MAX_BACKUPS BACKUP_PREFIX BACKUP_PATHS BACKUP_EXCLUDE |
|
|
|
|
|
|
|
|
BACKUP_PATHS="${BACKUP_PATHS:-app/data,app/data/redis}" |
|
|
BACKUP_EXCLUDE="${BACKUP_EXCLUDE:-*.tmp,*.cache,**/.DS_Store}" |
|
|
export BACKUP_PATHS BACKUP_EXCLUDE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ -n "$HF_TOKEN" ] && [ -n "$DATASET_ID" ]; then |
|
|
/app/tools/hf-backup.sh restore || log "Restore skipped/failed, continue." |
|
|
else |
|
|
log "未配置 HF_TOKEN/DATASET_ID,跳过恢复。" |
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
REDIS_HOST="${REDIS_HOST:-127.0.0.1}" |
|
|
REDIS_PORT="${REDIS_PORT:-6379}" |
|
|
|
|
|
start_internal_redis="false" |
|
|
case "$REDIS_HOST" in |
|
|
""|"127.0.0.1"|"localhost") start_internal_redis="true" ;; |
|
|
esac |
|
|
|
|
|
if [ "$start_internal_redis" = "true" ]; then |
|
|
log "Starting embedded Redis on 127.0.0.1:${REDIS_PORT} ..." |
|
|
if [ -n "${REDIS_PASSWORD:-}" ]; then |
|
|
redis-server \ |
|
|
--port "${REDIS_PORT}" --bind 127.0.0.1 \ |
|
|
--dir "${REDIS_DIR}" \ |
|
|
--dbfilename dump.rdb \ |
|
|
--appendonly yes --appendfilename appendonly.aof \ |
|
|
--appendfsync everysec \ |
|
|
--save 60 1 \ |
|
|
--requirepass "${REDIS_PASSWORD}" & |
|
|
else |
|
|
redis-server \ |
|
|
--port "${REDIS_PORT}" --bind 127.0.0.1 \ |
|
|
--dir "${REDIS_DIR}" \ |
|
|
--dbfilename dump.rdb \ |
|
|
--appendonly yes --appendfilename appendonly.aof \ |
|
|
--appendfsync everysec \ |
|
|
--save 60 1 & |
|
|
fi |
|
|
else |
|
|
log "Using EXTERNAL Redis at ${REDIS_HOST}:${REDIS_PORT}, skip embedded Redis." |
|
|
fi |
|
|
|
|
|
|
|
|
log "Waiting for Redis on ${REDIS_HOST}:${REDIS_PORT} ..." |
|
|
i=0 |
|
|
while :; do |
|
|
if [ -n "${REDIS_PASSWORD:-}" ]; then |
|
|
if redis-cli -h "${REDIS_HOST}" -p "${REDIS_PORT}" -a "${REDIS_PASSWORD}" ping >/dev/null 2>&1; then |
|
|
break |
|
|
fi |
|
|
else |
|
|
if redis-cli -h "${REDIS_HOST}" -p "${REDIS_PORT}" ping >/dev/null 2>&1; then |
|
|
break |
|
|
fi |
|
|
fi |
|
|
i=$((i+1)) |
|
|
if [ "$i" -ge 60 ]; then |
|
|
log "Redis not ready after 60s, exit." |
|
|
exit 1 |
|
|
fi |
|
|
sleep 1 |
|
|
done |
|
|
log "Redis is ready." |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ -n "$HF_TOKEN" ] && [ -n "$DATASET_ID" ]; then |
|
|
if [ "${BACKUP_ON_START:-false}" = "true" ]; then |
|
|
/app/tools/hf-backup.sh once || log "First backup failed (ignored)." |
|
|
fi |
|
|
|
|
|
/app/tools/hf-backup.sh daemon 2>&1 | tee -a /app/logs/hf-backup.log & |
|
|
log "启动 HF Dataset 备份服务(间隔 ${SYNC_INTERVAL:-3600}s,保留 ${MAX_BACKUPS:-10} 份)" |
|
|
else |
|
|
log "未配置 HF_TOKEN/DATASET_ID,跳过备份守护进程。" |
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ "${FORCE_ADMIN_RESET:-false}" = "true" ]; then |
|
|
log "FORCE_ADMIN_RESET=true, remove /app/data/init.json" |
|
|
rm -f /app/data/init.json |
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ -n "${ADMIN_USERNAME:-}" ] && [ -n "${ADMIN_PASSWORD:-}" ]; then |
|
|
log "Bootstrapping admin user: ${ADMIN_USERNAME}" |
|
|
else |
|
|
log "ADMIN_USERNAME/ADMIN_PASSWORD 未设置,将按已有 init.json 或默认逻辑处理。" |
|
|
fi |
|
|
npm run setup |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HOST="${HOST:-0.0.0.0}" |
|
|
PORT="${PORT:-7860}" |
|
|
log "Starting app on ${HOST}:${PORT} ..." |
|
|
exec node src/app.js |
|
|
|