我们正在构建一个应用程序,它将被打包到 DEB 包中。我们希望能够使用apt-get
.
为此,我们计划在组织内部署我们自己的 DEB 包存储库。 (因此,我们仅托管我们的包,但不镜像现有的外部存储库)该包存储库应由组织内的所有 Linux 服务器使用,以仅安装我们的单个应用程序包。
有人可以解释一下应该如何完成此操作(包括最佳实践)吗?
- 如何为我们的包设置一个最小的 DEB 包存储库(并在新版本发布时进行处理)?
- 设置 Debian 服务器,以便从组织内的自定义 DEB 包存储库服务器获取此单个包。
答案1
在花了一些时间挖掘大量文档源之后,我提出了以下解决方案,我正在分享:
- 在用于托管存储库的机器上,根据描述设置个人存储库Ubuntu 文档, 但不要在该机器上添加sources.list条目。
通过 Web 服务器(例如使用 Nginx)公开包含 DEB 文件和 Packages.gz 文件的目录,以便所有使用 DEB 文件的计算机都可以使用该目录。
在将获取 DEB 包的计算机上,向文件添加一个条目
/etc/apt/sources.list
,该条目指向您的服务器(将 foobar 替换为您自己的 URL):deb [trusted=yes] http://foobar/ /
- 跑步
sudo apt update
- 运行
sudo apt install foobar
安装自己的包(将foobar替换为自己的包名)
笔记:此设置托管 DEB 包,没有签名包/存储库提供的任何保护。如果存储库可供比驻留在公司防火墙后面的受保护子网上的团队服务器更广泛的受众使用,您可能希望实现存储库和包的签名。
答案2
您可以使用 dpkg-scanpackages 手动执行此操作,就像您在答案中所解释的那样。然而,也有一些更高级别的工具可以处理这个问题。一个简单的帮助工具,它也支持迁移和签名存储库和其他东西,称为复制品。首先,这样的事情可能会起作用:
$ mkdir ~/repo
$ cd ~/repo
$ mkdir incoming conf repository
$ cat > conf/options <<EOF
morguedir +o/old-versions
outdir +b/repository
EOF
$ cat > conf/distributions <<EOF
Codename: stretch
Origin: <you>
Label: <you>
Description: <description of this repository>
Architecture: source amd64 i386
Components: main
SignWith: <your gpg key ID>
EOF
$ cat > conf/incoming <<EOF
Name: incoming
IncomingDir: incoming
LogDir: logs
TempDir: /tmp
Multiple: yes
Permit: older_version unused_files
Allow: stretch
EOF
现在,每当您想要将任何包添加到存储库时,都可以将包(及其.changes
文件)添加到~/repo/incoming
目录中,然后:
cd ~/repo
reprepro processincoming incoming
这将询问您的 GPG 密钥密码(除非它是无密码密钥);输入后,存储库将是最新的,并且将被签名。
Reprepro 有详细记录手册页;如果您需要更多详细信息,我建议您查看一下。