Skip to content

feat(server): 图片配额与 TTL、好友无向唯一、S3 兼容冷备 - #2

Merged
cursor[bot] merged 1 commit into
mainfrom
cursor/media-quota-backup-3f48
Sep 17, 2026
Merged

cursor[bot] merged 1 commit into
mainfrom
cursor/media-quota-backup-3f48

Conversation

@aocac

@aocac aocac commented Sep 17, 2026

Copy link
Copy Markdown
Owner

每用户图片默认 64MB 上限,未引用的图 14 天后清理;好友表加上无向唯一索引,反向并发申请会自动互加。每日 dump 在填齐 BACKUP_S3_* 后可再推一份到 S3/COS/OSS/MinIO,失败不影响本地备份。

做了什么

  • 图片配额:POST /api/media 按 owner_id 统计 octet_length,超过 MEDIA_QUOTA_BYTES(默认 64MB)回 413 quota_exceeded。他人额度互不影响。
  • 未引用 TTL:撤回后清空引用、从未发出的待发图,超过 MEDIA_UNUSED_TTL_DAYS(默认 14,0 关闭)会被清掉。表情包和个人/群贴纸引用的图不删。
  • 好友无向唯一:迁移 017_media_quota_friends_pair.sql 先去重再加 (LEAST, GREATEST) 唯一索引。反向并发插入撞索引时再读对方那一行并自动接受。
  • 对象存储冷备:docker/backup-db.sh 在本地 dump 校验通过后,把文件拷进 server 容器调用 node dist/cli/push-backup.js 做 SigV4 PUT。四项凭据缺一则跳过,上传失败只打警告。

验证

  • server 105 / 14 文件全绿(新增 media.test.ts 2、s3.test.ts 4、friends 无向唯一 1)
  • server lint / typecheck 绿
  • 未改客户端 UI(配额错误走既有 ApiError 文案通道)

未动(需要拍板)

  • 生产服务端未升本分支(含 017 迁移);香港机目前也还没装每日备份 timer
  • 对象存储要在 docker/.env 填 BACKUP_S3_* 才会实际上传
  • 路线图还剩 macOS / Linux 游戏模式适配

未打 tag、未动生产。

Open in Web Open in Cursor 

每用户默认 64MB 图片上限,未引用图片 14 天后清理;好友表加上 LEAST/GREATEST
无向唯一索引,反向并发申请会自动互加。backup-db.sh 在填齐 BACKUP_S3_* 后把
每日 dump 再推一份到 S3/COS/OSS/MinIO,失败不影响本地备份。

Co-authored-by: AppDuck <aocac@users.noreply.github.com>
@aocac
aocac marked this pull request as ready for review September 17, 2026 14:09
@cursor
cursor Bot merged commit fd6440c into main Sep 17, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants