Хочете мати власний приватний PPA для Ubuntu з автоматичною збіркою і підписом .deb? Зробимо це разом: ми зберемо пакети у GitHub Actions, підпишемо їх GPG-ключем і опублікуємо у приватній гілці репозиторію, з якої клієнти зможуть безпечно встановлювати оновлення. Це зручно для команд і ентузіастів, які люблять керувати релізами через термінал Linux і цінують автоматизацію задач. 🔒
Що таке приватний PPA і як це працює
Традиційно PPA означає «Personal Package Archive» на Launchpad. Але приватні PPA там — платна опція. Ми підемо іншим шляхом: створимо приватний APT-репозиторій у вашому GitHub-репозиторії. GitHub Actions буде:
- збирати .deb пакети з вихідних;
- підписувати метадані репозиторію вашим GPG-ключем;
- публікувати структуру
dists/іpool/у приватній гілці (наприклад,apt); - клієнти додадуть джерело через
sources.listі отримуватимуть оновлення як зі звичайного PPA.
Переваги: контроль доступу через GitHub (PAT-токени), стандартна підтримка apt, прозора інтеграція в CI/CD. Це повністю сумісно з apt команди та підписом InRelease.
Підготовка: GPG-ключ і секрети GitHub
Спочатку створіть ключ для підпису релізів. У термінал Linux виконайте:
Збережіть private.asc як секрет GPG_PRIVATE_KEY у Settings → Secrets → Actions вашого репозиторію. Додайте також GPG_PASSPHRASE (якщо є) і PUBLISH_TOKEN — це ваш персональний PAT з правами repo для пушу у приватну гілку. Ми публікуватимемо архів у гілці apt вашого приватного репозиторію.
Структура APT-репозиторію (коротко)
APT очікує стандартну структуру:
pool/main/<pkg>/*.deb— самі пакети;dists/stable/main/binary-amd64/Packages(+.gz,.xz) — індекси;dists/stable/Release,InRelease,Release.gpg— метадані з підписом GPG.
Ми згенеруємо все це у GitHub Actions за допомогою dpkg-scanpackages і apt-ftparchive.
How-to: GitHub Actions для збірки, підпису та публікації
Створіть workflow. Найпростіше — додати файл з локального репо через bash скрипти:
Після пушу з тегом v* (наприклад, v1.0.0) workflow збере і опублікує репозиторій у гілці apt. Клієнти зможуть читати його за посиланням https://raw.githubusercontent.com/<OWNER>/<REPO>/apt/ з авторизацією.
Підключення клієнтів Ubuntu до приватного репозиторію
1) Додайте автентифікацію для raw.githubusercontent.com
2) Встановіть публічний ключ репозиторію
3) Додайте джерело у sources.list.d
Готово! Ви підключили приватний репозиторій. Далі оновлення виконуються як завжди через apt команди.
Альтернативні способи
- aptly + S3/CloudFront: надійно, масштабовано; потребує AWS і додаткової конфігурації.
- Launchpad (публічний): простіший публічний PPA для open-source.
- Packagecloud/Cloudsmith: готові керовані приватні APT-сховища (платні, зручні GUI).
GUI-спосіб (через інтерфейс GitHub)
- Створіть репозиторій (private) у GitHub.
- Settings → Secrets and variables → Actions: додайте
GPG_PRIVATE_KEY,GPG_PASSPHRASE(за потреби) іPUBLISH_TOKEN. - Створіть файл
.github/workflows/ppa.ymlчерез кнопку «Add file» → «Create new file», вставте вміст із розділу How-to і збережіть. - Створіть релізний тег
v1.0.0у розділі Releases → Draft a new release → Publish. - Перевірте гілку
apt: там мають з’явитисяdists/,pool/іkeys/public.asc.
FAQ
Чому apt каже «NO_PUBKEY» або «The following signatures couldn't be verified»?
Переконайтеся, що signed-by вказує на той самий ключ, яким підписано InRelease. Оновіть ключ: заново експортуйте public.asc і замініть файл у /usr/share/keyrings/.
Отримую 401/403 з raw.githubusercontent.com
APT не бачить токен. Перевірте /etc/apt/auth.conf.d/github.conf (права 600), правильний користувач/токен, і що репозиторій приватний та існує гілка apt.
InRelease/Release.gpg не збігаються
Ймовірно, ви не оновили підпис після змін у dists/. У CI переконайтеся, що крок підпису виконується після генерації Release і що кеш не підмінює файли.
Як додати інші архітектури або дистрибутиви (suite)?
Додайте ще каталоги binary-arm64, змініть Architectures в apt.conf, продублюйте генерацію індексів для кожної архітектури та додайте нові stable/testing гілки за потреби.
Чи безпечно зберігати приватний ключ у GitHub Actions?
Тримайте його у Secrets, використовуйте мінімально необхідні права для PAT, регулярно перевипускайте ключ (ротація), а для додаткової безпеки — апаратний ключ і короткі TTL.
Чи можна замість raw.githubusercontent.com використати GitHub Pages?
Так, але для приватності потрібен платний план/організація. Для більшості команд приватна гілка + auth через raw — простіше.
Rate limit GitHub і повільне оновлення?
Використовуйте персональні токени на клієнтах, кешуйте репозиторій-проксі (apt-cacher-ng) усередині мережі, зменшуйте частоту оновлень.
Порада від Kernelka
Додавайте перевірки підпису і smoke-тести встановлення пакета прямо в CI, щоб не штовхати «биті» індекси. Маленький тестовий контейнер з apt update && apt install з вашого репо — і ви спокійні. 🚀
Підсумок
- Згенерували GPG-ключ і додали його у Secrets GitHub.
- Налаштували workflow для збірки .deb, генерації індексів і підпису InRelease.
- Опублікували репозиторій у приватній гілці
apt. - Підключили клієнтів через
auth.conf, keyring іsources.list.d. - Керуємо оновленнями стандартними apt команди; все автоматизовано через GitHub Actions і ваші bash скрипти.

Прокоментувати
На сайті відображається лише твоє ім'я та коментар. Електронна пошта зберігається виключно для зв'язку з тобою за потреби та в жодному разі не передається стороннім особам.