Создание локального зеркала репозиториев с помощью Aptly

Статья подробно описывает процесс установки и настройки инструмента Aptly для создания локальных зеркал Linux-репозиториев, включая Proxmox и Debian. В ней рассмотрены шаги по созданию, синхронизации и публикации репозиториев, а также их размещение на веб-сервере Nginx. Дополнительно приведены команды для обновления зеркал и работы со снимками, что позволяет поддерживать актуальные копии репозиториев в локальной сети.

Установка Aptly

Aptly — это инструмент, который позволяет создавать клоны известных Linux-репозиториев.

На Debian 12 его можно установить из стандартного репозитория, но лучше использовать официальный репозиторий Aptly для получения более новой версии:

sudo apt update && sudo apt install aptly
  • Будет установлена версия: 1.5.0.

Для подключения репозитория Aptly и установки более свежей версии выполните следующие команды:

sudo wget -O /etc/apt/keyrings/aptly.asc https://www.aptly.info/pubkey.txt
echo 'deb [signed-by=/etc/apt/keyrings/aptly.asc] http://repo.aptly.info/release bookworm main' | sudo tee /etc/apt/sources.list.d/aptly.list
sudo apt update && sudo apt install aptly
  • Будет установлена версия: 1.6.2. Она была выпущена 9 июня 2025 года.

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

Скачиваем ключи репозитория Proxmox:

sudo wget https://enterprise.proxmox.com/debian/proxmox-archive-keyring-trixie.gpg   -O /usr/share/keyrings/proxmox-archive-keyring.gpg

Ключ от Debian уже должен быть в системе. Итого у нас два ключа:

  • /usr/share/keyrings/debian-archive-keyring.gpg
  • /usr/share/keyrings/proxmox-archive-keyring.gpg

Создадим каталог для загрузки репозиториев:

sudo mkdir /var/spool/aptly/
sudo chown alex:www-data /var/spool/aptly/
  • Пользователь alex имеет права на запись и будет использовать утилиту aptly.
  • Пользователь www-data имеет права только на чтение и будет использоваться для публикации на веб-сервере.

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

nano .aptly.conf
{
  "rootDir": "/var/spool/aptly"
}

Проверяем, что конфигурация применилась:

aptly config show
{
    "rootDir": "/var/spool/aptly",
    "logLevel": "info",
    "logFormat": "default",
    "databaseOpenAttempts": -1,
    "architectures": [],
    "skipLegacyPool": false,
    "dependencyFollowSuggests": false,
    "dependencyFollowRecommends": false,
    "dependencyFollowAllVariants": false,
    "dependencyFollowSource": false,
    "dependencyVerboseResolve": false,
    "ppaDistributorID": "ubuntu",
    "ppaCodename": "",
    "serveInAPIMode": false,
    "enableMetricsEndpoint": false,
    "enableSwaggerEndpoint": false,
    "AsyncAPI": false,
    "databaseBackend": {
        "type": "",
        "dbPath": "",
        "url": ""
    },
    "downloader": "default",
    "downloadConcurrency": 4,
    "downloadSpeedLimit": 0,
    "downloadRetries": 0,
    "downloadSourcePackages": false,
    "gpgProvider": "gpg",
    "gpgDisableSign": false,
    "gpgDisableVerify": false,
    "skipContentsPublishing": false,
    "skipBz2Publishing": false,
    "FileSystemPublishEndpoints": {},
    "S3PublishEndpoints": {},
    "SwiftPublishEndpoints": {},
    "AzurePublishEndpoints": {},
    "packagePoolStorage": {}
}

Как видите, параметров для настройки приложения много. При желании вы можете дополнительно настроить их под свои нужды.

Создание локальных репозиториев

Создаём зеркало репозитория pve-trixie:

aptly mirror create \
  -architectures=amd64 \
  -keyring=/usr/share/keyrings/proxmox-archive-keyring.gpg \
  pve-trixie \
  http://download.proxmox.com/debian/pve trixie pve-no-subscription

Описание параметров:

  • -architectures=amd64 — Указывает архитектуры, для которых нужно скачивать пакеты. Можно указать несколько через запятую, например: amd64,i386,arm64. Если параметр не задан, Aptly скачает все доступные пакеты (это может быть избыточно).
  • -keyring=/usr/share/keyrings/proxmox-archive-keyring.gpg — Файл с GPG-ключами для проверки подписи Release-файла зеркалируемого репозитория.
  • pve-trixie — Локальное имя зеркала в Aptly (можно задать свое).
  • http://download.proxmox.com/debian/pve — URL базового репозитория, откуда Aptly будет скачивать данные. Должен указывать на корень репозитория, где находятся каталоги dists/pool/ и т.д.
  • trixie — Кодовое имя ветки репозитория (соответствует подкаталогу в dists/).
  • pve-no-subscription — Компонент репозитория. В Debian обычно используются maincontribnon-free, но Proxmox использует свой (pve-no-subscription). Можно указать несколько компонентов через пробел.

Аналогично создаем остальные зеркала:

  • pbs-trixie:
aptly mirror create \
  -architectures=amd64 \
  -keyring=/usr/share/keyrings/proxmox-archive-keyring.gpg \
  pbs-trixie \
  http://download.proxmox.com/debian/pbs trixie pbs-no-subscription
  • debian-trixie:
aptly mirror create \
  -architectures=amd64,i386 \
  -keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
  debian-trixie \
  http://deb.debian.org/debian/ trixie main contrib non-free
  • debian-trixie-updates:
aptly mirror create \
  -architectures=amd64,i386 \
  -keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
  debian-trixie-updates \
  http://deb.debian.org/debian/ trixie-updates main contrib non-free
  • debian-security-trixie:
aptly mirror create \
  -architectures=amd64,i386 \
  -keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
  debian-security-trixie \
  http://security.debian.org/debian-security trixie-security updates/main updates/contrib updates/non-free-firmware updates/non-free

Синхронизация локального репозитория с удалённым

В предыдущем разделе мы подготовили локальные репозитории, но данные с удалённых серверов еще не загружены. Для загрузки выполните обновление зеркал:

  • pve-trixie:
aptly mirror update \
  -keyring=/usr/share/keyrings/proxmox-archive-keyring.gpg \
   pve-trixie
  • pbs-trixie:
aptly mirror update \
  -keyring=/usr/share/keyrings/proxmox-archive-keyring.gpg \
   pbs-trixie
  • debian-trixie:
aptly mirror update \
  -keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
  debian-trixie
  • debian-trixie-updates:
aptly mirror update \
  -keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
  debian-trixie-updates
  • debian-security-trixie:
aptly mirror update \
  -keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
  debian-security-trixie

Создание снимков локальных репозиториев

После синхронизации файлы загружаются в локальное зеркало, но репозиторий еще не готов к использованию. Для публикации необходимо создать снимки (снапшоты):

  • pve-trixie:
aptly snapshot create \
  pve-trixie-snapshot-13.08.2025 \
  from mirror pve-trixie
  • pbs-trixie:
aptly snapshot create \
  pbs-trixie-snapshot-13.08.2025 \
  from mirror pbs-trixie
  • debian-trixie:
aptly snapshot create \
  debian-trixie-snapshot-13.08.2025 \
  from mirror debian-trixie
  • debian-trixie-updates:
aptly snapshot create \
  debian-trixie-updates-snapshot-13.08.2025 \
  from mirror debian-trixie-updates
  • debian-security-trixie:
aptly snapshot create \
  debian-security-trixie-snapshot-13.08.2025 \
  from mirror debian-security-trixie

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

После создания снимков их необходимо опубликовать. В процессе публикации в каталоге rootDir (в нашем случае /var/spool/aptly/) создается подкаталог public/, где файлы структурируются в формате apt-репозитория. Используются символические ссылки и дополнительные файлы (ReleaseContents-amd64.gz и др.).

Публикация репозитория pve-trixie:

aptly publish snapshot \
  -architectures=amd64 \
  -component=pve-no-subscription \
  -distribution=trixie \
  -skip-signing \
  pve-trixie-snapshot-13.08.2025 \
  pve

Описание параметров:

  • -distribution=trixie — Имя дистрибутива для публикации.
  • -skip-signing — Отключает подпись репозитория GPG-ключом.
  • pve-trixie-snapshot-13.08.2025 — Имя снимка для публикации.
  • pve — Префикс для подкаталога публикации (например, /var/spool/aptly/public/pve/).

Публикация репозитория pbs-trixie:

aptly publish snapshot \
  -architectures=amd64 \
  -component=pbx-no-subscription \
  -distribution=trixie \
  -skip-signing \
  pbs-trixie-snapshot-13.08.2025 \
  pbs

Для многокомпонентных зеркал Debian пришлось убрать параметр -component, так как все компоненты (maincontribnon-free) объединяются в один (main).

Публикация репозитория debian-trixie:

aptly publish snapshot \
  -architectures=amd64,i386 \
  -distribution=trixie \
  -skip-signing \
  debian-trixie-snapshot-13.08.2025 \
  debian

debian-trixie-updates:

aptly publish snapshot \
  -architectures=amd64,i386 \
  -distribution=trixie-updates \
  -skip-signing \
  debian-trixie-updates-snapshot-13.08.2025 \
  debian

debian-security-trixie:

aptly publish snapshot \
  -architectures=amd64,i386 \
  -distribution=trixie-security \
  -skip-signing \
  debian-security-trixie-snapshot-13.08.2025 \
  debian-security

Возможно, для корректной работы многокомпонентных репозиториев Debian стоит создать отдельные зеркала для каждого компонента и опубликовать их как независимые репозитории. Но на проверку этого у меня не хватило сил:)

Вот структура опубликованных репозиториев:

tree -d -L 3 /var/spool/aptly/public/
/var/spool/aptly/public/
├── debian
│   ├── dists
│   │   ├── trixie
│   │   └── trixie-updates
│   └── pool
│       └── main
├── debian-security
│   ├── dists
│   │   └── trixie-security
│   └── pool
│       └── main
├── pbs
│   ├── dists
│   │   └── trixie
│   └── pool
│       └── pbx-no-subscription
└── pve
    ├── dists
    │   └── trixie
    └── pool
        └── pve-no-subscription

Просмотр информации

Для проверки состояния зеркал, снимков и публикаций используйте следующие команды:

aptly mirror list
aptly snapshot list
aptly publish list

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

Устанавливаем веб-сервер nginx:

sudo apt install nginx

Создаем конфигурационный файл:

sudo nano /etc/nginx/sites-available/aptly
server {
        listen 80 default_server;
        server_name _;
        root /var/spool/aptly/public;
        autoindex on;
        location / {
                try_files $uri $uri/ =404;
        }
}

Активируем конфигурацию:

sudo ln -s /etc/nginx/sites-available/aptly /etc/nginx/sites-enabled/

Отключаем стандартную конфигурацию:

sudo rm /etc/nginx/sites-enabled/default

Перезапускаем nginx:

sudo nginx -t && sudo systemctl restart nginx

Обновление локальных репозиториев

Для обновления зеркал выполните следующие шаги:

  1. Обновите зеркало:
aptly mirror update \
  -keyring=<ключ> \
  <название-зеркала>
  1. Создайте новый снимок:
aptly snapshot create \
  <название-снимка> \
  from mirror <название-зеркала>
  1. Переключите публикацию на новый снимок:
aptly publish switch \
  -skip-signing \
  <дистрибутив> \
  <префикс> \
  <снимок>

Также можно откатиться на более ранний снимок (но учтите, что apt upgrade не откатит пакеты на старые версии, если система уже обновлена):

aptly publish switch \
  -skip-signing \
  <дистрибутив> \
  <префикс> \
  <более-ранний-снимок>

Использование своего репозитория

Чтобы подключить своё зеркало репозитория на Debian или ProxmoxVE изменим /etc/apt/sources.list:

nano /etc/apt/sources.list
deb [trusted=yes] http://<ip_aptly>/debian/ trixie main
deb [trusted=yes] http://<ip_aptly>/debian/ trixie-updates main
deb [trusted=yes] http://<ip_aptly>/debian-security/ trixie-security main
deb [arch=amd64 trusted=yes] http://<ip_aptly>/pve/ trixie pve-no-subscription
deb [arch=amd64 trusted=yes] http://<ip_aptly>/pbs/ trixie pbx-no-subscription

Обратите внимание, что в нашем случае для репозитория Debian мы указываем только main. В него уже входят maincontrib и non-free.

И так как локальное зеркало репозитория не подписано, то нужно добавить опцию trusted=yes.


Кроме Aptly для создания своего локального зеркала репозитория можно использовать Apt-mirror:

Если понравилась статья, подпишись на мой канал в VK или Telegram.

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять
Отказаться
Политика конфиденциальности