搭建 APT 仓库
创建带 by-hash 索引的托管 DEB 仓库,并配置 APT 客户端。
本教程从零创建一个 Managed DEB 仓库。你需要一个可写目录,以及一个或多个
DEB 文件。
1. 创建工作区
mkdir -p /srv/sow
cd /srv/sow
sow init .
sow repo new pigsty
sow dist new trixie --format deb -r pigsty
Dist 名称会成为 APT Suite。它由你定义;SOW 不会根据 trixie 推断发行版语义。
2. 配置成员策略
如果需要过滤或限制版本,编辑生成的 sow.yml:
schema: sow/v3
architectures: [x86_64, aarch64]
repos:
pigsty:
dists:
trixie:
format: deb
limit: 1
exclude:
- kind: [dbgsym, dbg]
targets: {}
然后校验:
sow config check
sow config show --all
配置中保存规范架构名,渲染时使用 Debian 生态名称:x86_64 对应 amd64,aarch64
对应 arm64;中立架构 all 包会进入两个视图。
3. 添加 DEB
sow add /path/to/packages/*.deb -r pigsty -d trixie
sow status -r pigsty
sow check -r pigsty
接纳的包体只保存一次。公共树如下:
/srv/sow/pigsty/
├── pool/...
└── dists/trixie/
├── Release
└── main/
├── binary-amd64/
│ ├── Packages
│ ├── Packages.gz
│ └── by-hash/SHA256/...
└── binary-arm64/...
pool/ 下的路径按规范化源码包名分组;Packages 中的 Filename 相对 Archive Root;
SOW 会写入 SHA-256 by-hash 副本,并在 Release 中声明。
4. HTTP 预览
本地预览可以直接使用:
cd /srv/sow
python3 -m http.server --bind 127.0.0.1 8080
检查协议入口:
curl --fail http://127.0.0.1:8080/pigsty/dists/trixie/Release >/dev/null
curl --fail http://127.0.0.1:8080/pigsty/dists/trixie/main/binary-amd64/Packages.gz >/dev/null
长期服务应使用持续维护的 HTTP Server,并完整暴露 pigsty/ 树。
5. 配置 APT
将 REPO_HOST 替换为客户端可访问的地址。未签名测试仓库可使用显式信任的 deb822 配置:
# /etc/apt/sources.list.d/pigsty.sources
Types: deb
URIs: http://REPO_HOST:8080/pigsty
Suites: trixie
Components: main
Architectures: amd64
Trusted: yes
刷新并查询:
sudo apt update
apt-cache policy
Trusted: yes 会关闭真实性校验,只适合受控测试。签名仓库应删除该行并配置 Keyring:
Types: deb
URIs: https://repo.example.com/pigsty
Suites: trixie
Components: main
Architectures: amd64
Signed-By: /usr/share/keyrings/pigsty-archive-keyring.gpg
打开 Signed-By 前,请先完成仓库签名。
6. 安全发布
交付前必须通过深度校验:
向已配置的 filesystem 或 R2 目标交付时,使用 sow publish。
如果使用其他传输方式,应把完整仓库复制到离线 staging,再原子切换上线。不要逐文件更新在线
dists/ 树,否则客户端可能同时看到不同 Generation 的元数据与包体。
更新仓库
sow add /path/to/new.deb -r pigsty -d trixie
sow rm PACKAGE_NAME -r pigsty -d trixie
sow build -r pigsty
sow check -r pigsty
策略或签名配置变化后用 build 收敛;发布门禁是 check,不能只看 status。
自动化客户端与平台覆盖见平台与集成。