Проблема
В защищённых средах, на режимных объектах и в изолированных лабораториях серверы и рабочие станции не имеют доступа к интернету. Установка и обновление пакетов стандартными средствами (apt, dnf) становятся невозможными. Администратору приходится вручную скачивать .deb или .rpm пакеты на внешнем носителе, переносить их на целевую машину и устанавливать с помощью dpkg -i или rpm -i, разрешая зависимости по цепочке. При количестве машин больше двух это превращается в хаос: версии расходятся, зависимости теряются, а контроль целостности отсутствует. Локальный репозиторий linux это стандартное решение, позволяющее централизованно публиковать пакеты, подписывать их GPG-ключом и обслуживать парк машин любой величины без единого внешнего подключения.
Решение
Построим два типа репозиториев: DEB-репозиторий для Debian, Ubuntu, Astra Linux Common Edition и РЕД ОС на базе Debian, а также RPM-репозиторий для Astra Linux Special Edition, РЕД ОС на базе RPM, CentOS и Rocky Linux. Для DEB-репозитория используем утилиту Aptly, которая автоматизирует добавление пакетов, снапшоты и публикацию. Для RPM-репозитория применим классический createrepo_c. Оба репозитория подпишем GPG-ключом, чтобы клиенты могли проверять подлинность пакетов. Все инструменты входят в репозитории Debian/Ubuntu и Astra Linux. Официальная документация по Aptly: aptly.info, по createrepo: createrepo_c, руководство по управлению ключами: GNU Privacy Guard Manual.
Пошаговая инструкция
Шаг 1. Подготовка сервера-репозитория
Сервер должен иметь достаточно дискового пространства (от 50 ГБ) и находиться в той же сети, что и клиентские машины. Установите необходимые пакеты:
bash
sudo apt update
sudo apt install aptly createrepo-c dpkg-dev gpg -y # для DEB и RPM
Создайте структуру каталогов:
bash
sudo mkdir -p /srv/repo/{deb,rpm,incoming}
Шаг 2. Создание DEB-репозитория с помощью Aptly
Aptly работает с локальной базой .aptly в домашней директории пользователя. Для серверного использования создадим отдельного пользователя aptly:
bash
sudo useradd -m -s /bin/bash aptly
sudo -u aptly mkdir -p /home/aptly/.aptly/public
sudo -u aptly mkdir -p /home/aptly/incoming
Загрузите несколько тестовых .deb пакетов в директорию incoming. В изолированной сети пакеты предварительно скачиваются на машине с доступом в интернет с помощью apt-get download <package> или выгружаются из кеша apt.
bash
# На машине с интернетом
apt-get download nginx htop vim
# Перенесите файлы в /home/aptly/incoming/
Теперь создайте репозиторий и добавьте пакеты:
bash
sudo -u aptly aptly repo create -distribution=stable -component=main local-repo
sudo -u aptly aptly repo add local-repo /home/aptly/incoming/
Для публикации репозитория по HTTP потребуется веб-сервер. Установите nginx:
bash
sudo apt install nginx -y
Настройте виртуальный хост /etc/nginx/sites-available/repo:
nginx
server {
listen 80;
server_name repo.local;
root /home/aptly/.aptly/public;
location / {
autoindex on;
}
}
Включите сайт и перезапустите nginx:
bash
sudo ln -s /etc/nginx/sites-available/repo /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo systemctl restart nginx
Опубликуйте репозиторий:
bash
sudo -u aptly aptly publish repo -architectures=amd64 local-repo
Теперь репозиторий доступен по адресу http://repo.local/. На клиентских машинах пропишите его в /etc/apt/sources.list.d/local.list:
deb http://repo.local/ stable main
Шаг 3. Подпись DEB-репозитория GPG-ключом
Создайте ключевую пару для подписи:
bash
gpg --full-generate-key --batch --passphrase '' <<EOF
%echo Generating key
Key-Type: RSA
Key-Length: 4096
Name-Real: Local Repository Admin
Name-Email: admin@repo.local
Expire-Date: 0
%commit
%echo Done
EOF
Экспортируйте открытый ключ для клиентов:
bash
gpg --export --armor admin@repo.local > /srv/repo/public.gpg
Настройте Aptly на использование этого ключа. В конфигурации /home/aptly/.aptly.conf укажите:
json
{
"gpgProvider": "gpg",
"gpgSignKey": "admin@repo.local"
}
Переопубликуйте репозиторий с подписью:
bash
sudo -u aptly aptly publish update stable
На клиенте добавьте ключ:
bash
sudo curl -fsSL http://repo.local/public.gpg | sudo apt-key add -
# Или: sudo apt-key add public.gpg
После обновления apt update будет проверять подпись пакетов.
Официальное руководство Aptly по подписи: Aptly GPG signing.
Шаг 4. Создание RPM-репозитория с помощью createrepo_c
Создайте каталог для RPM-пакетов и поместите туда файлы .rpm:
bash
sudo mkdir -p /srv/repo/rpm/Packages
# Скопируйте .rpm-файлы в Packages
Создайте индекс репозитория:
bash
sudo createrepo_c /srv/repo/rpm/
Настройте nginx на раздачу RPM-репозитория, добавив в конфигурацию:
nginx
server {
listen 80;
server_name repo.local;
root /srv/repo;
location /deb {
alias /home/aptly/.aptly/public;
}
location /rpm {
autoindex on;
}
}
Перезагрузите nginx.
Для подписи RPM-репозитория используется тот же GPG-ключ. Подпишите метаданные:
bash
sudo createrepo_c --update /srv/repo/rpm/
sudo gpg --detach-sign --armor /srv/repo/rpm/repodata/repomd.xml
На клиенте создайте файл /etc/yum.repos.d/local.repo:
[local]
name=Local RPM Repository
baseurl=http://repo.local/rpm/
enabled=1
gpgcheck=1
gpgkey=http://repo.local/public.gpg
Импортируйте ключ:
bash
sudo rpm --import http://repo.local/public.gpg
Теперь dnf update или yum install будут использовать локальный репозиторий с проверкой подписи.
Документация по createrepo: createrepo_c Manual.
Шаг 5. Пополнение и обслуживание репозитория
Для добавления новых пакетов:
DEB:
bash
sudo -u aptly aptly repo add local-repo /path/to/new.deb
sudo -u aptly aptly publish update stable
RPM:
bash
sudo cp new.rpm /srv/repo/rpm/Packages/
sudo createrepo_c --update /srv/repo/rpm/
Регулярно проверяйте целостность метаданных. Для Aptly можно делать снапшоты перед изменениями:
bash
sudo -u aptly aptly snapshot create backup-$(date +%Y%m%d) from repo local-repo
В случае ошибки всегда можно откатиться к предыдущему снапшоту.
Устранение распространённых проблем
| Симптом | Вероятная причина | Решение |
|---|---|---|
| Клиент получает «Hash Sum mismatch» при apt update | Метаданные повреждены или не синхронизированы | Переопубликуйте репозиторий: aptly publish update stable. Очистите кеш клиента: sudo rm -rf /var/lib/apt/lists/*. |
| Пакеты не находятся, хотя файл .deb добавлен | Неверная архитектура (i386 vs amd64) или не указан компонент | Проверьте aptly repo show local-repo. При добавлении указывайте -force-replace для обновления существующих пакетов. |
| Ошибка GPG-подписи «NO_PUBKEY» | Открытый ключ не импортирован на клиенте | Выполните sudo apt-key add public.gpg для DEB или rpm --import для RPM. |
| createrepo_c не обновляет индекс | Утилита не перезаписывает существующие метаданные | Используйте ключ --update (createrepo_c --update /srv/repo/rpm/). |
| Веб-сервер не отдаёт файлы из репозитория | Неправильные права доступа или путь в конфигурации nginx | Убедитесь, что nginx имеет права на чтение /home/aptly/.aptly/public или /srv/repo. Проверьте конфигурацию nginx -t. |
Локальный репозиторий linux на базе Aptly и createrepo это фундамент для управления пакетами в изолированной среде. Он позволяет централизованно распространять обновления и новый софт, гарантируя целостность пакетов через GPG-подпись. Сервер-репозиторий, развёрнутый по этой инструкции, способен обслуживать смешанный парк из DEB- и RPM-систем, и легко пополняется новыми пакетами без изменения конфигурации клиентов. Включение автоматического создания снапшотов и регулярного обновления пакетов с внешнего носителя делает инфраструктуру полностью автономной и контролируемой.







