在一个网络服务器上设置一个简单但已签名的仓库。因为大多数其他教程都有点过时或繁琐,所以我将在这里尝试复制该过程。初始配置需要一些努力,但简单的构建脚本使其易于管理。您只需放入新的*.deb文件,然后更新,或者让cron作业处理。
生成一些签名密钥
首先,您需要为软件包和仓库创建一个gpg签名密钥。将其设置为(4) RSA签名密钥,无密码,并在要求时给它一个唯一的$KEYNAME。(后续示例假设keyname为"dpkg1")。
gpg --gen-key
gpg -a --export-secret-key dpkg1 > secret.gpg
gpg -a --export dpkg1 > public.gpg
我说不需要密码,因为你的网络服务器没有内置的猴子来重复输入密码。签名的软件包和存储库只是为了满足更新管理器对此的投诉。只需将两个密钥上传到您的网络服务器上的新的
/apt/
存储库目录中,但在初始化之后删除
secret.gpg
密钥。
更新CGI脚本
这是用于它的简单更新shell/CGI脚本:
#!/bin/sh
echo Status: 200 Okay
echo Content-Type: text/plain
echo
echo Rebuilding APT repository:
{
#-- settings
export GNUPGHOME=/var/www/usr12345/files
export KEYNAME=dpkg1
#-- one-time setup
if [ ! -e "$GNUPGHOME/secring.gpg" ] ; then
gpg --import -v -v ./secret.gpg
gpg --import -v -v ./public.gpg
gpg --list-keys
fi
#-- symlink .deb files from adjacent sub-directories
find .. -name '*.deb' -exec ln -s '{}' . \;
#-- build Packages file
apt-ftparchive packages . > Packages
bzip2 -kf Packages
#-- signed Release file
apt-ftparchive release . > Release
gpg --yes -abs -u $KEYNAME -o Release.gpg Release
} 2>&1
这三行
gpg
只需要执行一次,以初始化在某个目录
$GNUPGHOME
(在文档根目录上方)中的GPG设置。成功后仅删除
secret.gpg
。
这个小型shell脚本的一个独特功能是它接受您放入的任何
*.deb
文件,并递归地搜索其他文件(从上一级开始),并创建符号链接。 (最终需要.htaccess
Options FollowSymLinks
。)
您可以手动将此脚本作为CGI执行,也可以通过cron作业执行。但请隐藏它,或者更好地将其移出文档根目录。
因为它是一个“简单”的apt存储库,所以需要以下
apt-sources.list
条目:
deb http://example.org/deb/ ./ # Simple signed repo
这适用于单一架构的软件库,如果你不期望有数百个软件包。
软件包签名
一旦设置好了你的 gpg 密钥,对个别软件包进行签名也是非常简单的。
dpkg-sig -k dpkg1 -s builder *.deb
(这应该在构建软件包的工作站上完成,而不是在仓库 Web 服务器上。)
未签名仓库
如果您不需要签名的软件包,则可以将更新脚本简化为:
dpkg-scanpackages . > Packages
bzip2 -kf Packages
可以仍然被普通用户使用,但需要为
apt.sources
设置自定义标志。
deb [trusted=yes] http://apt.example.org/deb/ ./
但请不要习惯性地对所有事情使用“trusted=yes”标志,或者如果您对软件包的来源并不确定。
为了易用性
对于最终用户来说,只需将一个HEADER.html
文件放入存储库目录中。Apache的mod_auto_index
会在前面添加该注释:
<h1>http://example.org/apt/</h1>
<dl>
<dt>Add this repository to /etc/apt/sources.list as:
<dd><kbd>deb http://example.org/apt/ ./ # example repo</kbd>
<dt>Import verification key with:
<dd><kbd>wget -q http://http://example.org/apt/public.gpg -O- | sudo apt-key add -</kbd>
</dl>
替代方案
现在有一些工具可以自动化管理代码库。甚至还有在线托管代码库和软件包构建服务(gemfury,packagecloud,bintray等)。
由于这与原问题密切相关,因此也有一些工具可以更轻松地构建Debian软件包。有点过时的是:
EPM。更现代的是:
FPM。还有我个人的分支:
XPM(用于打包脚本语言应用程序的更懒惰方法)。