feat: 新增备份恢复与公网加固
- 新增备份管理页与 API:在线快照、自动周期备份、按份数清理、下载、一键恢复(恢复前自动兜底) - 新增 /profile/export,普通用户可导出本人全部数据(不含 Cookie 明文) - 修复 X-Forwarded-For 可伪造导致三道 IP 防线失效,统一走 client_ip() 取客户端地址 - 取消 admin123 硬编码默认口令,留空则生成随机初始口令并仅打印一次 - .dockerignore 排除 backups/ 并加构建期断言,防止密钥随镜像分发 - 新增会话版本号,改密/停用/删除及恢复备份后其他会话立即失效 - 新增容器资源上限、采集跨度硬顶 31 天、重操作最小间隔与并发 409 - 新增访问日志、HSTS 条件下发、口令黑名单、验证码抗模板匹配、instance.json 0600 - 版本号升至 1.4.0,同步更新 README、SECURITY、.env.example 与 compose 配置
这个提交包含在:
@@ -85,6 +85,7 @@ CREATE TABLE IF NOT EXISTS users (
|
||||
email TEXT,
|
||||
is_admin INTEGER NOT NULL DEFAULT 0,
|
||||
status TEXT NOT NULL DEFAULT 'active', -- active | disabled
|
||||
session_ver INTEGER NOT NULL DEFAULT 0, -- 会话版本:改密/重置/停用 +1,旧会话立即失效
|
||||
created_at TEXT,
|
||||
register_ip TEXT, -- 自助注册来源,用于每日限额
|
||||
last_login_at TEXT,
|
||||
@@ -119,3 +120,25 @@ CREATE TABLE IF NOT EXISTS captchas (
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_captcha_expires ON captchas(expires_at);
|
||||
|
||||
-- ---------------- 备份索引 ----------------
|
||||
-- 表里只放「元数据」,备份文件本身在 config.BACKUP_DIR(**不在** data/ 卷里,
|
||||
-- 免得 `docker compose down -v` 把正本和备份一起删掉)。
|
||||
-- 刻意不记录备份内容、也不记录任何凭证 —— 这里只是一份可下载清单。
|
||||
CREATE TABLE IF NOT EXISTS backups (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
filename TEXT NOT NULL UNIQUE, -- 备份目录内的文件名(不含路径)
|
||||
bytes INTEGER NOT NULL DEFAULT 0, -- 归档大小
|
||||
sha256 TEXT NOT NULL DEFAULT '', -- 归档整体校验值(前 64 位十六进制)
|
||||
created_at TEXT NOT NULL,
|
||||
trigger TEXT NOT NULL DEFAULT 'manual', -- manual | auto | cli | pre-restore
|
||||
actor TEXT, -- 触发者用户名(自动备份为 system)
|
||||
schema_ver INTEGER NOT NULL DEFAULT 0, -- 归档时的 user_version
|
||||
records INTEGER NOT NULL DEFAULT 0, -- 归档时的记录条数(便于挑一份恢复)
|
||||
credits REAL NOT NULL DEFAULT 0,
|
||||
users INTEGER NOT NULL DEFAULT 0,
|
||||
note TEXT, -- 备注 / 恢复来源
|
||||
missing INTEGER NOT NULL DEFAULT 0 -- 1 = 文件已不在磁盘上(手工删过)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_backups_at ON backups(created_at DESC);
|
||||
|
||||
在新工单中引用
屏蔽一个用户