diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 60e5d4d..b44fba5 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -178,6 +178,35 @@ jobs: git clone --depth 1 -b "${BRANCH}" "${REPO_URL}" . git rev-parse --short HEAD + - name: 注入 OAuth secrets 到 GITHUB_ENV(所有后续 step 自动继承,避免 step.env 在某些 Gitea Actions 版本中不生效) + env: + OAUTH_REDIRECT_URI: ${{ secrets.OAUTH_REDIRECT_URI }} + OAUTH_STATE_SECRET: ${{ secrets.OAUTH_STATE_SECRET }} + AGGREGATE_OAUTH_APP_ID: ${{ secrets.AGGREGATE_OAUTH_APP_ID }} + AGGREGATE_OAUTH_APP_KEY: ${{ secrets.AGGREGATE_OAUTH_APP_KEY }} + AGGREGATE_OAUTH_LOGIN_TYPE: ${{ secrets.AGGREGATE_OAUTH_LOGIN_TYPE }} + AGGREGATE_OAUTH_ENDPOINT: ${{ secrets.AGGREGATE_OAUTH_ENDPOINT }} + run: | + set -euo pipefail + OAUTH_ENV_FILE="$GITHUB_ENV" + # 所有变量只要非空就写入 GITHUB_ENV;写入时用双引号包住值,避免包含 ://[provider]/ 等特殊字符时被错误解析 + _append_env() { + local K="$1" V="$2" + if [ -n "${V}" ]; then + printf '%s="%s"\n' "$K" "$V" >> "$OAUTH_ENV_FILE" + echo "[OAuth-secrets] $K=已注入 (len=${#V})" + else + echo "[OAuth-secrets] $K=未配置(Repository Secrets 中缺失或为空)" + fi + } + _append_env OAUTH_REDIRECT_URI "${OAUTH_REDIRECT_URI:-}" + _append_env OAUTH_STATE_SECRET "${OAUTH_STATE_SECRET:-}" + _append_env AGGREGATE_OAUTH_APP_ID "${AGGREGATE_OAUTH_APP_ID:-}" + _append_env AGGREGATE_OAUTH_APP_KEY "${AGGREGATE_OAUTH_APP_KEY:-}" + _append_env AGGREGATE_OAUTH_LOGIN_TYPE "${AGGREGATE_OAUTH_LOGIN_TYPE:-}" + _append_env AGGREGATE_OAUTH_ENDPOINT "${AGGREGATE_OAUTH_ENDPOINT:-}" + echo "[OAuth-secrets] 写入完成;后续所有 step 都会自动把上述变量作为进程级 process.env.* 继承(包括 nuxt build)" + - name: 安装依赖(npm ci,含网络超时兜底:双 registry 切换 + 3 次重试 + fetch-retires 5 次 + 5 分钟 fetch-timeout) run: | set -euo pipefail @@ -355,6 +384,34 @@ jobs: docker version docker buildx version || echo "buildx 未安装,将使用 docker build --push" + - name: 注入 OAuth secrets 到 GITHUB_ENV(Docker build-arg 与运行期容器 .env 共用同一来源,构建期注入对应镜像 .output) + env: + OAUTH_REDIRECT_URI: ${{ secrets.OAUTH_REDIRECT_URI }} + OAUTH_STATE_SECRET: ${{ secrets.OAUTH_STATE_SECRET }} + AGGREGATE_OAUTH_APP_ID: ${{ secrets.AGGREGATE_OAUTH_APP_ID }} + AGGREGATE_OAUTH_APP_KEY: ${{ secrets.AGGREGATE_OAUTH_APP_KEY }} + AGGREGATE_OAUTH_LOGIN_TYPE: ${{ secrets.AGGREGATE_OAUTH_LOGIN_TYPE }} + AGGREGATE_OAUTH_ENDPOINT: ${{ secrets.AGGREGATE_OAUTH_ENDPOINT }} + run: | + set -euo pipefail + OAUTH_ENV_FILE="$GITHUB_ENV" + _append_env() { + local K="$1" V="$2" + if [ -n "${V}" ]; then + printf '%s="%s"\n' "$K" "$V" >> "$OAUTH_ENV_FILE" + echo "[OAuth-secrets] $K=已注入 (len=${#V})" + else + echo "[OAuth-secrets] $K=未配置(Repository Secrets 中缺失或为空)" + fi + } + _append_env OAUTH_REDIRECT_URI "${OAUTH_REDIRECT_URI:-}" + _append_env OAUTH_STATE_SECRET "${OAUTH_STATE_SECRET:-}" + _append_env AGGREGATE_OAUTH_APP_ID "${AGGREGATE_OAUTH_APP_ID:-}" + _append_env AGGREGATE_OAUTH_APP_KEY "${AGGREGATE_OAUTH_APP_KEY:-}" + _append_env AGGREGATE_OAUTH_LOGIN_TYPE "${AGGREGATE_OAUTH_LOGIN_TYPE:-}" + _append_env AGGREGATE_OAUTH_ENDPOINT "${AGGREGATE_OAUTH_ENDPOINT:-}" + echo "[OAuth-secrets] build-image 作业写入完成;docker build 可作为 build-arg 透传到 nuxt build" + - name: 计算镜像标签 id: meta run: | @@ -483,6 +540,23 @@ jobs: --build-arg NODE_BUILDER_TAG="${NODE_BUILDER_TAG}" --build-arg NODE_RUNTIME_TAG="${NODE_RUNTIME_TAG}" ) + # ========== 关键:OAuth 6 条 secrets 通过 --build-arg 透传到 Dockerfile 的 ARG ========== + # 这样镜像内部 RUN node scripts/memory-build.js(npm run build)时, + # process.env.AGGREGATE_OAUTH_APP_ID 就能读到,nuxt.config.ts public.oauth.aggregate = !!process.env.AGGREGATE_OAUTH_APP_ID + # 才会为 true → 前端渲染绿色微信按钮,不显示占位提示 + if [ -n "${OAUTH_REDIRECT_URI:-}" ]; then BUILD_ARGS+=( --build-arg OAUTH_REDIRECT_URI="${OAUTH_REDIRECT_URI}" ); fi + if [ -n "${OAUTH_STATE_SECRET:-}" ]; then BUILD_ARGS+=( --build-arg OAUTH_STATE_SECRET="${OAUTH_STATE_SECRET}" ); fi + if [ -n "${AGGREGATE_OAUTH_APP_ID:-}" ]; then BUILD_ARGS+=( --build-arg AGGREGATE_OAUTH_APP_ID="${AGGREGATE_OAUTH_APP_ID}" ); fi + if [ -n "${AGGREGATE_OAUTH_APP_KEY:-}" ];then BUILD_ARGS+=( --build-arg AGGREGATE_OAUTH_APP_KEY="${AGGREGATE_OAUTH_APP_KEY}" ); fi + if [ -n "${AGGREGATE_OAUTH_LOGIN_TYPE:-}" ]; then BUILD_ARGS+=( --build-arg AGGREGATE_OAUTH_LOGIN_TYPE="${AGGREGATE_OAUTH_LOGIN_TYPE}" ); fi + if [ -n "${AGGREGATE_OAUTH_ENDPOINT:-}" ]; then BUILD_ARGS+=( --build-arg AGGREGATE_OAUTH_ENDPOINT="${AGGREGATE_OAUTH_ENDPOINT}" ); fi + # 日志打印(只打有无,不打 value) + echo "[OAuth build-args] OAUTH_REDIRECT_URI=$( [ -n "${OAUTH_REDIRECT_URI:-}" ] && echo 已注入 || echo 空 )" + echo "[OAuth build-args] OAUTH_STATE_SECRET=$( [ -n "${OAUTH_STATE_SECRET:-}" ] && echo 已注入 || echo 空 )" + echo "[OAuth build-args] AGGREGATE_OAUTH_APP_ID=$( [ -n "${AGGREGATE_OAUTH_APP_ID:-}" ] && echo 已注入 || echo 空 )" + echo "[OAuth build-args] AGGREGATE_OAUTH_APP_KEY=$( [ -n "${AGGREGATE_OAUTH_APP_KEY:-}" ] && echo 已注入 || echo 空 )" + echo "[OAuth build-args] AGGREGATE_OAUTH_LOGIN_TYPE=$( [ -n "${AGGREGATE_OAUTH_LOGIN_TYPE:-}" ] && echo 已注入 || echo 空 )" + echo "[OAuth build-args] AGGREGATE_OAUTH_ENDPOINT=$( [ -n "${AGGREGATE_OAUTH_ENDPOINT:-}" ] && echo 已注入 || echo 空 )" # 说明:暂时关闭 registry 分层缓存(buildkitd 推 buildcache 也要认证,同样会触发 Gitea 1.27 OAuth2 空 token) # 改为本地 Docker daemon 缓存,已构建的层会自动复用,下次 build 速度几乎相同 BUILD_ARGS+=( --no-cache ) diff --git a/Dockerfile b/Dockerfile index 8b8a59c..384ceae 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,6 +37,23 @@ RUN set -eux; \ # 只有在 package.json 没变而源代码改变时,才会从这一步开始重新执行,跳过上面的耗时依赖安装 COPY . . +# ========== OAuth / 第三方登录构建期配置(process.env.AGGREGATE_OAUTH_APP_ID 控制 nuxt.config.ts public.oauth.aggregate 开关) ========== +# 说明: +# - 这些是 **构建期** 变量,只在 RUN npm run build 时用到(runtimeConfig.public 只会在 build 时固化到 .output/public 包) +# - 部署时运行期变量(同一套值)会通过 docker-compose.yml env_file: [.env] 注入到容器 process.env 供 server/utils/oauth-strategies.ts loadAggregateSettings 使用 +ARG OAUTH_REDIRECT_URI="" +ARG OAUTH_STATE_SECRET="" +ARG AGGREGATE_OAUTH_APP_ID="" +ARG AGGREGATE_OAUTH_APP_KEY="" +ARG AGGREGATE_OAUTH_LOGIN_TYPE="" +ARG AGGREGATE_OAUTH_ENDPOINT="" +ENV OAUTH_REDIRECT_URI="${OAUTH_REDIRECT_URI}" \ + OAUTH_STATE_SECRET="${OAUTH_STATE_SECRET}" \ + AGGREGATE_OAUTH_APP_ID="${AGGREGATE_OAUTH_APP_ID}" \ + AGGREGATE_OAUTH_APP_KEY="${AGGREGATE_OAUTH_APP_KEY}" \ + AGGREGATE_OAUTH_LOGIN_TYPE="${AGGREGATE_OAUTH_LOGIN_TYPE}" \ + AGGREGATE_OAUTH_ENDPOINT="${AGGREGATE_OAUTH_ENDPOINT}" + # 构建应用,使用内存优化脚本适应4GB总内存 RUN chmod +x scripts/memory-build.js && \ node scripts/memory-build.js