51 lines
2.1 KiB
Bash
51 lines
2.1 KiB
Bash
#!/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 "$@"
|