ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ente 服务器镜像发布指南:基于 GitHub Actions 的 Museum 镜像构建与分发全解析

Ente 服务器镜像发布指南:基于 GitHub Actions 的 Museum 镜像构建与分发全解析 Ente 服务器镜像发布指南基于 GitHub Actions 的 Museum 镜像构建与分发全解析【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente本文系统梳理 Ente 开源仓库中server/docs/publish.md所定义的服务器Museum镜像发布流程包括通过 Release (Server) 工作流发布内部镜像到 Scaleway 私有仓库、通过 Publish GHCR (Server) 工作流按月发布公共镜像到 GitHub Container Registry并结合 server/Dockerfile、.github/workflows/server-release.yml、.github/workflows/server-publish-ghcr.yml 与部署脚本逐层拆解镜像的构建、打标、发布、拉取与回滚链路帮助读者掌握 Ente 服务器镜像的完整生命周期管理方法。一、发布文档概述两条镜像发布路径Ente 的服务器组件名为Museum是仓库server/目录下用 Go 编写的 API 服务器入口见 server/cmd/museum/main.go。server/docs/publish.md 定义了它的镜像发布策略核心内容可归纳为两条相互独立的发布路径发布路径工作流文件触发方式目标仓库镜像名内部发布Internalserver-release.yml手动触发Scaleway 私有 Registryrg.fr-par.scw.cloud/ente/museum-prod公共发布GHCRserver-publish-ghcr.yml每月 15 日定时 手动触发GitHub Container Registryghcr.io/ente/server两者互不替代内部发布面向 Ente 自身的生产环境公共发布面向自托管用户与外部使用者。下面分别深入讲解。二、内部发布Release (Server) 工作流2.1 触发方式按照 server/docs/publish.md 的说明内部发布可以有两种等价触发方式在 GitHub Actions 界面手动运行Release (Server)工作流在本地安装 GitHub CLIgh后于仓库根目录执行gh workflow run server-release.yml默认行为是把当前main分支的最新一次提交发布到 Scaleway 私有镜像仓库。2.2 工作流源码级拆解.github/workflows/server-release.yml 完整实现了上述逻辑关键环节如下触发声明工作流只声明了workflow_dispatch一种触发事件没有 cron 定时任务——这正对应文档中手动运行的描述运行环境任务运行在ubuntu-latest上并显式绑定environment: production环境便于在 GitHub 侧做环境级保护与密钥隔离登录私有仓库使用仓库 Secrets 中的DOCKER_USERNAME/DOCKER_PASSWORD登录rg.fr-par.scw.cloudrun: printf %s ${DOCKER_PASSWORD} | docker login rg.fr-par.scw.cloud --username ${DOCKER_USERNAME} --password-stdin构建并推送使用 Buildx 一次构建、双标签推送docker buildx build --push \ --file server/Dockerfile \ --build-arg GIT_COMMIT${GITHUB_SHA} \ --tag rg.fr-par.scw.cloud/ente/museum-prod:${GITHUB_SHA} \ --tag rg.fr-par.scw.cloud/ente/museum-prod:latest \ server这里有两个值得注意的工程细节双标签策略镜像同时打上「提交 SHA」与latest两个标签。SHA 标签保证镜像可精确追溯、支持按版本回滚latest标签则让生产节点可以简单拉取最新镜像GIT_COMMIT构建参数把当前构建的提交 SHA 注入镜像内环境变量见下文 Dockerfile 分析使运行中的进程可以报告自身版本——这一点会在 GHCR 工作流中被反过来利用用于从生产环境反查线上提交。2.3 发布后的去向文档明确指出内部发布默认把镜像推送到 Scaleway Registry部署说明见 server/scripts/deploy/README.md。也就是说server-release.yml只管构建与推送镜像真正的生产部署由 systemd Docker 的运维体系负责两者解耦。部署细节将在本文第五、六节展开。三、公共发布Publish GHCR (Server) 工作流3.1 触发方式与频率Publish GHCR (Server) 工作流.github/workflows/server-publish-ghcr.yml定义了两种触发定时触发每月 15 日约 10:30IST自动执行schedule: # Monthly on the 15th at ~10:30 AM IST - cron: 0 5 15 * *手动触发同样支持workflow_dispatch可随时运行gh workflow run server-publish-ghcr.yml3.2 与内部发布的最大差异发布生产线上正在跑的提交这是两条流水线最本质的区别也是 GHCR 工作流最精妙的部分——它发布的不是最新代码而是当前正在生产环境运行的提交。整个流程分为四个步骤步骤一从生产环境反查线上提交。工作流调用生产 API 的健康检查端点读取当前生产 Museum 进程报告的 Git 提交 IDmuseum_commit$(curl -s https://api.ente.com/ping | jq -r .id) [[ ${museum_commit} ~ ^[0-9a-f]{40}$ ]]随后校验该提交是否确实存在且发布成功过在server-release.yml中查询该提交的成功运行记录只有校验通过才会继续[[ $(gh run list \ --repo ${GITHUB_REPOSITORY} \ --workflow server-release.yml \ --commit ${museum_commit} \ --status success \ --limit 1 \ --json databaseId \ --jq length) -gt 0 ]]这里能实现从/ping拿到的id就是 Git SHA这一约定正是得益于 2.2 节中GIT_COMMIT构建参数的注入——构建与运行时信息闭环由此打通。步骤二签出该提交。用actions/checkout检出刚确认的museum_commit确保构建产物与生产二进制完全同源with: ref: ${{ env.museum_commit }}步骤三登录 GHCRrun: printf %s ${GITHUB_TOKEN} | docker login ghcr.io --username ${GITHUB_ACTOR} --password-stdin步骤四多平台构建并推送。与内部发布相比GHCR 发布是多架构构建一次覆盖linux/amd64与linux/arm64两个平台标签同样为「提交 SHA latest」docker buildx create --use docker buildx build --push \ --file server/Dockerfile \ --platform linux/amd64,linux/arm64 \ --build-arg GIT_COMMIT${museum_commit} \ --tag ghcr.io/ente/server:${museum_commit} \ --tag ghcr.io/ente/server:latest \ server由此自托管用户每月可获取到与 Ente 官方生产环境完全一致的服务器镜像且支持在 ARM 架构如树莓派、ARM 云主机上运行。四、镜像构建细节多阶段 Dockerfile两条流水线共用同一个构建文件 server/Dockerfile理解它有助于把握发布产物的构成FROM golang:1.26.4-alpine3.23 AS builder ENV CGO_ENABLED0 WORKDIR /etc/ente/ COPY go.mod . COPY go.sum . RUN go mod download COPY . . RUN --mounttypecache,target/root/.cache/go-build \ go build -trimpath -o museum cmd/museum/main.go FROM alpine:3.22 COPY --frombuilder /etc/ente/museum . COPY configurations configurations COPY migrations migrations COPY mail-templates mail-templates COPY web-templates web-templates ARG GIT_COMMIT ENV GIT_COMMIT$GIT_COMMIT CMD [./museum]值得向读者强调的实现要点构建阶段在golang:1.26.4-alpine3.23中编译设置CGO_ENABLED0产出纯静态二进制不依赖 glibc便于在任何 Linux 容器/主机上运行并使用-trimpath去除构建路径信息以提升可复现性与安全性缓存优化先单独复制go.mod/go.sum并执行go mod download利用 Docker 层缓存避免依赖变化时全量重下构建缓存通过--mounttypecache挂载进一步加速 CI 中的重复构建运行阶段最终镜像仅基于alpine:3.22只拷贝编译产物与运行必需的configurations、migrations、mail-templates、web-templates目录镜像体积被控制在很小范围版本注入ARG GIT_COMMIT/ENV GIT_COMMIT将发布时的提交 SHA 固化进镜像环境变量——这正是 3.2 节中生产环境/ping接口能够报告id的来源。五、生产部署体系镜像发布的下游消费方server/docs/publish.md 明确指引读者查阅 server/scripts/deploy/README.md。该文档说明了 Ente 官方生产环境的部署模式对自托管用户一般不需要在 Ubuntu 主机上用 Docker 运行 Museum 镜像并通过 systemd 进行进程管理与仓库其余基础设施采用相同的服务模式。核心要素包括镜像拉取与更新脚本server/scripts/deploy/update-and-restart-museum.sh两种 systemd 单元直接运行容器的 museum.service 与置于 Nginx 之后的museum.nginx.service运维命令systemctl start|stop|status museum用于管理运行中的镜像。5.1 更新与重启脚本update-and-restart-museum.sh 是消费latest标签的典型实现其执行逻辑为若容器正在运行先把当前镜像打上museum-prod:previous标签作为回滚锚点sudo docker tag $(sudo docker inspect -f {{.Image}} museum) rg.fr-par.scw.cloud/ente/museum-prod:previous拉取最新的rg.fr-par.scw.cloud/ente/museum-prod镜像通过systemctl restart museum以新镜像重启服务健康探测对https://localhost/ping做带重试的 curl 检查输出服务状态与最近 20 行日志便于确认发布是否成功。5.2 systemd 单元中的镜像运行方式museum.service 展示了镜像运行时挂载的关键路径ExecStartdocker run --name museum \ -e ENVIRONMENTproduction \ --hostname %H \ -p 443:443 \ -p 2112:2112 \ -v /root/museum/credentials:/credentials:ro \ -v /root/museum/credentials.yaml:/credentials.yaml:ro \ -v /root/museum/data:/data:ro \ -v /root/var:/var \ rg.fr-par.scw.cloud/ente/museum-prod可见生产容器以只读方式挂载凭据与数据目录/credentials、/credentials.yaml、/data对外暴露 443HTTPS API与 2112指标端口并将日志写入宿主机/root/var。5.3 回滚机制部署文档给出了明确的回滚操作见 server/scripts/deploy/README.md。回滚依赖 5.1 节中预先打好的previous标签sudo docker tag rg.fr-par.scw.cloud/ente/museum-prod:previous rg.fr-par.scw.cloud/ente/museum-prod:latest sudo systemctl restart museum[!NOTE]回滚的硬性限制如果回滚涉及数据库迁移migrations该方案无效——数据库结构无法随镜像简单回退。此外需要恢复本地latest与仓库镜像一致时重跑更新脚本或手动docker pull即可。六、自托管用户如何获取已发布镜像对于不关心 Ente 内部发布链路的自托管用户GHCR 公共镜像正是为他们准备的。参考 server/docs/quickstart.md 可知最便捷的方式是使用quickstart.sh脚本从预构建镜像直接拉起整套服务无需克隆仓库或自行构建sh -c $(curl -fsSL 仓库内 quickstart.sh 原始链接)脚本会在当前目录创建my-ente/生成compose.yaml与museum.yaml含自动生成的凭据然后启动 museum、web、postgres、minio 等服务。其端口规划如下服务端口说明museum:8080Ente 的 API 服务器web:3000Ente Photos Web 应用web:3002Ente 公共相册应用postgres—数据库minio:3200对象存储启动后可用curl localhost:8080/ping做冒烟测试。服务编排模板见 server/config/compose.yaml其中 museum 服务通过depends_on等待 postgres 健康检查通过、以只读方式挂载museum.yaml与数据目录并借助alpine/socat将容器内的localhost:3200转发到 minio。需要提醒的运维要点均出自 quickstart.mdmuseum.yaml包含实例唯一凭据必须妥善保管丢失后无法访问卷中的数据删除my-ente/目录不会删除 Docker 卷若要彻底重建需在正确目录下执行docker compose down --volumes该操作会永久删除包括已上传照片在内的全部数据遇到pq: password authentication failed时常见原因是重建了my-ente目录却残留了旧的my-ente_postgres-data与my-ente_minio-data卷该快速启动方案仅用于入门若用于严肃场景建议理解全部组件并考虑使用外部 S3 对象存储与外部数据库替换内置样例。七、发布与获取的最佳实践小结结合 server/docs/publish.md 与工作流源码可总结出 Ente 服务器镜像发布体系的设计要点发布与部署解耦CI 只负责构建 推送生产节点通过 systemd 拉取脚本消费镜像便于独立扩缩容与灰度双标签可追溯所有发布均同时打「提交 SHA」与latestSHA 标签保证精确回滚能力latest保证运维简单生产即公共GHCR 每月发布的正是生产环境运行的提交经由/ping反查校验让自托管用户始终能对齐官方生产版本且覆盖 amd64/arm64 双架构版本自述GIT_COMMIT从构建参数注入镜像环境变量形成构建 → 发布 → 运行 → 溯源的完整闭环回滚有边界镜像级回滚不适用于已执行数据库迁移的发布需要将数据库变更纳入回滚评估。无论是想要在本地/云上自托管 Ente、还是希望深入理解一套真实项目的镜像发布流水线设计以上两条工作流与配套部署脚本都是极具参考价值的实践范本。【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表