#!/bin/sh # rdgen 容器启动入口:修正挂载卷属主 -> 数据库迁移 -> 可选创建初始管理员 -> 降权启动 set -e DATA_DIRS="/opt/rdgen/exe /opt/rdgen/png /opt/rdgen/temp_zips /opt/rdgen/data" # 以 root 启动时,把宿主机挂载进来的数据目录属主改为运行用户 for d in $DATA_DIRS; do if [ -d "$d" ]; then chown -R appuser:appuser "$d" 2>/dev/null || true fi done # 数据库迁移(SQLite 文件位于持久化的 data 目录) # 迁移前先冷拷贝一份兜底(防迁移异常),存放在 data/backups; # 轮转策略统一由维护进程按后台「保留份数」设置处理,这里不删除旧备份。 DB_FILE="/opt/rdgen/data/db.sqlite3" BACKUP_DIR="/opt/rdgen/data/backups" if [ -f "$DB_FILE" ]; then mkdir -p "$BACKUP_DIR" cp "$DB_FILE" "$BACKUP_DIR/db-$(date +%Y%m%d-%H%M%S).sqlite3" 2>/dev/null || true fi su-exec appuser python manage.py migrate --noinput # 启动定时维护守护进程(清理过期构建任务/临时文件、每日备份数据库)。 # 单实例后台常驻,每小时醒来检查一次;日志写入持久化数据卷。 su-exec appuser sh -c 'python manage.py maintenance --loop >> /opt/rdgen/data/maintenance.log 2>&1 &' # 可选:首次启动时自动创建超级管理员(已存在同名用户则跳过) if [ -n "$DJANGO_SUPERUSER_USERNAME" ] && [ -n "$DJANGO_SUPERUSER_PASSWORD" ]; then export DJANGO_SUPERUSER_USERNAME DJANGO_SUPERUSER_PASSWORD DJANGO_SUPERUSER_EMAIL su-exec appuser python manage.py shell <<'PY' import os from django.contrib.auth import get_user_model User = get_user_model() name = os.environ.get("DJANGO_SUPERUSER_USERNAME") password = os.environ.get("DJANGO_SUPERUSER_PASSWORD") email = os.environ.get("DJANGO_SUPERUSER_EMAIL", "") if name and password and not User.objects.filter(username=name).exists(): User.objects.create_superuser(username=name, email=email, password=password) print(f"[rdgen] 已创建初始管理员账号:{name}") else: print("[rdgen] 管理员账号已存在或未配置,跳过创建") PY fi # 降权运行业务进程 exec su-exec appuser "$@"