## 功能 - 邮箱找回密码:新增 password_resets 表 + POST /api/auth/forgot-password (按接收邮箱反查用户 → 生成一次性 30 分钟令牌 → 复用 SMTP 发重置邮件, 防枚举统一提示、复用登录限流器防刷)+ POST /api/auth/reset (校验令牌有效性 → bcrypt 更新密码 → 作废令牌 → 强制该用户全部会话下线); H5 新增 /forgot、/reset 页面,登录页加"忘记密码"入口 - SMTP 全局配置补全:新增发件邮箱 smtp_user / 授权码 smtp_pass 字段 (H5 + 小程序设置页同步展示与保存),GET 脱敏回显, 修复"脱敏值含 * 被 POST 写回覆盖真实配置"的 bug - 新增 cmd/sendmail 真实发送工具(配置走环境变量,敏感信息不落库, 已用 163 SMTP 465 隐式 SSL 实测发送成功) ## 日志体系 - 死配置 OIL_MONITOR_LOG_DIR 替换为 OIL_MONITOR_LOG_LEVEL (debug/info/warn/error,LevelVar 动态切换,上线默认 info 收敛日志) - 自定义 requestLogger 请求日志中间件(Debug 级:method/path/status/耗时/IP) - 外部交互日志统一:爬虫抓取 / SMTP / Webhook / 高德 regeo / 微信 code2session, 成功 Debug、失败 Error、均带 dur_ms、URL 去 query 脱敏防 key/token 泄露 - 定时任务统一 runTask 包装:开始 Debug、完成+时长 Info、失败/panic Error (panic 被 recover,不连累调度器) ## 测试 - cron/scheduler_test.go:runTask 成功/失败/panic 三路径单测 - push/sender_test.go:本地假 SMTP 服务器完整发送会话链路 + 服务器拒绝失败路径 - db_test.go:表数量断言 11 → 12(新增 password_resets) ## 部署配置与文档 - Dockerfile / docker-compose.yml / .env.example / README:日志配置同步 (删 /app/logs 目录与挂载,OIL_MONITOR_LOG_LEVEL) - .gitignore:忽略 internal/pkg 依赖缓存(349M,防误提交) - docs/10/21/22/23/24:同步 A18/A19 接口、password_resets 表、任务执行日志、SMTP 字段 Co-Authored-By: Claude <noreply@anthropic.com>
27 lines
773 B
Docker
27 lines
773 B
Docker
# ── 构建阶段 ──
|
|
FROM golang:1.22-alpine AS build
|
|
WORKDIR /src
|
|
|
|
# 依赖缓存(go.sum 变化才重下)
|
|
COPY go.mod go.sum ./
|
|
RUN go mod download
|
|
|
|
COPY . .
|
|
# modernc.org/sqlite 为纯 Go,可 CGO_ENABLED=0 交叉编译
|
|
RUN CGO_ENABLED=0 GOOS=linux go build \
|
|
-ldflags "-s -w -X oil-price-monitor/internal/api.version=0.1.0" \
|
|
-o /out/oil-monitor ./cmd/server
|
|
|
|
# ── 运行阶段 ──
|
|
FROM alpine:3.20
|
|
RUN adduser -D -H -u 1000 oilmon
|
|
WORKDIR /app
|
|
COPY --from=build /out/oil-monitor /app/oil-monitor
|
|
RUN mkdir -p /app/data && chown -R oilmon:oilmon /app
|
|
USER oilmon
|
|
EXPOSE 8080
|
|
VOLUME ["/app/data"]
|
|
ENV OIL_MONITOR_DB_PATH=/app/data/oilmonitor.db \
|
|
OIL_MONITOR_LOG_LEVEL=info \
|
|
OIL_MONITOR_TIMEZONE=Asia/Shanghai
|
|
CMD ["/app/oil-monitor"] |