it-swarm.cn

如何设置APT存储库?

我想在服务器上设置一个APT存储库,它将提供几个包。

有没有办法设置一个没有在服务器上安装任何软件?

如何组织文件?


编辑:我一定做错了什么......有人可以帮帮我吗?我有 http://quickmediasolutions.com/apt/dists 的存储库

我不知道在哪里或什么,但有些东西是错误配置的。我目前只有一个包,它适用于所有架构。

这是我的/etc/apt/sources.list中添加的内容:

deb http://quickmediasolutions.com/apt stable main
52
Nathan Osman

使用dpkg-scanpackages设置一个简单的存储库非常容易。 本页 解释如何设置一个简单的回购, 这一个 解释如何使用它(向下滚动到例4)。

26
Michael Crenshaw

只需在网络服务器上设置一个简单但已签名的存储库。因为大多数其他教程有点过时或繁琐,我会尝试在这里复制过程。初始配置需要一些努力,但简单的构建脚本使其易于管理。你可以直接删除新的*.deb文件,然后更新,或让cron作业处理它。

生成一些签名密钥

首先,您需要为包和存储库创建gpg签名密钥。使它成为(4)RSA签名密钥,没有密码,并在被要求时给它一个唯一的$KEYNAME。 (进一步的例子假设“dpkg1”为键名。)

 gpg --gen-key
 gpg -a --export-secret-key dpkg1 > secret.gpg
 gpg -a --export dpkg1            > public.gpg

我说没有密码,因为你的网络服务器没有内置的猴子可以反复输入。签名的软件包和存储库只是为了满足更新管理员对此的抱怨。只需将两个密钥上传到Web服务器上的新/apt/存储库目录,但删除secret.gpg密钥after初始化。

更新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。但是隐藏它,或者更好地将其移出文档根目录。

因为它是一个“普通的”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标志,或者如果你真的不确定包Origin。

为了实用性

对于最终用户,只需将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>

备择方案

现在有一些工具可以自动化存储库管理。甚至还有存储库在线托管服务和包构建服务( gemfurypackagecloudbintray 等)

  • 一个相当方便的选择是 prm 。这是一个Ruby脚本,它构建了复杂的APT和YUM repos。 (但是,让我们希望RPM最终很快就会消失......) - 最好按gem install prm安装。

  • 而且我也写了一个小脚本来自动化这个: http://apt.include-once.org/apt-phparchive - 请注意它不是过于强大并写在PHP(一次,这是巧合),最初用于DEB,以及RPM-over-APT和Phar捆绑。

由于这与原始问题密切相关,因此还有更容易构建Debian软件包的工具。有些过时了: EPM 。更多当代人: FPM 。我的个人分支: XPM (更加懒惰的方法来打包脚本语言应用程序。)

40
mario

是。你可以这样做。您只需要以正确的方式组织文件并创建索引文件。如果将目录结构放在Web服务器的文档根目录中,则只能通过Web服务器访问这些包。

这里 详细描述了如何组织文件以及如何创建索引文件。

如果您愿意安装那个包,也可以使用名为 reprepro 的工具。这将使管理更方便。

7
txwikinger

您也可以考虑 Launchpad PPA

2
ups

对于在关注mario的答案后面临此错误的任何人:

Unable to find expected entry 'Packages' in Release file (Wrong sources.list entry or malformed file)

请执行下列操作:

dpkg-scanpackages debs /dev/null > Packages
gzip -k Packages
apt-ftparchive release . > Release
gpg --default-key $KEYID -abs -o Release.gpg Release

我将*.deb文件放在debs文件夹中。

0
theeminence