喜悦星宇 Liang Junxing

阿里云 APT 多版本发布配置

此脚本包针对已部署的 apt.liangjunxing.com:Alibaba Cloud Linux 3 宿主机、现有 apt-manager Ubuntu 22.04 容器、jammy/main/arm64,以及现有签名密钥。它不是通用的全新安装器。

目标:板卡沿用同一个源,能够查看并选择最近 10 个版本。使用 Ubuntu 自带的 dpkg-scanpackages --multiversion 与 apt-ftparchive 生成索引,沿用现有 GPG 签名、Nginx、HTTPS 与证书续期配置。

重要 现有 reprepro 数据库不迁移。新流程启用后,发布统一使用 publish-board-apt;旧 includedeb/export/手工同步流程不再用于线上发布。 不要把服务器密码或 GPG 私钥发到聊天里。

一、把脚本包传到服务器

在 Windows PowerShell 中执行(路径按你本机实际文件位置调整):

scp "C:\Users\Lenovo\Documents\Codex\2026-10-20\w-p\outputs\board-apt-multiversion.tar.gz" root@120.26.244.161:/tmp/

输入你自己的服务器密码。

二、在服务器安装并首次发布

以下命令在阿里云宿主机 root 的交互式 SSH 终端执行:

tar -xzf /tmp/board-apt-multiversion.tar.gz -C /tmp
bash -n /tmp/board-apt-multiversion/install.sh
bash -n /tmp/board-apt-multiversion/publish-board-apt
bash /tmp/board-apt-multiversion/install.sh

安装器会检查现有挂载、停止 apt-manager 后备份、再启动容器并安装 Jammy 官方仓库中的 dpkg-dev、apt-utils、python3 等工具。网站仍由宿主机 Nginx 提供静态文件。备份位于命令输出的 /var/backups/board-apt/multiversion-XXXXXXXX,目录仅 root 可读。

出现 Installation complete 后,再运行:

/usr/local/sbin/publish-board-apt

如果出现 GPG 提示,输入现有仓库签名密钥的口令。不要输入服务器登录密码来代替密钥口令。

首次发布会收集现有 repo/pool、公开 pool 以及 packages 上传目录内的 .deb,读取包内部的名称、版本、架构,并规范存储路径。它会完整检查新输入包的数据归档。同包名、同版本、同架构但内容不同的文件会导致发布中止:请重新打包为更高的版本号,再处理冲突文件。

发布完成的标志:

Published successfully: build-...

脚本会先验证完整索引、GPG 签名,并使用隔离的 APT 列表和缓存目录验证版本查询;随后同步和校验公开包文件,最后切换 InRelease。构建或校验失败时,不会把该构建的新 InRelease 切到线上。

三、板卡一键接入 APT 源(推荐)

不要一段段粘贴公钥和源配置。在板卡上整行复制下面对应命令即可:脚本会校验公钥、写入源、执行 apt-get update,并尽量停用冲突的旧源文件。

喜悦星宇源(apt.liangjunxing.com):

curl -fsSL https://apt.liangjunxing.com/setup-board-apt.sh | sudo bash

宏远天翔源(apt.hongyuantianxiang.com):

curl -fsSL https://apt.hongyuantianxiang.com/setup-board-apt.sh | sudo bash

成功后可再确认:

apt-cache madison qtracker-booster
sudo apt-get install qtracker-booster
选哪个? 两套源相互独立。板卡按项目归属选一个接入即可,一般不要同时启用两套,以免包名冲突。

四、服务器与板卡验收

服务器上运行:

curl -fsS https://apt.liangjunxing.com/health
curl -fsS https://apt.liangjunxing.com/dists/jammy/main/binary-arm64/Packages \
  | sed -n '/^Package:/p; /^Version:/p; /^Architecture:/p'

板卡上(已跑过一键脚本后)运行:

sudo apt-get update
apt-cache madison qtracker-booster

当前只有 1.0.0 时,查询到一个版本是正常现象。发布 1.0.1 后,两个版本都会列出,无需修改板卡源地址、公钥或 suite。

五、以后发布新版

打包设备先修改打包脚本中的版本参数,让生成包内部的 Version 变为例如 1.0.1;包名保持 qtracker-booster,架构保持 arm64。只重命名文件不会改变内部版本。

在香橙派上传,先使用临时扩展名,上传完成前不会被索引器扫描:

scp /home/orangepi/G4040-cameralink-in-sdi-out/dist_deb/qtracker-booster_1.0.1_arm64.deb \
  root@120.26.244.161:/srv/board-apt/packages/qtracker-booster_1.0.1_arm64.deb.upload

上传成功后,在服务器宿主机 root 终端执行:

mv /srv/board-apt/packages/qtracker-booster_1.0.1_arm64.deb.upload \
   /srv/board-apt/packages/qtracker-booster_1.0.1_arm64.deb
publish-board-apt

上面的 1.0.1 是示例,替换成每次真实发布的版本。发布过程中可能需要输入 GPG 密钥口令。当前是上传后手动执行发布命令,不会自动监听目录。

板卡按需选择:

# 查看可用版本
sudo apt-get update
apt-cache madison qtracker-booster

# 安装/升级到候选最新版
sudo apt-get install qtracker-booster

# 安装指定版本(版本必须已发布)
sudo apt-get install qtracker-booster=1.0.1

# 回退到已保留的旧版(确认程序自身的数据格式支持回退)
sudo apt-get install --allow-downgrades qtracker-booster=1.0.0

# 只下载,不安装
apt-get download qtracker-booster=1.0.0

六、目录与保留范围

路径用途
/srv/board-apt/packages/上传目录,只扫描最终扩展名为 .deb 的文件
/srv/board-apt/repo/.multiversion/archive/校验过的历史包归档
/srv/board-apt/repo/.multiversion/builds/独立构建及验证结果
/srv/board-apt/repo/.multiversion/BACKUP本次迁移前备份路径
/usr/local/sbin/publish-board-apt统一发布命令
/var/www/board-apt/Nginx 提供的公开文件

「最近 10 版」指每个包、每种架构最多索引 10 个版本,按 Debian 版本排序,并非按上传时间排序。较老 .deb、历史构建和公开 by-hash 文件保留作为恢复材料,不自动删除,因此磁盘使用会随发布次数增长。构建中的包通过硬链接复用归档文件。

可为某次发布调整可选版本数量,例如:

KEEP_VERSIONS=20 publish-board-apt

后续不带该参数运行时,仍使用默认 10。历史文件保留,因此也可以重新索引更早的版本。

七、需要恢复原公开仓库时

以下命令在服务器宿主机 root 终端执行,仅恢复旧公开内容;额外的历史包文件不删除。当前新发布流程停用,回到原先的 reprepro 流程:

BACKUP_DIR=$(cat /srv/board-apt/repo/.multiversion/BACKUP)
tar -xzf "$BACKUP_DIR/original.tgz" -C / var/www/board-apt
restorecon -RF /var/www/board-apt

原始 repo/db 和 conf 从未迁移;完整备份中还包含当时的源仓库、上传文件、公钥和私钥。如需恢复原发布脚本,备份目录内若有 publish-board-apt.previous,可重新安装该文件;否则回到原来的手工发布步骤。恢复后不要再运行新版 publish-board-apt,除非准备重新切换到多版本流程。

验证范围与参考

脚本在生成环境中完成 Python 编译及版本保留、重复版本冲突、索引校验等逻辑测试;生成环境是 Windows,没有 Linux/Docker 运行环境,因此真实 dpkg/GPG/APT 集成验证由服务器首次发布中的检查完成。线上验证仍以服务器与板卡执行结果为准。