管理后台
管理后台各页面的用途、管理员与普通用户的权限差别、配额与上传频控、上传 Token 的完整生命周期,以及登录、会话与界面偏好。
登录
管理后台就在站点根路径,例如 https://img.example.com/。
首次启动时内置管理员的登录名是 admin,密码是出厂默认值 imgyoung123。用它登录后,后台会直接进入「设置管理员密码」页。
这项限制在服务端执行:仍用出厂密码的会话只能改密、退出和查看当前账号,其余后台接口(包括后台上传、签发 Token、管理渠道)一律返回 403 须先修改出厂默认密码,不论请求来自后台页面还是脚本。
默认密码是公开的,实例暴露到公网之前务必先完成这一步。忘记密码见 重置密码。
没有用来设置初始管理员密码的环境变量,也没有由环境变量提供的引导 Token:这类一次性种子设过一次就不再起作用,却会一直留在部署文件里,让人分不清值从哪来。没有界面的部署,首次登录改密后在后台签发 Token 即可。
页面导览
左侧栏分三组,普通用户只看得到其中一部分:
| 分组 | 页面 | 谁能看到 |
|---|---|---|
| 内容 | 总览、图片、上传 Token | 全部用户 |
| 站点 | 存储渠道、用户、疑似重复、待清理、审计日志 | 管理员 |
| 其他 | 使用指南 | 全部用户 |
| 其他 | 设置 | 管理员 |
顶栏有页面搜索(⌘K / Ctrl+K 打开命令面板)、语言切换与主题切换。侧栏底部的账号菜单里有「修改密码」与「退出登录」。
总览
管理员看到全站概况:
- 指标卡:图片、存储用量(原图字节合计,副本不重复计)、用户、访问次数(附估算流量)、待清理、疑似重复。
- 「存储渠道」:每个渠道的健康状态与已存字节。
- 「告警」:当前未恢复的告警,条件不再成立时自动恢复;「历史记录」跳到设置里的告警历史。告警类型有渠道不健康、副本补齐失败、渠道用量超阈值、渠道排空失败、备份失败。
- 「热门图片」:按访问次数排序的前 10 张。
- 本机磁盘以外没有健康的渠道时,顶部显示「数据只存在这台主机上」:图片副本和元数据库快照都只在这台主机上,主机损坏即全部丢失。判定条件是找不到一个健康、不在清理中、且驱动不是 local 的渠道,一个健康渠道都没有时同样显示。添加一个对象存储或网盘渠道即可解除;已经有了,就到「存储渠道」页查看它为什么不健康。
普通用户看到自己的图片数、已用空间与配额。站里还没有图片时,总览显示三步快速开始。
访问次数与估算流量的口径见 访问图片。
图片
图片网格,管理员看全站(「全站图片」),普通用户只看自己的(「我的图片」)。
- 搜索:按短 ID 或文件名。
- 「筛选」:「上传来源 Token」、「上传时间」、「仅看已豁免」;管理员另有「归属用户」。
- 「选择」后可多选「批量删除」,一次最多 100 张。
- 「上传图片」:后台直接上传,见 上传。
点开一张图是详情抽屉:
- 「分享链接」:完整链接,「复制为」URL、Markdown、HTML、BBCode;下方列出可用的缩放宽度,点一下复制带
?w=的链接。设置了对外站点地址时链接用它的域名。 - 元数据:格式、尺寸、大小、归属、来源 Token、引用数、上传时间、最近访问、访问次数、到期(含「修改有效期」)、清理豁免、SHA-256。
- 「副本分布」:这张图在每个渠道上的副本状态(待补齐 / 上传中 / 就绪 / 失败)、尝试次数与最近错误。
- 「删除」;管理员另有「审计记录」,跳到以这张图为目标的审计日志。
有效期与清理豁免的含义见 生命周期与查重。
上传 Token
签发与管理数据接口的凭证,见下文 上传 Token。
存储渠道
新建、编辑、探测与删除渠道,设置优先级、加密与 302 直链,查看各渠道的副本水位。表单字段与各类渠道的配置细节见 存储渠道,这里只列使用后台时要知道的几点:
- 网盘模板在授权控件上方有「应用 Client ID」「应用 Client Secret」两个字段,随渠道配置加密保存。一键授权必须先填 Client ID;粘贴令牌时,如果授权用的是自建应用也要填,因为令牌续期要用签发它的同一个应用。
- 编辑渠道时,凭证类参数显示为掩码:除密码、密钥、令牌外,访问密钥 ID、WebDAV 用户名、Client ID 等也是。不改就保留原值。
- 渠道装载失败(配置解不开、驱动构造失败等)时,列表里显示为「异常」,原因以
装载失败:开头。健康检查每轮自动重试装载,「重新探测」也会先重试装载;装上且探测通过后才恢复健康、重新参与读写。 - 设置里「新渠道默认加密」开启时,新建渠道的「服务端加密」保持「继承全局默认」就会加密,此时「允许 302 直链」不可用;要用直链,把服务端加密设为「强制关闭」。
- 「测试连接」时如果服务商刷新了授权令牌,测试结论下方提示「服务商在测试时刷新了授权令牌,表单已换用新令牌,保存时提交的就是它;原令牌可能已失效。」,授权字段显示「已授权」,接着保存即可。编辑时沿用的已存令牌被刷新,会直接写回该渠道。
- 渠道行菜单的「导出 rclone 配置」(清理中的渠道没有这一项)下载该渠道的 rclone 配置文件
imgyoung-channel-<渠道 ID>.rclone.conf,标准 rclone 凭它即可脱离 ImgYoung 读写这个渠道上的数据;加密渠道另有一个加密层远端,经它读出的就是明文。 文件里含渠道凭证与授权令牌(加密渠道还有解密密码),要和主密钥一样离线妥善保存;每次下载都记入审计日志。文件内容与用法见 渠道存储加密 与 存储渠道。
删除渠道时,弹窗里的「同时删除本服务写在该渠道上的数据」默认勾选,确认按钮是「删除并清理」:图片副本与元数据库快照在后台逐个删除(深探测留下的残留文件一并删除),期间渠道显示为「清理中」,删完自动移除;不是本服务写的文件不动。 取消勾选,按钮变为「仅移除」:渠道立即移除,远端的图片副本与元数据库快照原样保留,需要时自行到存储商处理。
「删除并清理」删对象失败时:
- 第一次失败就把原因写进渠道的探测结果,在渠道列表里可见,同时开启「渠道排空失败」告警。单次清理任务超时、服务停机打断的不算失败。
- 之后按退避间隔一直自动重试,不会停止;渠道临时不可用,恢复后会自己清完。
- 凭证已失效或存储桶已不存在、再重试也删不掉时,对该渠道点「直接移除」:立即移除渠道,尚未删除的远端对象原样保留。确定删不掉的渠道,删除时也可以一开始就选「仅移除」。
用户
列出全部账号及其图片数、用量 / 配额、默认有效期。可以「建号」、「编辑」、「重置密码」、「删除」,见下文 角色与权限 与 配额与上传频控。
疑似重复与待清理
两个裁决队列:「疑似重复」并排比较感知哈希相近的图片对,决定合并或忽略;「待清理」列出长期无人访问的冷图,决定保留或删除。见 生命周期与查重。
审计日志
管理操作的只追加记录,可按「动作」、「操作者」(用户 ID)、「目标」(图片短 ID、渠道 ID、Token ID 等,精确匹配)与「时间范围」筛选。记录的动作:
| 对象 | 动作 |
|---|---|
| 渠道 | 新建渠道、编辑渠道、删除渠道、导出渠道 rclone 配置 |
| Token | 签发 Token、吊销 Token、轮换 Token、删除 Token |
| 用户 | 新建用户、更新用户(含改密与重置密码)、删除用户 |
| 图片 | 修改图片(有效期、清理豁免)、删除图片(含 S3 DeleteObject) |
| 裁决 | 合并重复图、忽略重复图 |
| 设置 | 修改配置、添加防盗链白名单、移除防盗链白名单 |
| 数据 | 导出数据、立即备份、恢复备份 |
上传本身与到期自动删除不记审计。保留期由「审计日志保留天数」audit_retention_days 决定,出厂 0 表示永久保留。
使用指南
后台内置的速查页,curl、PicGo、S3 客户端的配置示例里直接填好了当前站点的地址,所有用户可见。
设置
仅管理员可见,分四个标签:
- 「运行配置」:全部运营配置,按访问与链接、上传限制、生命周期、按需处理、查重、可靠性与渠道、CDN 缓存清理、告警与审计分组;改完点「保存修改」即时生效,不需要重启。
页面下方的「引导配置」卡片只读展示环境变量(监听地址、数据目录、信任的反代网段、
/metrics放行网段)、服务端版本与内置的登录限速参数。见 配置。 网段类变量未设置时显示出厂默认网段;显式设为空串时,「信任的反代网段」显示「空:不采信任何转发头」,「/metrics 放行网段」显示「空:不对任何地址开放」。 - 「防盗链」:Referer 白名单与「空 Referer 放行」开关,见 访问图片。
- 「备份与导出」:元数据库快照按「备份间隔」自动写到每个健康渠道,各渠道各自保留最近几份。快照表列出快照、大小、时刻与「所在渠道」(持有它的渠道,按优先级排列),可「立即备份」、「下载」、「恢复」;另有「导出 JSON」导出全量元数据。
「立即备份」时有渠道没写成会报错,错误形如
备份失败:快照 imgyoung-….db 有 k/n 个渠道未写成: …,写成的渠道仍保留这份快照;没有健康渠道时报没有健康渠道可存放快照。「下载」与「恢复」按优先级从持有该快照的健康渠道读取,读不到就换下一个。见 备份与恢复。 - 「告警历史」:全部告警的开启与恢复记录。告警 Webhook 见 监控。
角色与权限
账号只能由管理员在「用户」页创建,不开放注册。角色有两种:
| 能力 | 管理员 | 普通用户 |
|---|---|---|
| 上传(Token、后台、S3) | 可以 | 可以 |
| 查看、删除图片 | 全站 | 只限自己的 |
| 修改图片有效期 | 全站 | 只限自己的 |
| 设置清理豁免 | 可以 | 不可以 |
| 签发、轮转自己的 Token,查看自己 Token 的 S3 配置 | 可以 | 可以 |
| 查看、吊销、删除别人的 Token | 可以 | 不可以 |
| 存储渠道、用户、疑似重复、待清理、审计日志、设置 | 可以 | 不可以 |
普通用户之间互相看不到对方的图片与 Token;访问别人的图片详情得到 404 图片不存在。图片链接本身是公开的,知道链接的人都能访问。
可以有多个管理员。内置管理员(用户 ID 为 default)受保护:不能被禁用、降级或删除,可以改名。任何管理员都不能删除自己。
在「用户」页:
- 「建号」:登录名、初始密码(至少 8 位,建好即可登录)、角色、配额、默认有效期。
- 「编辑」:改登录名、角色、配额、默认有效期,或勾选「禁用」。禁用立即结束该用户的全部会话,其 Token 也无法再上传。
- 「重置密码」:设新密码,该用户的全部会话立即失效。
- 「删除」:名下还有图片时拒绝,需先删掉图片;删除时其 Token 与会话一并删除,审计记录保留。
配额与上传频控
- 配额:在建号或编辑时为每个用户设置,单位 MB 或 GB,留空或填 0 表示不限。按引用计全额:每张图都按其物理文件的完整大小计入,后台查重合并不减少已用量。口径只有这一种,也无法靠上传与别人相同的图来少计用量。上传后会超出配额时返回 403。 用户可在总览看到已用空间与配额,管理员在「用户」页的「用量 / 配额」列查看。
- 上传频率上限:「设置 → 运行配置」的
upload_rate_per_min,对每个用户统一生效,出厂 0 表示不启用;同一用户经 Token、后台、S3 的上传共享额度。 - 上传并发上限:
max_concurrent_uploads,全站共享,出厂 8。
超限时的行为与状态码见 上传。
上传 Token
上传 Token 是数据接口(/api/upload、/api/upload/url)与 S3 协议的凭证,只能用于上传,不能登录后台、也不能调用后台接口。
凭证只有两种:后台用密码加会话,数据接口与 S3 用上传 Token(S3 的签名用的也是同一批 Token)。Token 不能调用后台接口,是为了把它泄露时的影响限制在「以这个用户的身份上传」,后台接口另有 CSRF 防护。Token 的权限也只有上传一种:每个客户端签发一枚、可以单独吊销,已经足以止损。
签发
在「上传 Token」页点「签发 Token」:
- 「用途名称」:如
picgo、blog-script,最长 64 字节。同一用户的有效 Token 不能重名;同名的旧 Token 已过期时,签发新 Token 会自动吊销那条过期记录。 - 「有效期」:永久、7 天、30 天、90 天或 365 天。到期后与吊销同样失效。
签发成功后弹窗显示 Token 明文(形如 imgy_ 加 43 个字符),只显示这一次,关掉就再也看不到。数据库只存它的 SHA-256 与前 12 个字符的识别前缀;Token 是高熵随机串,普通哈希即可,不需要密码那样的慢哈希。
用法是请求头 Authorization: Bearer <token>。
列表与状态
列表显示名称、识别前缀、状态(有效 / 已过期 / 已吊销)、到期、最近使用与签发时间。「最近使用」大约每分钟批量更新一次。 每张图记着经由哪个 Token 上传,「图片」页可以按「上传来源 Token」筛选。
行操作
点行末的「更多操作」:
| 操作 | 适用 | 作用 |
|---|---|---|
| 「S3 客户端配置」 | 自己的有效 Token | 查看这枚 Token 对应的 S3 access key、secret 与端点,可以反复查看,见 上传客户端 |
| 「轮转」 | 自己的有效 Token | 原子地签发一枚同名新 Token 并吊销旧的。新明文同样只显示一次;旧 Token 与它的 S3 凭证立即失效。原来是永久的仍为永久,原来有有效期的从现在起按同样时长重新计算 |
| 「吊销」 | 有效 Token | 立即失效,使用它的客户端无法再上传,S3 凭证同步失效。记录保留 |
| 「删除记录」 | 已吊销或已过期的 Token | 从列表移除,审计记录保留。有效的 Token 不能删除,需先吊销 |
管理员查看别人的 Token
管理员可以用「按用户查看」切换到任意用户的 Token 列表,对其中的 Token「吊销」或「删除记录」。 「轮转」与「S3 客户端配置」只对本人开放:它们会交出可用的凭证,对别人的 Token 执行等于接管对方的上传权限。
会话与安全
| 机制 | 做法 |
|---|---|
| 密码存储 | argon2id(64 MiB 内存、3 轮、单线程),每个密码独立随机盐。密码至少 8 位 |
| 登录限速 | 按客户端 IP 与登录名分别计:各允许连续 5 次尝试,之后每 12 秒恢复 1 次,超出返回 429。登录成功清零。经信任的反向代理时,客户端 IP 取自 X-Forwarded-For |
| 防用户名枚举 | 用户名不存在与密码错误返回同样的错误,校验耗时相近 |
| 会话 | 登录后下发 256 位随机会话 ID,放在 HttpOnly、SameSite=Lax 的 cookie imgyoung_session 里,客户端到站点是 HTTPS 时加 Secure。服务端只存哈希,数据库泄露也不能据此冒用会话。有效期固定 30 天,不随使用延长 |
| CSRF | 会话绑定一个 CSRF 令牌,所有改动状态的请求必须在 X-CSRF-Token 头里带上它,后台页面自动处理 |
| 出厂密码 | 内置管理员仍用出厂默认密码时,服务端只放行改密、退出与查看当前账号,其余后台接口返回 403 |
| 改密 | 「修改密码」需要旧密码;改完该用户全部设备下线,需要重新登录 |
| 禁用与重置 | 禁用或重置密码立即结束该用户的全部会话;被禁用的用户无法登录,其 Token 全部失效 |
| 页面防护 | 全站响应带 X-Frame-Options: DENY 与 X-Content-Type-Options: nosniff;后台页面另带内容安全策略(CSP):脚本与接口请求只允许来自本站,不允许被其他页面嵌入 |
HTTPS 判定与客户端 IP 都依赖反向代理的转发头,只有来自 IMGYOUNG_TRUSTED_PROXIES 网段的转发头才被采信。见 反向代理。
界面语言与主题
- 语言:顶栏的语言按钮在简体中文与 English 之间切换。首次访问时按浏览器语言选择(中文环境用简体中文,其余用英文),之后记住你的选择一年。
- 主题:顶栏的主题按钮可选浅色、深色、跟随系统,默认深色,选择同样会记住。
两项偏好都只保存在当前浏览器里,不随账号同步。