Добавление репозитория с ключём, установка:
|
1 2 3 4 5 |
echo "deb [signed-by=/etc/apt/keyrings/aptly.asc] http://repo.aptly.info/ squeeze main" | sudo tee /etc/apt/sources.list.d/aptly.list sudo mkdir -p /etc/apt/keyrings; sudo chmod 755 /etc/apt/keyrings wget -O /etc/apt/keyrings/aptly.asc https://www.aptly.info/pubkey.txt sudo apt-get update sudo apt install aptly rng-tools nginx -y |
Создать .aptly.conf в домашнем каталоге, или /etc/aptly.conf:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
{ "rootDir": "/public", "downloadConcurrency": 4, "downloadSpeedLimit": 0, "architectures": [], "dependencyFollowSuggests": false, "dependencyFollowRecommends": false, "dependencyFollowAllVariants": false, "dependencyFollowSource": false, "dependencyVerboseResolve": false, "gpgDisableSign": false, "gpgDisableVerify": false, "gpgProvider": "gpg", "downloadSourcePackages": false, "skipLegacyPool": true, "ppaDistributorID": "ubuntu", "ppaCodename": "", "FileSystemPublishEndpoints": { "pubtest": { "rootDir": "/var/www/aptly", "linkMethod": "symlink", "verifyMethod": "md5" } }, "enableMetricsEndpoint": false } |
|
1 2 3 4 5 6 7 8 9 10 11 |
#Создать каталог для публикаций: sudo mkdir /var/www/aptly/ #Создание ключа gpg для публикации: sudo rngd -r /dev/urandom && sudo gpg --full-generate-key # Вводим имя, после предложат ввести passphrase и время жизни для него # Пароль записать в файл (/etc/gpgpass) для автоматизации # Ключ можно посмотреть командой: gpg --list-keys # публикация открытого ключа: sudo gpg --export --armor | sudo tee repos.asc ( или под рутом: gpg --export --armor > /var/www/aptly/pubtest.asc) #Пароль записать в файл (/etc/gpgpass) для автоматизации |
Создание x64 репозитория на примере Ubuntu 22 jammy (без source)
Создать репозитории x64 (всё будет скачано в компонент main, если нужно отделить, нужно скачивать каждый компонент отдельно). Во время этих команд попросят добавить ключи, команда для этого будет на экране (gpg —no-default-keyring —keyring trustedkeys.gpg —keyserver keyserver.ubuntu.com —recv-keys 871920D1991BC93C):
|
1 2 3 |
aptly mirror create -architectures=amd64 jammy http://ru.archive.ubuntu.com/ubuntu/ jammy aptly mirror create -architectures=amd64 jammy-updates http://ru.archive.ubuntu.com/ubuntu/ jammy-updates aptly mirror create -architectures=amd64 jammy-security http://security.ubuntu.com/ubuntu/ jammy-security |
Обновить репозиторий (скачать), создать снапшоты и объединить 3 в 1:
|
1 2 3 4 5 |
aptly mirror list -raw | grep jammy | xargs -n1 aptly mirror update aptly snapshot create jammy from mirror jammy aptly snapshot create jammy-updates from mirror jammy-updates aptly snapshot create jammy-security from mirror jammy-security aptly snapshot merge -latest jammy-final-$(date -u +'%d%m%Y') jammy jammy-updates jammy-security |
Опубликовать снапшот объединённого репозитория (origin и label берутся из файла InRelease в репозитории):
|
1 2 |
aptly -skip-contents -gpg-provider gpg -batch -passphrase-file /etc/gpgpass publish snapshot -distribution="jammy" -origin="Ubuntu" -label="Ubuntu" jammy-final-$(date -u +'%d%m%Y') filesystem:pubtest:ubuntu # "ubuntu" указывает путь, можно заменить, но тогда его нужно будет менять в sources.list клиента. Для Debian указывается debian. |
Настройка NGINX для публикации репозиториев (с сертификатом let’s encrypt):
sudo nano /etc/nginx/sites-available/repos.dom.loc:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
server { listen 80; listen 443 ssl http2; server_name aptly.example.com; ssl_certificate /etc/letsencrypt/live/aptly.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/aptly.example.com/privkey.pem; root /var/www/aptly; location / { autoindex on; try_files $uri $uri/ =404; } } ##### Вариант без сертификата: server { server_name aptly.example.com; root /var/www/aptly; location / { autoindex on; try_files $uri $uri/ =404; } } |
Также нужно поменять порты\пути в default конфиге, либо выключить его.
Включить сайт, перезапустить nginx:
|
1 2 3 |
sudo ln -s /etc/nginx/sites-available/repos.dom.loc -s /etc/nginx/sites-enabled/repos.dom.loc systemctl restart nginx systemctl enable nginx |
Подключение своего репозитория на клиенте
В /etc/apt/sources.list поменять адрес на внутренний и оставить только компонент main. Пример файла ubuntu 22:
|
1 2 3 |
# Начало deb http://repos.dom.loc/ubuntu/ jammy main # Конец |
Пример /etc/apt/sources.list.d/ubuntu.sources в ubuntu 24:
|
1 2 3 4 5 |
Types: deb URIs: http://repos.dom.loc/ubuntu/ Suites: noble Components: main Signed-By: /etc/apt/trusted.gpg.d/repos.asc |
Далее apt update…
Дополнительная информация
Удаление репозитория на примере ubuntu 24:
|
1 2 3 4 5 6 7 8 9 |
# удаление публикации (вместе с Updates и security так как всё в main) aptly publish drop noble filesystem:pubtest:ubuntu # удаление снапшотов (2 раза): aptly snapshot list -raw | grep noble | xargs -n1 aptly snapshot drop aptly snapshot list -raw | grep noble | xargs -n1 aptly snapshot drop # Удаление зеркала aptly mirror list -raw | grep noble | xargs -n1 aptly mirror drop # очистка БД aptly db cleanup |
Инфа по зеркалам и снапшотам (текущий объём нельзя посмотреть):
|
1 2 3 |
aptly mirror list aptly mirror show bionic-update aptly snapshot list |
Обновление зеркала репозитория:
|
1 2 3 4 5 |
aptly mirror update aptly publish drop aptly snapshot drop aptly snapshot create aptly publish snapshot |
Автоматизация обновления зеркала репозиториев
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/bin/bash # Если ubuntu.com пингуется, записать текущую дату, запустить обновление зеркал и создание снапшотов ping -c 1 ubuntu.com > /dev/null if [ $? -eq 0 ]; then date=$(date -u +'%d%m%Y') for n in $(aptly mirror list -raw | grep -v rusiem); do aptly mirror update $n aptly snapshot create $n-$date from mirror $n done # Для каждого названия релизов репозиториев объединить снапшоты в 1 for n in $(echo bookworm jammy xenial noble); do if [[ $n != bullseye && $n != bookworm ]]; then # Если не bullseye и bookworm (не debian) aptly snapshot merge -latest $n-final-$date $n-$date $n-updates-$date $n-security-$date # Переключить снапшот публикации зеркала: aptly -skip-contents -gpg-provider gpg -batch -passphrase-file /etc/gpgpass publish switch $n filesystem:pubtest:ubuntu $n-final-$date else # Иначе для debian aptly snapshot merge -latest $n-final-$date $n-$date $n-updates-$date $n-security-$date # Переключить снапшот публикации зеркала: aptly -skip-contents -gpg-provider gpg -batch -passphrase-file /etc/gpgpass publish switch $n filesystem:pubtest:debian $n-final-$date fi done fi # Удалить неиспользуемые снапшоты, старше двух дней for n in $(aptly snapshot list -raw | grep -v $(date -u +'%d%m%Y') | grep -v $(date -d '1 day ago' +%d%m%Y)); do aptly snapshot drop $n done # Второй раз освобождаются зависимые for n in $(aptly snapshot list -raw | grep -v $(date -u +'%d%m%Y') | grep -v $(date -d '1 day ago' +%d%m%Y)); do aptly snapshot drop $n done aptly db cleanup # Очистить БД от неиспользуемых данных |
Пример зеркала с отдельными компонентами main, contrib и non-free:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#Создать зеркала: aptly mirror create wheezy-main http://ftp.ru.debian.org/debian/ wheezy main aptly mirror create wheezy-contrib http://ftp.ru.debian.org/debian/ wheezy contrib aptly mirror create wheezy-non-free http://ftp.ru.debian.org/debian/ wheezy non-free aptly mirror list -raw | xargs -n 1 aptly mirror update # (скачать) #Создать снапшот: aptly snapshot create wheezy-main-7.5 from mirror wheezy-main aptly snapshot create wheezy-contrib-7.5 from mirror wheezy-contrib aptly snapshot create wheezy-non-free-7.5 from mirror wheezy-non-free #Опубликовать все компоненты: aptly publish snapshot -component=main,contrib,non-free -distribution=wheezy wheezy-main-7.5 wheezy-contrib-7.5 wheezy-non-free-7.5 upstream #или: aptly publish snapshot -component=,, wheezy-main-7.5 wheezy-contrib-7.5 wheezy-non-free-7.5 upstream |