Локальное зеркало Linux репозитория (apt-mirror)
Введение
Иногда бывает полезно сделать своё зеркало различных Linux репозиториев. Оно будет синхронизироваться с официальными репозиториями, а уже локальные сервера будут получать обновления с нашего сервера.
Например, это можно сделать, если у этих серверов нет возможности выйти в интернет, а обновлять их нужно.

Создание зеркала репозиториев
Устанавливаем пакет:
# apt install apt-mirror
Это решение написано на языке perl. Посмотреть расположение самого скрипта можно с помощью следующей команды:
# which apt-mirror
/bin/apt-mirror
Так как проект давно заброшен, то в скрипте есть недоработки, например Файлы переводов (i18n/Translation) раньше в репозиториях хранились в виде архива bz2, а сейчас хранятся в виде архива xz. Ещё одна проблема в том, что начиная с Ubuntu Focal (20.04), клиент APT ожидает, что репозиторий предоставят файлы метаданных (command-not-found — cnf). Про эти файлы apt-mirror тоже ничего не знает. Раньше был форк на GitHub от Stifler6996 , который предоставлял исправленную версию скрипта, но потом этот форк закрылся. Я загрузил исправленную версию скрипта в свой репозиторий, можете использовать его.
То есть скачиваете скрипт и подменяете им /bin/apt-mirror.
# cp /bin/apt-mirror /root/apt-mirror.orig
# wget -O /bin/apt-mirror https://raw.githubusercontent.com/alexsem88/tools/main/apt-mirror
# chmod +x /bin/apt-mirror
Настройка apt-mirror
После исправления скрипта нужно произвести настройки, для этого используется конфиг /etc/apt/mirror.list. В конфиг нужно добавить те репозитории, для которым мы делаем зеркало. Вы также можете изменить пути сохранения файлов, но я оставляю их по умолчанию (/var/spool/apt-mirror):
# nano /etc/apt/mirror.list
############# config ##################
### тут ничего не правлю
############# end config ##############
# Proxmox 8
deb [arch=amd64] http://download.proxmox.com/debian/pve bookworm pve-no-subscription
deb [arch=amd64] http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription
# Debian 12
deb [arch=amd64] http://deb.debian.org/debian/ bookworm main contrib non-free
deb [arch=amd64] http://security.debian.org/debian-security bookworm-security main contrib non-free
deb [arch=amd64] http://deb.debian.org/debian/ bookworm-updates main contrib non-free
deb [arch=i386] http://deb.debian.org/debian/ bookworm main contrib non-free
deb [arch=i386] http://security.debian.org/debian-security bookworm-security main contrib non-free
deb [arch=i386] http://deb.debian.org/debian/ bookworm-updates main contrib non-free
# Proxmox 9
deb [arch=amd64] http://download.proxmox.com/debian/pve trixie pve-no-subscription
deb [arch=amd64] http://download.proxmox.com/debian/pbs trixie pbs-no-subscription
# Debian 13
deb [arch=amd64] http://deb.debian.org/debian/ trixie main contrib non-free
deb [arch=amd64] http://security.debian.org/debian-security trixie-security main contrib non-free
deb [arch=amd64] http://deb.debian.org/debian/ trixie-updates main contrib non-free
deb [arch=i386] http://deb.debian.org/debian/ trixie main contrib non-free
deb [arch=i386] http://security.debian.org/debian-security trixie-security main contrib non-free
deb [arch=i386] http://deb.debian.org/debian/ trixie-updates main contrib non-free
# Ubuntu 24.04
deb [arch=amd64] http://ru.archive.ubuntu.com/ubuntu noble main restricted universe
deb [arch=amd64] http://ru.archive.ubuntu.com/ubuntu noble-updates main restricted universe
deb [arch=amd64] http://ru.archive.ubuntu.com/ubuntu noble-security main restricted universe
clean http://ftp.us.debian.org/debian
И запускаем синхронизацию:
# apt-mirror
Возможно у вас за 1 раз всё не скачается, процесс может упасть и придется снова выполнить команду apt-mirror. Не волнуйтесь, процесс начнется не с начала, а продолжит скачивать то что ещё не скачалось.
Файлы загружаются в каталог /var/spool/apt-mirror/, можем посмотреть структуру каталогов с помощью утилиты tree (возможно её нужно будет установить):
# tree -d -L 4 /var/spool/apt-mirror/
/var/spool/apt-mirror/
├── mirror
│ ├── deb.debian.org
│ │ └── debian
│ │ ├── dists
│ │ └── pool
│ ├── download.proxmox.com
│ │ └── debian
│ │ ├── pbs
│ │ └── pve
│ ├── ru.archive.ubuntu.com
│ │ └── ubuntu
│ │ ├── dists
│ │ └── pool
│ └── security.debian.org
│ └── debian-security
│ ├── dists
│ └── pool
├── skel
│ ├── deb.debian.org
│ │ └── debian
│ │ └── dists
│ ├── download.proxmox.com
│ │ └── debian
│ │ ├── pbs
│ │ └── pve
│ ├── ru.archive.ubuntu.com
│ │ └── ubuntu
│ │ └── dists
│ └── security.debian.org
│ └── debian-security
│ └── dists
└── var
32 directories
В каталоге mirror находятся сами пакеты. А в каталоге skel — содержится служебная информация. Например, список пакетов можете посмотреть для разных веток в файле Packages:
# less /var/spool/apt-mirror/skel/download.proxmox.com/debian/pve/dists/buster/pve-no-subscription/binary-amd64/Packages
# less /var/spool/apt-mirror/skel/deb.debian.org/debian/dists/bullseye/main/binary-amd64/Packages
Проверить, есть ли у вас битые пакеты можно так:
# cd /var/spool/apt-mirror/mirror/
# md5sum -c /var/spool/apt-mirror/var/MD5 > mirror.log
# grep -v 'OK' mirror.log
Последняя команда покажет пути установки битых пакетов, если такие имеются. Их нужно будет удалить и выполнить заново команду apt-mirror. А если вывод пустой, значит битых пакетов нет и пора переходить к следующему шагу.
Публикация своего репозитория
Чтобы использовать этот репозиторий, нужно опубликовать его с помощью веб сервера. Я для этого использую nginx. Устанавливаем веб сервер:
# apt install nginx
Правим основной конфиг nginx. Вам нужно изменить корневой путь и включить autoindex:
# nano /etc/nginx/sites-enabled/default
root /var/spool/apt-mirror/mirror/;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
autoindex on;
Перезапускаем nginx:
# systemctl restart nginx.service
Если в браузере введёте адрес вашего сервера, то увидите следующее:

Прописываем репозиторий на наши сервера
Осталось добавить наш репозиторий на остальные наши сервера. Для этого нужно поправить конфиг /etc/apt/sources.list или создать отдельные конфиги в файле /etc/apt/sources.list.d.
Вот примеры того, как прописывается наш локальный репозиторий:
# так прописываем репозитории для PVE
deb [arch=amd64] http://192.168.0.45/download.proxmox.com/debian/pve/ buster pve-no-subscription
deb [arch=amd64] http://192.168.0.45/download.proxmox.com/debian/pbs/ buster pbs-no-subscription
# так для debian 11
deb [arch=amd64] http://192.168.0.45/deb.debian.org/debian/ bullseye main
deb [arch=amd64] http://192.168.0.45/deb.debian.org/debian/ bullseye-updates main
deb [arch=amd64] http://192.168.0.45/security.debian.org/debian-security/ bullseye-security main
# так для Ubuntu 22.04
deb [arch=amd64] http://192.28.0.45/ru.archive.ubuntu.com/ubuntu/ jammy main restricted
deb [arch=amd64] http://192.28.0.45/ru.archive.ubuntu.com/ubuntu/ jammy-updates main restricted
deb [arch=amd64] http://192.28.0.45/ru.archive.ubuntu.com/ubuntu/ jammy-security main restricted
Кроме Apt-mirror для создания своего локального зеркала репозитория можно использовать Aptly .
Если понравилась статья, подпишись на мой канал в VK или Telegram .