学生资料设置、头像与自动备份恢复。
首页卡片支持修改/删除;详情页设置 Tab 可维护学校、年级与头像;系统设置新增数据备份下载与恢复;备份默认存 /root/grade-archive-backups,详见 docs/BACKUP.md。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+25
-7
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user