Статья подробно описывает процесс установки и настройки инструмента Aptly для создания локальных зеркал Linux-репозиториев, включая Proxmox и Debian. В ней рассмотрены шаги по созданию, синхронизации и публикации репозиториев, а также их размещение на веб-сервере Nginx. Дополнительно приведены команды для обновления зеркал и работы со снимками, что позволяет поддерживать актуальные копии репозиториев в локальной сети.
Установка Aptly
Aptly — это инструмент, который позволяет создавать клоны известных Linux-репозиториев.
- Официальный сайт: https://www.aptly.info/
- HigHub: https://github.com/aptly-dev/aptly
На 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 обычно используютсяmain,contrib,non-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-репозитория. Используются символические ссылки и дополнительные файлы (Release, Contents-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, так как все компоненты (main, contrib, non-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
Обновление локальных репозиториев
Для обновления зеркал выполните следующие шаги:
- Обновите зеркало:
aptly mirror update \ -keyring=<ключ> \ <название-зеркала>
- Создайте новый снимок:
aptly snapshot create \ <название-снимка> \ from mirror <название-зеркала>
- Переключите публикацию на новый снимок:
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. В него уже входят main, contrib и non-free.
И так как локальное зеркало репозитория не подписано, то нужно добавить опцию trusted=yes.
Кроме Aptly для создания своего локального зеркала репозитория можно использовать Apt-mirror:
Если понравилась статья, подпишись на мой канал в VK или Telegram.