如何建立APT储存库?


52

我想在将提供几个软件包的服务器上建立一个APT存储库。

有没有一种方法可以在服务器上安装任何软件的情况下进行设置?

文件如何组织?


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

我不确定在哪里或在什么地方,但是配置错误。我目前只有一个软件包,适用于所有体系结构。

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

deb http://quickmediasolutions.com/apt stable main

您可以编辑和添加下载的应用程序所使用的许可证类型吗?这是供私人使用还是您打算分发它们等?
Jorge Castro

@Jorge:你什么意思?有什么应用?
内森·奥斯曼

1
我试图确定该软件包是否为OSS,您才可以使用启动板。
Jorge Castro

@Jorge:不,不是OSS。(实际上,它几乎是我编写的唯一的应用程序。)
Nathan Osman 2010年

Answers:


26

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


使它无法正常工作有点麻烦。请参阅我对问题的更新。
内森·奥斯曼

1
您似乎正在尝试设置“自动”存储库。对于一个(或几个)软件包,使用琐碎的存储库会更好。尝试将Packages.gz和deb一直移动到quickmediasolutions.com/apt/binary中。然后您的来源将是deb http://quickmediasolutions.com/apt binary/
Michael Crenshaw'7

2
琐碎的存储库在固定时会出现问题,但是是的,它们是为几个软件包设置存储库的最快/最简单的方法。仅仅为2-3个软件包设置一个池式仓库似乎很愚蠢。
蒂姆·波斯特

乔治,您曾经做过这项工作吗?
Michael Crenshaw,2010年

@mac:嗯....我还没来得及尝试:)我最终只是将所有内容上传到PPA。
内森·奥斯曼

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

我说没有密码,因为您的网络服务器没有内置的猴子可以重复输入。签名的程序包和存储库仅用于满足更新管理器对此的抱怨。只需上传两个键到新的/apt/网页伺服器储存库目录,但删除secret.gpg初始化。

更新CGI脚本

这是简单的更新外壳程序/ 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您放入的任何文件,还可以递归搜索(从一个级别开始)以寻找其他文件,并将它们符号链接到其中。(Options FollowSymLinks最终需要.htaccess 。)

您可以作为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习惯性地将标志用于所有内容,或者如果您实际上不确定包的来源。

为了可用性

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

备择方案

如今,有一些工具可以自动执行存储库管理。甚至还有存储库在线托管和软件包构建服务(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(用于打包脚本语言应用程序的更懒惰的方法。)


1
要使用该存储库时,如何添加gpg密钥?
布鲁斯·孙

1
通常类似wget …/public.gpg -O- | apt-key add -
mario '18

如果确实要支持多种体系结构,我需要更改什么?
starbeamrainbowlabs

1
@starbeamrainbowlabs不确定,但我认为dpkg-scanpackages -m可能就足够了。它将仍在同一Release文件中列出所有体系结构。但是,只要每个.deb具有唯一的名称/或存储在不同的子目录(amd64 /,all /)中,它就应该可以工作。否则,将使用较复杂的存储库工具之一。
马里奥

7

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

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

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


@txwikinger:我无法安装软件包的原因是因为服务器正在运行centOS :)
Nathan Osman

好。您不需要。您可以在另一台计算机上创建所有内容,然后将整个树
同步

是的,我绝对会第二次使用reprepro。这将使您的生活变得更加轻松。万一它可以让您更好地保护签名密钥,甚至可以在另一台计算机上创建存储库。
andol 2010年

@andol&@txwikinger:我正在尝试但遇到了问题。请查看我更新的问题。
内森·奥斯曼

对于您的dists文件,您仍然需要./binary-<specific arch>。
andol 2010年


0

对于遵循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文件夹中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.