问题描述
我想在服务器上设置一个APT存储库,它将提供几个包。
有没有办法在服务器上安装任何软件时设置一个?
如何组织文件?
编辑:我一定做错了什么……有人可以帮我吗?我在http://quickmediasolutions.com/apt/dists有存储库
我不知道在哪里或什么,但有些东西是错误配置的。我目前只有一个包,它适用于所有架构。
这里’s what’已添加到我的/etc/apt/sources.list
:
deb http://quickmediasolutions.com/apt stable main
最佳解决方案
使用dpkg-scanpackages设置一个简单的存储库非常容易。 This page解释了如何设置一个简单的仓库,this one解释了如何使用它(向下滚动到例4)。
次佳解决方案
只需在Web服务器上设置一个简单但已签名的存储库。因为大多数其他教程有点过时或繁琐,我会尝试在这里复制过程。初始配置需要一些努力,但简单的构建脚本使其易于管理。你可以直接放入新的*.deb
文件,然后更新,或让cron作业处理它。
生成一些签名密钥
首先,您需要为包和存储库创建gpg
签名密钥。将其设为(4)RSA签名密钥,无密码,并在要求时为其提供唯一的$KEYNAME
。 (进一步的例子假设“dpkg1
”为关键名。)
gpg --gen-key
gpg -a --export-secret-key dpkg1 > secret.gpg
gpg -a --export dpkg1 > public.gpg
我说没有密码,因为你的网络服务器没有内置的猴子可以反复输入。签名的软件包和存储库只是为了满足update-managers对此的抱怨。只需将两个密钥上传到Web服务器上的新/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-job的形式执行此脚本。但是隐藏它,或者更好地将其移出文档根目录。
因为它是”trivial” apt存储库,所以需要以下apt-sources.list
条目:
deb http://example.org/deb/ ./ # Simple signed repo
这适用于single-architecture存储库,如果您不期望数百个包。
包签名
一旦你设置了你的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
放入存储库目录即可。 Apaches 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>
Alternatives
现在有一些工具可以自动化存储库管理。甚至还有存储库在线主机和包构建服务(gemfury,packagecloud,bintray等)
-
一个相当方便的替代方案是prm。这是一个Ruby脚本,它构建了复杂的APT和YUM存储库。 (但是,让我们希望RPM最终很快就会消失……) – 最好按照
gem install prm
进行安装。 -
我也编写了一个小脚本来自动执行此操作:http://apt.include-once.org/apt-phparchive – 请注意,它不是过于强大并且用PHP编写(一次,这是巧合),最初用于DEB,以及RPM-over-APT和Phar捆绑。
由于这与原始问题密切相关,因此还有更容易构建Debian软件包的工具。有些过时了:EPM。更多当代人:FPM。我的个人分支:XPM(用于打包脚本语言应用程序的更懒惰的方法。)
第三种解决方案
是。你可以这样做。您只需要以正确的方式组织文件并创建索引文件。如果将目录结构放在Web服务器的文档根目录中,则只能通过Web服务器访问这些包。
Here详细描述了如何组织文件以及如何创建索引文件。
如果您愿意安装该软件包,也可以使用名为reprepro的工具。这将使管理更方便。
第四种方案
您也可以考虑使用Launchpad PPA