Ubuntu 22.04 安装 aptly 指南

Ubuntu 22.04 上 aptly 三种安装方案详解——apt 源 v1.6.1 / go install v1.6.3 / 预编译二进制,含 systemd 托管 API 服务实测

aptlyaptly2026/10/27

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 要求)
GPGgnupg2 ≥ 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 installv1.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.1v1.6.3v1.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 按以下顺序查找配置文件:

  1. -config= 命令行参数
  2. ~/.aptly.conf
  3. /etc/aptly.conf
  4. /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 下
downloadConcurrency4并发下载线程数,8 核服务器可增至 8
architectures["amd64"]限定架构,避免拉取多余包
gpgProvider"gpg"用系统 GPG 而非 Go 内部实现(更安全)
downloadSourcePackagesfalse不拉源码包,节省磁盘
enableMetricsEndpointtrue开启 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

十二、参考链接