Files
cao.wangrenbo 630d240dc0 feat(M1): 认证与用户管理 — 双通道登录、cookie 会话、用户 CRUD 与真实系统账号对接
认证:
- 图形验证码 GET /auth/captcha(内置 PNG 渲染,零第三方依赖)
- 外部用户 OTP 双通道:DB 存储(otp_codes)使邮件与 CLI 共用同一验证码/冷却/失败限速
- 管理员 bcrypt 登录 + 连续失败限速锁定;admin/forgot + admin/reset 邮件重置(SMTP 或日志)
- cookie 会话(HttpOnly/SameSite)、me/logout、admin/user 鉴权中间件

用户管理(admin):
- CRUD + disable/enable/extend/delete,对接 system 层真实 useradd/usermod/userdel/passwd
- system 层三执行模式:dry-run(默认,安全)/ direct(容器/测试用户)/ sudo(生产 sudoers 白名单)
- Exists 系统账号一致性检查;deploy/sudoers.example 白名单模板
- 关键操作接入 append-only 审计

其他:
- CLI user otp 改 DB store,与邮件通道真正对齐
- 容器镜像补 shadow(alpine 无 useradd);Makefile VERSION 0.2.0-m1
- 测试:auth/service 单测 + api httptest 集成 + 容器内真实系统账号端到端验证
2026-08-29 23:40:20 +08:00

66 lines
2.1 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ws_usernode 单二进制镜像(podman 多阶段构建)
#
# 构建(走代理时):
# podman build -t ws-usernode:latest \
# --build-arg HTTP_PROXY=http://10.62.25.123:7897 \
# --build-arg HTTPS_PROXY=http://10.62.25.123:7897 \
# --build-arg ALL_PROXY=http://10.62.25.123:7897 \
# -f deploy/Containerfile .
# 无代理环境可省略 --build-argContainerfile 内缺省为空,不影响)。
# 建议加 --network=host,规避容器网络插件缺失导致的拉包失败。
# ---------- 阶段 1:前端构建(node:20-alpine ----------
FROM node:20-alpine AS web-build
# proxychains 无法注入容器,代理环境变量须显式传入
ARG HTTP_PROXY=
ARG HTTPS_PROXY=
ARG ALL_PROXY=
ARG NO_PROXY=
ENV HTTP_PROXY=$HTTP_PROXY \
HTTPS_PROXY=$HTTPS_PROXY \
ALL_PROXY=$ALL_PROXY \
NO_PROXY=$NO_PROXY
WORKDIR /web
COPY web/package.json web/package-lock.json* ./
RUN npm install
COPY web/ .
RUN npm run build
# 产物:/web/dist
# ---------- 阶段 2Go 构建(golang:1.22-alpine ----------
FROM golang:1.22-alpine AS go-build
ARG HTTP_PROXY=
ARG HTTPS_PROXY=
ARG ALL_PROXY=
ARG NO_PROXY=
ENV HTTP_PROXY=$HTTP_PROXY \
HTTPS_PROXY=$HTTPS_PROXY \
ALL_PROXY=$ALL_PROXY \
NO_PROXY=$NO_PROXY
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
# 用前端构建产物覆盖 internal/webui/distgo:embed 入口)
COPY --from=web-build /web/dist ./internal/webui/dist
RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /out/usernode ./cmd/usernode
# ---------- 阶段 3:运行镜像 ----------
FROM alpine:3.20
# shadow 提供 useradd/usermod/userdel/passwdalpine 默认 busybox 无 useradd
RUN apk add --no-cache ca-certificates tzdata shadow \
&& addgroup -S usernode && adduser -S -G usernode usernode
COPY --from=go-build /out/usernode /usr/local/bin/usernode
# 数据目录(SQLite 默认 data/usernode.db),运行时以专有用户运行
RUN mkdir -p /data && chown usernode:usernode /data
VOLUME ["/data"]
USER usernode
WORKDIR /data
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/usernode"]
CMD ["serve", "--config", "/etc/usernode/config.toml"]