如何设置 APT 存储库?

Nat*_*man 54 package-management apt repository

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

有没有办法在服务器上安装任何软件的情况下进行设置?

文件必须如何组织?


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

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

这是添加到我的/etc/apt/sources.list

deb http://quickmediasolutions.com/apt stable main
Run Code Online (Sandbox Code Playgroud)

mar*_*rio 40

只需在网络服务器上设置一个简单但已签名的存储库。因为大多数其他教程有些过时或繁琐,我将尝试在此处复制该过程。初始配置需要一些努力,但简单的构建脚本使其易于管理。您可以放入新*.deb文件,然后进行更新,或者让 cron 作业来处理。

生成一些签名密钥

首先,您需要gpg为包和存储库创建签名密钥。将其设为 (4) RSA 签名密钥,无密码,并在需要$KEYNAME时为其赋予唯一性。(进一步的例子假设“ dpkg1”作为键名。)

 gpg --gen-key
 gpg -a --export-secret-key dpkg1 > secret.gpg
 gpg -a --export dpkg1            > public.gpg
Run Code Online (Sandbox Code Playgroud)

我说没有密码,因为你的网络服务器没有内置的猴子来重复输入。并且签名的包和存储库只是为了满足更新经理对此的抱怨。只需将两个密钥上传到/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
Run Code Online (Sandbox Code Playgroud)

gpg三行只需要执行一次,即可在某个目录$GNUPGHOME(文档根目录上方)中初始化 GPG 设置。secret.gpg成功后才删除。

这个小型 shell 脚本的一个独特功能是它接受*.deb您放入的任何文件,但也会递归搜索(从一个级别开始)其他文件,并将它们符号链接。(Options FollowSymLinks最终需要 .htaccess 。)

您可以手动执行此脚本作为 CGI 或每个 cron-job。但是隐藏它,或者更好地将它移出文档根目录。

因为它是一个“微不足道”的 apt 存储库,所以它需要以下apt-sources.list条目:

deb http://example.org/deb/  ./    # Simple signed repo
Run Code Online (Sandbox Code Playgroud)

这适用于单一架构的存储库,如果您不期望有数百个包。

包签

一旦你设置了你的 gpg 密钥,签署你的个人包也很简单:

dpkg-sig -k dpkg1 -s builder *.deb
Run Code Online (Sandbox Code Playgroud)

(这应该在构建软件包的工作站上完成,而不是在存储库网络服务器上。)

未签名存储库

如果您不需要签名包,那么您可以将更新脚本缩减为:

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages
Run Code Online (Sandbox Code Playgroud)

普通用户仍然可以使用它,但需要一个自定义标志apt.sources

deb [trusted=yes] http://apt.example.org/deb/ ./
Run Code Online (Sandbox Code Playgroud)

但是请不要trusted=yes习惯性地将标志用于所有内容,或者如果您实际上不确定包的来源。

为了可用性

对于最终用户,只需将 aHEADER.html放入存储库目录即可。Apachesmod_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>
Run Code Online (Sandbox Code Playgroud)

备择方案

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

  • 一个相当方便的替代方法是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(用于打包脚本语言应用程序的更懒惰的方法。)


Mic*_*haw 27

使用 dpkg-scanpackages 设置一个简单的存储库非常容易。此页面介绍了如何建立一个简单的回购,而这一个说明如何使用它(向下滚动到例如4)。

  • 琐碎的存储库在固定时会出现问题,但是是的,它们是为几个包设置存储库的最快/最简单的方法。只为 2 - 3 个包设置一个汇集的 repo 似乎很愚蠢。 (2认同)

txw*_*ger 7

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

这里详细说明了文件的组织方式以及索引文件的创建方式。

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