
Dragonfly 安装包构建指南基于 tools/packaging 的 Debian / RPM 打包与软件源发布【免费下载链接】dragonflyA modern replacement for Redis and Memcached项目地址: https://gitcode.com/GitHub_Trending/dr/dragonfly本指南围绕 tools/packaging 目录系统讲解如何将 DragonflyRedis / Memcached 的高性能兼容替代品源码仓库中的二进制构建为 Debian.deb与 RPM.rpm安装包并配置 systemd 服务、默认运行参数与日志轮转。读完本文你将掌握generate_debian_package.sh的完整用法、Debian 包内部各维护脚本与配置文件的职责、RPM 包的构建方式以及官方 YUM / APT 软件源的组织与使用逻辑可直接在自己的发行版环境中复现整套打包流程。一、目录总览packaging 目录里有什么tools/packaging目录承载了 Dragonfly 面向主流 Linux 发行版的全部打包资产从目录结构可以看出它分为四块能力路径作用tools/packaging/debianDebian 包.deb的构建素材control、rules、systemd 单元、安装/卸载钩子、默认配置、logrotate 规则tools/packaging/rpmRPM 包.rpm的构建脚本build_rpm.sh与 spec 文件dragonfly.spectools/packaging/osreposYUM / APT 软件源的生成脚本、仓库配置dragonfly.repo、dragonfly.sources与 GPG 公钥tools/packaging/generate_debian_package.sh一键生成 Debian 安装包的主脚本配合 generate_changelog.sh此外目录中还包含多份 Dockerfile如 Dockerfile.ubuntu-prod、Dockerfile.alpine-dev、Dockerfile.distroless-dev等用于构建开发环境与最终运行镜像其中 Debian 打包环境可以直接复用 Ubuntu 基础镜像来搭建详见下文。二、构建 Debian 安装包.deb这是 tools/packaging/README.md 的核心内容构建脚本会将预先编译好的 Dragonfly 二进制与debian/目录下的打包素材组装成一个.deb文件同时从 Git 历史生成 Debian 格式的 changelog。2.1 构建脚本的参数与默认行为入口脚本 generate_debian_package.sh 接受一个可选参数二进制路径可选指定用于安装的 Dragonfly 二进制文件所在位置文档声明的默认路径是repo path/build-opt仓库构建输出目录。但实际阅读脚本源码可以发现脚本对参数做了更严格的校验generate_debian_package.shif [ $# -ge 1 ]; then VERSION_FILE$1 if ! [ -f ${VERSION_FILE} ]; then echo binary file ${VERSION_FILE} does not exist exit 1 fi else echo no binary file provided exit 1 fi也就是说当前版本的脚本必须显式传入二进制文件路径且该文件必须真实存在否则脚本会直接退出。构建产物的输出位置是执行脚本时所在的当前目录而非脚本所在目录这一点在脚本末尾用MY_DIR${PWD}记录并回写完成。2.2 构建依赖构建 Debian 包需要以下系统包README 明确列出git—— 用于读取仓库历史生成 changelogmoreutils—— 提供sponge命令changelog 生成脚本依赖它原地合并内容debhelper—— 提供dh构建框架与维护脚本模板#DEBHELPER#展开dpkg-dev—— 提供dpkg-buildpackage等打包工具链。构建只能运行在Debian 系主机上Ubuntu / Debian 均可。2.3 标准构建命令在源码仓库的main分支上先完成二进制构建然后执行/path/to/dragonfly/tools/packaging/generate_debian_package.sh [/path/to/dragonfly-binary-file]脚本内部的执行流程对应 generate_debian_package.sh为解析脚本真实路径定位到仓库根目录ROOT_ABS_PATH与debian素材目录在临时目录中组装packages/dragonfly结构把debian/全部素材与generate_changelog.sh复制进去将传入的二进制复制为debian/bin/dragonfly调用generate_changelog.sh生成 Debian changelog在组装目录内执行dpkg-buildpackage --buildbinary产出.deb将产物文件名规范化去掉架构位如_amd64_折叠后移动到执行脚本时的当前目录并打印成功路径。2.4 用 Docker 提供打包环境由于只能在 Debian 系主机上构建README 给出了一个最小可用的 Ubuntu 打包镜像方案可直接照抄FROM ubuntu:20.04 ARG DEBIAN_FRONTENDnoninteractive RUN apt update -y apt-get install -y gcc dpkg-dev gpg vim wget git moreutils debhelper构建并挂载源码仓库运行docker build -t ubuntu-package . docker run --rm -ti -v /path/to/dragonfly-repo:/mydocker-path ubuntu-package bash容器内进入挂载目录后先保证处于main分支再执行第 2.3 节的构建命令即可。2.5 changelog 从哪来Debian 包要求提供标准格式的debian/changeloggenerate_changelog.sh 负责从 Git 历史自动生成源码首先确认仓库本地存在v*形式的标签若没有则执行git fetch --all --tags拉取从v0.2.0开始遍历git tag -l v* | sort -V的每个版本标签用git log $prevtag..$tag提取提交标题作为变更条目用git log $tag^..$tag提取提交者与时间作为-- maintainer email date尾注借助spongemoreutils把新版本段落不断叠到 changelog 文件顶部最终产出$pkgname (${tag#v}) unstable; urgencylow的 Debian 标准格式。因此包的版本号取自 Git 标签去掉v前缀这也解释了为什么构建前必须处于带标签的main分支。2.6 两个已知注意事项必须使用main分支changelog 依赖标签历史非main分支可能导致标签缺失或历史不完整deb-systemd-helper报错可忽略安装结束时若看到/usr/bin/deb-systemd-helper: error: systemctl preset failed on dragonfly.service: No such file or directoryREADME 明确指出这属于已知的 Debian 工具链问题可以安全忽略不影响包安装与服务的后续启用。三、Debian 包内部一个可生产的 systemd 服务包构建出的.deb不只是把二进制放进去它同时交付了完整可运维的服务化能力。逐一看debian/目录中每个文件的实际职责。3.1 包元数据controldebian/control 定义了包的元信息Package: dragonfly Architecture: amd64 arm64 Depends: libc6, openssl, adduser, zstd Description: A fast in-memory store that is fully compatible with Redis™* and Memcached.支持amd64与arm64两种架构运行时依赖libc6C 运行库、opensslTLS 支持、adduser创建dfly系统用户、zstd日志压缩注意描述中标明了与 Redis™ 及 Memcached 的兼容性定位。3.2 构建规则rulesdebian/rules 使用了极简的 debhelper 模板并通过override关闭了包内二次构建与测试export DEB_BUILD_OPTIONS : noopt nostrip nocheck %: dh $ override_dh_auto_build: echo no build is done here由于二进制由脚本预先传入打包过程不再执行源码编译这是用预构建产物快速出包的关键设计。3.3 systemd 服务单元dragonfly.servicedebian/dragonfly.service 是包的运维核心值得逐段理解[Unit]服务描述为 Modern and fast key-value store在network.target之后启动[Service]TypesimpleExecStart/usr/bin/dragonfly --flagfile/etc/dragonfly/dragonfly.conf—— 通过--flagfile加载默认配置EnvironmentFile-/etc/dragonfly/environment-前缀表示文件不存在时静默跳过允许用户注入环境变量Userdfly/Groupdfly以专用系统用户运行Restartalways保证异常退出自动拉起目录权限管理RuntimeDirectorydragonfly并设RuntimeDirectoryMode2755资源限制LimitNOFILE262144提升文件描述符上限适配高并发安全加固PrivateTmpyes、ProtectHomeyes、ProtectSystemfull、NoNewPrivilegestrue、MemoryDenyWriteExecutetrue、ProtectKernelModulestrue、ProtectKernelTunablestrue、ProtectControlGroupstrue、RestrictRealtimetrue、RestrictNamespacestrue并将地址族收窄为AF_INET AF_INET6 AF_UNIX、能力集收窄为CAP_SETGID CAP_SETUID CAP_SYS_RESOURCE通过ReadWritePaths显式放行/var/lib/dragonfly、/var/log/dragonfly、/var/run/dragonfly三个数据/日志/运行目录TimeoutStopSecinfinity等待持久化数据落盘完成。[Install]WantedBymulti-user.target并设置Aliasdragonfly.service。包安装完成后即可用标准 systemctl 命令管理服务例如sudo systemctl start dragonfly sudo systemctl status dragonfly sudo systemctl stop dragonfly sudo systemctl enable dragonfly # 开机自启3.4 安装前后的钩子脚本debian/preinst安装前执行。若系统不存在dfly用户则通过adduser --system --group创建随后创建并授权四个关键目录源码/var/log/dragonfly模式2755属组adm日志归管理员组/var/lib/dragonfly模式755属主dfly数据目录/var/run/dragonfly模式755属主dflyPID/运行目录/etc/dragonfly模式2775属主dfly配置目录组可写便于维护。 目录的属主/权限修改通过dpkg-statoverride固化保证升级时不被覆盖。debian/postinst配置阶段将/etc/dragonfly/dragonfly.conf用dpkg-statoverride设为dfly:dfly 640并清理空的遗留目录。debian/postrm执行purge彻底卸载时删除dfly用户并移除/var/lib/dragonfly、/var/log/dragonfly、/etc/dragonfly、/var/run/dragonfly全部痕迹保证环境干净。3.5 默认运行参数dragonfly.confdebian/dragonfly.conf 是服务启动时通过--flagfile加载的默认参数--pidfile/var/run/dragonfly/dragonfly.pid --log_dir/var/log/dragonfly --dir/var/lib/dragonfly --max_log_size20 --version_checktrue各参数含义--pidfile指定 PID 文件位置--log_dir指定日志落盘目录--dir指定数据持久化目录--max_log_size20限制单个日志文件大小单位 MB--version_checktrue启用启动时的版本检查。用户可通过编辑该文件或/etc/dragonfly/environment覆盖这些默认值。3.6 文件安装清单install 与 logrotatedebian/dragonfly.install 声明了包的安装落位debian/dragonfly.service /lib/systemd/system debian/dragonfly.conf /etc/dragonfly debian/bin/dragonfly /usr/bin即服务单元装入/lib/systemd/system配置装入/etc/dragonfly二进制装入/usr/bin。debian/dragonfly.logrotate 定义了日志轮转规则按天轮转、missingok、使用zstd压缩compresscmd zstd/compressext .zst、空文件不处理prerotate阶段用lsof检测日志文件是否仍被进程打开若被占用则跳过本次轮转避免误删正在写入的日志。四、构建 RPM 安装包.rpmRPM 侧由 build_rpm.sh 驱动其参数为归档文件路径与版本号两个必填参数./tools/packaging/rpm/build_rpm.sh /path/to/dragonfly-arch.tar.gz 1.33.1脚本流程源码在/tmp下创建独立的rpmbuild_XXXXXX工作目录初始化BUILD / RPMS / SOURCES / SPECS标准布局将二进制归档软链接到SOURCES并把dragonfly.service、dragonfly.conf一并放入执行rpmbuild --define _topdir $RPM_ROOT --define version $VERSION -bb完成构建把生成的.rpm移动到当前目录。spec 文件 dragonfly.spec 的关键设计包名格式被定制为%{NAME}.%{ARCH}.rpm%pre阶段用groupadd/useradd创建dfly系统用户-M -s /sbin/nologin无登录 shell并通过Provides: user(dfly)/Provides: group(dfly)声明%install阶段将二进制安装到/usr/local/bin服务单元到/usr/lib/systemd/system配置到/etc/dragonfly与 Debian 包一致也创建/var/log/dragonfly、/var/lib/dragonfly目录许可证声明为BUSL-1.1。五、YUM / APT 软件源的生成与使用tools/packaging/osrepos 提供了把上述.deb/.rpm组织成可公开安装的 YUM / APT 软件源的完整方案详见 osrepos/README.md。其核心思路是以静态网站形式托管仓库配套脚本fetch-releases.py、generate-apt-repo.sh、generate-index.py、sign-rpms.sh、wait_for_repo_version.py负责下载最新的 5 个 release 的 deb/rpm 资产、按版本分目录、签名并发布。5.1 APT 仓库Debian / Ubuntu仓库内 dragonfly.sources 展示了 apt 源的核心声明Types: deb URIs: https://packages.dragonflydb.io/deb Suites: noble Components: main Signed-By: /usr/share/keyrings/dragonfly-keyring.public配置流程分为三步内容源自仓库内文档先把 GPG 公钥下载到 keyring 位置再安装.sources文件最后apt update apt install dragonfly。需要特别说明的是APT 仓库只保留最新一个版本原因有二——Debian 的reprepro工具只有 5.4 及以上版本才支持多版本共存而 CI 运行环境ubuntu-latestrunner尚未升级到该版本若改用 apt 的 components 特性来固定版本又需要把版本号硬编码进 sources 文件、每次发版都要求用户手动更新体验较差。因此需要旧版本的用户应直接从 release 页面下载历史安装包。5.2 YUM / DNF 仓库RHEL 系YUM 仓库没有上述限制osrepos/README.md 记录的用法是通过dnf config-manager addrepo导入仓库定义然后直接安装最新版或指定版本sudo dnf config-manager addrepo --from-repofilehttps://packages.dragonflydb.io/dragonfly.repo sudo dnf -y install dragonfly-0:v1.33.1-1.fc30.x86_645.3 包签名所有发布资产使用仓库中保存的私钥GPG_PRIVATE_KEYsecret签名对应的公钥 pgp-key.public 随站点资产一同发布供 apt / dnf 工具链校验包完整性。签名流程由sign-rpms.sh与 apt 的 Release 文件签名配合完成这是仓库TODO中已勾选完成的项。六、延伸Docker 镜像的构建资产虽然 tools/packaging/README.md 未展开介绍但tools/packaging目录内的多份 Dockerfile 与打包能力同属一套发布体系。以 Dockerfile.ubuntu-prod 为例它先用fetch_release.sh按TARGETPLATFORM拉取发布二进制再在ubuntu:22.04上创建dfly系统用户uid/gid 999、暴露 6379 端口并以tini作为 PID 1 来正确回收僵尸进程issue #5844最终以entrypoint.sh启动服务。这与 Debian / RPM 包中专用系统用户 安全加固的思路完全一致印证了打包规范的统一性。七、小结与最佳实践回顾全文Dragonfly 的安装包体系呈现三条清晰主线统一的服务模型无论 Debian 包、RPM 包还是 Docker 镜像都遵循dfly专用用户、--flagfile/etc/dragonfly/dragonfly.conf默认配置、/var/lib|log|run/dragonfly目录约定、systemd 加固参数这同一套规范预构建二进制 元数据组装Debian / RPM 的构建脚本都不在打包阶段编译源码而是把构建产物与维护脚本、配置、服务单元组装成型因此打包速度快、可重复性好版本号统一取自 Git 标签自动化的 changelog 与软件源changelog 由 Git 标签历史自动生成软件源由osrepos脚本自动抓取、签名、发布形成从发版 → 打包 → 源发布 → 用户安装的闭环。如果要在自己的环境中复现推荐顺序是先在 Debian 系容器内按第 2.4 节搭好环境 → 在main分支执行generate_debian_package.sh产出.deb→ 用systemctl start dragonfly验证服务 → 如需 RPM 再用build_rpm.sh产出.rpm。仓库内 debian、rpm、osrepos 三个目录的文件即为最权威的模板参考。【免费下载链接】dragonflyA modern replacement for Redis and Memcached项目地址: https://gitcode.com/GitHub_Trending/dr/dragonfly创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考