How to Create Local APT Repository in Ubuntu 20.04 LTS

How to Create Local APT Repository in Ubuntu 20.04 LTS Техника
  1. How To Create an Authenticated Repository

create-local-apt-repository-in-ubuntu-lts

In this guide, you will learn, how to create a local APT repository on your Ubuntu 20.04 LTS operating system.

  1. Why a local package repository
  2. Requirements
    1. Installation
    2. Configuration
  3. Ready to Upload ?
  4. Changing your systems apt-get sources.list
  5. Adjusting Pbuilder to use your repository
  6. Finally

This tutorial is going to show you how to set up your own package repository on Debian/Ubuntu server.

Set Up APT Package Repository on Debian Ubuntu

Note: This tutorial is not showing how to set up a local APT mirroring repository that replicates packages from the Debian/Ubuntu repository. The repository we are going to set up works like a Personal Package Archive (PPA).

Используемые термины: Aptly, Linux.

В инструкции мы рассмотрим основные моменты для создания и управления репозиторием для пакетов Deb с помощью инструмента Aptly.

Установка программного обеспечения
Базовая настройка
Работаем с репозиторием
Работа с публикациями
Подключение к репозиторию
Поиск и работа с пакетами

Начальная настройка

Прежде чем начать работать с репозиторием, создадим конфигурационный файл:

* для нас важны опции:

  • rootDir — базовая директория для приложения, где будет храниться база репозиториев.
  • FileSystemPublishEndpoints — точка публикации для репозитория. Данную опцию мы рассмотрим подробнее ниже.
    • pubtest — название для точки публикации.
    • rootDir — каталог, в котором должны находить файлы опубликованного репозитория.
    • linkMethod — способ создания копии. Возможны варианты: symlink, copy, hardlink. У каждого метода свои плюсы и минусы. Решение на усмотрение администратора репозитория.

Мы готовы начать работать с aptly.

Мы научились собирать пакеты и подписывать их. Теперь самое время сделать свой репозиторий с пакетами.

По сути, есть 3 способа (более или менее «легальных») способа собрать свой репозиторий: dpkg-scanpackages, mini-dinstall и reprepo. dpkg-scanpackages — достаточно простая тулза, но требует много ручной работы. Я хоть и напишу про неё, но использовать её в промышленных масштабах не стоит. С reprepo я особенно не разобрался — официальная документация старовата и далека от вменяемости. Так что в основном здесь написано про mini-dinstall.

dpkg-scanpackages — утилита, которая индексирует каталог и создаёт для него файл Packages. Эту тулзу можно использовать как временную локальную замену (чтобы, например, проверить, что пакеты будут ставиться через apt-get), но не нужно использовать её там, где важна проверка подписи пакетов — dpkg-scanpackages сам по себе этого просто не умеет (хотя и можно подписывать репозиторий лапками).

Сам dpkg-scanpackages живет в пакете dpkg-dev, так что:

Тогда мы генерируем Packages.gz следующим образом:

Проверяем, что репозиторий работает:

Так в простейшем виде работает и mini-dinstall — генерирует Packages.gz. Но он умеет проверять подписи пакетов, работать по крону/демоном и прочие плюшки.

Повеселились, хватит. Давайте ставить mini-dinstall и другой софт, который пригодится:

Дальше всё я буду расписывать исходя из того, что заливать пакеты в репозиторий будет несколько пользователей. Конечно, можно использовать dput и всё делать под одним пользователем, но если у вас полтора разработчика — то такой вариант вас уже не устроит и захочется предоставить возможность заливать пакеты с подписями разных разработчиков. Поэтому мы создадим отдельного пользователя и отдельный gpg-ключ, которым будем подписывать репозиторий. А подписи пакетов будем проверять перед тем, как добавить их в репозиторий.
Mini-dinstall незачем работать под рутом (если запустить его под рутом — нам не придется вводить целую дополнительную команду по выставлению вменяемых прав на каталог incoming, гы). Создадим отдельного пользователя:

Пойдем под этого пользователя:

Создадим папочку, куда будем складывать наш репозиторий:

Напишем конфиг /home/repokeeper/.mini-dinstall.conf для нашей собиралки репозиториев:

Генерируем ключ уже знакомой нам командой:

Что там отвечать уже написано, стоит только заметить, что нам нужен именно новый ключ, а не ключ с теми же ответами. Ну там ник и почту измените для приличия.

Создадим каталог keys, в который для начала положим публичный ключ нашего репозитория. Там же мы будем складировать публичные ключи наших разработчиков (себя для начала).

Сначала экспортируем публичный ключ репозитория. Под пользователем repokeeper делаем такое:

Так же экспортируем ключ, которым мы подписываем пакеты и «добавим его» в валидные ключи для repokeeper (разрешив тем самым заливать пакеты, подписанные тем ключом). Под пользователем, из-под которого мы собираем пакеты, выполняем команду:

(напомню, что свою почту я использовал в прошлом примере)
Файл inkvizitor68sl.gpg нам нужно закинуть в каталог /home/repokeeper/keys на том сервере, где у вас будет работать mini-dinstall. О правах на файлы можно не сильно беспокоиться (в конце концов, это публичная подпись — обладая ей хуже вам не сделают).

Теперь под пользователем repokeeper импортируем ключ «разработчика»:

Так же нам понадобится скрипт, который будет запускаться для подписывания собранного репозитория. Подходящий скрипт есть в документации к mini-dinstall, утащим его себе:

Немного подправим для своих нужд:

В файл ~/.gnupg/passphrase нужно написать пароль от GPG ключа, который мы сгенерировали для репозитория.

Так как мы запускаем mini-dinstall не от рута, нам нужны корректные права на его incoming-каталог. При помощи chmod/chown надежно добиться у нас этого не получится (разработчики обязательно будут заливать с такими правами, что у mini-dinstall не будет хватать прав на удаление залитых файлов — и он будет падать с ошибкой), посему сделаем это через acl:

А так же создадим группу, присутствие в которой будет позволять системным пользователям заливать пакеты на сервер (от рута):

И выставим права этим пользователям на каталог incoming:

И добавим пользователя, от которого собираем пакеты в группу аплоадеров. Точнее, добавим пользователя, которому мы хотим дать права на заливание файлов в репозиторий. Это может быть и аккаунт разработчика, который будет заливать пакеты по sftp/scp через dupload.

Заодно по дороге запретим заливать файлы всем остальным:

«Зальём» наш собранный ранее пакетик в репозиторий. Сейчас мы это делаем при помощи простого cp, в будущем я напишу о том, как использовать dupload.

Наконец-то запускаем сборку нашего репозитория (обратите внимание, не от рута):

Если ошибок не видно, то проверяем содержимое файла Packages:

Как видим, у нас в репозитории появился наш example-package. Попробуем поставить его.
Для начала подключим репозиторий локально:

Проверяем, что пакет появился в индексе apt’a:

Пробуем его поставить:

Фиг нам, как говорится. apt считает пакеты недоверенным. Что ж мы, зря мучались с подписями) ? Скормим публичный ключ нашего репозитория нашему локальному apt-у:

Обновим индекс apt-а, как обычно:

Пробуем поставить пакет:

Вуаля. Поставился молча и сделал нам пустой /root/.ssh/authorized_keys, ибо я ленивая жопа и собрал таки пакет с пустыми файлами)

Теперь мы можем закидывать файлы в repo/mini-dinstall/incoming когда нам нужно и перегенерировать репозиторий командой от рута

или просто от пользователя repokeeper

Дальше нам предстоит научиться использовать upload, запускать mini-dinstall по крону и демоном. А ещё не забыть расшарить репозиторий по http и https. А потом уже перейдем ко всяким забавным полезностям в dpkg.

Requirements

  • pbuilder
  • dput
  • mini-dinstall
  • rsync

Installation

The installation of pbuilder is described at PbuilderHowto, so I won’t repeat it here. The other tools you can install with:

$ sudo apt-get install dput mini-dinstall rsync

Configuration

Well, you need to configure the dput and mini-dinstall tools. I will show you how my configuration looks so you can adjust it for your needs.

dput

[local]
fqdn = localhost
method = local
incoming = ~/archive/mini-dinstall/incoming
allow_unsigned_uploads = 1
post_upload_command = mini-dinstall --batch

* Create the required directories

$ mkdir -p $HOME/archive/mini-dinstall/incoming

mini-dinstall

Ok, this is something which needs some extra explanation, but first the setup:

[DEFAULT]
architectures = all, i386
archivedir = /home/shermann/archive
use_dnotify = 0
verify_sigs = 0
extra_keyrings = /home/shermann/.gnupg/pubring.gpg
mail_on_success = 0
archive_style = flat
poll_time = 40
mail_log_level = NONE
generate_release = 1
release_description = shermanns ubuntu packages

[hoary]

[breezy]
  • the DEFAULT group sets
    • everything which is default to all repositories. If you gpg pubkey is inside the Ubuntu/Debian pub-keyring, you need to verify_sigs = 1, for me te extra_keyrings weren’t working. I have to figure out why, but later Smile :)

  • hoary and breezy Groups
    • describing the two repositories, one for hoary and one for the next ubuntu generation breezy. When you upload the packages, you have to be sure, what distribution it is. For example if you set in your <app>-version/debian/changelog as distribution «hoary» the package will be moved into the hoary distribution.

Create Your. Deb Package

.deb is the standard format for software packages developed for Debian/Ubuntu distros. You can grab an existing .deb file for the purpose of this tutorial, if the package is distributed under an open-source license. I will show you the basic steps to create a .deb file in case you need to develop your own software.

I use Firefox as an example. Ubuntu doesn’t ship Firefox in .deb format anymore. It only provides the Snap package for Firefox. I use Snap package sometimes, like the Let’s Encypt client certbot, because it’s a simple program. I invoke it to obtain a TLS certificate, then don’t have to worry about it anymore. The web browser is a piece of software that I need to use all the time, but the Snap version of Firefox doesn’t integrate well with the file system, so I prefer to use the tranditional Debian package format.

Дополнительно:  Исправляем ошибки в работе Windows |

CD to your home directory.

cd ~

Download Firefox tarball from Mozilla’s web server.

wget https://download-installer.cdn.mozilla.net/pub/firefox/releases/107.0.1/linux-x86_64/en-US/firefox-107.0.1.tar.bz2

Extract the archive.

tar xvf firefox-107.0.1.tar.bz2
mkdir -p ~/firefox/opt/firefox-deb

Then open your file manager and move all other files and sub-directoris to the ~/firefox/opt/firefox-deb/ directory.

Next, Make a DEBIAN directory.

mkdir ~/firefox/DEBIAN

Create a control file under the DEBIAN directory.

nano ~/firefox/DEBIAN/control
Source: firefox
Maintainer: Xiao Guoan <[email protected]>
Section: misc
Priority: optional
Standards-Version: 3.9.2
Build-Depends: debhelper (>= 9)
Package: firefox-deb 
Architecture: amd64
Description: Firefox web browser without the Snaps
Version: 107
mkdir -p ~/firefox/usr/share/applications/

Create the .desktop file.

nano ~/firefox/usr/share/applications/firefox-deb.desktop

For your convenience, I upload my firefox-deb.desktop file to my web server. You can download and use it.

dpkg-deb --build ~/firefox

Ubuntu uses zstd compression for .deb packages. If you build .deb package for Debian on an Ubuntu computer, then you should use other compression methods like gzip, which will work on both Debian and Ubuntu.

dpkg-deb -Zgzip --build ~/firefox

Updating List of Available APT Packages

ahmer@local-apt-repo:~$ sudo apt-get update

31-apt-update-command-output

Authenticating Repository and Packages

Create a GPG key pair.

  gpg --gen-key

Since we are only using our key for only generating digital signatures use RSA for maximum security.

  Please select what kind of key you want:
     (1) RSA and RSA (default)
     (2) DSA and Elgamal
     (3) DSA (sign only)
     (4) RSA (sign only)
  Your selection? 4
  RSA keys may be between 1024 and 4096 bits long.
  What keysize do you want? (2048) 4096
  Requested keysize is 4096 bits

Choose «key does not expire» for length of validity.

Please specify how long the key should be valid.
           0 = key does not expire
        <n>  = key expires in n days
        <n>w = key expires in n weeks
        <n>m = key expires in n months
        <n>y = key expires in n years
  Key is valid for? (0) 0
  Key does not expire at all
  Is this correct? (y/N) y

Give at least the name for the new key.

  You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form:
      "Zaphod Beeblebrox (Galactic President) <zbeeblebrox@pres.galaxy.com>"
  Real name: Repository
  Email address:
  Comment:
  You selected this USER-ID:
      "Repository"
  Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
  gpg: key 041DA354 marked as ultimately trusted
  public and secret key created and signed.
  gpg: checking the trustdb
  gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
  gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
  pub   4096R/041DA354 2012-06-01
        Key fingerprint = 2253 4C89 DE74 CF68 39D7  2A2E DB3E 384F 041D A354
  uid                  Repository
  gpg --list-keys

Export your public key that was generated to a text file and store it in the root of the repository:

  sudo gpg --output keyFile --armor --export 041DA354

Sign the packages with your key.

  sudo dpkg-sig --sign builder file1.deb
  sudo dpkg-sig --sign builder file2.deb

On another computer to access and install these packages, edit the /etc/apt/sources.list file to update the package list for your repository.

  • (You can use any text editor, this example uses vi)
  sudo vi /etc/apt/sources.list
  deb http://10.31.31.89/repository_dir/dists/stable/main/binary /

After saving, update the packages list.

sudo apt-get update

Note: An error to the effect of «cannot find packages» is normal at this point, as no index file has been createded yet.

Download the repository’s public key:

  wget -O - http://10.31.31.89/repository_dir/keyFile | sudo apt-key add -
  apt-key list
  • (From within the repository_dir directory)
  sudo chown user:user -R .

Create an index file for the repository called Packages in the same directory as the deb files and zip it. An uncompressed Packages file must be kept there too.

  • (From within the binary directory)
  apt-ftparchive packages . &gt; Packages
  gzip -c Packages &gt; Packages.gz

Create a Release, InRelease, and Release.gpg file:

  • (From within binary directory)
  apt-ftparchive release . &gt; Release
  gpg --clearsign -o InRelease Release
  gpg -abs -o Release.gpg Release

Update the package list for the recipient computer and install the packages.

  sudo apt-get update
  sudo apt-get install package_name

More info on building and maintaining repositories can be found on the Debian website.


Originally posted The Ubuntu Forums (ubuntuforums.org)

CreateAuthenticatedRepository (last edited 2012-11-23 00:41:06 by )

Write Script to Update Package. gz File

Create a script file to scan and update the Packages.gz file.

It is required, because you may add new .deb packages in your local APT repository, time to time. Therefore, you are required to update the Packages.gz file, each time after add a new .deb file in repo directory.

ahmer@local-apt-repo:~$ sudo nano /bin/update-mydebs
#!/bin/bash
cd /var/www/html/repo
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

Grant execute permissions to update-mydebs script.

ahmer@local-apt-repo:~$ sudo chmod u+x /bin/update-mydebs

Now, execute this script to create or update Packages.gz file.

ahmer@local-apt-repo:~$ 
dpkg-scanpackages: warning: Packages in archive but missing from override file:
dpkg-scanpackages: warning:   amd64-microcode crda efibootmgr grub-common grub-efi grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed grub-gfxpayload-lists grub-pc grub-pc-bin grub2-common intel-microcode iucode-tool iw jfsutils kpartx-boot libdbus-glib-1-2 libfreetype6 libnl-3-200 libnl-genl-3-200 libnvpair1linux libuutil1linux libwrap0 libzfs2linux libzpool2linux linux-firmware linux-generic linux-generic-hwe-20.04 linux-headers-5.4.0-65 linux-headers-5.4.0-65-generic linux-headers-5.8.0-41-generic linux-headers-generic linux-headers-generic-hwe-20.04 linux-hwe-5.8-headers-5.8.0-41 linux-image-5.4.0-65-generic linux-image-5.8.0-41-generic linux-image-generic linux-image-generic-hwe-20.04 linux-modules-5.4.0-65-generic linux-modules-5.8.0-41-generic linux-modules-extra-5.4.0-65-generic linux-modules-extra-5.8.0-41-generic mokutil multipath-tools-boot ncurses-term openssh-server openssh-sftp-server os-prober reiserfsprogs shim shim-signed ssh-import-id thermald wireless-regdb zfs-initramfs zfs-zed zfsutils-linux
dpkg-scanpackages: info: Wrote 58 entries to output Packages file.

Your local APT repository has been successfully setup. You can now add it in the sources.list file of your Ubuntu 20.04 machines.

Installing DPKG-DEV Package on Ubuntu 20. 04 LTS

You are required to install dpkg-dev package, to create the packages meta data for your local APT repository.

ahmer@local-apt-repo:~$ sudo apt-get install -y dpkg-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  binutils binutils-common binutils-x86-64-linux-gnu build-essential cpp cpp-9
  fakeroot g++ g++-9 gcc gcc-9 gcc-9-base libalgorithm-diff-perl
  libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan5 libatomic1
  libbinutils libc-dev-bin libc6-dev libcc1-0 libcrypt-dev libctf-nobfd0
  libctf0 libdpkg-perl libfakeroot libfile-fcntllock-perl libgcc-9-dev
  libgomp1 libisl22 libitm1 liblsan0 libmpc3 libquadmath0 libstdc++-9-dev
  libtsan0 libubsan1 linux-libc-dev make manpages-dev
Suggested packages:
  binutils-doc cpp-doc gcc-9-locales debian-keyring g++-multilib
  g++-9-multilib gcc-9-doc gcc-multilib autoconf automake libtool flex bison
  gdb gcc-doc gcc-9-multilib glibc-doc bzr libstdc++-9-doc make-doc
The following NEW packages will be installed:
  binutils binutils-common binutils-x86-64-linux-gnu build-essential cpp cpp-9
  dpkg-dev fakeroot g++ g++-9 gcc gcc-9 gcc-9-base libalgorithm-diff-perl
  libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan5 libatomic1
  libbinutils libc-dev-bin libc6-dev libcc1-0 libcrypt-dev libctf-nobfd0
  libctf0 libdpkg-perl libfakeroot libfile-fcntllock-perl libgcc-9-dev
  libgomp1 libisl22 libitm1 liblsan0 libmpc3 libquadmath0 libstdc++-9-dev
  libtsan0 libubsan1 linux-libc-dev make manpages-dev
0 upgraded, 41 newly installed, 0 to remove and 23 not upgraded.
Need to get 40.0 MB of archives.
After this operation, 175 MB of additional disk space will be used.
...Processing triggers for libc-bin (2.31-0ubuntu9.2) ...

Wrapping Up

I hope this article helped you set up an APT repository. As always, if you found this post useful, subscribe to our free newsletter to get more tips and tricks. Take care 🙂

Set Up HTTP Server

Now we need to set up an HTTP server to expose the repository to the public Internet. We can use Nginx or Apache.

Nginx

Install Nginx on the cloud server.

sudo apt install nginx

Create a virtual host file for the APT repository.

sudo nano /etc/nginx/conf.d/apt-repository.conf
server {
  listen 80;
  server_name ;

  access_log /var/log/nginx/apt-repository.access;
  error_log /var/log/nginx/apt-repository.error;

  location / {
    root /var/www/repository/;
    autoindex on;
  }

  location ~ /(.*)/conf {
    deny all;
  }

  location ~ /(.*)/db {
    deny all;
  }
}

Save and close the file. Then test Nginx configuration.

sudo nginx -t

If the test is successful, reload Nginx.

sudo systemctl reload nginx

Apache

If you prefer to use Apache, then install Apache on the cloud server.

sudo apt install apache2

Create a virtual host file for the APT repository.

sudo nano /etc/apache2/sites-available/apt-repository.conf
<VirtualHost *:80>
   ServerName 
   ErrorDocument 404 /404.html
   DocumentRoot /var/www/repository
   <Directory /var/www/repository/ >
        # We want the user to be able to browse the directory manually
        Options Indexes FollowSymLinks Multiviews
        Require all granted
   </Directory>

   # This syntax supports several repositories, e.g. one for Debian, one for Ubuntu.
   # Replace * with debian, if you intend to support one distribution only.
   <Directory "/var/www/repository/apt/*/db/">
        Require all denied
   </Directory>

   <Directory "/var/www/repository/apt/*/conf/">
        Require all denied
   </Directory>

   <Directory "/var/www/repository/apt/*/incoming/">
        Require all denied
   </Directory>
</VirtualHost>

Save and close the file. Then enable this virtual host.

sudo a2ensite apt-repository.conf
sudo systemctl restart apache2

Configure Ubuntu Firewall

Allow Apache service port in Linux firewall by executing ufw command.

ahmer@local-apt-repo:~$ sudo ufw allow http
Rules updated
Rules updated (v6)

How to Remove a Package From Repository

reprepro -V --basedir /var/www/repository/ remove jammy firefox

Then sync the repository.

rsync -azP /var/www/repository/ [email protected]:/var/www/repository/

Requirements

You should prepare a cloud Linux server and a domain name.

Ready to Upload ?

Now, after configuring the required tools we’re ready to upload the packages.

-rw-r--r--  1 user group    340 2005-04-12 12:42 qinx_1.4-0ubuntu1.dsc
-rw-r--r--  1 user group    765 2005-04-12 12:44 qinx_1.4-0ubuntu1_i386.changes
-rw-r--r--  1 user group 206702 2005-04-12 12:44 qinx_1.4-0ubuntu1_i386.deb
-rw-r--r--  1 user group    916 2005-04-12 12:40 qinx_1.4-0ubuntu1_source.changes
-rw-r--r--  1 user group 663497 2005-04-12 12:42 qinx_1.4-0ubuntu1.tar.gz
$ dput local qinx_1.4-0ubuntu1_i386.changes

Well, if everything went fine, you will find in $HOME/archive/breezy/ this:

-rw-r--r--  1 user group   2150 2005-04-13 13:17 Packages
-rw-r--r--  1 user group    774 2005-04-13 13:17 Packages.gz
-rw-r--r--  1 user group    340 2005-04-13 13:17 qinx_1.4-0ubuntu1.dsc
-rw-------  1 user group    765 2005-04-13 13:17 qinx_1.4-0ubuntu1_i386.changes
-rw-r--r--  1 user group 206702 2005-04-13 13:17 qinx_1.4-0ubuntu1_i386.deb
-rw-r--r--  1 user group 663497 2005-04-13 13:17 qinx_1.4-0ubuntu1.tar.gz
-rw-r--r--  1 user group    689 2005-04-13 13:17 Release
-rw-r--r--  1 user group    868 2005-04-13 13:17 Sources
-rw-r--r--  1 user group    425 2005-04-13 13:17 Sources.gz

Is it? If not, go back to the beginning and try again Smile :)

Дополнительно:  Не запускается Call of Juarez: Gunslinger. Не работает игра. Ошибка

Requirements

  • Packages: apt-utils (Should be installed by default), dpkg-dev, a web server (apache2), and dpkg-sig (In Ubuntu Universe Repository)
  • Base Directory for repository
  • .deb files

Установка Aptly

Инструкцию по установке мы можем найти на официальном сайте. Давайте ее рассмотрим на примере Ubuntu и Rocky Linux.

Ubuntu (Debian)

Установку Aptly на Deb-системы выполнить, довольно, просто. Необходимо подключить репозиторий разработчика и выполнить установку. 

Выполним импорт ключа репозитория:

deb http://repo.aptly.info/ squeeze main

Обновим список пакетов и выполним установку:

Для проверки введем команду:

Мы должны увидеть что-то на подобие:

aptly version: 1.4.0

Rocky Linux (RPM)

Для начала, нам понадобятся wget и tar:

yum install wget tar

Переходим на страницу последнего релиза и копируем ссылку для загрузки архива:

Копируем ссылку на архив aptly

Используя ссылку, скачиваем на наш компьютер архив:

tar zxf aptly*tar.gz

Раскидаем полученные файлы по своим местам:

mv aptly_*_linux_amd64/aptly /usr/local/bin/

Для проверки введем команду:

Мы должны увидеть что-то на подобие:

aptly version: 1.4.0

Why a local package repository

If you are packaging software for Debian Linux or (K)Ubuntu sometimes you need not only one package, but you have to provide a dependency like a library or whatever. When those dependencies are not in the official repositories, the only way to fulfill those dependencies is to put your package inside the repository.

But what, if you don’t have the permission to upload to main/universe/multiverse? So, inject your packages to your pbuilder enviroment via a local apt-get repository.

In this document I will describe how to setup a local apt-get repository, how to upload it to your root server via rsync and how to change your pbuilders sources.list.

You might wish to also check out LocalAptGetRepositoriesTrivial for a slightly easier way to make a local repository.

Adjusting Pbuilder to use your repository

You have to know now, pbuilder is working in a chroot enviroment, so it doesn’t know anything about your $HOME directory. It means you have to setup a remote repository for your packages.

If you have your own server

I’m in the position to have a Root-Server (ok, it’s running with Gentoo, but what the hell ;)) and I’m running an Apache webserver so I setup a virtualhost for my own package repository.

Say, my remote repository is in the directory /var/www/ubuntu.linux-server.org/htdocs/archive/ and I have write permissions on this directory, I have to synchronize now my local repository with the remote one.

If you know the magics of rsync now, it will be easy to do this, without having a rsync daemon running. SSH + rsync are good buddies Smile :)

Ok, time to sync local with remote, try this:

$ cd $HOME/archive
$ rsync -azrptL --progress --delete-after -e "ssh" breezy user@host:/var/www/ubuntu.linux-server.org/htdocs/archive/

That’s it for syncing. Easy, isn’t it?

If you have shared hosting

ok, now you have your own remote package repository. It’s time to adjust the pbuilder enviroment.

Changes to the pbuilder enviroment

Ok, vi the /etc/pbuilder/apt.config/sources.list

$ sudo vi /etc/pbuilder/apt.config/sources.list

and add these two lines (replace <url to repository> with your URL)

deb http://<url to repository>/ breezy/
deb-src http://<url to repository>/ breezy/

save it and now update the pbuilder:

$ sudo pbuilder update --distribution breezy --override-config

You should see, how apt-get is updating inside the pbuilders enviroment its cache.

Работа с репозиторием

Рассмотрим несколько действий:

  1. Создадим новый репозиторий.
  2. Добавим в него пакеты.

1. И так, создадим репозиторий командой:

aptly repo create -comment=»Testing first repo» -component=»main» -distribution=»focal» test

* в данном примере будет создан новый репозиторий test.
** а также:

  • comment — произвольный комментарий.
  • component — компонент по умолчанию, который будет использоваться при публикации. Обычно указываются:
    • main — DFSG-пакеты (соответствуют критериям Debian по определению свободного ПО), которым не требуются другие пакеты из других зон.
    • contrib — DFSG-пакеты с зависимостями из зоны main.
    • non-free — пакеты, которое не соответствует DFSG.
  • distribution — указать на название дистрибутива. Например, кодовое имя или класс релиза:
    • jessie/stretch/buster/sid.
    • stable/oldstable/testing/unstable.

При необходимости, можно отредактировать параметры нашего репозитория командой:

aptly repo edit -comment=»New comment» test

aptly repo rename test test-new-name

aptly repo drop test

Посмотреть список репозиториев можно командой:

aptly repo list

Ну и, более подробная информация о репозитории:

aptly repo show test

2. Добавление пакета в созданный ранее репозиторий:

aptly repo add test /tmp/deb/package-name_1.2.3_amd64.deb

* это простой вариант добавления пакета в репозиторий с именем test; сам же пакет в нашем примере будет загружен из /tmp/deb/package-name_1.2.3_amd64.deb.

Мы должны будем увидеть что-то на подобие:

Посмотреть информацию о репозитории вместе со списком добавленных в него пакетов:

aptly repo show -with-packages test

Подробная информация о пакете:

aptly package show package-name_1.2.3_amd64

Удалить пакет из репозитория можно командой:

aptly repo remove test package-name_1.2.3_amd64

* ниже мы рассмотрим способ поиска и удаления пакетов по параметрам.

Мы должны будем увидеть что-то на подобие:

Create APT Repository Directory

Create a directory ‘repo’ within Apache document root, to host your local APT repository.

ahmer@local-apt-repo:~$ sudo mkdir /var/www/html/repo

Mount the Ubuntu DVD at /mnt/cdrom.

ahmer@local-apt-repo:~$ sudo mkdir /mnt/cdrom
ahmer@local-apt-repo:~$ sudo mount /dev/cdrom /mnt/cdrom
mount: /mnt/cdrom: WARNING: device write-protected, mounted read-only.

Find and copy all the *.deb packages into our local APT repository.

ahmer@local-apt-repo:~$ 

Check the files that was copied by previous command.

ahmer@local-apt-repo:~$ 

33-linux-bash-ls-command-output

Add Your APT Repository in Ubuntu Sources. list

Edit sources.list file in nano text editor.

ahmer@local-apt-repo:~$ sudo nano /etc/apt/sources.list
# Local APT Repository
deb [allow-insecure=yes] http://local-apt-repo.centlinux.com/repo ./

Execute apt-get command to update packages list.

ahmer@local-apt-repo:~$ sudo apt-get update

32-local-apt-repo-update

Ignore the warning about the release file.

Try to install a package from your local APT repository.

ahmer@local-apt-repo:~$ sudo apt install jfsutils
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  jfsutils
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 195 kB of archives.
After this operation, 1,616 kB of additional disk space will be used.
WARNING: The following packages cannot be authenticated!
  jfsutils
Install these packages without verification? [y/N] y
Get:1 http://local-apt-repo.centlinux.com/repo ./ jfsutils 1.1.15-4 [195 kB]
Fetched 195 kB in 0s (3,991 kB/s)
Selecting previously unselected package jfsutils.
(Reading database ... 77573 files and directories currently installed.)
Preparing to unpack .../jfsutils_1.1.15-4_amd64.deb ...
Unpacking jfsutils (1.1.15-4) ...
Setting up jfsutils (1.1.15-4) ...
update-initramfs: deferring update (trigger activated)
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for initramfs-tools (0.136ubuntu6.3) ...
update-initramfs: Generating /boot/initrd.img-5.4.0-66-generic

Your required package has been installed successfully.

Installing the Required Packages

  sudo apt-get install dpkg-dev
  sudo apt-get install apache2
  sudo apt-get install dpkg-sig

Create the Repository Directory Structure

Note: If you do not create the repository in the /var/www directory then you will have to create a symbolic link inside that directory linking to your repository directory

For example (Assuming you are in your home directory):

sudo ln -s ~/repository_dir /var/www/repository_dir

Create the repository in /var/www using this command, while within said directory:

  sudo mkdir -p repository_dir/dists/stable/main/binary

Import the deb files to the binary directory (while within said directory):

  sudo mv location_of_package/package_name.deb

Changing your systems apt-get sources. list

Now you’re ready to change your local systems apt-get sources list to let it know about your local package repository.

$ sudo vi /etc/apt/sources.list
deb file:///$HOME/archive breezy/
deb-src file:///$HOME/archive breezy/

After adding these two lines, update your local apt cache:

$ sudo apt-get update

You should see, how apt is reading your local repository.

If this is working, let’s do the change for your pbuilder enviroment

Upload the Repository to a Cloud Server

If you want others to use your repository, then you should create the repository on a cloud Linux server. Once you got one, SSH into the server and create the same base directory.

sudo mkdir -p /var/www/repository/

Then use rsync to sync the two base directories. Replace 12.34.56.78 with the IP address of your cloud Linux server.

rsync -azP --delete /var/www/repository/ [email protected]:/var/www/repository/
  • -a: archive mode
  • -z: compress file data during the transfer
  • -P: keep partially transferred files and show progress during transfer
  • --delete: delete extraneous files from the destination directory.

Environment Specification

  • CPU — 3.4 Ghz (2 cores)
  • Memory — 2 GB
  • Storage — 20 GB
  • Operating System — Ubuntu Server 20.04 LTS
  • Hostname – local-apt-repo.centlinux.com
  • IP Address — 192.168.116.239 /24

Создание локального репозитория

Вместо использования dpkg -i package_name.deb для установки, можно создать локальный репозиторий для пакетов, принесенных на флешке или другом носителе, а потом использовать synaptic/kynaptic (или apt-get install package_name).

1. Все действия лучше проводить как root

sudo su

2.Теперь установите пакет dpkg-dev. Он будет содержать утилиту dpkg-scanpackages, которая нам и нужна.

apt-get install dpkg-dev

3.Поместите все .deb пакеты в директорию например, /myrepo (причем не непосредственно в эту директорию, а в поддиректории, расположенные в этой директории)

cd /myrepo
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

5. Теперь нужно внести новый репозиторий в /etc/apt/sources.list. Вставьте в /etc/apt/sources.list строчку (лучше вставить ближе к началу, т.к. apt-get (synaptic/kynaptic) ставит более высокий приоритет источнику, находящемуся раньше остальных)

deb file:/myrepo ./

6. Обновление списка репозиториев

apt-get update

Если изменится содержимое директории с пакетами, повторите шаги 1,4.


RussianDocumentation/CreatingLocalReprositoryHowto (last edited 2008-08-06 17:00:27 by )

Поиск и работа с пакетами

Стоит обсудить еще одну важную для работы функцию — поиск пакетов. Осуществляется с помощью package query. Более подробнее про данный формат стоит почитать на официальной странице. Мы же рассмотрим несколько запросов для примера и способы их применения.

1. Поиск пакетов.

Найти по версии:

aptly package search ‘Version (>>8.0.0-20220413)’

* в данном примере система выведет список пакетов, версия которых старше 8.0.0-20220413.

По имени и версии:

aptly package search ‘Name (% *-dev), Version (>>8.0.0-20220413)’

* в этом примере будут найдены все пакеты, в имени которых на конце есть -dev и версия выше 8.0.0-20220413.

2. Удаление пакетов.

Дополнительно:  Can You Root Android Phones without a PC? -Find the Best Ways

Также с использованием package query мы можем находить и удалять из базы пакеты.

aptly repo remove <имя репозитория> <package-query>

Например, удалим пакеты, версия которых начинается на 8.

aptly repo remove -dry-run test ‘Version (% 8*)’

* обратите внимание, что мы используем флаг -dry-run, который позволит нам не удалять пакеты, а вывести на экран список того, что будет удалено, для окончательного удаления пишем команду без данного флага.

Публикация репозиториев

При работе с базой aptly мы просто добавляем в нее пакеты, но они не будут доступны при подключении к нашему репозиторию. Нам необходимо выполнить публикацию и предоставить веб-доступ. В данном разделе мы рассмотрим, как:

  • Выполнить публикацию репозитория.
  • Обновить данные в публикации.
  • Настроить веб-сервер nginx.

Начнем с публикации.

Публикация

Для публикации нам потребуется ключ gpg. Если у нас его нет, создаем:

gpg —default-new-key-algo rsa4096 —gen-key —keyring pubring

Система запросит ввести имя и email. Как минимум, вводим имя:

Real name:

После появится окно ввода пароля для закрытого ключа. Придумываем новый и вводим его дважды.

Ключ создан, его можно увидеть командой:

Теперь сделаем первую публикацию:

aptly publish repo test filesystem:pubtest:test

Система запросит пароль для GPG-ключа в отдельном окне.

Для успешного выполнения команды нужно, чтобы в репозитории был добавлен, хотя бы, один пакет.

После публикации в каталоге /var/www/aptly/test мы должны увидеть:

В папке dists метаданные для опубликованных дистрибутивах, pool — загруженные пакеты (в нашем примере симлинки на пул в основном каталоге — /opt/aptly).

Для удобства работы с нашим репозиторием можно опубликовать открытый ключ GPG — он будет необходим для подключения к репозиторию со стороны клиентов. Вводим:

gpg —export —armor > /var/www/aptly/test/pubtest.asc

Мы вернемся к данному ключу, когда будет настраивать подключение к репозиторию.

Обновление публикации

После изменений в основной базе пакетов, нам нужно обновлять настройки публикации. Это приводит к обновлению метаданных и актуализации пакетов в каталогах pool.

aptly publish update focal filesystem:pubtest:test

Система должна запросить пароль для нашего GPG-ключа.

Также полезно запускать команду со следующими опциями:

  • batch — запуск команды без привязки к tty. Нужно для работы команды вне интерактивного контекста.
  • force-overwrite — перезаписать пакеты, при необходимости.
  • gpg-key — идентификатор нашего ключа (смотрим командой gpg —list-keys).
  • passphrase — парольная фраза для gpg-ключа.

Мы теперь можем опубликовать репозиторий и обновить в нем данные. Но для получения доступа по веб, нам нужен веб-сервер.

Настройка NGINX

Для получения доступа к репозиторию по http(s) нам нужно установить и настроить веб-сервер. В данном примере мы рассмотрим простой способ настройки NGINX.

Установка будет немного отличаться для Linux DEB и RPM. Рассмотрим процесс по-отдельности.

apt install nginx

yum install nginx 

Если система вернет ошибку, что не может найти данный пакет, ставим:

yum install epel-release

После установки веб-сервера, немного сконфигурируем его. Тут тоже процесс отличается для DEB и RPM.

а) на deb:

б) на rpm:

Далее процесс схож.

Находим и редактируем строку с директивой root:

* в нашем примере мы определили корневую директорию для веб-публикаций /var/www/aptly.

Перезапускаем сервис и разрешаем автозапуск nginx:

systemctl restart nginx

systemctl enable nginx

В нашем примере мы не стали рассматривать процесс настройки https. Но в продуктивной среде правильнее настроить веб-доступ к репозиторию по защищенному каналу. Читайте дополнительно про получение бесплатного сертификата.

Настраиваем брандмауэр, если в нашей системе он используется. Нам нужно открыть порт 80 (и 443, если работаем по https). В зависимости от используемой утилиты управления netfilter, наши действия будут отличаться. Рассмотрим наиболее популярные инструменты — iptables и firewalld.

а) для iptables (как правило, на DEB):

iptables -I INPUT -p tcp —dport 80 -j ACCEPT

iptables -I INPUT -p tcp —dport 443 -j ACCEPT

Для сохранения правил вводим:

б) для firewalld (как правило, на RPM):

И для сохранения:

Настройка клиента (работа с репозиторием)

Рассмотрим кратко процесс настройки подключения к репозиторию и установки с него пакетов.

На системе, где планируем подключиться к репозиторию, создаем файл с настройками:

* где own_repo — произвольное название для репозитория.

Добавляем строку следующего вида:

deb https://repo.dmosk.ru/test focal main

Импортируем в систему ключ, который мы публиковали в предыдущем разделе:

* скорректируйте полный путь на ваш.

Мы должны увидеть:

Можно обновить список пакетов:

И пользоваться репозиторием.

Step 8

Now we can add the repository on another computer to test if it will work.

wget --quiet -O - https://repo.linuxbabe.com/linuxbabe-pubkey.asc | sudo tee /etc/apt/keyrings/linuxbabe-pubkey.asc

Add the repository.

echo "deb [signed-by=/etc/apt/keyrings/linuxbabe-pubkey.asc arch=$( dpkg --print-architecture )] https://repo.linuxbabe.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/firefox-linuxbabe.list

Update repository index.

sudo apt update

Install Firefox. Don’t worry. It won’t overwrite your existing Firefox installation.

sudo apt install firefox-deb

Check where it’s installed.

dpkg -L firefox-deb

You will see that Firefox Deb is installed under the /opt/firefox-deb/ directory.

install firefox debian package

/opt/firefox-deb/firefox

firefox web browser without snaps

You might be wondering why I have 3 Firefox icons 🙂 Because I installed the Snap version of Firefox, Firefox ESR (Extended Security Release), and my own Firefox deb package.

If you want to remove the Snap Firefox, run

sudo systemctl disable --now var-snap-firefox-common-host\\x2dhunspell.mount

sudo snap remove firefox

The good thing about using my Firefox deb package is that you can update the browser as soon as Firefox releases a new version. You don’t have to wait for me to push the update via sudo apt update.

firefox debian package self-update

Sign the Package with Your GPG Private Key

Install the dpkg-sig tool.

sudo apt install dpkg-sig
dpkg-sig --sign builder 

Enable HTTPS

sudo apt install certbot

If you use Nginx, then you also need to install the Certbot Nginx plugin.

sudo apt install python3-certbot-nginx
sudo certbot --webroot -w /var/www/repository -i nginx --agree-tos --redirect --hsts --staple-ocsp --email  -d 

If you use Apache, then you need to install the Certbot Apache plugin.

sudo apt install python3-certbot-apache
sudo certbot --webroot -w /var/www/repository -i apache --agree-tos --redirect --hsts --staple-ocsp --email  -d 
  • --webroot: Use the webroot plugin to obtain TLS certificate.
  • -w: specify the webroot directory.
  • -i nginx: Use the nginx plugin to install the certificate.
  • -i apache: Use the Apache plugin to install the certificate
  • --agree-tos: Agree to terms of service.
  • --redirect: Force HTTPS by 301 redirect.
  • --hsts: Add the Strict-Transport-Security header to every HTTP response. Forcing browser to always use TLS for the domain. Defends against SSL/TLS Stripping.
  • --staple-ocsp: Enables OCSP Stapling. A valid OCSP response is stapled to the certificate that the server offers during TLS.

The certificate should now be obtained and automatically installed.

enable https on apt repository

And you can visit your APT repository in the web browser.

Set Up APT Package Repository on Debian Ubuntu

What is APT?

In Ubuntu Linux, APT repository is the primary source of installing stable and supported software packages on your Operating System.

Online APT repositories are available free of cost specific to different versions of Ubuntu and related distributions.

However, there are situations, where we do not have access to Internet or our Ubuntu machines are not connected to Internet due to some security reasons.

In such cases, you can setup your own local APT repository and use it to install software packages on your Ubuntu machines.

create-local-apt-repository-in-ubuntu-lts

Installing Apache Web Server on Ubuntu 20. 4 LTS

If you are planning to configure your local APT repository for use by other Ubuntu 20.04 LTS machines on your network. Then you should install Apache web server to host your APT repository.

ahmer@local-apt-repo:~$ sudo apt-get install -y apache2
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  apache2-bin apache2-data apache2-utils libapr1 libaprutil1
  libaprutil1-dbd-sqlite3 libaprutil1-ldap libjansson4 liblua5.2-0 ssl-cert
Suggested packages:
  apache2-doc apache2-suexec-pristine | apache2-suexec-custom www-browser
  openssl-blacklist
The following NEW packages will be installed:
  apache2 apache2-bin apache2-data apache2-utils libapr1 libaprutil1
  libaprutil1-dbd-sqlite3 libaprutil1-ldap libjansson4 liblua5.2-0 ssl-cert
0 upgraded, 11 newly installed, 0 to remove and 45 not upgraded.
Need to get 1,865 kB of archives.
After this operation, 8,080 kB of additional disk space will be used.
...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...

Create the APT Repository

Install the Debian package repository producer.

sudo apt install reprepro

Then create a base directory for the repository.

sudo mkdir -p /var/www/repository/
sudo chown : /var/www/repository/

Create a conf sub-directory.

mkdir -p /var/www/repository/conf/

Create a text file named distributions.

nano /var/www/repository/conf/distributions
Origin: 
Label: apt repository
Codename: jammy
Architectures: amd64 
Components: main
Description: LinuxBabe package repository for Debian/Ubuntu
SignWith: 752E173A3F8B04F5
Pull: jammy
  • Origin: the hostname of your repository.
  • Label: Give it a name
  • Codename: What distro your repository supports. jammy is for Ubuntu 22.04. If you want to support multiple distros, simple copy the above snippet, paste it in the same file and change the codename.
  • Architectures: could be amd64, i386, or source.
  • Components: If you don’t have lots of packages in your repository, use main as the single Component.
  • Description: Describe what this repository is for.
  • SignWith: The repository should be signed with a GPG key. A Release.gpg file will be generated. You need to enter your GPG key ID here.
gpg --list-sigs 

gpg list signature

As you can see, my key ID is 752E173A3F8B04F5.

Save and close the file. Next, add the .deb file to the repository. You will be asked to enter your GPG key passphrase.

reprepro -V --basedir /var/www/repository/ includedeb jammy /path/to/the/.deb_file
  • -V: verbose mode.
  • --basedir: specify the base directory.
  • includedeb: add deb package to the repository.
  • jammy: the distro codename. In this case, the deb package will be added for Ubuntu 22.04 users.

reprepo create repository structure

Note that you should not run reprepro as root or with sudo, or it can’t find your GPG key.

gpg --armor --export  | sudo tee /var/www/repository/gpg-pubkey.asc

APT repostiory public key

Finally

Yeah, you did it. Now you can build your new packages with your self-made dependencies. Have fun.

If anything is not clear, please leave a comment with the comment function on this page.


Conclusion

In this article, you have successfully create a local APT repository on Ubuntu 20.04 LTS.

Оцените статью
Master Hi-technology
Добавить комментарий