From 317973e94d2b90fd4c58d7bbd7f9b006b3cdbcf6 Mon Sep 17 00:00:00 2001 From: Wang Defa <1+wangdefa@noreply.gitea.bcde.io> Date: Tue, 9 Jun 2026 22:00:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AF=B9=E9=BD=90=20xxxig/proxy=20?= =?UTF-8?q?=E6=89=93=E5=8C=85=E8=A7=84=E8=8C=83=E5=B9=B6=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E8=87=B3=20/etc/mond?= 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 | 53 +++++++++---- .gitignore | 8 +- CLAUDE.md | 57 ++++++++++++++ README.md | 10 +-- debian/build-deb.sh | 37 +++++---- debian/control.template | 2 +- debian/mond.service | 2 +- debian/postinst | 166 ++++++++------------------------------- debian/postrm | 3 +- debian/prerm | 44 +++-------- docker/Dockerfile.ubuntu | 29 ++----- 11 files changed, 184 insertions(+), 227 deletions(-) create mode 100644 CLAUDE.md diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index c5595dd..cfc3577 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -9,7 +9,7 @@ on: env: DOCKER_BUILDKIT: "1" PRODUCT_NAME: "mond" - MONERO_VERSION: "v0.18.4.6" + PACKAGE_VERSION: "0.18.5.0" BUILDX_NO_DEFAULT_ATTESTATIONS: "1" jobs: @@ -35,11 +35,7 @@ jobs: - name: Build binaries run: | PLATFORM="linux/${{ matrix.arch }}" - - echo "🏗️ Building ${PLATFORM} on native ${{ matrix.arch }} runner" - echo "📦 Using Ubuntu 20.04 with depends system" - echo "📦 Monero Version: ${MONERO_VERSION}" - echo "🔗 Static linking enabled" + MONERO_VERSION="v${PACKAGE_VERSION}" # 上游 Monero git tag 带 v 前缀,需补回 # 设置 BuildKit 优化参数 export BUILDKIT_PROGRESS=plain @@ -53,7 +49,7 @@ jobs: - name: Package and test run: | DIR="./output/linux_${{ matrix.arch }}" - VERSION=${MONERO_VERSION#v} # 移除前导 v + VERSION=${PACKAGE_VERSION} TARGZ="${PRODUCT_NAME}-${{ matrix.arch }}-ubuntu-${VERSION}.tar.gz" tar -czf "${TARGZ}" -C "$DIR" . @@ -64,6 +60,9 @@ jobs: # 快速验证 mkdir -p test && tar -xzf "${TARGZ}" -C test test/mond --version 2>/dev/null || echo "⚠️ 跳过版本检查" + # 纯静态校验(depends 系统应产出无动态依赖的二进制) + ldd test/mond 2>&1 | grep -q "not a dynamic executable" \ + && echo "✅ 纯静态链接" || echo "⚠️ 非纯静态二进制" rm -rf test - name: Build Debian package @@ -71,12 +70,12 @@ jobs: # 安装 dpkg-deb(如果需要) sudo apt-get update && sudo apt-get install -y dpkg-dev - DIR="./output/linux_${{ matrix.arch }}" - VERSION=${MONERO_VERSION#v} # 移除前导 v + VERSION=${PACKAGE_VERSION} + TARGZ="${PRODUCT_NAME}-${{ matrix.arch }}-ubuntu-${VERSION}.tar.gz" echo "📦 Building Debian package for ${{ matrix.arch }}..." chmod +x debian/build-deb.sh - ./debian/build-deb.sh ${{ matrix.arch }} ${VERSION} "${DIR}" + ./debian/build-deb.sh ${{ matrix.arch }} ${VERSION} "${TARGZ}" ls -lh *.deb @@ -110,12 +109,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 @@ -124,7 +124,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 } @@ -147,12 +147,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,"","Mond 是 Monero 守护进程 (monerod) 的定制版本。","","### ✨ 主要特性","","- 🔗 **纯静态链接** - 无需依赖,可在任意 Linux 系统运行","- 🏗️ **多架构支持** - 原生支持 AMD64 和 ARM64","- 📦 **官方构建系统** - 使用 Monero 官方 depends 系统构建,确保可靠性","","### 📥 下载方式","","#### 方式一:直接下载(推荐)","","点击下方 **Assets** 区域的文件名直接下载。","","**可用安装包:**",""]+[f"- [`{f}`](https://{r}/api/packages/{o}/generic/{p}/{t}/{f})" for f in sorted(glob.glob("*.tar.gz"))]+["","#### 方式二:通用软件包仓库","","通过命令行下载:",""]+[f"```bash\nwget https://{r}/api/packages/{o}/generic/{p}/{t}/{f}\n```" for f in sorted(glob.glob("*.tar.gz"))[:1]]+["","#### 方式三:Debian 软件源","","```bash","# 下载 GPG 密钥",f"sudo curl https://{r}/api/packages/{o}/debian/repository.key -o /etc/apt/keyrings/gitea-{o}.asc","","# 添加软件源",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","","# 更新并安装","sudo apt-get update","sudo apt-get install mond","```"];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` 的关键差异**:那两个项目源码来自 `wangdefaa`(双 a)换名仓库;mond 直接克隆 Monero 官方仓库,靠 init.sh 现场改名。三者共享同一套 CI / build-deb / debian 打包骨架,但 mond 的构建方式(官方 depends 系统)和版本号格式(四段 `0.18.5.0`)不同。 + +## 整体架构:单二进制 + +编译产出单个可执行文件 `mond`:Monero 全节点守护进程,负责 P2P 同步区块链、提供 RPC。配置来自 [conf/params.example.conf](conf/params.example.conf)。 + +## 构建与发布流程(CI) + +[.gitea/workflows/ci.yaml](.gitea/workflows/ci.yaml) 是 Gitea Actions 流水线: + +1. **build-and-test**(矩阵 `arch=[amd64,arm64]`,跑在对应架构原生 runner):用 `docker buildx` 按 [docker/Dockerfile.ubuntu](docker/Dockerfile.ubuntu) 原生编译 → 打成 tar.gz → 解包冒烟测试(`mond --version` + `ldd` 纯静态校验)→ 调 `debian/build-deb.sh` 打 .deb → 上传 artifact。 +2. **release**(仅 tag 触发):下载 artifact,上传 tar.gz 到 Generic Package Registry、上传 .deb 到 Debian Registry(stable/main),并用 `jq` 生成描述创建 Gitea Release。 + +关键点: +- **只构建 ubuntu,不做 alpine**(与参考项目不同,刻意取舍):mond 用 Monero **官方 depends 系统**(`make depends target=…`)交叉编译,产物为纯静态二进制(`ldd` 显示 "not a dynamic executable"),任意发行版可跑,Alpine 无需单独构建;且单次构建耗时 30–60 分钟,加 distro 维度会让 CI 翻倍而无收益。 +- **版本号约定**:包版本硬编码在 ci.yaml 的 `PACKAGE_VERSION: "0.18.5.0"`(**纯数字、无 v**,符合 Debian 版本规范)。**关键分界**:上游 Monero git tag 带 `v`,故 build job 用 `MONERO_VERSION=v${PACKAGE_VERSION}` 补回 v 传给 Dockerfile `git checkout`;tar.gz / deb / registry 路径 / Release 标题等包版本一律直接用 `${PACKAGE_VERSION}`;release job 用 `VERSION="${TAG#v}"` 归一。发版改 `PACKAGE_VERSION` 并打对应 `v*` tag。 +- **依赖精简**:depends 系统已将 boost/openssl/zmq/unbound/sodium/unwind 静态链入,故 [debian/control.template](debian/control.template) 仅 `Depends: libc6`,无需列动态库。 +- 架构名映射:Dockerfile 内 `arm64→aarch64-linux-gnu`、`amd64→x86_64-linux-gnu` 作为 depends target。 +- tar.gz 下载 URL 形如 `https://gitea.bcde.io/api/packages/wangdefa/generic/mond/{version}/mond-{arch}-ubuntu-{version}.tar.gz`(version 为纯数字)。 + +## 本地常用命令 + +```bash +# 本地编译某架构的二进制(输出到 ./output/linux_/mond) +docker buildx build --platform linux/amd64 \ + --build-arg MONERO_VERSION=v0.18.5.0 \ + --output type=local,dest=./output \ + -f docker/Dockerfile.ubuntu . + +# 用已有 tar.gz 打 .deb 包(注意第三个参数是 tar.gz,不是目录) +./debian/build-deb.sh amd64 0.18.5.0 mond-amd64-ubuntu-0.18.5.0.tar.gz + +# 改 shell 脚本后做静态检查(需自行安装 shellcheck) +shellcheck debian/*.sh +``` + +无单元测试;CI 中唯一的冒烟测试是解包后跑 `mond --version` 并 `ldd` 校验纯静态。 + +## Debian 包布局与服务 + +- 二进制装到 `/opt/mond/mond`,systemd 服务文件 [debian/mond.service](debian/mond.service),维护脚本 `debian/{postinst,prerm,postrm}`。 +- **配置流转(单一数据源)**:`conf/params.example.conf` 是唯一配置源 → build-deb.sh 复制进包内 `/opt/mond/params.conf` → postinst 首次安装时 `cp` 到 `/etc/mond/params.conf`(**升级不覆盖**用户已有配置;旧版本位于 `/var/lib/mond/params.conf` 时 postinst 会自动迁移到 `/etc/mond/`)。service 的 `ExecStart` 用 `--config-file=/etc/mond/params.conf`。**改默认配置改 conf/params.example.conf 一处即可**(不要再在 postinst 内联)。 +- 数据目录 `/var/lib/mond/data`、日志目录 `/var/log/mond`,均归 `mond` 系统用户。 +- postinst 创建 `mond` 系统用户/组。**服务不自动启用/启动**(首次同步需用户确认配置),升级时若服务原为 enabled 则重启以加载新二进制。.deb 安装后手动 `systemctl enable --now mond`。 diff --git a/README.md b/README.md index fd3f3ee..30670ce 100644 --- a/README.md +++ b/README.md @@ -33,11 +33,11 @@ sudo apt-get install mond ### 方式二:通用二进制包 ```bash -# 1. 下载对应架构的包 -wget https://gitea.bcde.io/releases/download/v0.18.4.6/mond-amd64-ubuntu-v0.18.4.6.tar.gz +# 1. 下载对应架构的包(registry 路径与下载名版本号均不带 v 前缀) +wget https://gitea.bcde.io/api/packages/wangdefa/generic/mond/0.18.5.0/mond-amd64-ubuntu-0.18.5.0.tar.gz # 2. 解压 -tar -xzf mond-amd64-ubuntu-v0.18.4.6.tar.gz +tar -xzf mond-amd64-ubuntu-0.18.5.0.tar.gz # 3. 运行 ./mond --help @@ -92,7 +92,7 @@ sudo systemctl disable mond.service ``` /opt/mond/mond # 二进制文件 -/var/lib/mond/params.conf # 配置文件 +/etc/mond/params.conf # 配置文件 /var/lib/mond/data/ # 区块链数据目录 /var/log/mond/ # 日志目录 ``` @@ -103,7 +103,7 @@ Debian/Ubuntu 系统包使用配置文件方式运行,修改配置非常简单 ```bash # 1. 编辑配置文件 -sudo nano /var/lib/mond/params.conf +sudo nano /etc/mond/params.conf # 2. 重启服务使配置生效 sudo systemctl restart mond.service diff --git a/debian/build-deb.sh b/debian/build-deb.sh index 3a7bd11..e96ee13 100755 --- a/debian/build-deb.sh +++ b/debian/build-deb.sh @@ -3,16 +3,18 @@ set -e # 参数检查 if [ $# -ne 3 ]; then - echo "Usage: $0 " - echo "Example: $0 amd64 0.18.4.6 build/Linux/release/bin" + echo "Usage: $0 " + echo "Example: $0 amd64 0.18.5.0 mond-amd64-ubuntu-0.18.5.0.tar.gz" exit 1 fi ARCH=$1 VERSION=$2 -BINARY_DIR=$3 +TARGZ_FILE=$3 PKG_NAME="mond" -DEB_FILE="${PKG_NAME}_${VERSION}_${ARCH}.deb" +DEB_VERSION="${VERSION#v}" # Debian 版本号必须以数字开头,去掉可能的 v 前缀 + +[ -f "$TARGZ_FILE" ] || { echo "❌ 找不到产物包: $TARGZ_FILE"; exit 1; } # 转换架构名称(Docker 使用的架构名到 Debian 架构名) case "$ARCH" in @@ -28,34 +30,34 @@ case "$ARCH" in ;; esac +DEB_FILE="${PKG_NAME}_${DEB_VERSION}_${DEB_ARCH}.deb" + echo "📦 Building Debian package: ${DEB_FILE}" echo " Architecture: ${DEB_ARCH}" -echo " Version: ${VERSION}" -echo " Binary directory: ${BINARY_DIR}" - -# 检查二进制文件是否存在 -if [ ! -f "${BINARY_DIR}/mond" ]; then - echo "❌ Error: mond binary not found in ${BINARY_DIR}" - exit 1 -fi +echo " Version: ${DEB_VERSION}" +echo " Source: ${TARGZ_FILE}" # 创建临时目录 BUILD_DIR=$(mktemp -d) trap "rm -rf $BUILD_DIR" EXIT # 创建包目录结构 -PKG_DIR="${BUILD_DIR}/${PKG_NAME}_${VERSION}_${DEB_ARCH}" +PKG_DIR="${BUILD_DIR}/${PKG_NAME}_${DEB_VERSION}_${DEB_ARCH}" mkdir -p "${PKG_DIR}/DEBIAN" mkdir -p "${PKG_DIR}/opt/mond" mkdir -p "${PKG_DIR}/lib/systemd/system" -# 复制二进制文件 -echo "📂 Copying binary..." -cp "${BINARY_DIR}/mond" "${PKG_DIR}/opt/mond/mond" +# 解压二进制文件 +echo "📂 Extracting binary..." +tar -xzf "${TARGZ_FILE}" -C "${PKG_DIR}/opt/mond" + +# 打入默认配置(conf/params.example.conf 为唯一配置源,postinst 据此生成 /etc/mond/params.conf) +echo "📄 Bundling default config..." +cp conf/params.example.conf "${PKG_DIR}/opt/mond/params.conf" # 生成 control 文件 echo "📝 Generating control file..." -sed -e "s/{{VERSION}}/${VERSION}/" \ +sed -e "s/{{VERSION}}/${DEB_VERSION}/" \ -e "s/{{ARCH}}/${DEB_ARCH}/" \ debian/control.template > "${PKG_DIR}/DEBIAN/control" @@ -74,6 +76,7 @@ cp debian/mond.service "${PKG_DIR}/lib/systemd/system/" # 设置权限 chmod 755 "${PKG_DIR}/opt/mond/mond" +chmod 644 "${PKG_DIR}/opt/mond/params.conf" chmod 644 "${PKG_DIR}/lib/systemd/system/mond.service" # 构建 deb 包 diff --git a/debian/control.template b/debian/control.template index 255809b..153fd6b 100644 --- a/debian/control.template +++ b/debian/control.template @@ -3,7 +3,7 @@ Version: {{VERSION}} Section: net Priority: optional Architecture: {{ARCH}} -Depends: libc6, libboost-system1.74.0 | libboost-system1.81.0 | libboost-system1.83.0, libboost-filesystem1.74.0 | libboost-filesystem1.81.0 | libboost-filesystem1.83.0, libboost-thread1.74.0 | libboost-thread1.81.0 | libboost-thread1.83.0, libboost-program-options1.74.0 | libboost-program-options1.81.0 | libboost-program-options1.83.0, libssl3 | libssl1.1, libzmq5, libunwind8 +Depends: libc6 (>= 2.31) Maintainer: Mond Team Homepage: https://github.com/monero-project/monero Description: Mond cryptocurrency daemon diff --git a/debian/mond.service b/debian/mond.service index 2203205..f9c1fb3 100644 --- a/debian/mond.service +++ b/debian/mond.service @@ -9,7 +9,7 @@ Type=simple WorkingDirectory=/opt/mond # 执行命令 - 使用配置文件 -ExecStart=/opt/mond/mond --config-file=/var/lib/mond/params.conf --non-interactive +ExecStart=/opt/mond/mond --config-file=/etc/mond/params.conf --non-interactive # 重启策略 Restart=always diff --git a/debian/postinst b/debian/postinst index 2538792..5c7bcff 100755 --- a/debian/postinst +++ b/debian/postinst @@ -17,128 +17,43 @@ mkdir -p /var/log/mond chown mond:mond /var/log/mond chmod 750 /var/log/mond -# Create data directory +# Create data directory(非递归设权限,避免升级时遍历庞大的区块链数据目录) mkdir -p /var/lib/mond/data -chown -R mond:mond /var/lib/mond -chmod -R 750 /var/lib/mond +chown mond:mond /var/lib/mond /var/lib/mond/data +chmod 750 /var/lib/mond /var/lib/mond/data -# Create configuration file if it doesn't exist -if [ ! -f /var/lib/mond/params.conf ]; then - cat > /var/lib/mond/params.conf << 'CONF' -# Mond Configuration File -# This file is automatically created during installation -# Edit this file to customize your Mond daemon settings -# After modifying, restart the service: sudo systemctl restart mond.service +# Create config directory +mkdir -p /etc/mond -# DATA STORAGE -# ============================================================================ -# data-dir: 区块链数据存储目录 -data-dir=/var/lib/mond/data - -# BLOCKCHAIN PRUNING -# ============================================================================ -# prune-blockchain: 启用区块链修剪模式 -prune-blockchain=1 - -# sync-pruned-blocks: 同步已修剪的区块(默认启用) -sync-pruned-blocks=1 - -# NETWORK PEER SETTINGS -# ============================================================================ -# out-peers: 主动连接的对等节点数量(出站连接) -out-peers=32 - -# in-peers: 接受连接的对等节点数量(入站连接) -in-peers=64 - -# limit-rate-up: 上传速率限制(kB/s) -limit-rate-up=1048576 - -# limit-rate-down: 下载速率限制(kB/s) -limit-rate-down=1048576 - -# PRIORITY NODES -# ============================================================================ -# add-priority-node: 优先连接的可信节点 -add-priority-node=p2pmd.xmrvsbeast.com:18080 -add-priority-node=nodes.hashvault.pro:18080 - -# SECURITY AND NETWORK INTEGRITY -# ============================================================================ -# enforce-dns-checkpointing: 强制执行 DNS 检查点验证 -enforce-dns-checkpointing=1 - -# enable-dns-blocklist: 启用 DNS 黑名单 -enable-dns-blocklist=1 - -# ZMQ NOTIFICATION SYSTEM -# ============================================================================ -# zmq-pub: ZeroMQ 发布接口,用于实时广播区块链事件 -zmq-pub=tcp://127.0.0.1:18083 - -# P2P AND RPC NETWORK BINDING -# ============================================================================ -# p2p-bind-ip: P2P 网络监听地址(默认启用,绑定所有网络接口) -p2p-bind-ip=0.0.0.0 - -# p2p-bind-port: P2P 网络监听端口 -p2p-bind-port=18080 - -# rpc-bind-ip: RPC 接口监听地址 -#rpc-bind-ip=0.0.0.0 - -# rpc-bind-port: RPC 接口监听端口 -#rpc-bind-port=18081 - -# confirm-external-bind: 确认外部网络绑定 -#confirm-external-bind=1 - -# RPC AUTHENTICATION -# ============================================================================ -# rpc-login: RPC 访问认证凭据 -#rpc-login=user:password - -# RPC SSL/TLS ENCRYPTION -# ============================================================================ -# rpc-ssl: 启用 RPC 连接的 SSL/TLS 加密(语义更清晰的启用方式) -#rpc-ssl=enabled - -# rpc-ssl-certificate: SSL 证书文件路径 -#rpc-ssl-certificate=/path/to/your/certificate.pem - -# rpc-ssl-private-key: SSL 私钥文件路径 -#rpc-ssl-private-key=/path/to/your/private_key.pem - -# LOGGING SETTINGS -# ============================================================================ -# log-level: 日志详细程度(调整为详细日志级别) -log-level=1 - -# log-file: 日志文件保存路径 -log-file=/var/log/mond/mond.log -CONF - chown mond:mond /var/lib/mond/params.conf - chmod 640 /var/lib/mond/params.conf +# 兼容旧版本:配置文件曾位于 /var/lib/mond/params.conf,迁移到 /etc/mond/params.conf +if [ ! -f /etc/mond/params.conf ] && [ -f /var/lib/mond/params.conf ]; then + echo "Migrating existing config from /var/lib/mond to /etc/mond..." + cp /var/lib/mond/params.conf /etc/mond/params.conf fi -# Set permissions on binary -chown root:root /opt/mond/mond +# 首次安装:从包内默认配置生成(源:conf/params.example.conf)。升级不覆盖已有配置 +if [ ! -f /etc/mond/params.conf ]; then + cp /opt/mond/params.conf /etc/mond/params.conf +fi + +chown mond:mond /etc/mond/params.conf +chmod 640 /etc/mond/params.conf + +# Set permissions:/opt 目录与二进制 755,数据文件 644(对齐 xxxig / xxxig-proxy) +chown -R root:root /opt/mond +find /opt/mond -type d -exec chmod 755 {} + +find /opt/mond -type f -exec chmod 644 {} + chmod 755 /opt/mond/mond -# 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 mond.service 2>/dev/null; then - echo "Restarting mond service after upgrade..." - systemctl start mond.service || true - fi - fi + # 升级时重启正在运行的服务以加载新二进制;try-restart 不会启动未运行的服务, + # 故首次安装仍保持"不自动启动"语义 + systemctl try-restart mond.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 mond.service # systemctl start mond.service fi @@ -146,31 +61,14 @@ fi echo "" echo "✅ Mond installed successfully!" echo "" -echo "📋 Configuration and startup:" -echo "" -echo "1. Review and configure settings (optional):" -echo " sudo nano /var/lib/mond/params.conf" -echo "" -echo " Adjust network settings, peer connections, and other options as needed." -echo "" -echo "2. Start Mond:" -echo " sudo systemctl enable mond.service" -echo " sudo systemctl start mond.service" -echo "" -echo "3. Check status:" -echo " sudo systemctl status mond.service" -echo " sudo journalctl -u mond -f" -echo "" echo "📁 Important paths:" -echo " Config file: /var/lib/mond/params.conf" -echo " Data directory: /var/lib/mond/data" -echo " Log directory: /var/log/mond" -echo " Binary: /opt/mond/mond" +echo " Config file: /etc/mond/params.conf" +echo " Data directory: /var/lib/mond/data" +echo " Log directory: /var/log/mond" +echo " Binaries: /opt/mond/mond" +echo " Systemd services: mond.service" echo "" -echo "💡 Tip: Your params.conf will NOT be overwritten during package upgrades." -echo "" -echo "For help:" -echo " /opt/mond/mond --help" +echo "💡 Tip: Your config files will NOT be overwritten during package upgrades." echo "" exit 0 diff --git a/debian/postrm b/debian/postrm index 7c88e82..7df6d32 100755 --- a/debian/postrm +++ b/debian/postrm @@ -12,9 +12,10 @@ case "$1" in delgroup --quiet mond || true fi - # Remove data directories (only on purge) + # Remove data/config directories (only on purge) rm -rf /var/log/mond rm -rf /var/lib/mond + rm -rf /etc/mond ;; remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) diff --git a/debian/prerm b/debian/prerm index fa0289b..8ca2582 100755 --- a/debian/prerm +++ b/debian/prerm @@ -1,36 +1,18 @@ #!/bin/sh set -e -case "$1" in - upgrade) - # 升级时只停止服务,保留 enabled 状态 - if [ -d /run/systemd/system ]; then - if systemctl is-active --quiet mond.service; then - echo "Stopping mond service for upgrade..." - systemctl stop mond.service - fi - fi - ;; - remove|deconfigure) - # 删除时停止并禁用服务 - if [ -d /run/systemd/system ]; then - if systemctl is-active --quiet mond.service; then - echo "Stopping mond service..." - systemctl stop mond.service - fi - if systemctl is-enabled --quiet mond.service 2>/dev/null; then - echo "Disabling mond service..." - systemctl disable mond.service - fi - fi - ;; - failed-upgrade) - # 升级失败时不做操作 - ;; - *) - echo "prerm called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac +# 仅在卸载(remove)时停用服务;升级(upgrade)时保持运行, +# 由 postinst 的 try-restart 重启以加载新二进制 +if [ "$1" = "remove" ] && [ -d /run/systemd/system ]; then + if systemctl is-active --quiet mond.service; then + echo "Stopping mond service..." + systemctl stop mond.service + fi + + if systemctl is-enabled --quiet mond.service 2>/dev/null; then + echo "Disabling mond service..." + systemctl disable mond.service + fi +fi exit 0 diff --git a/docker/Dockerfile.ubuntu b/docker/Dockerfile.ubuntu index b291c25..d9a54a4 100644 --- a/docker/Dockerfile.ubuntu +++ b/docker/Dockerfile.ubuntu @@ -5,43 +5,30 @@ ARG BUILDPLATFORM ENV DEBIAN_FRONTEND=noninteractive -# 安装构建依赖(包括 depends 系统所需工具) +# 仅安装 Monero depends 系统所需的最小工具链: +# depends 会自行交叉编译 boost/openssl/zmq/unbound/sodium 等全部第三方库到 contrib/depends//, +# 故无需任何系统 -dev 库(装了反而可能被动态链接、破坏纯静态)。 RUN apt-get update && apt-get install -y \ git \ wget \ curl \ + ca-certificates \ build-essential \ cmake \ pkg-config \ autoconf \ automake \ libtool \ + gperf \ + python3 \ bzip2 \ xz-utils \ - python3 \ - gperf \ - libboost-all-dev \ - libssl-dev \ - libzmq3-dev \ - libunbound-dev \ - libsodium-dev \ - libunwind8-dev \ - liblzma-dev \ - libreadline-dev \ - libexpat1-dev \ - libpgm-dev \ - qttools5-dev-tools \ - libhidapi-dev \ - libusb-1.0-0-dev \ - libprotobuf-dev \ - protobuf-compiler \ - libudev-dev \ - libgtest-dev \ + patch \ && rm -rf /var/lib/apt/lists/* FROM base AS build -ARG MONERO_VERSION=v0.18.4.6 +ARG MONERO_VERSION ARG TARGETARCH ARG BUILDPLATFORM ARG TARGETPLATFORM