使用 reprepro 管理 Debian 软件包发布
reprepro 是一个强大的工具,用于创建和管理 Debian/APT 软件仓库,特别适合企业内部或私有软件分发。以下是完整的 reprepro 使用指南:
安装与基础配置
1. 安装 reprepro
sudo apt update
sudo apt install reprepro gnupg2
2. 创建仓库目录结构
mkdir -p myrepo/{conf,dists,incoming,indices,logs,pool,project,tmp}
cd myrepo
3. 生成 GPG 密钥(若未创建)
gpg --full-generate-key
# 选择 RSA (sign only),长度 4096
4. 创建仓库配置文件 (conf/distributions
)
Origin: My Company
Label: My Debian Repository
Codename: bookworm
Suite: stable
Architectures: amd64 arm64 source
Components: main contrib
Description: Private repository for company software
SignWith: YOUR_KEY_ID # 通过 gpg --list-secret-keys 获取
UDebComponents: main # 若需要 microdebs
Contents: .gz # 生成内容索引
5. 创建选项配置文件 (conf/options
)
verbose
basedir .
dbdir ./db
logdir ./logs
outdir +b/.
管理软件包
1. 导入软件包到仓库
reprepro -b . includedeb bookworm /path/to/your-package_1.0-1_amd64.deb
2. 导入源码包
reprepro -b . includedsc bookworm /path/to/your-package_1.0-1.dsc
3. 更新仓库元数据
reprepro -b . export
reprepro -b . createsymlinks
仓库维护操作
1. 列出仓库内容
reprepro -b . list bookworm
2. 移除软件包
reprepro -b . remove bookworm your-package
3. 添加新发行版
在 conf/distributions
添加新条目:
Codename: trixie
Suite: testing
Architectures: amd64 source
Components: main
SignWith: YOUR_KEY_ID
然后初始化新发行版:
reprepro -b . export trixie
4. 跨发行版复制软件包
reprepro -b . copy trixie bookworm your-package
配置客户端访问
1. 导出仓库公钥
gpg --export -a YOUR_KEY_ID > myrepo.gpg
2. 客户端配置步骤
# 导入公钥
sudo mkdir -p /etc/apt/keyrings
sudo cp myrepo.gpg /etc/apt/keyrings/
sudo chmod 644 /etc/apt/keyrings/myrepo.gpg
# 添加仓库源
echo "deb [signed-by=/etc/apt/keyrings/myrepo.gpg] http://your-repo-domain.com/debian/ bookworm main contrib" | sudo tee /etc/apt/sources.list.d/myrepo.list
# 更新并安装
sudo apt update
sudo apt install your-package
高级功能
1. 自动导入新包(使用 incoming
目录)
# 创建 conf/incoming
mkdir -p conf/incoming
# 添加配置文件 conf/incoming/myproject
Name: myproject
IncomingDir: incoming/myproject
TempDir: tmp
Allow: bookworm
2. 设置仓库自动清理
# 在 conf/options 添加
keepunusednewfiles 3
keep 5
3. 生成发布文件签名
reprepro -b . -C main --ignore=forbiddenchar createsymlinks
reprepro -b . export
4. 使用 hooks 自动化
创建 conf/updates
文件:
Name: nightly-update
Method: https://updates.example.com
Suite: bookworm
Components: main
Architectures: amd64
VerifyRelease: YOUR_KEY_ID
然后添加 hook 脚本:
echo "reprepro -b . update" > hooks/nightly
chmod +x hooks/nightly
仓库结构示例
myrepo/
├── conf/
│ ├── distributions # 发行版配置
│ ├── options # 全局选项
│ ├── incoming # 自动导入配置
│ └── updates # 自动更新配置
├── db/ # 数据库文件
├── dists/ # 仓库元数据
│ └── bookworm
│ ├── main
│ │ ├── binary-amd64
│ │ └── source
│ └── Release # 签名文件
├── pool/ # 实际软件包存储
│ └── main
│ └── y/
│ └── your-package
│ ├── your-package_1.0-1.deb
│ └── your-package_1.0-1.dsc
├── logs/ # 日志文件
└── tmp/ # 临时文件
最佳实践
- 版本控制:将
conf/
目录纳入 Git 管理 - 定期清理:设置 cron 任务执行清理
0 3 * * * /usr/bin/reprepro -b /path/to/myrepo clearvanished
- 安全加固:
- 使用 GPG subkeys 进行签名
- 限制仓库的写入权限
- 通过 HTTPS 提供仓库访问
-
监控:
# 检查仓库健康状态 reprepro -b . check # 验证包依赖关系 reprepro -b . checkpool
- 备份策略:定期备份
db/
目录和 GPG 私钥
常见问题解决
问题: GPG 签名失败
gpg: signing failed: No secret key
解决:
export GPG_TTY=$(tty)
reprepro --gnupghome ~/.gnupg -b . export
问题: 架构不匹配
Skipping inclusion of 'package.deb' as no component found for this type of package!
解决: 确保 conf/distributions
中的 Architectures
包含包的实际架构
问题: 客户端出现 NO_PUBKEY
错误
解决: 确保客户端正确导入公钥且路径匹配 signed-by
声明
通过 reprepro 管理的私有仓库,您可以完全控制软件包的发布流程、版本管理和访问权限,特别适合企业级应用分发和持续交付场景。
发表回复