使用reprepro+nginx搭建apt服务器

这篇具有很好参考价值的文章主要介绍了使用reprepro+nginx搭建apt服务器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

项目背景

项目要求

项目开发过程

1、apt服务器的搭建

2、实现自定义指定源文件列表来实现apt update更新

3、实现软件启动时自动更新

4. source.list中镜像源地址的格式

项目开发的难点/坑点

总结


项目背景

       前面写过一篇“利用Nginx搭建一个apt服务器”, 但只是前期铺垫工作,只适合用于简单的场景,并没有细化,简单实现能用apt安装就可以了。现在我们来细化一下,添加一下要求,使其更加实用,适用于大型项目。

项目要求

  1. 远程服务器(实际应用会部署在阿里云上)搭建apt服务器,建立软件包管理仓库,以提高软件包下载速度,并保存有软件包仓库的地址、发行版代号、组件等信息;
  2. 本地可用apt install来安装软件;
  3. 本地可用apt update来检查是否有软件更新;
  4. 检查是否有更新或更新软件时,只涉及本apt服务器所在的源地址,不涉及其他源地址;
  5. 每当软件启动时,会自动检查更新,当有更新时自动更新;

项目开发过程

1、apt服务器的搭建

        首先需要在服务器上建立一个本地软件包镜像仓库,而建立仓库有多种手段,可以借助工具来实现,比如:apt-mirror 、repreproaptly等都是可以的,选其一即可。在此我选择了reprepro,它是一个由Debian项目提供的开源软件包管理工具,用于构建和管理Debian软件包仓库,可以帮助用户轻松地创建本地APT仓库并进行软件包的管理、发布和分发。

  • 安装reprepro

首先,在您的服务器上安装reprepro软件包管理工具。您可以使用以下命令进行安装:

$ sudo apt update

$ sudo apt install reprepro

  • 创建reprepro仓库

 创建一个目录用于存储reprepro的仓库,例如/var/www/html/apt-repository

 进入到reprepro仓库目录,并使用以下命令初始化reprepro仓库

$ mkdir /var/www/html/apt-repository

$ cd /var/www/html/apt-repository

$ mkdir conf 

$ cd conf

$ touch  distributions

distributions用于指定软件包仓库的不同发行版(distribution)的信息。

编辑distributions配置文件并添加必要的信息。您可以参考下面的示例配置文件内容:

Origin: Your_Origin     // 指定软件包仓库的来源,通常是您或您的组织的名称

Label: Your_Label       // 给软件包仓库设置一个标签,用于标识仓库

 // 每个发行版都有一个代号,比如 stabletestingunstable 等

Codename: Your_Codename 

// 指定软件包支持的架构,比如 amd64i386arm64 等

Architectures: Your_Architectures

// 指定软件包仓库的组件,比如 maincontribnon-free 等

Components: main

Description: Your_Description

// 指定用于对软件包进行签名的GPG密钥ID

SignWith: YOUR_KEY_ID   

 GPG密钥的生成:

gpg --gen-key

按照提示创建你的GPG密钥。

gpg --list-keys //显示密钥

gpg --list-keys --keyid-format LONG  //显示密钥和密钥ID

 密钥ID通常是8byte的16进制组合。

确保配置文件中的信息正确无误后,再次尝试使用以下命令初始化reprepro仓库:

$ cd /var/www/html/apt-repository

$ reprepro export

执行后,目录下应该会有以下文件生成:

$ ls

conf    db   dists    lists

现在仓库初始化完成。

  • 添加软件包到reprepro仓库

将您的软件包文件拷贝到服务器的某一目录下,例如/home/w/publish/ 。

使用以下命令将软件包添加到reprepro仓库中:

$ reprepro includedeb YourCodename /home/w/publish/package.deb

其中,YourCodename为您在配置文件中设置的Codename,当然这里也可以写软件包镜像仓库的路径,但不如写codename来的方便。

  • 发布版本

使用以下命令发布版本到reprepro仓库中:

$ reprepro export

 执行的时候会需要再次输入密钥的短语,确认后即可。

可以看一下目录架构:

$ tree

apt搭建,环境,运维,nginx,linux,容器,bash,reprepro,apt服务器

 成功后会生成一个“pool”的文件夹,存放安装包。

  • 配置Nginx

安装Nginx并配置为代理reprepro仓库的静态文件。您可以使用以下命令安装Nginx

$ sudo apt-get install nginx

编辑Nginx的配置文件/etc/nginx/sites-available/default,添加类似以下配置来代理reprepro仓库:

server {
    listen 80;

    root /var/www/html/apt-repository;
    server_name _;

    location / {
        autoindex on;
    }
}

nginx默认的路径是“/var/www/html”,将其改为仓库的路径,或者在location中使用alias命令:

location / {
        alias /var/www/html/apt-repository;
        autoindex on;
    }

保存配置文件并重启Nginx服务:

$ sudo systemctl restart nginx

  • 本地配置访问APT服务器

现在,您可以通过浏览器或者使用apt-get命令来访问您搭建的APT服务器。

在客户端的/etc/apt/sources.list文件中添加以下行来指向您的APT服务器:

deb http://192.168.2.103/ codename main

codename为您的发行版名称,main为您的软件包组。

sudo apt update

之后就可以通过

sudo apt install xxx

来安装软件了。

apt搭建,环境,运维,nginx,linux,容器,bash,reprepro,apt服务器

2、实现自定义指定源文件列表来实现apt update更新

 下面说一下实现自定义指定源文件列表来实现apt update更新,在 /etc/apt/sources.list 定义了软件源外,/etc/apt/sources.list.d 目录下的文件中也会定义一些第三方的软件源或者叫 PPA(Personal Package Archives)。如果将apt服务器的源地址写在source.list 文件中的话,每次update的时候都要将系统上所有的镜像源全都检查一遍,耗时较多,并不符合我们此次的项目的目的。如果使用软件启动时采用自检查更新的方案的话,这将会造成软件启动慢、客户体验不佳的问题。因此,单独设置apt服务器源地址是有必要的。

  1. /etc/apt/sources.list.d/目录下创建一个新的源文件,比如mirror.list,可以使用以下命令创建:

    $ sudo touch /etc/apt/sources.list.d/mirror.list

  2. 编辑这个新创建的源文件mirror.list,并添加您想要使用的镜像源地址,例如:

    deb http://your-mirror-server/ubuntu bionic main

  3. 确保mirror.list中的源地址格式正确,包括deb或者deb-src开头,并且每行只包含一个源地址。

  4. 运行 

apt update -o Dir::Etc::sourcelist=/etc/apt/sources.list.d/mirror.list

命令来更新APT,这样APT会按照mirror.list中的源地址来更新软件包信息。

3、实现软件启动时自动更新

程序启动时需要启动的脚本:

#!/bin/bash

# 执行 apt update 命令检查更新
apt update -o Dir::Etc::sourcelist=/etc/apt/sources.list.d/mirror.list > /dev/null

# 检查 apt update 命令的返回状态
if [ $? -eq 0 ]; then
    echo "检查更新成功"

    # 检查是否有可用更新
    if apt list --upgradable | grep -qE '\[upgradable\]'; then
        echo "发现可用更新,执行升级操作"
        apt upgrade -y
        echo "软件包已升级"
    else
        echo "没有可用更新"
    fi
else
    echo "检查更新失败,请检查网络连接或软件源配置"
fi

软件启动时,采用自动检查是否有更新,如果有更新,则自动更新的方案避免了用户手动更新的问题,毕竟不能要求所有用户都会使用linux系统。

4. source.list中镜像源地址的格式

  1. 源地址的格式

    • 源地址通常以debdeb-src开头,分别表示二进制软件包和源代码软件包。
    • 紧接着是软件包的下载地址,可以是HTTP、FTP等协议的URL。
    • 接下来是发行版的代号,例如Ubuntu中的版本代号(如bionic、focal等)。
    • 最后是软件包的组件,如main、restricted、universe、multiverse等。
  2. 源地址的组成

    • 主要组件(main):包含由官方团队维护的自由软件。
    • 受限组件(restricted):包含受限制的软件,不是完全自由的。
    • 宇宙组件(universe):包含社区维护的自由软件。
    • 多元宇宙组件(multiverse):包含非自由软件。

项目开发的难点/坑点

  • 问题1,将软件包文件包含进仓库的时候报错:

$ reprepro includedeb immortal /home/w/publish/benan-test-gateway_1.0.2_amd64.deb

// error

“no section given for '.deb',skipping”

“no priority given for '.deb',skipping”

        这个并不是distributions配置文件的设置问题,不要被误导,这其实是因为.deb安装包打的有问题,.deb安装包打包的时候,其control文件的设置中缺少了“section”、“priority”属性。

control 文件的属性一般如下, 

package: packagename  // 软件包的名称

version: 1.0.2  // 软件包的版本号,通常遵循特定的版本号规范,此属性必须有

architecture: amd64  // 软件包适用的架构,例如 amd64i386 等,此属性必须有

maintainer: name <email>   //软件包的维护者信息,包括姓名和邮箱地址,可不写

depends: dpkg  //软件包的运行时依赖关系,没有的话可以不写

recommends: npm,sudo // 软件包的建议性依赖关系,可不写

description: 描述信息,随便写

//软件包所属的分类,用于组织软件包在软件包管理器中的显示,此属性必须有

section: default 

// 软件包的优先级,指定软件包在安装时的优先级,此属性必须有

priority: optional 

homepage: https://xxxx/   //软件包的官方网站或主页链接,可不写

conflicts:    xxx      //软件包的冲突关系,可不写

所以,打包.deb安装包的时候尽量使用规范的写法哦。 

  • 问题2,

 W: GPG 错误:http://192.168.2.103 immortal InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY   密钥ID

 由于apt服务器的软件包镜像仓库使用了GPG加密,该加密为非对称加密,有公钥和私钥。该问题是因为系统没有该仓库的公钥用于验证软件包的签名。所以需要将其公钥下载下来并导入本地软件包仓库。

使用下面的命令来下载公钥:

sudo apt-key adv --keyserver http://192.168.2.103 --recv-keys 密钥ID

 其中,“http://192.168.2.103” 替换成apt服务器的地址,“密钥ID”替换成真实的密钥ID。

如果不能下载的话,可以手动将密钥文件下载到本地,然后导入:

gpg --output public_key.asc --armor --export  密钥ID   //生成密钥文件

将生成的.asc公钥文件传输到本地,然后

 sudo apt-key add <public_key.asc>

然后,

sudo apt update 

就可以了。 

总结

这样的搭配才是最实用的。

动手操作才会发现更多的细节。文章来源地址https://www.toymoban.com/news/detail-860918.html

Talk is cheap.Show me your code.

到了这里,关于使用reprepro+nginx搭建apt服务器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详解如何使用Nginx搭建文件服务器及实现文件服务

    公司最近有做文件服务器的需求,并且使用到了Nginx做负载均衡服务器,顺水推舟,就想着顺便用作文件服务器算了,实际上它也非常适合。 Nginx是一种轻巧、高效的Web服务器,用作文件服务器非常合适。但是如果需要一些高级功能,如FTP远程访问、多用户管理,可能需要选

    2024年02月09日
    浏览(62)
  • 使用nginx简单搭建一个ChatGPT代理服务器

    作者:ChenZhen 本人不常看CSDN消息,有问题通过下面的方式联系: 邮箱:1583296383@qq.com vx: ChenZhen_7 我的个人博客地址:https://www.chenzhen.space/🌐 版权:本文为博主的原创文章,本文版权归作者所有,转载请附上原文出处链接及本声明。📝 如果对你有帮助,请给一个小小的sta

    2024年02月06日
    浏览(76)
  • Ubuntu 使用 nginx 搭建 https 文件服务器

    安装 nginx 生成证书 修改 config 重启 nginx apt 安装: 使用 openssl 生成证书: 到对应的路径下: /etc/nginx/ssl/ 修改 nginx 对应的 config 文件: /etc/nginx/site-enable/default

    2024年02月06日
    浏览(47)
  • 如何使用Nginx搭建详细的静态文件服务器【经典】

    Nginx是一种强大的Web服务器,可以用于托管静态文件。本文将详细介绍如何使用Nginx搭建一个静态文件服务器,使您能够轻松地浏览目录、导航子目录和文件,并通过浏览器下载文件。 以下是使用Nginx搭建静态文件服务器的详细步骤: 步骤1:安装Nginx 首先,确保您已经安装了

    2024年02月08日
    浏览(57)
  • 图片存储解决方案之一使用nginx搭建图片服务器(一)

    常见的图片存储方案: 方案一:使用nginx搭建图片服务器 方案二:使用开源的分布式文件存储系统,例如Fastdfs、HDFS等 方案三:使用云存储,例如阿里云、七牛云等 首先下载Nginx http://nginx.org/en/download.html http://nginx.org/en/download.html?login=from_csdn    然后解压,如下图所示: 双

    2024年02月16日
    浏览(52)
  • 创建网站教程:服务器环境搭建(MySQL+Jdk+Nginx...),前后端项目部署(技术栈:SSM+Vue),域名+备案【全网最简单】

    【如有建站方面的需求欢迎 添加微信 ,接私单 】 2024/4/26记,本文写于1年前,当时建站经验不够丰富,文章逻辑混乱,近期重新编写,希望能帮助更多小伙伴,搭建属于自己的网站。 我主要以我部署的个人网站:www.pbjlovezjy.com 为例,来讲解如何搭建一个网站,源码如果需要

    2024年04月26日
    浏览(61)
  • 蓝易云:Ubuntu使用nginx搭建webdav文件服务器的详细过程

    在 Ubuntu 上使用 Nginx 搭建 WebDAV 文件服务器的详细过程如下: 安装 Nginx: 创建 WebDAV 目录: 配置 Nginx: 打开 Nginx 配置文件: 在  server  块内添加以下配置: 保存并关闭文件。 创建用户认证文件: 替换  your_username  为你想要设置的用户名。根据提示输入密码并确认。 检查

    2024年02月20日
    浏览(50)
  • 使用VsCode搭建Node.js服务器开发环境

    使用VsCode搭建Node.js服务器开发环境 在进行Node.js服务器开发时,一个好的集成开发环境可以帮助您更快地编写代码,并且提高程序的效率。在此推荐安装配置VSCode作为Node.js服务器开发环境,下面介绍安装配置过程。 Step 1:下载安装VSCode 首先我们需要访问VSCode官网(https://c

    2024年02月15日
    浏览(58)
  • 服务器上使用docker搭建gem5-gcn3环境

    3步:拉取镜像,编译gcn,测试square 1、拉取镜像 默认主机有梯子/代理,根据官网步骤 gem5 gpu:AMD VEGA GPU 报错: 解决,需要在github上设置一下token信息,参考链接 关于容器注册表支持。设置步骤: 重新拉取镜像, 报错: Error response from daemon: manifest unknown,清单未知。去gem

    2024年02月02日
    浏览(56)
  • 疯狂Node.js服务器篇:使用VsCode搭建Node.js开发环境

    疯狂Node.js服务器篇:使用VsCode搭建Node.js开发环境 Node.js作为一种流行的服务器端JavaScript运行环境,提供了强大的功能和便捷的开发体验。在本篇文章中,我们将探索如何使用VsCode搭建Node.js开发环境,以便更高效地进行服务器端应用程序的开发。 步骤1:安装Node.js 首先,我们

    2024年02月08日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包