From 436c4675600f9d4d75055ee792a01589fc113712 Mon Sep 17 00:00:00 2001 From: makewheels <33256842+makewheels@users.noreply.github.com> Date: Thu, 27 Aug 2026 09:44:06 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20Docker=20=E9=95=9C=E5=83=8F=E5=8F=8C?= =?UTF-8?q?=E6=8E=A8=20ACR=20+=20GHCR=EF=BC=88=E7=94=9F=E4=BA=A7=E4=BB=8D?= =?UTF-8?q?=E6=8B=89=20ACR=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-cd.yml | 16 +++++++++++++++- ...45\217\214\346\216\250ACR\344\270\216GHCR.md" | 16 ++++++++++++++++ docs/changelog/README.md | 1 + docs/deploy.md | 4 ++-- 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 "docs/changelog/20260827-094331-chore-Docker\351\225\234\345\203\217\345\217\214\346\216\250ACR\344\270\216GHCR.md" diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 64cb25b..c27fd2c 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -9,6 +9,8 @@ on: env: ACR: registry.cn-beijing.aliyuncs.com ACR_IMAGE: registry.cn-beijing.aliyuncs.com/b4/speakup + # 开源分发镜像:与 ACR 双推。生产部署只拉 ACR(北京机房快),GHCR 供外部拉取 + GHCR_IMAGE: ghcr.io/makewheels/speakup SERVER_DIR: /opt/speakup jobs: @@ -102,6 +104,7 @@ jobs: runs-on: ubuntu-latest permissions: contents: read + packages: write id-token: write steps: - uses: actions/checkout@v5 @@ -134,6 +137,13 @@ jobs: printf '%s' "$ACR_AK_SECRET" | docker login \ --username "$ACR_AK_ID" --password-stdin "$ACR" >/dev/null + - name: Login to GHCR + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + printf '%s' "$GITHUB_TOKEN" | docker login ghcr.io \ + --username "$GITHUB_ACTOR" --password-stdin >/dev/null + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 @@ -154,13 +164,17 @@ jobs: tags: | ${{ env.ACR_IMAGE }}:latest ${{ env.ACR_IMAGE }}:${{ steps.tag.outputs.value }} + ${{ env.GHCR_IMAGE }}:latest + ${{ env.GHCR_IMAGE }}:${{ steps.tag.outputs.value }} cache-from: type=gha,scope=speakup cache-to: type=gha,scope=speakup,mode=max provenance: false - name: 清理 Runner registry 登录 if: always() - run: docker logout "$ACR" >/dev/null 2>&1 || true + run: | + docker logout "$ACR" >/dev/null 2>&1 || true + docker logout ghcr.io >/dev/null 2>&1 || true - name: 准备临时 SSH 文件 run: | diff --git "a/docs/changelog/20260827-094331-chore-Docker\351\225\234\345\203\217\345\217\214\346\216\250ACR\344\270\216GHCR.md" "b/docs/changelog/20260827-094331-chore-Docker\351\225\234\345\203\217\345\217\214\346\216\250ACR\344\270\216GHCR.md" new file mode 100644 index 0000000..c9714f0 --- /dev/null +++ "b/docs/changelog/20260827-094331-chore-Docker\351\225\234\345\203\217\345\217\214\346\216\250ACR\344\270\216GHCR.md" @@ -0,0 +1,16 @@ +# chore: Docker 镜像双推——ACR + GitHub GHCR + +背景:镜像此前只推阿里云 ACR。作为开源项目应同时发布到 GitHub(GHCR);但北京生产机从 GitHub 拉镜像很慢,因此采用双推。 + +## 改动(`.github/workflows/ci-cd.yml`) +- deploy job 权限加 `packages: write`。 +- 新增 Login to GHCR 步骤(内置 `GITHUB_TOKEN`,无额外凭据)。 +- build-push tags 双推:`ACR_IMAGE` 与 `GHCR_IMAGE` 各带 `latest` + `YYYYMMDD-HHMMSS-NNNN`。 +- 清理步骤同时 `docker logout ghcr.io`。 +- **生产部署不变**:仍只从 ACR 拉(北京机房快),`:previous` 回滚锚点不受影响。 + +## 文档 +deploy.md 架构图与镜像仓库小节同步为双推。 + +## 说明 +deploy job 只在 push master 时运行,PR 阶段跳过,因此首次双推在本 PR 合并时生效;GHCR 包可见性跟随仓库可见性。 diff --git a/docs/changelog/README.md b/docs/changelog/README.md index dda884a..ff6317e 100644 --- a/docs/changelog/README.md +++ b/docs/changelog/README.md @@ -6,6 +6,7 @@ | 时间 | 文件 | 摘要 | |---|---|---| +| 2026-08-27 09:43:31 | [20260827-094331-chore-Docker镜像双推ACR与GHCR.md](20260827-094331-chore-Docker镜像双推ACR与GHCR.md) | 镜像双推 ACR + GHCR;生产仍只拉 ACR(北京快),GHCR 供开源分发。 | | 2026-08-27 09:33:59 | [20260827-093359-fix-练习偏好服务端化-用户设置跟账号走.md](20260827-093359-fix-练习偏好服务端化-用户设置跟账号走.md) | 练习偏好(难度/目的)改为服务端用户设置,登录响应携带,旧浏览器设置自动迁移。 | | 2026-08-27 09:06:46 | [20260827-090646-fix-登录后回跳原页面backurl.md](20260827-090646-fix-登录后回跳原页面backurl.md) | 未登录访问受保护页面时,登录成功后回到原入口(含指定题目查询参数),外链拒绝。 | | 2026-08-27 08:30:34 | [20260827-083034-feat-渐进式场景提示-实现与试点就绪.md](20260827-083034-feat-渐进式场景提示-实现与试点就绪.md) | 渐进式场景提示代码与试点内容就绪:slug 精确入口、按需提示、幂等创建、评分隔离、10 题审核稿;生产激活待分批投放。 | diff --git a/docs/deploy.md b/docs/deploy.md index 8ba7d24..1745fa6 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -6,7 +6,7 @@ ## 架构 ``` -GitHub Actions → OIDC 读取 Infisical → 构建 Docker 镜像 → 推 ACR (b4/speakup) +GitHub Actions → OIDC 读取 Infisical → 构建 Docker 镜像 → 双推 ACR (b4/speakup) + GHCR (ghcr.io/makewheels/speakup) → SSH 到生产机 → 临时注入配置 → docker compose pull && up <生产域名> → /opt/caddy 网关 (Caddy, 80/443) → speakup:3001 (docker network: edge) speakup:3001 → MongoDB (内网, MONGO_URI) @@ -45,7 +45,7 @@ AI 能力按环境变量解耦:文字使用 `CHAT_*`,语音使用 `VOICE_*` 2. `/opt/caddy/Caddyfile` 加一段 `<域名> { reverse_proxy <服务名>:<端口> }` 3. `docker compose -f /opt/caddy/docker-compose.yml exec caddy caddy reload --config /etc/caddy/Caddyfile` -- **镜像仓库**:阿里云 ACR 个人版 (cn-beijing),`b4/speakup` 存应用镜像。caddy 等公共镜像走 docker.io,靠生产机 docker daemon 配置的 **registry-mirrors** 拉。 +- **镜像仓库(双推)**:阿里云 ACR 个人版 (cn-beijing) `b4/speakup` + GitHub GHCR `ghcr.io/makewheels/speakup`,每次部署同 tag 双推(`latest` + `YYYYMMDD-HHMMSS-NNNN`)。**生产只拉 ACR**(北京机房速度快);GHCR 面向开源分发。GHCR 登录用内置 `GITHUB_TOKEN`(job 需 `packages: write`),无额外凭据。 - **凭据**:阿里云 ACR 登录凭据存 `speakup/prod/deployment`;runner 和生产机均使用一次性 Docker 配置目录,任务结束即清理。 - **回滚**:旧 `:latest` 转 `:previous`,`docker tag :previous :latest && docker compose up -d`。