Создание локального зеркала репозиториев с помощью Aptly
Установка 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 .