学生资料设置、头像与自动备份恢复。

首页卡片支持修改/删除;详情页设置 Tab 可维护学校、年级与头像;系统设置新增数据备份下载与恢复;备份默认存 /root/grade-archive-backups,详见 docs/BACKUP.md。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-28 17:56:09 +08:00
parent 1cb3c7fad5
commit 530a8b70a1
25 changed files with 1230 additions and 194 deletions
+25 -7
View File
@@ -1,9 +1,17 @@
#!/usr/bin/env bash
# 中学成绩档案 — 数据备份(数据库 + uploads,统一 tar.gz
set -euo pipefail
INSTALL_DIR="${INSTALL_DIR:-/opt/secondary-school-grade-archive}"
BACKUP_DIR="${BACKUP_DIR:-${INSTALL_DIR}/backups}"
BACKUP_DIR="${BACKUP_DIR:-/root/grade-archive-backups}"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
ARCHIVE="${BACKUP_DIR}/grade-archive_${TIMESTAMP}.tar.gz"
WORK=$(mktemp -d)
cleanup() {
rm -rf "${WORK}"
}
trap cleanup EXIT
cd "${INSTALL_DIR}"
# shellcheck disable=SC1090
@@ -12,11 +20,21 @@ mkdir -p "${BACKUP_DIR}"
echo "[INFO] 备份数据库…"
PGPASSWORD="${POSTGRES_PASSWORD}" pg_dump -h 127.0.0.1 -U "${POSTGRES_USER}" "${POSTGRES_DB}" \
> "${BACKUP_DIR}/db_${TIMESTAMP}.sql"
--no-owner --no-privileges --clean --if-exists \
> "${WORK}/database.sql"
echo "[INFO] 备份 uploads…"
tar -czf "${BACKUP_DIR}/uploads_${TIMESTAMP}.tar.gz" -C "${INSTALL_DIR}" uploads/
cat > "${WORK}/manifest.json" <<EOF
{
"app": "secondary-school-grade-archive",
"created_at": "$(date -Iseconds)",
"database": "${POSTGRES_DB}"
}
EOF
echo "[INFO] 完成:"
echo " ${BACKUP_DIR}/db_${TIMESTAMP}.sql"
echo " ${BACKUP_DIR}/uploads_${TIMESTAMP}.tar.gz"
echo "[INFO] 打包 uploads…"
tar -czf "${ARCHIVE}" -C "${WORK}" database.sql manifest.json -C "${INSTALL_DIR}" uploads/
echo "[INFO] 完成: ${ARCHIVE}"
# 清理 30 天前的备份
find "${BACKUP_DIR}" -name 'grade-archive_*.tar.gz' -mtime +30 -delete 2>/dev/null || true