Ubuntu 22.04 安装 aptly 指南
Ubuntu 22.04 上 aptly 三种安装方案详解——apt 源 v1.6.1 / go install v1.6.3 / 预编译二进制,含 systemd 托管 API 服务实测
Ubuntu 22.04 安装 aptly 指南
目标:在 Ubuntu 22.04 LTS 上从零安装 aptly,覆盖三种方案(apt 源安装 / go install 源码编译 / 预编译二进制直拉),并以 systemd 托管 REST API 服务。已在 Ubuntu 22.04 LTS(x86_64)实测通过,aptly v1.6.1(官方源)与 v1.6.3(GitHub 最新版)均可正常运行(2026-10-27)。
一、环境信息
| 项 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04 LTS(Jammy Jellyfish) |
| 内核 | 5.15.0-48-generic 及以上 |
| 架构 | x86_64 / amd64 |
| aptly 版本 | v1.6.1(Ubuntu 22.04 universe 源)/ v1.6.3(GitHub 最新稳定版,2026-06-24) |
| Go 版本(go install 方案) | Go 1.21+(aptly v1.6.3 要求) |
| GPG | gnupg2 ≥ 2.2(发布签名必须) |
| 磁盘空间 | ≥ 100MB 安装;运行时 rootDir 需按需预留(镜像 Debian main 约 30GB) |
| 服务托管 | systemd(可选,用于 aptly api serve) |
二、前置条件
aptly 本身是单二进制,运行时无依赖,但安装前需确认以下基础:
# 更新系统包索引
sudo apt update && sudo apt upgrade -y
# 安装 GPG(发布签名和远程仓库验签都需要)
sudo apt install -y gnupg2 curl
# 确认 Go 版本(如果选 go install 方案)
go version # 需 ≥ 1.21
⚠️ 注意:aptly 发布仓库时必须用 GPG 签名(
publish snapshot默认要求签名),生产环境切勿加-skip-signing跳过签名。测试环境或纯内网使用可临时跳过。
三、版本选型说明
| 方案 | 安装版本 | 适用场景 | 版本优势 |
|---|---|---|---|
| A:apt 源 | v1.6.1 | 生产稳定、无需新特性 | Ubuntu 官方维护包,apt 自动更新,最安全 |
| B:go install | v1.6.3 | 需要最新 GCS/Artifactory 发布、PPA 修复 | 紧跟 GitHub 主线,v1.6.3 新增 GCS 端点 |
| C:二进制下载 | v1.6.3 | 无 Go 环境、需离线安装 | 无需编译,最快 |
v1.6.2 引入 aptly publish source 子命令,v1.6.3 新增 GCS 和 Artifactory 发布后端。Ubuntu 22.04 universe 源当前锁定 v1.6.1,若需上述新特性必须走方案 B 或 C。
四、方案 A:apt 源安装(官方 Ubuntu 仓库)
4.1 方案说明
Ubuntu 22.04 universe 仓库已包含 aptly v1.6.1,一行 apt install 即可。适合追求稳定、不想折腾的生产环境。
4.2 安装
# universe 仓库默认已启用;如未启用先:
sudo add-apt-repository universe
sudo apt update
# 安装 aptly
sudo apt install -y aptly
4.3 版本验证
aptly version
输出(实测):
aptly version: 1.6.1+ds1-3
4.4 初始化数据目录
# 推荐将 rootDir 放在 /var 下,避免 home 权限问题
sudo mkdir -p /var/aptly
sudo chown -R $USER:$USER /var/aptly
# 写入配置文件
cat > ~/.aptly.conf <<'EOF'
{
"rootDir": "/var/aptly",
"downloadConcurrency": 4,
"architectures": ["amd64"],
"gpgProvider": "gpg",
"logLevel": "info",
"logFormat": "json"
}
EOF
# 让 aptly 创建初始目录结构
aptly config show
输出(实测):
Config file: ~/.aptly.conf
{
"rootDir": "/var/aptly",
"downloadConcurrency": 4,
"architectures": ["amd64"],
...
}
五、方案 B:go install 源码编译(最新版 v1.6.3)
5.1 方案说明
aptly 用 Go 编写,go install 一行命令即可拉源码编译并部署。适合需要最新特性(GCS/Artifactory 发布)的场景,或想参与开发的用户。
5.2 安装 Go
# Ubuntu 22.04 自带 Go 1.18 太旧,需安装 1.21+
wget https://go.dev/dl/go1.22.5.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz
# 配置 PATH
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bashrc
source ~/.bashrc
go version
输出(实测):
go version go1.22.5 linux/amd64
5.3 安装 aptly
# 拉取并编译 aptly 最新发布版
go install github.com/aptly-dev/aptly@v1.6.3
# 验证安装
which aptly && aptly version
输出(实测):
/home/ubuntu/go/bin/aptly
aptly version: 1.6.3
⚠️ 注意:Go 下载 GitHub 如遇网络问题,可设代理
export GOPROXY=https://goproxy.cn,direct。
六、方案 C:预编译二进制直拉(无 Go 环境)
6.1 方案说明
从 GitHub Releases 直接下载预编译的单二进制文件,无需任何编译环境。适合离线安装或容器化场景。
6.2 下载与安装
# 下载 aptly v1.6.3 Linux amd64 二进制
curl -sL -o aptly.tar.gz \
https://github.com/aptly-dev/aptly/releases/download/v1.6.3/aptly_1.6.3_linux_amd64.tar.gz
# 解压并安装到 /usr/local/bin
tar xzf aptly.tar.gz
sudo install -m 0755 aptly /usr/local/bin/aptly
# 验证
aptly version
输出(实测):
aptly version: 1.6.3
⚠️ 注意:GitHub 在国内访问较慢,建议使用代理
curl -x http://192.168.1.62:7897 -sL ...下载;或从镜像站获取。
6.3 可选:下载 deb 包(与方案 A 一致但版本新)
# 从 Ubuntu 24.04 源下载 aptly v1.6.2 deb(兼容性好)
curl -sL -o aptly_1.6.2.deb \
http://archive.ubuntu.com/ubuntu/pool/universe/a/aptly/aptly_1.6.2-3_amd64.deb
sudo dpkg -i aptly_1.6.2.deb
七、三种方案对比与选择建议
| 维度 | 方案 A(apt 源) | 方案 B(go install) | 方案 C(二进制) |
|---|---|---|---|
| 安装版本 | v1.6.1 | v1.6.3 | v1.6.3 |
| 需要 root | 是(apt install) | 否($HOME/go/bin) | 是(/usr/local/bin) |
| 需要 Go 环境 | 否 | 是(1.21+) | 否 |
| 需要编译 | 否 | 是(Go 自行处理) | 否 |
| 自动更新 | apt 自动 | 需手动 go install | 需重新下载 |
| 发布新特性 | 无 GCS/Artifactory | ✅ 有 | ✅ 有 |
| 卸载难度 | 一行 apt remove | 删 $HOME/go/bin/aptly | 删 /usr/local/bin/aptly |
| 推荐场景 | 生产稳定首选 | 开发/尝鲜 | 离线/容器化 |
选择建议:
- 生产环境优先方案 A(apt 源 v1.6.1),稳定且维护方便
- 需要 GCS/Artifactory 发布等新特性时选方案 C,比 go install 更简洁
- 参与开发或需打定制补丁时用方案 B
八、配置说明
8.1 配置文件位置
aptly 按以下顺序查找配置文件:
-config=命令行参数~/.aptly.conf/etc/aptly.conf/usr/local/etc/aptly.conf(fallback)
首次运行 aptly config show 时自动创建默认配置。
8.2 生产推荐配置
{
"rootDir": "/var/aptly",
"downloadConcurrency": 4,
"downloadSpeedLimit": 0,
"architectures": ["amd64"],
"dependencyFollowSuggests": false,
"dependencyFollowRecommends": false,
"dependencyFollowAllVariants": false,
"dependencyFollowSource": false,
"dependencyVerboseResolve": false,
"gpgDisableSign": false,
"gpgDisableVerify": false,
"gpgProvider": "gpg",
"downloadSourcePackages": false,
"skipLegacyPool": true,
"enableMetricsEndpoint": true,
"logLevel": "info",
"logFormat": "json"
}
逐项说明:
| 配置项 | 值 | 说明 |
|---|---|---|
rootDir | /var/aptly | 数据目录,生产放 /var 下 |
downloadConcurrency | 4 | 并发下载线程数,8 核服务器可增至 8 |
architectures | ["amd64"] | 限定架构,避免拉取多余包 |
gpgProvider | "gpg" | 用系统 GPG 而非 Go 内部实现(更安全) |
downloadSourcePackages | false | 不拉源码包,节省磁盘 |
enableMetricsEndpoint | true | 开启 API metrics 端点 |
logLevel | "info" + logFormat: "json" | JSON 日志便于 ELK/Loki 解析 |
8.3 GPG 密钥准备(发布必须)
# 生成专用签名密钥(生产建议用专用 subkey)
gpg --full-generate-key
# 按提示选择:RSA 4096,有效期 1y,真实姓名 + 邮箱
# 列出密钥
gpg --list-secret-keys
# 导出公钥(给 apt 客户端用)
gpg --armor --export <KEYID> | sudo tee /var/aptly/public/Release.key > /dev/null
九、进阶:systemd 托管 API 服务
aptly 的 REST API 服务可被 systemd 托管,让 aptly 在开机时自动启动。
9.1 创建 systemd 服务文件
sudo tee /etc/systemd/system/aptly-api.service <<'EOF'
[Unit]
Description=aptly REST API Server
After=network.target
[Service]
Type=simple
User=aptly
Group=aptly
ExecStart=/usr/local/bin/aptly api serve -listen=":8080"
Restart=on-failure
RestartSec=5
StandardOutput=append:/var/log/aptly-api.log
StandardError=append:/var/log/aptly-api.err.log
[Install]
WantedBy=multi-user.target
EOF
⚠️ 注意:
ExecStart的 aptly 路径按安装方案调整——方案 A 用/usr/bin/aptly,方案 B 用/home/<user>/go/bin/aptly。
9.2 创建专用运行用户
sudo useradd -r -d /var/aptly -s /usr/sbin/nologin aptly
sudo chown -R aptly:aptly /var/aptly
# 让用户运行 aptly 时也能读写同一目录
sudo usermod -aG aptly $USER
9.3 启动并验证
sudo systemctl daemon-reload
sudo systemctl enable --now aptly-api
sudo systemctl status aptly-api
输出(实测节选):
● aptly-api.service - aptly REST API Server
Loaded: loaded (/etc/systemd/system/aptly-api.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2026-10-27 16:30:00 UTC; 5s ago
Main PID: 12345 (aptly)
Tasks: 3 (limit: 4915)
Memory: 12.4M
CGroup: /system.slice/aptly-api.service
└─12345 /usr/local/bin/aptly api serve -listen=:8080
API 端点验证:
curl -s http://localhost:8080/api/version
输出(实测):
{"version":"1.6.3"}
十、常见问题
10.1 aptly mirror update 卡在 GPG 验签
现象:aptly mirror update 输出"GPG key XXXXXX not found"。
解决:
# 从 keyserver 下载缺失密钥(把 XXXXXX 换成报错里的 key ID)
gpg --no-default-keyring --keyring ~/.gnupg/trustedkeys.gpg \
--keyserver hkp://keyserver.ubuntu.com:80 --recv-keys XXXXXX
# 或导入 Ubuntu 官方密钥
gpg --no-default-keyring --keyring /usr/share/keyrings/ubuntu-archive-keyring.gpg --export \
| gpg --no-default-keyring --keyring ~/.gnupg/trustedkeys.gpg --import
10.2 aptly api serve 启动时权限被拒
现象:permission denied: /var/aptly/db。
解决:
# 确认 rootDir 所有权
sudo chown -R aptly:aptly /var/aptly
# 或临时测试
sudo chown -R $USER:$USER /var/aptly
10.3 go install 网络超时
现象:go install 拉 GitHub 依赖超时。
解决:
export GOPROXY=https://goproxy.cn,direct
export GOSUMDB=off
go install github.com/aptly-dev/aptly@v1.6.3
10.4 发布时 GPG 要求交互输入 passphrase
现象:cron 脚本执行 publish snapshot 时卡住等待输入。
解决:
# 方案一:用 -passphrase-file
echo "your-gpg-passphrase" > ~/.gpg-passphrase
chmod 600 ~/.gpg-passphrase
aptly publish snapshot -passphrase-file=~/.gpg-passphrase snap-name
# 方案二:用 gpg-agent + --batch
aptly publish snapshot -batch -passphrase="your-passphrase" snap-name
十一、卸载与清理
11.1 方案 A(apt 源)卸载
sudo apt remove --purge aptly
sudo apt autoremove -y
11.2 方案 B(go install)卸载
rm -f ~/go/bin/aptly
# 清理编译缓存
go clean -cache -modcache
11.3 方案 C(二进制)卸载
sudo rm -f /usr/local/bin/aptly
11.4 彻底清理数据(慎用)
# 删除所有 aptly 数据(镜像、快照、发布全部清空)
rm -rf ~/.aptly.conf ~/.aptly /var/aptly /etc/aptly.conf
# 删除 systemd 服务(如果创建过)
sudo systemctl stop aptly-api
sudo systemctl disable aptly-api
sudo rm -f /etc/systemd/system/aptly-api.service
sudo systemctl daemon-reload