使用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

 成功后会生成一个“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

来安装软件了。

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 ]; thenecho "检查更新成功"# 检查是否有可用更新if apt list --upgradable | grep -qE '\[upgradable\]'; thenecho "发现可用更新,执行升级操作"apt upgrade -yecho "软件包已升级"elseecho "没有可用更新"fi
elseecho "检查更新失败,请检查网络连接或软件源配置"
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 

就可以了。 

总结

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

动手操作才会发现更多的细节。

Talk is cheap.Show me your code.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32嵌入式开发需要掌握硬件、嵌入式系统、C编程语言以及相关的外设驱动等知识

学习STM32嵌入式开发需要掌握硬件、嵌入式系统、C编程语言以及相关的外设驱动等知识。以下是学习STM32的路线及重要的学习内容&#xff1a; 阶段学习内容目标1.基础知识- 理解嵌入式系统的基本概念和原理 - 了解STM32系列微控制器的特点和应用领域掌握嵌入式系统基本概念&…

Midjourney绘图欣赏系列(十)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

用Docker Compose实现负载均衡【入门篇】

在本文中&#xff0c;我们将讨论如何使用Docker Compose管理多个容器&#xff0c;并实现负载均衡。 首先&#xff0c;让我们简要介绍一下Docker Compose。Docker Compose是一个用于定义和运行多个Docker容器的工具&#xff0c;通过一个单独的文件来描述应用程序的整个服务架构…

vue项目:webpack打包优化实践

本文目录 一、项目基本信息二、分析当前项目情况1、使用 webpack-bundle-analyzer 插件2、使用 speed-measure-webpack-plugin 插件 三、解决构建问题1、caniuse-lite 提示的问题2、 warning 问题 四、打包速度优化1、修改source map2、处理 loader 五、webpack性能优化1、使用…

idea+maven+tomcat+spring 创建一个jsp项目

概述&#xff1a;我真服了&#xff0c;这个垃圾学校还在教jsp&#xff0c;这种技术我虽然早会了&#xff0c;但是之前搞的大多都是springboot web类型的&#xff0c;这里我就复习一下&#xff0c;避免以后忘记这种垃圾技术 第一步&#xff1a;创建maven项目 第二步&#xff1a…

adb shell 指令集

1.connect device连接设备&#xff1a; adb devices #return: List of devices attached 0123456789ABCDEF device2.连接终端 adb shell从设备拷贝文件到本地 adb pull <remote> [local] 如: adb pull /sdcard/demo.txt e:\从到本地拷贝文件到设备 adb push &…

HUAWEI 华为交换机 配置 MAC 地址漂移检测示例

组网需求 如 图 2-17 所示&#xff0c;网络中两台 LSW 间网线误接形成了网络环路&#xff0c;引起 MAC 地址发生漂 移、MAC 地址表震荡。 为了能够及时检测网络中出现的环路&#xff0c;可以在 Switch 上配置 MAC 地址漂移检测功能&#xff0c; 通过检测是否发生MAC 地址漂移…

从零搭建Vue项目

目录 环境准备 NodeJS安装 ​编辑 2. 选择安装目录 3. 验证NodeJS环境变量 4. 配置npm的全局安装路径 5. 切换npm的淘宝镜像 6. 安装Vue-cli Vue项目创建 1. 打开UI界面 2. 打开项目管理器 3. 创建项目 vue项目目录结构介绍 运行vue项目 Vue项目开发流程 Vue组…

JAVA的多线程及并发

1. Java 中实现多线程有几种方法 继承 Thread 类&#xff1b; 实现 Runnable 接口&#xff1b; 实现 Callable 接口通过 FutureTask 包装器来创建 Thread 线程&#xff1b; 使 用 ExecutorService 、 Callable 、 Future 实 现 有 返 回 结 果 的多 线 程 &#xff08; 也 就 …

十五、计算机视觉-sobel算子

文章目录 前言一、sobel算子的概念二、sobel算子的计算方式三、具体实现 前言 上节课我们学习了梯度的知识&#xff0c;学习了如何去计算梯度&#xff0c;本节我们继续学习计算梯度的方法&#xff0c;本节我们学习使用Sobel算子计算梯度&#xff0c;这与上节课梯度计算方法有所…

jmeter发送请求参数如何使用变量

问题描述 发送jmeter请求时&#xff0c;想设置请求参数为变量 解决方法

190基于matlab的tfrSTFT时频分布图

基于matlab的tfrSTFT时频分布图&#xff0c;计算时间序列的STFT时频分布图&#xff0c;得到瞬时频率。通过GUI可以调节图像的展示样式。程序已调通&#xff0c;可直接运行。 190 STFT时频分布图 瞬时频率 能量谱 (xiaohongshu.com)

GPT R 生态环境领域数据统计分析

自2022年GPT&#xff08;Generative Pre-trained Transformer&#xff09;大语言模型的发布以来&#xff0c;它以其卓越的自然语言处理能力和广泛的应用潜力&#xff0c;在学术界和工业界掀起了一场革命。在短短一年多的时间里&#xff0c;GPT已经在多个领域展现出其独特的价值…

Django调用mysql

Django——数据库 1、ORM ORM 是 Django提供的内置框架 &#xff0c; 是和一些关系型数据库的连接接口&#xff0c;使用类对象的方式操作数据(增删改查)。 ORM 将类对象的操作语句转换为 sql 语句&#xff0c;将在数据库中查询得到的结果转换为对象的格式进行返回 在 Djang…

excel统计分析——一元直线回归

参考资料&#xff1a;生物统计学 两个具有因果关系的协变量如果呈直线关系&#xff0c;可以用直线回归模型来分析两个变量的关系。直线回归&#xff08;linear regression&#xff09;是回归分析中最简单的类型&#xff0c;建立直线回归方程并经检验证明两个变量存在直线回归关…

如何使用 templ 在 Go 中编写 HTML 用户界面?

简介 templ 是一个在 Go 中编写 HTML 用户界面的语言。使用 templ&#xff0c;我们可以创建可呈现 HTML 片段的组件&#xff0c;并将它们组合起来创建屏幕、页面、文档或应用程序。 安装 我们可以通过以下两种方式来安装 templ&#xff1a; go 安装 首先&#xff0c;我们需…

软件需求分析报告-word

第3章 技术要求 3.1 软件开发要求 第4章 项目建设内容 第5章 系统安全需求 5.1 物理设计安全 5.2 系统安全设计 5.3 网络安全设计 5.4 应用安全设计 5.5 对用户安全管理 5.6 其他信息安全措施 第6章 其他非功能需求 6.1 性能设计 6.2 稳定性设计 6.3 安全性设计 6.4 兼容性设计…

C++标准输入输出和名字空间

C标准输入输出和名字空间 标准输入输出 在C中&#xff0c;标准输入输出&#xff08;I/O&#xff09;是通过标准库中的iostream库来实现的&#xff0c;它提供了一套流&#xff08;stream&#xff09;抽象来进行数据的输入和输出操作。这套流抽象包括输入流用于读取数据&#x…

leetcode 热题 100_合并两个有序链表

题解一&#xff1a; 迭代&#xff1a;分别用两个指针遍历两段链表&#xff0c;逐步比较两链表的节点&#xff0c;将值较大的节点存入新链表&#xff0c;同时指针移动&#xff0c;直到某段链表遍历结束&#xff0c;将另一段链表剩余的节点存入新链表。需要注意存入新链表时要用新…

cad怎么转换成黑白的pdf图纸?分享3个常用的软件!

在工程设计、建筑、机械制造等领域&#xff0c;CAD图纸的应用非常广泛。然而&#xff0c;有时出于某些需要&#xff0c;我们可能需要将CAD图纸转换为黑白的PDF格式。那么&#xff0c;如何实现这一转换呢&#xff1f;本文将为您详细介绍几种常用的转换软件及其操作步骤。 迅捷CA…