diff --git a/README.md b/README.md index 0b99621..c80993b 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ docker volume ls | grep woc # 看所有微信实例的数据卷 **方式 A · 本地自构建(官方尚未发布镜像时用这个)** ```bash -git clone WechatOnCloud +git clone https://github.com/Gloridust/WechatOnCloud.git WechatOnCloud cd WechatOnCloud cp .env.example .env # 至少改掉默认密码 WOC_PASSWORD ./scripts/build-local.sh # 构建面板 + 微信实例镜像,打成 compose 用的同名标签 @@ -128,7 +128,7 @@ docker compose up -d # compose 默认优先用本地镜像,不会 **方式 B · 拉取官方镜像(已发布到 GHCR 后)** ```bash -git clone WechatOnCloud +git clone https://github.com/Gloridust/WechatOnCloud.git WechatOnCloud cd WechatOnCloud cp .env.example .env # 至少改掉默认密码 WOC_PASSWORD docker compose up -d # 直接从 GHCR 拉取 @@ -182,13 +182,47 @@ docker compose up -d # 直接从 GHCR 拉取 ## 发布到 GHCR +两种方式任选其一。 + +### 方式 A · GitHub Actions(推荐) + 仓库自带 GitHub Actions([.github/workflows/release.yml](.github/workflows/release.yml)),在你**推送 `vX.Y.Z` 标签或发布 Release** 时,自动构建多架构(amd64+arm64)镜像并推到 GHCR: ```bash git tag v1.0.0 git push origin v1.0.0 # 触发 Actions,产出 ghcr.io//woc-panel:1.0.0 等标签 +# 或在 GitHub 上 Publish 一个 Release(会额外打 latest): +gh release create v1.0.0 --title v1.0.0 --notes "..." ``` +> 注意:单纯 push tag 只产出 `X.Y.Z / X.Y / X`,**不会更新 `latest`**;要更新 `latest` 请改用 **发布 Release** 或在 Actions 里手动 `workflow_dispatch`。 + +### 方式 B · 本机 buildx 手动构建并推送(不走 Actions) + +适合想立刻出包、或不依赖 CI 的场景。需要 Docker Buildx(Docker Desktop 自带;纯 Linux 跨架构需先装 QEMU:`docker run --privileged --rm tonistiigi/binfmt --install all`)。 + +```bash +# 1) 登录 GHCR(PAT 需 write:packages 权限) +echo | docker login ghcr.io -u --password-stdin + +# 2) 首次创建并启用多架构构建器(已建过改用 docker buildx use woc) +docker buildx create --name woc --use + +# 3) 构建并推送两个镜像(amd64 + arm64)。VER 与 git tag 保持一致(不带 v) +VER=1.0.1 +docker buildx build --platform linux/amd64,linux/arm64 \ + -t ghcr.io/gloridust/woc-panel:$VER -t ghcr.io/gloridust/woc-panel:latest \ + --push ./panel +docker buildx build --platform linux/amd64,linux/arm64 \ + -t ghcr.io/gloridust/wechat-on-cloud:$VER -t ghcr.io/gloridust/wechat-on-cloud:latest \ + --push ./docker +``` + +> 把 `gloridust` 换成你的 GHCR 命名空间(与 `docker-compose.yml` / `WOC_IMAGE_PREFIX` 一致)。 +> 只想本机自用、不推 GHCR,用 [`./scripts/build-local.sh`](scripts/build-local.sh) 构建本机架构单架构镜像即可。 + +### 发布后:把包设为公开 + 首次发布后还需把 GHCR 包设为公开,否则别人 `docker compose up -d` 会报 `denied`: 1. 打开 GitHub → 你的头像 → **Packages** → 分别进入 `woc-panel`、`wechat-on-cloud`; diff --git a/panel/web/public/favicon.svg b/panel/web/public/favicon.svg index 942b800..79703ba 100644 --- a/panel/web/public/favicon.svg +++ b/panel/web/public/favicon.svg @@ -7,9 +7,8 @@ - - - + + diff --git a/panel/web/public/icon-180.png b/panel/web/public/icon-180.png index 1365a11..d3ec46b 100644 Binary files a/panel/web/public/icon-180.png and b/panel/web/public/icon-180.png differ diff --git a/panel/web/public/icon-192.png b/panel/web/public/icon-192.png index f3fad24..8e6c77b 100644 Binary files a/panel/web/public/icon-192.png and b/panel/web/public/icon-192.png differ diff --git a/panel/web/public/icon-512.png b/panel/web/public/icon-512.png index ada061c..312d613 100644 Binary files a/panel/web/public/icon-512.png and b/panel/web/public/icon-512.png differ diff --git a/panel/web/scripts/gen-icons.mjs b/panel/web/scripts/gen-icons.mjs index 5f512cd..f225d8e 100644 --- a/panel/web/scripts/gen-icons.mjs +++ b/panel/web/scripts/gen-icons.mjs @@ -56,15 +56,14 @@ function makePng(size) { const stroke = (7.5 / 2) * s; // 笔画半宽 // 提示符坐标(基于 100 视图) const chevron = [ - [34, 30], - [48, 44], - [34, 58], + [28, 24], + [42, 38], + [28, 52], ].map(([x, y]) => [x * s, y * s]); const underline = [ - [56, 60], - [72, 60], + [50, 54], + [66, 54], ].map(([x, y]) => [x * s, y * s]); - const dot = [22 * s, 36 * s, 3.4 * s]; // cx, cy, r const inRounded = (x, y) => { const r = radius; @@ -93,7 +92,6 @@ function makePng(size) { cov = Math.max(cov, clamp01(stroke - distToSeg(gx, gy, chevron[0][0], chevron[0][1], chevron[1][0], chevron[1][1]) + 0.5)); cov = Math.max(cov, clamp01(stroke - distToSeg(gx, gy, chevron[1][0], chevron[1][1], chevron[2][0], chevron[2][1]) + 0.5)); cov = Math.max(cov, clamp01(stroke - distToSeg(gx, gy, underline[0][0], underline[0][1], underline[1][0], underline[1][1]) + 0.5)); - cov = Math.max(cov, clamp01(dot[2] - Math.hypot(gx - dot[0], gy - dot[1]) + 0.5)); const o = y * rowLen + 1 + x * 4; raw[o] = Math.round(bg[0] + (WHITE[0] - bg[0]) * cov);