一个基于 Go 语言 + Nuxt 打造的图床后。使用了vipsgen(libvips的 Go 语言实现),理论上能够良好地处理主流文件格式以及新兴的webp、avif、jpxl格式
使用前请先配置.env文件,样例文件位于deploy/.env.example中。
项目根目录的 VERSION 是前后端统一的默认版本号。Docker 构建时会读取该文件,也可以通过 ANZUIMG_VERSION 覆盖;版本号须符合 SemVer,例如 0.1.0 或 1.0.0-rc.1。
# 使用 VERSION 中的版本号
docker compose -f deploy/docker-compose.yml build
# 为本次构建覆盖版本号
ANZUIMG_VERSION=1.0.0 docker compose -f deploy/docker-compose.yml build
# 构建版本号;留空时读取根目录 VERSION
ANZUIMG_VERSION=
# 后端核心配置
# 监听地址
ANZUIMG_SERVER_ADDR=:8080
# 优雅停机等待秒数,默认 10
ANZUIMG_SHUTDOWN_TIMEOUT_SEC=10
# API 前缀配置
# API 路由前缀,例如 /kotori,留空表示无前缀
# 默认为空,此时 API 路由为 /api/v1/...
# 设置为 /kotori 时,API 路由为 /kotori/api/v1/...
ANZUIMG_API_PREFIX=
# 数据库配置
# 主机地址,Docker 部署通常填 db
ANZUIMG_DB_HOST=db
ANZUIMG_DB_PORT=5432
ANZUIMG_DB_USER=anzuuser
ANZUIMG_DB_PASSWORD=anzupass
ANZUIMG_DB_NAME=anzuimg
# SSL 模式,支持 disable require verify-full,默认 disable
ANZUIMG_DB_SSLMODE=disable
# 存储配置
# 存储类型,local 或 cloud,默认 local
ANZUIMG_STORAGE_TYPE=local
# 本地存储路径,仅在 STORAGE_TYPE=local 时使用
ANZUIMG_STORAGE_BASE=/data/images
# S3 或 S3 兼容云存储配置,仅在 STORAGE_TYPE=cloud 时使用
ANZUIMG_CLOUD_ENDPOINT=s3.amazonaws.com
ANZUIMG_CLOUD_BUCKET=anzuimg-bucket
ANZUIMG_CLOUD_REGION=us-east-1
ANZUIMG_CLOUD_ACCESS_KEY=
ANZUIMG_CLOUD_SECRET_KEY=
ANZUIMG_CLOUD_USE_SSL=true
# 网络与安全配置
# 允许跨域访问的源,逗号分隔,填写前端访问地址
ANZUIMG_ALLOWED_ORIGINS=http://localhost:9200
# 仅填写实际反向代理的精确 IP/CIDR;留空时忽略所有转发 IP 头
ANZUIMG_TRUSTED_PROXIES=
# 客户端 IP 读取头顺序,按顺序尝试,按顺序尝试,在 ANZUIMG_TRUSTED_PROXIES 配置有效值时生效
ANZUIMG_CLIENT_IP_HEADERS=X-Forwarded-For,X-Real-IP
# XFF 解析策略:trusted(按受信任代理链推导)/ rightmost(取最右有效 IP)
ANZUIMG_CLIENT_IP_XFF_STRATEGY=trusted
# 兼容 APP_TRUSTED_PROXIES / APP_CLIENT_IP_HEADERS / APP_CLIENT_IP_XFF_STRATEGY(APP_* 优先)
# 初始化设置 Token,留空则不校验,首次部署建议设置
ANZUIMG_SETUP_TOKEN=
# Cookie SameSite 策略,Lax Strict None,默认 Lax
ANZUIMG_COOKIE_SAMESITE=Lax
# 是否启用会话严格 IP 绑定,默认 false
ANZUIMG_STRICT_SESSION_IP=false
# 是否允许 Web 端修改运行时配置,默认 true
# 关闭后 /settings 系统配置区变只读,仅可通过 .env 或数据库调整
ANZUIMG_ALLOW_WEB_CONFIG=true
# 应用日志文件输出目录,默认 /data/logs (容器内)
ANZUIMG_LOG_FILE_DIR=/data/logs
# Passkey WebAuthn 配置
# Relying Party ID,通常为域名
ANZUIMG_PASSKEY_RP_ID=localhost
# Relying Party Origin,浏览器访问的完整 URL
ANZUIMG_PASSKEY_RP_ORIGIN=http://localhost:9200
# Relying Party Display Name,注册时显示的应用名称
ANZUIMG_PASSKEY_RP_DISPLAY_NAME=AnzuImg
# 上传限制配置
# 单次请求的最大体积,单位 MB,默认 110
ANZUIMG_MAX_UPLOAD_MB=110
# 单个文件的最大体积,单位 MB,默认 60
ANZUIMG_MAX_UPLOAD_FILE_MB=60
# 单次请求的最大文件数,默认 20
ANZUIMG_MAX_UPLOAD_FILES=20
# 前端配置
# 后端 API 地址
ANZUIMG_FRONTEND_BACKEND_URL=http://backend:8080
# 前端子路径部署,例如 /app/,建议以 / 结尾
ANZUIMG_FRONTEND_APP_BASE_URL=/clannd/
# 前端 API 路由前缀,应与 ANZUIMG_API_PREFIX 一致
# 留空或 / 表示不加前缀,此时前端 API 为 /api/v1/...
# 设置为 /kotori 时,前端 API 为 /kotori/api/v1/...
ANZUIMG_FRONTEND_API_PREFIX=/kotori
使用docker
docker compose -f deploy/docker-compose.yml up -dCaution
首次运行,前端将引导进行初始化密码,如果没有配置 ANZUIMG_SETUP_TOKEN,后端将只接受本地路径访问进行初始化
请根据自己的网络环境配置如何获取请求来源IP地址,否则可能获取到 Docker 网关地址
举个例子,如果配置的CDN服务,那么需要根据CDN文档来读取对应响应头,比如EdgeOne的是EO-Connecting-IP、Cloudflare的是CF-Connecting-IP;如果使用了多层代理,需要根据外层行为选择合适的响应头与解析行为
如果使用了CDN服务,请关闭严格IP模式,否则会因为IP变动无法正常访问控制服务
务必正确配置CORS
cloud存储策略我没有测试过
虽然 Nuxt 前端的 Nitro 支持 proxy,但生产环境仍建议把 宿主机 Nginx 作为唯一对外入口。
本项目支持子路径部署和 API 前缀,推荐对外暴露 3 个入口:
- 图床前端:
/clannd/ - 图床后端 API:
/kotori/,通常只承载/api/v1/*与/health - 图片直链:
/i/
对应前端环境变量:
ANZUIMG_FRONTEND_APP_BASE_URL=/clannd/,前端挂载路径,建议以/结尾ANZUIMG_FRONTEND_API_PREFIX=/kotori,置空或/表示不加前缀ANZUIMG_FRONTEND_BACKEND_URL=http://backend:8080,前端 SSR 和 Nitro 侧用于 proxy 的后端地址
后端如需原生前缀支持可设置:
ANZUIMG_API_PREFIX=/kotori,后端路由将变为/kotori/api/v1/...
示例 Nginx 配置见 deploy/nginx/anzuimg.conf.example。
请阅读API文档
登录的时候支持密码登录与Passkey登录(Passkey需要自行注册)
点击图片可以查看详情
Tip
在此模态框下,可以拖拽图片、缩放图片、编辑图片信息等操作
Tip
上传页支持多文件上传,也支持对图片格式进行转换
/logs 是独立的日志中心,提供:
- 三个 Tab:应用日志 app_logs / 安全日志 security_event_logs / Token 日志 api_token_logs
- 多字段过滤:级别、模块、IP、动作、时间范围、关键字
- 实时模式应用日志,基于 SSE 推送,边产生边滚动展示
- 一键导出 CSV / JSON
- 一键清理 N 天前日志,属敏感操作,需要二次确认
应用日志通过 logger 的多 sink 同时输出到 stdout、文件轮转与 DB。文件路径由 ANZUIMG_LOG_FILE_DIR 决定,文件大小、保留备份与天数都可在系统配置页热改。
进入 /settings 底部"系统配置"区,可在 Web 端调整大部分运行期参数,改动到 system_configs 表覆盖 .env 默认值,无需重启进程。涵盖:
- 上传限制、Cookie SameSite、严格 IP 绑定
- 会话与 API Token 生存期
- 登录失败锁定阈值与冷却时长、爆破告警阈值
- 密码策略,最短长度与是否要求大小写、数字、符号
- CORS 允许的 Origin、CSP 追加片段
- IP 黑名单全局生效,与管理面板 IP 白名单仅敏感路由生效
- 日志保留天数、级别、文件轮转、DB sink 缓冲
敏感操作如改配置、删 Passkey、删 Token、改密码、清日志,受 step-up 二次确认保护:在 N 秒内首次执行会要求重输密码或使用 Passkey;窗口由 STEP_UP_MAX_AGE_SEC 控制,默认 120 秒。








