From 3b024fdc1062a58a26f4e2595246dca4970eba5c Mon Sep 17 00:00:00 2001 From: Wang Defa <1+wangdefa@noreply.gitea.bcde.io> Date: Wed, 10 Jun 2026 14:55:12 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=BA=20musl=20=E7=BA=AF?= =?UTF-8?q?=E9=9D=99=E6=80=81=E6=89=93=E5=8C=85=EF=BC=8C=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E8=BF=81=20/etc=EF=BC=8C=E5=AF=B9=E9=BD=90=E4=B8=89=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- .gitea/workflows/ci.yaml | 57 ++++--- .gitignore | 8 +- CLAUDE.md | 61 ++++++++ README.md | 139 ++++++++---------- .../params.conf.example | 2 +- debian/build-deb.sh | 8 +- debian/control.template | 1 - debian/p2pool.service | 2 +- debian/postinst | 123 +++++----------- debian/postrm | 3 +- debian/prerm | 49 +++--- docker/Dockerfile | 74 ++++++++++ docker/Dockerfile.alpine | 46 ------ docker/Dockerfile.ubuntu | 46 ------ 14 files changed, 307 insertions(+), 312 deletions(-) create mode 100644 CLAUDE.md rename params.conf.example => conf/params.conf.example (98%) create mode 100644 docker/Dockerfile delete mode 100644 docker/Dockerfile.alpine delete mode 100644 docker/Dockerfile.ubuntu diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 769b95d..c7567b3 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -9,7 +9,7 @@ on: env: DOCKER_BUILDKIT: "1" PRODUCT_NAME: "p2pool" - PACKAGE_VERSION: "v4.15.1" + PACKAGE_VERSION: "4.15.1" BUILDX_NO_DEFAULT_ATTESTATIONS: "1" jobs: @@ -18,7 +18,6 @@ jobs: strategy: matrix: arch: [amd64, arm64] - distro: [ubuntu, alpine] steps: - uses: actions/checkout@v4 @@ -35,11 +34,10 @@ jobs: - name: Build binaries run: | - P2POOL_VERSION=${PACKAGE_VERSION} PLATFORM="linux/${{ matrix.arch }}" + P2POOL_VERSION="v${PACKAGE_VERSION}" # 上游 p2pool git tag 带 v 前缀,需补回 - echo "🏗️ Building ${PLATFORM} on native ${{ matrix.arch }} runner" - echo "📦 Distribution: ${{ matrix.distro }}" + echo "🏗️ Building ${PLATFORM} on native ${{ matrix.arch }} runner (musl 纯静态)" # 设置 BuildKit 优化参数 export BUILDKIT_PROGRESS=plain @@ -48,7 +46,7 @@ jobs: --platform ${PLATFORM} \ --build-arg P2POOL_VERSION=${P2POOL_VERSION} \ --output type=local,dest=./output \ - -f docker/Dockerfile.${{ matrix.distro }} . + -f docker/Dockerfile . - name: Package and test run: | @@ -59,24 +57,25 @@ jobs: exit 1 fi - TARGZ="${PRODUCT_NAME}-${{ matrix.arch }}-${{ matrix.distro }}-${PACKAGE_VERSION}.tar.gz" + TARGZ="${PRODUCT_NAME}-${{ matrix.arch }}-linux-static-${PACKAGE_VERSION}.tar.gz" tar -czf "${TARGZ}" -C "$DIR" . echo "📦 Created package: ${TARGZ}" ls -lh "${TARGZ}" - # 快速验证 + # 快速验证:--help 冒烟 + ldd 纯静态校验(musl 静态可在 glibc runner 直接跑) mkdir -p test && tar -xzf "${TARGZ}" -C test - test/p2pool --help 2>/dev/null || echo "⚠️ Help displayed" + test/p2pool --help >/dev/null 2>&1 && echo "✅ --help OK" || echo "⚠️ --help 退出非0" + ldd test/p2pool 2>&1 | grep -qE 'statically linked|not a dynamic executable' \ + && echo "✅ fully-static(无动态依赖,跨发行版)" || { echo "⚠️ 非纯静态:"; ldd test/p2pool; } rm -rf test - name: Build Debian package - if: matrix.distro == 'ubuntu' run: | # 安装 dpkg-deb(如果需要) sudo apt-get update && sudo apt-get install -y dpkg-dev - TARGZ="${PRODUCT_NAME}-${{ matrix.arch }}-${{ matrix.distro }}-${PACKAGE_VERSION}.tar.gz" + TARGZ="${PRODUCT_NAME}-${{ matrix.arch }}-linux-static-${PACKAGE_VERSION}.tar.gz" echo "📦 Building Debian package for ${{ matrix.arch }}..." chmod +x debian/build-deb.sh @@ -86,7 +85,7 @@ jobs: - uses: https://github.com/ChristopherHX/gitea-upload-artifact@v4 with: - name: binaries-${{ matrix.arch }}-${{ matrix.distro }} + name: binaries-${{ matrix.arch }} path: | *.tar.gz *.deb @@ -114,12 +113,13 @@ jobs: REGISTRY=$(echo "${{ gitea.server_url }}" | sed 's|https\?://||') OWNER="${{ gitea.repository_owner }}" REPO_NAME=$(echo "${{ gitea.repository }}" | cut -d'/' -f2) + VERSION="${TAG#v}" # 包版本:去掉 git tag 的 v 前缀(registry 路径/下载名/Release 标题统一用纯数字) echo "📦 上传包到 Generic Package Registry..." echo " Registry: ${REGISTRY}" echo " Owner: ${OWNER}" echo " Package: ${PRODUCT_NAME}" - echo " Version: ${TAG}" + echo " Version: ${VERSION}" # 上传所有 tar.gz 包到 Generic Package Registry for file in *.tar.gz; do @@ -128,7 +128,7 @@ jobs: curl -fsSL -X PUT \ -H "Authorization: token ${TOKEN}" \ --upload-file "$file" \ - "https://${REGISTRY}/api/packages/${OWNER}/generic/${PRODUCT_NAME}/${TAG}/$file" || { + "https://${REGISTRY}/api/packages/${OWNER}/generic/${PRODUCT_NAME}/${VERSION}/$file" || { echo "❌ 上传失败: $file" exit 1 } @@ -151,12 +151,35 @@ jobs: } done - # 生成 Release JSON payload + # 生成 Release 描述 echo "" echo "📝 生成 Release..." - export REGISTRY OWNER TAG - RELEASE_DATA=$(python3 -c 'import json,glob,os;r=os.environ["REGISTRY"];o=os.environ["OWNER"];p=os.environ["PRODUCT_NAME"];t=os.environ["TAG"];b=["## Release "+t,"","### 📥 下载方式","","#### 方式 1: 直接下载(推荐)","","点击下面 **Assets** 部分的文件名直接下载。","","#### 方式 2: Generic Package Registry",""]+[f"- [`{f}`](https://{r}/api/packages/{o}/generic/{p}/{t}/{f})" for f in sorted(glob.glob("*.tar.gz"))]+["","#### 方式 3: Debian Repository","","```bash","# Download GPG key",f"sudo curl https://{r}/api/packages/{o}/debian/repository.key -o /etc/apt/keyrings/gitea-{o}.asc","","# Add repository",f"echo \"deb [signed-by=/etc/apt/keyrings/gitea-{o}.asc] https://{r}/api/packages/{o}/debian stable main\" | sudo tee -a /etc/apt/sources.list.d/{o}.list","","# Update and install","sudo apt-get update",f"sudo apt-get install {p}","```"];print(json.dumps({"tag_name":t,"name":f"Release {t}","body":"\n".join(b),"draft":False,"prerelease":False}))') + # 拼接 tar.gz 下载链接 + ASSETS=$(for f in *.tar.gz; do + [ -f "$f" ] || continue + echo "- [\`$f\`](https://${REGISTRY}/api/packages/${OWNER}/generic/${PRODUCT_NAME}/${VERSION}/$f)" + done) + + BODY=$(cat < **与同目录 `gitea-xxxig` / `gitea-xxxig-proxy` / `gitea-mond` 的关系**:四者共享同一套 CI / build-deb / debian 打包骨架,且均为 **musl fully-static** 构建。差异:xxxig 系是 XMRig 换名仓库源码;mond 克隆 Monero 官方靠 init.sh 现场换名;p2pool 直接构建官方源码、不换名,版本号纯数字(`4.15.1`,上游 git tag 带 v、构建时补回)。 + +## 整体架构:单二进制 + +编译产出单个可执行文件 `p2pool`:连接 monerod(本地,或经 `--rpc-ssl` 连外部 SSL 节点)、维护 P2Pool sidechain、提供 stratum 给矿工。配置模板 [conf/params.conf.example](conf/params.conf.example)。 + +## 构建与发布流程(CI) + +[.gitea/workflows/ci.yaml](.gitea/workflows/ci.yaml) 是 Gitea Actions 流水线: + +1. **build-and-test**(矩阵 `arch=[amd64,arm64]`,跑在对应架构原生 runner):用 `docker buildx` 按 [docker/Dockerfile](docker/Dockerfile) 原生编译 → 打成 tar.gz → 解包冒烟(`p2pool --help` + `ldd` 纯静态校验)→ 调 `debian/build-deb.sh` 打 .deb → 上传 artifact。 +2. **release**(仅 tag 触发):下载 artifact,上传 tar.gz 到 Generic Package Registry、上传 .deb 到 Debian Registry(stable/main),并用 python3 生成描述创建 Gitea Release。 + +关键点: +- **musl fully-static(Alpine 构建,勿改回 glibc)**:上游 p2pool **官方 release 二进制即用此法**(见上游 `.github/workflows/c-cpp.yml` 的 Alpine static job)。[docker/Dockerfile](docker/Dockerfile) 在 `alpine:3.21` 下自编 external 静态库(curl/libuv/libzmq)+ 上游 boringssl,再 `-DSTATIC_BINARY=ON` 全静态。产物 `ldd` = `not a dynamic executable`、零外部依赖,**glibc/musl 任意发行版直接运行**(实测 musl 产物在 Debian 13 上正常 `--help`)。 +- **为何用 musl 而非 glibc**:musl 的 `getaddrinfo` 自带实现,全静态也能解析 DNS;glibc 静态会因 NSS 运行时 `dlopen` 失败。与 `gitea-xxxig`/`gitea-xxxig-proxy`/`gitea-mond` 一致。曾用的 `Dockerfile.ubuntu`(glibc 动态)与 `Dockerfile.alpine`(动态链 system 库)均已删除。 +- **依赖处理(关键,勿乱改)**: + - external 依赖**子模块自带源码**,逐个编静态(`BUILD_SHARED_LIBS=OFF` 等)。**只拉构建所需的 8 个子模块**,grpc 仅取其 `third_party/boringssl-with-bazel`,**不递归 grpc 其余巨型子模块**(abseil/protobuf 等,体积上 GB)。 + - **p2pool 主体无条件依赖 boringssl**(`cmake/ssl/CMakeLists.txt` 的 `add_subdirectory`),与 `WITH_GRPC` 无关——故即使 `WITH_GRPC=OFF` 也必须拉 boringssl。 + - **curl 用 boringssl TLS(保留 rpc-ssl,勿改回 no-SSL)**:完整照搬官方 `c-cpp.yml` 的 curl flags——`P2POOL_BORINGSSL=ON`(上游给 curl 的独立 boringssl 后端补丁,与 `CURL_ENABLE_SSL=OFF` 共存、不走 curl 标准 SSL 路径)+ 一整套 `CURL_DISABLE_*`(尤其 `SRP`/`AWS`/`*_AUTH`)。后者跳过会引用 `OpenSSL::SSL` imported target 的 `curl_openssl_check_exists` 符号检测(新版 cmake 在 `try_compile` 阶段校验该 target 必失败,**少一个 disable 都会触发**)。curl 与 p2pool 主体共用同一 boringssl,`json_rpc_request` 的 `CURLOPT_SSL_CTX_FUNCTION` 才能接管证书指纹校验——**`--rpc-ssl`/`--rpc-ssl-fingerprint` 连外部 SSL monerod 的能力得以保留**(已实测连真实 SSL 节点用 `--rpc-ssl` 拿到链上高度)。曾误用 no-SSL curl 会断此能力,勿回退。 +- **版本号约定**:包版本硬编码在 ci.yaml 的 `PACKAGE_VERSION: "4.15.1"`(**纯数字、无 v**,符合 Debian 版本规范)。**关键分界**:上游 p2pool git tag 带 `v`,故 build job 用 `P2POOL_VERSION="v${PACKAGE_VERSION}"` 补回 v 传给 Dockerfile `git checkout`;tar.gz / deb / registry 路径 / Release 标题等包版本一律直接用 `${PACKAGE_VERSION}`;release job 用 `VERSION="${TAG#v}"` 归一(tag 带不带 v 都兼容,唯 Release 的 `tag_name` 用 git tag 原值)。CI 触发条件 `tags: ['*']`,发版改 `PACKAGE_VERSION` 并打对应 tag(纯数字,如 `4.15.1`)。 +- 架构映射:Dockerfile 内 `arm64→ARCH_ID=aarch64`、`amd64→ARCH_ID=x86_64`(传给 p2pool cmake,控制 RandomX 优化)。 +- tar.gz 下载 URL 形如 `https://gitea.bcde.io/api/packages/wangdefa/generic/p2pool/{version}/p2pool-{arch}-linux-static-{version}.tar.gz`(version 为纯数字)。 + +## 本地常用命令 + +```bash +# 本地编译某架构的二进制(输出到 ./output/linux_/p2pool) +docker buildx build --platform linux/amd64 \ + --build-arg P2POOL_VERSION=v4.15.1 \ + --output type=local,dest=./output \ + -f docker/Dockerfile . + +# 校验纯静态(应输出 "not a dynamic executable") +ldd output/linux_amd64/p2pool + +# 用已有 tar.gz 打 .deb 包(第三个参数是 tar.gz) +./debian/build-deb.sh amd64 4.15.1 p2pool-amd64-linux-static-4.15.1.tar.gz +``` + +无单元测试;CI 唯一冒烟是解包后跑 `p2pool --help`(musl 纯静态可在 glibc runner 直接运行),并用 `ldd` 校验为纯静态。 + +## Debian 包布局与服务 + +- 二进制装到 `/opt/p2pool/p2pool`,systemd 服务 [debian/p2pool.service](debian/p2pool.service),维护脚本 `debian/{postinst,prerm,postrm}`。 +- **配置流转(单一数据源,对齐 gitea-mond)**:`conf/params.conf.example` 是唯一配置源 → build-deb.sh 复制进包内 `/opt/p2pool/params.conf` → postinst 首次安装时 `cp` 到 `/etc/p2pool/params.conf`(**升级不覆盖**用户已有配置;旧版本位于 `/var/lib/p2pool/params.conf` 时 postinst 自动迁移到 `/etc/p2pool/`)。service 的 `ExecStart` 用 `--params-file /etc/p2pool/params.conf`。**改默认配置改 conf/params.conf.example 一处即可**(不要再在 postinst 内联 heredoc)。 +- 数据目录 `/var/lib/p2pool/data-api`、日志目录 `/var/log/p2pool`,均归 `p2pool` 系统用户。postinst 创建 `p2pool` 系统用户/组,**服务不自动启用/启动**(首次需用户配置钱包地址),升级时若服务原为 enabled 则重启加载新二进制。 +- control.template **无 `Depends` 字段**(纯静态,连 libc6/libuv1/libzmq5/libcurl4 都不需要)。 diff --git a/README.md b/README.md index 88ac49d..686b07f 100644 --- a/README.md +++ b/README.md @@ -1,102 +1,91 @@ -# P2Pool Docker 构建基础设施 +# P2Pool -[![Build Status](https://img.shields.io/badge/build-passing-brightgreen.svg)]() -[![License](https://img.shields.io/badge/license-MIT-blue.svg)]() +P2Pool 是 [SChernykh/p2pool](https://github.com/SChernykh/p2pool) 的定制打包——Monero 去中心化矿池的 sidechain 节点。对上游唯一定制是**禁用合并挖矿捐赠**(`-DWITH_MERGE_MINING_DONATION=OFF`),不改源码。 -为 [p2pool](https://github.com/SChernykh/p2pool) 提供的自动化 Docker 构建和打包系统。 +**本仓库只包含构建与打包基础设施**,不含 p2pool 源码:二进制在 CI 中从上游官方仓库 `github.com/SChernykh/p2pool` 编译,再打包分发到 [gitea.bcde.io](https://gitea.bcde.io) 的 Generic / Debian 包仓库。 -## 📋 项目简介 +## 产物 -这是一个专业的构建基础设施项目,用于自动化构建、打包和分发 p2pool(Monero 去中心化矿池)的多架构二进制文件和 Debian 软件包。 +每次构建产出单个可执行文件(musl 纯静态,自带 boringssl/libuv/libzmq,无外部动态库依赖,任意 Linux 发行版可跑): -**关键特性**: -- 🏗️ 多架构支持(amd64、arm64) -- 📦 多发行版构建(Alpine、Ubuntu) -- 🤖 全自动 CI/CD 流程 -- 🔒 禁用合并挖矿捐赠 -- 📊 原生架构构建(无 QEMU) +| 二进制 | 作用 | +|---|---| +| `p2pool` | P2Pool sidechain 节点:连接 monerod、维护 sidechain、向矿工提供 stratum | -## 🚀 快速开始 +支持架构 `amd64` / `arm64`;musl 纯静态,任意 Linux 发行版(Debian/Ubuntu/Alpine/CentOS 等)开箱即跑。静态构建仍保留 `--rpc-ssl`,可连接外部 SSL monerod 节点。 -### Debian/Ubuntu(推荐) +## 安装 + +### APT(Debian / Ubuntu) ```bash -# 下载 GPG 密钥 sudo curl https://gitea.bcde.io/api/packages/wangdefa/debian/repository.key -o /etc/apt/keyrings/gitea-wangdefa.asc - -# 添加仓库 -echo "deb [signed-by=/etc/apt/keyrings/gitea-wangdefa.asc] https://gitea.bcde.io/api/packages/wangdefa/debian stable main" | sudo tee -a /etc/apt/sources.list.d/wangdefa.list - -# 更新并安装 -sudo apt-get update -sudo apt-get install p2pool +echo "deb [signed-by=/etc/apt/keyrings/gitea-wangdefa.asc] https://gitea.bcde.io/api/packages/wangdefa/debian stable main" | sudo tee /etc/apt/sources.list.d/wangdefa.list +sudo apt-get update && sudo apt-get install p2pool ``` -修改配置: +安装布局: + +| | 路径 | +|---|---| +| 二进制 | `/opt/p2pool/p2pool` | +| 默认配置 | `/opt/p2pool/params.conf`(postinst 复制到 `/etc/p2pool/params.conf`) | +| 数据 | `/var/lib/p2pool/data-api` | +| 日志 | `/var/log/p2pool/` | +| 服务 | `p2pool.service` | + +> 安装后服务**不会自动启动**(须先填钱包地址)。编辑 `/etc/p2pool/params.conf` 设置 Monero 钱包地址,再启用: +> +> ```bash +> sudo systemctl enable --now p2pool +> ``` + +### tar.gz(通用:Alpine / Ubuntu / Debian) + +从 Generic Package Registry 下载对应架构的 tar.gz,解压即用(单二进制): ```bash -# 设置你的 Monero 钱包地址 -sudo nano /var/lib/p2pool/params.conf - -# 启动服务 -sudo systemctl enable --now p2pool.service +curl -fSL -o p2pool.tar.gz \ + https://gitea.bcde.io/api/packages/wangdefa/generic/p2pool/4.15.1/p2pool-amd64-linux-static-4.15.1.tar.gz +tar -xzf p2pool.tar.gz +./p2pool --params-file params.conf # 配置模板见仓库 conf/params.conf.example ``` -### 本地构建 +## 构建与发布 + +CI 定义于 [.gitea/workflows/ci.yaml](.gitea/workflows/ci.yaml): + +- **push 到 `main`/`develop`**:矩阵 `arch=[amd64,arm64]`,在原生 runner 上用 Docker(musl 纯静态)编译为 tar.gz 并打 `.deb`。 +- **打 tag**:产物上传到 Generic / Debian 包仓库并创建 Release。 + +本地构建: ```bash -# Alpine 构建(推荐,体积更小) -docker buildx build --pull \ - --platform linux/amd64 \ +# 编译某架构二进制(输出到 ./output/linux_/p2pool) +docker buildx build --platform linux/amd64 \ --build-arg P2POOL_VERSION=v4.15.1 \ --output type=local,dest=./output \ - -f docker/Dockerfile.alpine . + -f docker/Dockerfile . -# Ubuntu 构建 -docker buildx build --pull \ - --platform linux/amd64 \ - --build-arg P2POOL_VERSION=v4.15.1 \ - --output type=local,dest=./output \ - -f docker/Dockerfile.ubuntu . +# 校验纯静态(应输出 "not a dynamic executable") +ldd output/linux_amd64/p2pool + +# 用产物 tar.gz 打 .deb +./debian/build-deb.sh amd64 4.15.1 p2pool-amd64-linux-static-4.15.1.tar.gz ``` -## 🏗️ 构建系统 +## 版本号约定 -### 支持的架构和平台 +- **上游源码 git tag** 带 `v`(如 `v4.15.1`),CI 用 `P2POOL_VERSION=v${PACKAGE_VERSION}` 检出。 +- **包版本**(tar.gz / deb / registry 路径)一律用数字(如 `4.15.1`),符合 Debian 版本规范。 -| 架构 | Alpine | Ubuntu | Debian 包 | -|------|--------|--------|-----------| -| amd64 | ✅ | ✅ | ✅ | -| arm64 | ✅ | ✅ | ✅ | +发版只需改 ci.yaml 的 `PACKAGE_VERSION`。 -### 构建产物 +## 目录结构 -- **二进制包** (`tar.gz`) - 适用于所有 Linux 发行版 -- **Debian 包** (`.deb`) - 适用于 Debian/Ubuntu 系统 - -## 🔧 配置管理 - -配置文件模板:[params.conf.example](params.conf.example) - -## 🔐 安全性 - -- ✅ 禁用上游合并挖矿捐赠 -- ✅ 使用专用用户运行服务 -- ✅ Systemd 安全加固 -- ✅ 最小权限原则 -- ✅ 安全的文件权限设置 - -## 📄 许可证 - -本项目为上游 [p2pool](https://github.com/SChernykh/p2pool) 提供构建基础设施。 - -上游项目许可证:GPL-3.0 - -## 🔗 相关链接 - -- **上游项目**: [SChernykh/p2pool](https://github.com/SChernykh/p2pool) -- **Monero**: [getmonero.org](https://www.getmonero.org/) - ---- - -**注意**: 本仓库不包含 p2pool 源代码,仅提供构建和打包基础设施。 +``` +.gitea/workflows/ CI 流水线 +docker/ Dockerfile(musl 纯静态,从上游官方源码编译) +debian/ .deb 打包:control 模板、维护脚本、systemd 服务 +conf/ params.conf.example 默认配置模板 +``` diff --git a/params.conf.example b/conf/params.conf.example similarity index 98% rename from params.conf.example rename to conf/params.conf.example index 86ad4b8..f6f9eec 100644 --- a/params.conf.example +++ b/conf/params.conf.example @@ -1,5 +1,5 @@ # P2Pool Configuration File Example -# Copy this file to /var/lib/p2pool/params.conf and edit as needed +# Copy this file to /etc/p2pool/params.conf and edit as needed # Compatible with: p2pool v4.15+ # ============================================================================= diff --git a/debian/build-deb.sh b/debian/build-deb.sh index 65e3b77..9ea514e 100755 --- a/debian/build-deb.sh +++ b/debian/build-deb.sh @@ -4,7 +4,7 @@ set -e # 参数检查 if [ $# -ne 3 ]; then echo "Usage: $0 " - echo "Example: $0 amd64 v4.15.1 p2pool-amd64-ubuntu-v4.15.1.tar.gz" + echo "Example: $0 amd64 4.15.1 p2pool-amd64-linux-static-4.15.1.tar.gz" exit 1 fi @@ -45,12 +45,15 @@ PKG_DIR="${BUILD_DIR}/${PKG_NAME}_${DEB_VERSION}_${DEB_ARCH}" mkdir -p "${PKG_DIR}/DEBIAN" mkdir -p "${PKG_DIR}/opt/p2pool" mkdir -p "${PKG_DIR}/lib/systemd/system" -mkdir -p "${PKG_DIR}/etc/p2pool" # 解压二进制文件 echo "📂 Extracting binaries..." tar -xzf "${TARGZ_FILE}" -C "${PKG_DIR}/opt/p2pool" +# 打入默认配置(conf/params.conf.example 为唯一配置源,postinst 据此生成 /etc/p2pool/params.conf) +echo "📄 Bundling default config..." +cp conf/params.conf.example "${PKG_DIR}/opt/p2pool/params.conf" + # 生成 control 文件 echo "📝 Generating control file..." sed -e "s/{{VERSION}}/${DEB_VERSION}/" \ @@ -72,6 +75,7 @@ cp debian/p2pool.service "${PKG_DIR}/lib/systemd/system/" # 设置权限 chmod 755 "${PKG_DIR}/opt/p2pool/p2pool" +chmod 644 "${PKG_DIR}/opt/p2pool/params.conf" chmod 644 "${PKG_DIR}/lib/systemd/system/p2pool.service" # 构建 deb 包 diff --git a/debian/control.template b/debian/control.template index fd77d9d..2ed63b0 100644 --- a/debian/control.template +++ b/debian/control.template @@ -3,7 +3,6 @@ Version: {{VERSION}} Section: net Priority: optional Architecture: {{ARCH}} -Depends: libc6, libuv1, libzmq5, libcurl4 Maintainer: P2Pool Team Homepage: https://github.com/SChernykh/p2pool Description: Decentralized pool for Monero mining diff --git a/debian/p2pool.service b/debian/p2pool.service index b20ddb9..741f0a0 100644 --- a/debian/p2pool.service +++ b/debian/p2pool.service @@ -8,7 +8,7 @@ Type=simple User=p2pool Group=p2pool WorkingDirectory=/var/lib/p2pool -ExecStart=/opt/p2pool/p2pool --params-file /var/lib/p2pool/params.conf +ExecStart=/opt/p2pool/p2pool --params-file /etc/p2pool/params.conf Restart=on-failure RestartSec=10s StandardOutput=journal diff --git a/debian/postinst b/debian/postinst index 1291277..a80f496 100755 --- a/debian/postinst +++ b/debian/postinst @@ -12,78 +12,48 @@ if ! getent passwd p2pool >/dev/null; then --gecos "P2Pool Service" p2pool fi -# Create data directory -mkdir -p /var/lib/p2pool/data-api -chown -R p2pool:p2pool /var/lib/p2pool -chmod -R 750 /var/lib/p2pool - -# Create example params.conf if it doesn't exist -if [ ! -f /var/lib/p2pool/params.conf ]; then - cat > /var/lib/p2pool/params.conf << 'CONF' -# P2Pool Configuration File -# Edit this file with your settings and restart the service - -# Monero node connection -host = 127.0.0.1 -rpc-port = 18081 -zmq-port = 18083 - -# Use SSL for RPC connection -# rpc-ssl = true - -# RPC credentials (if applicable) -# rpc-login = username:password - -# Your Monero wallet address (REQUIRED) -wallet = YOUR_MONERO_WALLET_ADDRESS - -# P2P settings -p2p = 0.0.0.0:37889 - -# API settings -data-api = /var/lib/p2pool/data-api -local-api = true - -# Logging -log-file = /var/log/p2pool/p2pool.log -loglevel = 3 - -# Mining mode (uncomment to enable mini sidechain) -# mini = true - -# Merge mining (optional - uncomment to enable Tari merge mining) -# merge-mine = tari://TARI_NODE_IP:18142 TARI_WALLET_ADDRESS - -# Stratum server (for miners to connect) -# stratum = 0.0.0.0:3333 -CONF - chown p2pool:p2pool /var/lib/p2pool/params.conf - chmod 640 /var/lib/p2pool/params.conf -fi - # Create log directory mkdir -p /var/log/p2pool chown p2pool:p2pool /var/log/p2pool chmod 750 /var/log/p2pool -# Set binary permissions -chown root:root /opt/p2pool/p2pool +# Create data directory(非递归设权限,避免升级时遍历庞大数据目录) +mkdir -p /var/lib/p2pool/data-api +chown p2pool:p2pool /var/lib/p2pool /var/lib/p2pool/data-api +chmod 750 /var/lib/p2pool /var/lib/p2pool/data-api + +# Create config directory +mkdir -p /etc/p2pool + +# 兼容旧版本:配置文件曾位于 /var/lib/p2pool/params.conf,迁移到 /etc/p2pool/params.conf +if [ ! -f /etc/p2pool/params.conf ] && [ -f /var/lib/p2pool/params.conf ]; then + echo "Migrating existing config from /var/lib/p2pool to /etc/p2pool..." + cp /var/lib/p2pool/params.conf /etc/p2pool/params.conf +fi + +# 首次安装:从包内默认配置生成(源:conf/params.conf.example)。升级不覆盖已有配置 +if [ ! -f /etc/p2pool/params.conf ]; then + cp /opt/p2pool/params.conf /etc/p2pool/params.conf +fi + +chown p2pool:p2pool /etc/p2pool/params.conf +chmod 640 /etc/p2pool/params.conf + +# Set permissions:/opt 目录与二进制 755,数据文件 644(对齐 xxxig / xxxig-proxy / mond) +chown -R root:root /opt/p2pool +find /opt/p2pool -type d -exec chmod 755 {} + +find /opt/p2pool -type f -exec chmod 644 {} + chmod 755 /opt/p2pool/p2pool -# Reload systemd and handle service restart on upgrade +# Reload systemd if [ -d /run/systemd/system ]; then systemctl daemon-reload - # On upgrade: restart service if it was enabled - if [ "$1" = "configure" ] && [ -n "$2" ]; then - # $2 is the previously installed version (only set on upgrade) - if systemctl is-enabled --quiet p2pool.service 2>/dev/null; then - echo "Restarting p2pool service after upgrade..." - systemctl start p2pool.service || true - fi - fi + # 升级时重启正在运行的服务以加载新二进制;try-restart 不会启动未运行的服务, + # 故首次安装仍保持"不自动启动"语义 + systemctl try-restart p2pool.service 2>/dev/null || true + # Note: On fresh install, service is NOT auto-enabled or auto-started - # Users should manually enable the service: # systemctl enable p2pool.service # systemctl start p2pool.service fi @@ -91,31 +61,16 @@ fi echo "" echo "✅ P2Pool installed successfully!" echo "" -echo "📋 Before starting P2Pool, you MUST configure your settings:" -echo "" -echo "1. Edit the configuration file:" -echo " sudo nano /var/lib/p2pool/params.conf" -echo "" -echo " Set your Monero wallet address and adjust other settings as needed." -echo "" -echo "2. Start P2Pool:" -echo " sudo systemctl enable p2pool.service" -echo " sudo systemctl start p2pool.service" -echo "" -echo "3. Check status:" -echo " sudo systemctl status p2pool.service" -echo " sudo journalctl -u p2pool -f" -echo "" echo "📁 Important paths:" -echo " Config file: /var/lib/p2pool/params.conf" -echo " Data directory: /var/lib/p2pool" -echo " Log directory: /var/log/p2pool" -echo " Binary: /opt/p2pool/p2pool" +echo " Config file: /etc/p2pool/params.conf" +echo " Data directory: /var/lib/p2pool/data-api" +echo " Log directory: /var/log/p2pool" +echo " Binaries: /opt/p2pool/p2pool" +echo " Systemd services: p2pool.service" echo "" -echo "💡 Tip: Your params.conf will NOT be overwritten during package upgrades." -echo "" -echo "For help:" -echo " /opt/p2pool/p2pool --help" +echo "💡 Tip: Your config files will NOT be overwritten during package upgrades." +echo " Before starting, set your Monero wallet in /etc/p2pool/params.conf, then:" +echo " sudo systemctl enable --now p2pool.service" echo "" exit 0 diff --git a/debian/postrm b/debian/postrm index 6949c3c..81ac414 100755 --- a/debian/postrm +++ b/debian/postrm @@ -12,9 +12,10 @@ case "$1" in delgroup --quiet p2pool || true fi - # Remove data directories (only on purge) + # Remove data/config directories (only on purge) rm -rf /var/lib/p2pool rm -rf /var/log/p2pool + rm -rf /etc/p2pool ;; remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) diff --git a/debian/prerm b/debian/prerm index e68542c..98e331a 100755 --- a/debian/prerm +++ b/debian/prerm @@ -1,33 +1,18 @@ -case "$1" in - upgrade) - # Stop service only during upgrade, keep enabled state - if [ -d /run/systemd/system ]; then - if systemctl is-active --quiet p2pool.service; then - echo "Stopping p2pool service for upgrade..." - systemctl stop p2pool.service - fi - fi - ;; - remove|deconfigure) - # Stop and disable service during removal - if [ -d /run/systemd/system ]; then - if systemctl is-active --quiet p2pool.service; then - echo "Stopping p2pool service..." - systemctl stop p2pool.service - fi - if systemctl is-enabled --quiet p2pool.service 2>/dev/null; then - echo "Disabling p2pool service..." - systemctl disable p2pool.service - fi - fi - ;; - failed-upgrade) - # Do nothing on failed upgrade - ;; - *) - echo "prerm called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac +#!/bin/sh +set -e -exit 0 \ No newline at end of file +# 仅在卸载(remove)时停用服务;升级(upgrade)时保持运行, +# 由 postinst 的 try-restart 重启以加载新二进制 +if [ "$1" = "remove" ] && [ -d /run/systemd/system ]; then + if systemctl is-active --quiet p2pool.service; then + echo "Stopping p2pool service..." + systemctl stop p2pool.service + fi + + if systemctl is-enabled --quiet p2pool.service 2>/dev/null; then + echo "Disabling p2pool service..." + systemctl disable p2pool.service + fi +fi + +exit 0 diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..e53de56 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,74 @@ +# p2pool musl 纯静态构建(参照上游官方 c-cpp.yml 的 Alpine static release 流程) +# Alpine + 自编 external 静态库(curl/libuv/libzmq) + 上游 boringssl + -DSTATIC_BINARY=ON +# 产物 fully-static(ldd: not a dynamic executable),glibc/musl 任意发行版直接运行。 +# 为何 musl:musl getaddrinfo 自包含,全静态可跨发行版;glibc 静态会因 NSS dlopen 失败。 +FROM alpine:3.21 AS build +ARG P2POOL_VERSION +ARG TARGETARCH +RUN apk add --no-cache git cmake gcc g++ make linux-headers perl + +RUN git clone https://github.com/SChernykh/p2pool /src/p2pool +WORKDIR /src/p2pool +# 只拉构建所需子模块:8 个常规依赖 + grpc 仅取其 boringssl(p2pool cmake/ssl 无条件依赖), +# 不递归 grpc 其余巨型子模块(abseil/protobuf 等),WITH_GRPC=OFF 不编 grpc 本体。 +RUN git checkout ${P2POOL_VERSION} && \ + git submodule update --init --recursive \ + external/src/RandomX external/src/rapidjson external/src/cppzmq \ + external/src/libuv external/src/libzmq external/src/robin-hood-hashing \ + external/src/curl external/src/miniupnp && \ + git submodule update --init external/src/grpc && \ + git -C external/src/grpc submodule update --init third_party/boringssl-with-bazel + +# external libcurl:HTTP + p2pool boringssl 集成(保留 rpc-ssl 连 HTTPS monerod)。 +# 完整照搬官方 c-cpp.yml 的 curl flags:P2POOL_BORINGSSL=ON 是上游给 curl 打的独立 +# boringssl TLS 后端补丁(不走 curl 标准 CURL_ENABLE_SSL 路径,故二者共存且仍支持 --rpc-ssl)。 +# 一整套 CURL_DISABLE_*(尤其 SRP/AWS/*_AUTH) 用于跳过会引用 OpenSSL::SSL imported target 的 +# curl_openssl_check_exists 符号检测——新版 cmake 在 try_compile 阶段校验该 target 必失败,少一个都会触发。 +RUN cd external/src/curl && cmake . -DCMAKE_BUILD_TYPE=Release \ + -DCURL_DROP_UNUSED=ON -DCURL_DISABLE_TYPECHECK=ON \ + -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON -DCURL_DISABLE_SHA512_256=ON \ + -DPICKY_COMPILER=OFF -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF \ + -DCURL_DISABLE_INSTALL=ON -DCURL_ENABLE_EXPORT_TARGET=OFF \ + -DCURL_DISABLE_HEADERS_API=ON -DCURL_DISABLE_BINDLOCAL=ON \ + -DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF \ + -DCURL_ZLIB=OFF -DCURL_BROTLI=OFF -DCURL_ZSTD=OFF \ + -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON \ + -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON \ + -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON \ + -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON \ + -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON \ + -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF \ + -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF \ + -DENABLE_UNIX_SOCKETS=OFF -DBUILD_TESTING=OFF -DUSE_NGHTTP2=OFF \ + -DBUILD_EXAMPLES=OFF -DP2POOL_BORINGSSL=ON -DCURL_DISABLE_SRP=ON \ + -DCURL_DISABLE_AWS=ON -DCURL_DISABLE_BASIC_AUTH=ON \ + -DCURL_DISABLE_BEARER_AUTH=ON -DCURL_DISABLE_KERBEROS_AUTH=ON \ + -DCURL_DISABLE_NEGOTIATE_AUTH=ON \ + -DOPENSSL_INCLUDE_DIR=../grpc/third_party/boringssl-with-bazel/include && \ + make -j"$(nproc)" + +# external libuv 静态 +RUN cd external/src/libuv && mkdir build && cd build && \ + cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF && \ + make -j"$(nproc)" + +# external libzmq 静态 +RUN cd external/src/libzmq && mkdir build && cd build && \ + cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ + -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DWITH_DOCS=OFF \ + -DENABLE_DRAFTS=OFF -DBUILD_SHARED=OFF && \ + make -j"$(nproc)" + +# p2pool 主体:纯静态(STATIC_BINARY) + 禁 grpc本体 + 禁合并挖矿捐赠(gitea-p2pool 定制) +RUN if [ "$TARGETARCH" = "arm64" ]; then ARCH_ID=aarch64; else ARCH_ID=x86_64; fi && \ + mkdir build && cd build && \ + cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ + -DSTATIC_BINARY=ON -DWITH_GRPC=OFF -DWITH_MERGE_MINING_DONATION=OFF \ + -DARCH_ID="$ARCH_ID" \ + -DCMAKE_C_FLAGS='-Wl,-s -Wl,--gc-sections' \ + -DCMAKE_CXX_FLAGS='-Wl,-s -Wl,--gc-sections' && \ + make -j"$(nproc)" p2pool && cp p2pool /p2pool + +FROM scratch +ARG TARGETARCH +COPY --from=build /p2pool /linux_${TARGETARCH}/p2pool diff --git a/docker/Dockerfile.alpine b/docker/Dockerfile.alpine deleted file mode 100644 index ce601bc..0000000 --- a/docker/Dockerfile.alpine +++ /dev/null @@ -1,46 +0,0 @@ -FROM alpine:3.21 AS base - -ARG TARGETARCH - -RUN apk update && apk add --no-cache \ - git \ - cmake \ - gcc \ - g++ \ - make \ - linux-headers \ - libuv-dev \ - zeromq-dev \ - curl-dev - -FROM base AS build - -ARG P2POOL_VERSION -ARG TARGETARCH -ARG BUILDPLATFORM -ARG TARGETPLATFORM - -RUN git clone --recursive https://github.com/SChernykh/p2pool /src/p2pool - -WORKDIR /src/p2pool - -RUN git checkout ${P2POOL_VERSION} - -# Determine parallel jobs based on cross-compilation and architecture -RUN mkdir build && cd build && \ - if [ "$BUILDPLATFORM" != "$TARGETPLATFORM" ]; then \ - MAKE_JOBS="-j2"; \ - elif [ "$TARGETARCH" = "amd64" ]; then \ - MAKE_JOBS="-j$(($(nproc) / 2))"; \ - else \ - MAKE_JOBS="-j$(nproc)"; \ - fi && \ - echo "Building with parallel jobs: $MAKE_JOBS (arch: $TARGETARCH, cross-compile: $([ "$BUILDPLATFORM" != "$TARGETPLATFORM" ] && echo yes || echo no))" && \ - cmake .. -DCMAKE_BUILD_TYPE=Release -DWITH_MERGE_MINING_DONATION=OFF && \ - make $MAKE_JOBS - -FROM scratch - -ARG TARGETARCH - -COPY --from=build /src/p2pool/build/p2pool /linux_${TARGETARCH}/p2pool diff --git a/docker/Dockerfile.ubuntu b/docker/Dockerfile.ubuntu deleted file mode 100644 index 7c6bfe0..0000000 --- a/docker/Dockerfile.ubuntu +++ /dev/null @@ -1,46 +0,0 @@ -FROM ubuntu:24.04 AS base - -ARG TARGETARCH - -RUN apt-get update && apt-get install -y \ - git \ - cmake \ - gcc \ - g++ \ - make \ - libuv1-dev \ - libzmq3-dev \ - libcurl4-openssl-dev \ - && rm -rf /var/lib/apt/lists/* - -FROM base AS build - -ARG P2POOL_VERSION -ARG TARGETARCH -ARG BUILDPLATFORM -ARG TARGETPLATFORM - -RUN git clone --recursive https://github.com/SChernykh/p2pool /src/p2pool - -WORKDIR /src/p2pool - -RUN git checkout ${P2POOL_VERSION} - -# Determine parallel jobs based on cross-compilation and architecture -RUN mkdir build && cd build && \ - if [ "$BUILDPLATFORM" != "$TARGETPLATFORM" ]; then \ - MAKE_JOBS="-j2"; \ - elif [ "$TARGETARCH" = "amd64" ]; then \ - MAKE_JOBS="-j$(($(nproc) / 2))"; \ - else \ - MAKE_JOBS="-j$(nproc)"; \ - fi && \ - echo "Building with parallel jobs: $MAKE_JOBS (arch: $TARGETARCH, cross-compile: $([ "$BUILDPLATFORM" != "$TARGETPLATFORM" ] && echo yes || echo no))" && \ - cmake .. -DCMAKE_BUILD_TYPE=Release -DWITH_MERGE_MINING_DONATION=OFF && \ - make $MAKE_JOBS - -FROM scratch - -ARG TARGETARCH - -COPY --from=build /src/p2pool/build/p2pool /linux_${TARGETARCH}/p2pool