Создаем свой apt-репозиторий для PHP 8.3.10. Собираем PHP 8.3 из исходного кода в Debian 12 Bookworm часть 3.
В прошлой части из собранного из исходного кода PHP 8.3.10 мы создали .deb пакет, позволяющий установить результат сборки на другой сервер с помощью apt.
Единственным недостатком установки именно из deb-пакета является отсутствие возможности автоматической установки требуемых зависимостей и необходимость вручную копировать файлы каждый раз, когда нужно установит - обновить пакет.
Сегодня мы создадим свой локальный репозиторий и подпишем его PGP-подписью, и проверим его работоспособность на тестовом сервере.
Создаем свой apt-репозиторий для PHP 8.3.10
Создание папок для репозитория
Перейдем на сервер сборки:
Создадим папку:
sudo mkdir /var/www/html/repo
sudo mkdir /var/www/html/repo/deb
Скопируем .deb файл в папку веб-сервера:
sudo cp /opt/build/php-8.3.10.deb /var/www/html/repo/deb
Теперь нам нужно создать файл со списком пакетов, который будет загружаться на клиентские пк командой apt update.
Сразу оформим его в виде скрипта:
sudo mcedit /opt/build/make-repo.sh
С содержимым:
cd /var/www/html
dpkg-scanpackages repo /dev/null | gzip -9c > repo/Packages.gz
chown -R www-data /var/www/html/repo
chgrp -R www-data /var/www/html/repo
Сделаем исполняемым:
sudo chmod +x /opt/build/make-repo.sh
Запустим:
sudo /opt/build/make-repo.sh
dpkg-scanpackages: warning: Packages in archive but missing from override file:
dpkg-scanpackages: warning: php-8.3.10
dpkg-scanpackages: info: Wrote 1 entries to output Packages file.
Будет создан файл:
/var/www/html/repo/Packages.gz
C содержимым:
Package: php-8.3.10
Version: 8.3.10
Architecture: amd64
Maintainer: <admin@localcompany.ru>
Depends: libcurl4, libxml2, libreadline8, libzip4, openssl, zlib1g, sqlite3, libonig5, libpq5, libpng16-16, libldap-2.5-0, libfreetype6, libjpeg62
Filename: repo/php-8.3.10.deb
Size: 51254504
MD5sum: d613b8b848f420f5a504e4b859e549cb
SHA1: 586441ee40abeb851ee3bd7042db8707b9bae98e
SHA256: af38f2a8fd0e9cc8884a9f18093b3c956d217e51546511ac55e8564d849f4cec
Description: PHP 8.3.10 всё в одном
License: PHP License v3.01
Vendor: Локальная компания
Перейдем на тестовый пк и запустим:
wget http://192.168.1.36/repo/Packages.gz
--2024-08-13 01:01:24-- http://192.168.1.36/repo/Packages.gz
Connecting to 192.168.1.36:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 428 [application/octet-stream]
Saving to: ‘Packages.gz’
Packages.gz 100%[===================>] 428 --.-KB/s in 0s
2024-08-13 01:01:24 (157 MB/s) - ‘Packages.gz’ saved [428/428]
Файл будет загружен, значит всё в порядке, можно настраивать репозиторий.
Настройка локального репозитория
На тестовой машине запустим:
su
echo 'deb http://192.168.1.36/repo/ ./' | sudo tee /etc/apt/sources.list.d/localrepo.list
sudo apt update
Получим:
Ign:1 http://192.168.1.36/repo ./ InRelease
Err:2 http://192.168.1.36/repo ./ Release
404 Not Found [IP: 192.168.1.36 80]
Get:3 http://security.debian.org/debian-security bookworm-security InRelease [48 .0 kB]
Hit:4 http://deb.debian.org/debian bookworm InRelease
Get:5 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:6 http://security.debian.org/debian-security bookworm-security/main Sources [105 kB]
Get:7 http://security.debian.org/debian-security bookworm-security/main amd64 Pa ckages [169 kB]
Get:8 http://security.debian.org/debian-security bookworm-security/main Translat ion-en [103 kB]
Reading package lists... Done
E: The repository 'http://192.168.1.36/repo ./ Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disa bled by default.
N: See apt-secure(8) manpage for repository creation and user configuration deta ils.
Так как у нас ест только файл Packages, но нет файла Release apt отказывается обновляться.
Создаем файл Release
Для чего нужен файл Release?
Файл Release содержит важную информацию о структуре репозитория, позволяющую проверить загруженные файлы и гарантировать, что они не были заменены в процессе передачи с помощью разнообразных MITM-атак.
В файле содержаться хеш-суммы для всех основных файлов репозитория, их размер и имя.
Создаем GPG-ключ
Перейдем на сервер сборки. Установим требуемые пакеты
sudo apt-get install -y rng-tools
В первой части мы уже установили nginx так что будем использовать его
Для начала создадим PGP-ключ для подписания пакетов в нашем репозитории.
Создадим все нужные папки:
sudo gpg --list-keys
gpg: directory '/root/.gnupg' created
gpg: keybox '/root/.gnupg/pubring.kbx' created
gpg: /root/.gnupg/trustdb.gpg: trustdb created
Создадим файл с описанием для нашего ключа:
sudo mcedit /root/.gnupg/phpRepo
С содержимым:
Key-Type: RSA
Key-Length: 3072
Subkey-Type: ELG-E
Subkey-Length: 3072
Name-Real: local company php apt repository
Name-Comment: php apt repository
Name-Email: admin@localcompany.ru
Expire-Date: 0
Запустим генерацию ключа. Так как длина его 3072 это займет некоторое время!
sudo gpg --batch --gen-key /root/.gnupg/phpRepo
Для ключа обязательно придумайте пароль.
Введем пароль для нашего ключа.
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
x Please enter the passphrase to x
x protect your new key x
x x
x Passphrase: ________________________________________ x
x x
x <OK> <Cancel> x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
И подтверждение пароля. Будет создан PGP-ключ:
gpg: Generating a basic OpenPGP key
gpg: done
gpg: directory '/root/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/root/.gnupg/openpgp-revocs.d/D7A8D603CCA4148437F081B8870EE5F8E2222EE2.rev'
Проверим ключ:
sudo gpg --list-keys
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
/home/user/.gnupg/pubring.kbx
-----------------------------
pub rsa3072 2024-08-13 [SCEA]
D7A8D603CCA4148437F081B8870EE5F8E2222EE2
uid [ultimate] local company php apt repository (php apt repository) <admin@localcompany.ru>
sub elg3072 2024-08-13 [E]
Экспортируем публичную часть ключа, чтобы сделать его доступным по сети:
Здесь
D7A8D603CCA4148437F081B8870EE5F8E2222EE2
Обратите внимание! Для каждого ключа создается уникальный ИД, во всех командах далее замените этот Ид на полученный с помощью команды:
sudo gpg --list-keys
Запустим:
sudo gpg --export -a D7A8D603CCA4148437F081B8870EE5F8E2222EE2 | sudo tee /var/www/html/repo/phprepo.pub
Преобразуем в бинарный формат, это необходимо так как старый способ использования ключей объявлен устаревшим и будет удален в будущих релизах:
sudo cat /var/www/html/repo/phprepo.pub | sudo gpg --dearmor -o /var/www/html/repo/phprepo.gpg
Скрипт генерации файла Release
Обновим файл
sudo mcedit /opt/build/make-repo.sh
Приведем содержимое к виду:
#!/bin/sh
repoGPGKey="D7A8D603CCA4148437F081B8870EE5F8E2222EE2"
cd /var/www/html/repo
dpkg-scanpackages -m . > Packages
sudo gzip -f -k -9 Packages
sudo cat <<EOF > Release
Origin: LocalCompany
Label: PHP-8.3.10
Description: PHP 8 local repository
Architectures:amd64
EOF
apt-ftparchive release . >> Release
sudo gpg -u $repoGPGKey --yes --clearsign --digest-algo SHA512 -o InRelease Release
chown -R www-data /var/www/html/repo
chgrp -R www-data /var/www/html/repo
Не забудьте изменить ИД ключа в строке:
repoGPGKey="D7A8D603CCA4148437F081B8870EE5F8E2222EE2"
Давайте рассмотрим его подробнее:
dpkg-scanpackages -m . > Packages
Эта команда сканирует ищет файлы с расширением .deb в текущей папке и подпапках и создает файл Packages с метаданными о каждом файле.
sudo gzip -f -k -9 Packages
Здесь мы создаем файл:
Packages.gz
sudo cat <<EOF > Release
Origin: LocalCompany
Label: PHP-8.3.10
Description: PHP 8 local repository
Architectures:amd64
EOF
apt-ftparchive release . >> Release
Здесь мы создаем шаблон файла:
Release
Далее мы добавляем список файлов с его хешами в файл Release:
apt-ftparchive release . >> Release
Это необходимо, чтобы гарантировать, что файлы не будут подменены в процессе передачи, так как после получения локально будут вычислены хеши этих файлов и сравнены с суммами из файла Release.
sudo gpg -u $repoGPGKey --yes --clearsign --digest-algo SHA512 -o InRelease Release
Мы подписываем файл Release GPG-подписью нашего репозитория. При этом создается файл InRelease
в конец которого добавляется блок с электронной подписью файла Release.
Запустим:
sudo /opt/build/make-repo.sh
Введем пароль, использовавшийся при создании GPG-ключа:
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
x Please enter the passphrase to unlock the OpenPGP secret key: x
x "local company php apt repository (php apt repository) x
x <admin@localcompany.ru>" x
x 3072-bit RSA key, ID 870EE5F8E2222EE2, x
x created 2024-08-13. x
x x
x x
x Passphrase: ********_______________________________________________________ x
x x
x <OK> <Cancel> x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
Файл будет подписан!
Настройка локального репозитория на другом сервере
Установка ключа репозитория
Перейдем на тестовый сервер:
Запустим:
su
wget -O /etc/apt/keyrings/phprepo.gpg http://192.168.1.36/repo/phprepo.gpg
Проверим:
ls /etc/apt/keyrings/phprepo.gpg
Удалим файл:
sudo rm /etc/apt/sources.list.d/localrepo.list
Пересоздадим:
echo 'deb [signed-by=/etc/apt/keyrings/phprepo.gpg] http://192.168.1.36/repo/ /' | sudo tee /etc/apt/sources.list.d/localrepo.list
Обратите внимание, согласно новой системе проверки подписей теперь для репозитория указывается путь к файлу с подписью:
signed-by=/etc/apt/keyrings/phprepo.gpg
Обновим apt
sudo apt update
Get:1 http://192.168.1.36/repo InRelease [2,007 B]
Get:2 http://192.168.1.36/repo Packages [439 B]
Hit:3 http://deb.debian.org/debian bookworm InRelease
Get:4 http://security.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:5 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:6 http://security.debian.org/debian-security bookworm-security/main Sources [105 kB]
Get:7 http://security.debian.org/debian-security bookworm-security/main amd64 Packages [169 kB]
Get:8 http://security.debian.org/debian-security bookworm-security/main Translation-en [103 kB]
Fetched 483 kB in 2s (212 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
1 package can be upgraded. Run 'apt list --upgradable' to see it.
Удалим установленный php 8.3.10
sudo apt-get -y remove php-8.3.10
Установим:
sudo apt install php-8.3.10
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
php-8.3.10
0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded.
Need to get 51.3 MB of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 http://192.168.1.36/repo php-8.3.10 8.3.10 [51.3 MB]
Fetched 51.3 MB in 0s (213 MB/s)
Selecting previously unselected package php-8.3.10.
(Reading database ... 33177 files and directories currently installed.)
Preparing to unpack .../php-8.3.10_8.3.10_amd64.deb ...
Unpacking php-8.3.10 (8.3.10) ...
Setting up php-8.3.10 (8.3.10) ...
Если мы вернемся к контрольной точке тестовой машины, созданной сразу после установки чистой операционной системы, настроим наш репозиторий и запустим:
sudo apt install php-8.3.10
То получим следующее:
sudo apt install php-8.3.10
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
libcurl4 libjpeg62-turbo libonig5 libpq5 libzip4 sqlite3
Suggested packages:
sqlite3-doc
The following NEW packages will be installed:
libcurl4 libjpeg62-turbo libonig5 libpq5 libzip4 php-8.3.10 sqlite3
0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded.
Need to get 52.6 MB of archives.
After this operation, 3,801 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://192.168.1.36/repo php-8.3.10 8.3.10 [51.3 MB]
Get:2 http://deb.debian.org/debian bookworm/main amd64 libcurl4 amd64 7.88.1-10+deb12u6 [390 kB]
Get:3 http://security.debian.org/debian-security bookworm-security/main amd64 libpq5 amd64 15.8-0+deb12u1 [188 kB]
Get:4 http://deb.debian.org/debian bookworm/main amd64 libjpeg62-turbo amd64 1:2.1.5-2 [166 kB]
Get:5 http://deb.debian.org/debian bookworm/main amd64 libonig5 amd64 6.9.8-1 [188 kB]
Get:6 http://deb.debian.org/debian bookworm/main amd64 libzip4 amd64 1.7.3-1+b1 [55.5 kB]
Get:7 http://deb.debian.org/debian bookworm/main amd64 sqlite3 amd64 3.40.1-2 [353 kB]
Fetched 52.6 MB in 2s (24.0 MB/s)
Selecting previously unselected package libcurl4:amd64.
(Reading database ... 33123 files and directories currently installed.)
Preparing to unpack .../0-libcurl4_7.88.1-10+deb12u6_amd64.deb ...
Unpacking libcurl4:amd64 (7.88.1-10+deb12u6) ...
Selecting previously unselected package libjpeg62-turbo:amd64.
Preparing to unpack .../1-libjpeg62-turbo_1%3a2.1.5-2_amd64.deb ...
Unpacking libjpeg62-turbo:amd64 (1:2.1.5-2) ...
Selecting previously unselected package libonig5:amd64.
Preparing to unpack .../2-libonig5_6.9.8-1_amd64.deb ...
Unpacking libonig5:amd64 (6.9.8-1) ...
Selecting previously unselected package libpq5:amd64.
Preparing to unpack .../3-libpq5_15.8-0+deb12u1_amd64.deb ...
Unpacking libpq5:amd64 (15.8-0+deb12u1) ...
Selecting previously unselected package libzip4:amd64.
Preparing to unpack .../4-libzip4_1.7.3-1+b1_amd64.deb ...
Unpacking libzip4:amd64 (1.7.3-1+b1) ...
Selecting previously unselected package sqlite3.
Preparing to unpack .../5-sqlite3_3.40.1-2_amd64.deb ...
Unpacking sqlite3 (3.40.1-2) ...
Selecting previously unselected package php-8.3.10.
Preparing to unpack .../6-php-8.3.10_8.3.10_amd64.deb ...
Unpacking php-8.3.10 (8.3.10) ...
Setting up libzip4:amd64 (1.7.3-1+b1) ...
Setting up libpq5:amd64 (15.8-0+deb12u1) ...
Setting up libjpeg62-turbo:amd64 (1:2.1.5-2) ...
Setting up libcurl4:amd64 (7.88.1-10+deb12u6) ...
Setting up libonig5:amd64 (6.9.8-1) ...
Setting up sqlite3 (3.40.1-2) ...
Setting up php-8.3.10 (8.3.10) ...
Created symlink /etc/systemd/system/multi-user.target.wants/php-8.3.10-fpm.service → /lib/systemd/system/php-8.3.10-fpm.service.
Processing triggers for man-db (2.11.2-2) ...
Processing triggers for libc-bin (2.36-9+deb12u7) ...
Проверим:
systemctl status php-8.3.10-fpm
● php-8.3.10-fpm.service - The PHP 8.3.10 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php-8.3.10-fpm.service; enabled; preset: enabled)
Active: active (running) since Tue 2024-08-13 04:48:52 EDT; 1min 43s ago
Main PID: 1160 (php-fpm)
Tasks: 3 (limit: 1020)
Memory: 19.4M
CPU: 23ms
CGroup: /system.slice/php-8.3.10-fpm.service
├─1160 "php-fpm: master process (/opt/php-8.3.10/etc/php-fpm.conf)"
├─1163 "php-fpm: pool www"
└─1164 "php-fpm: pool www"
Aug 13 04:48:52 debian-test systemd[1]: Started php-8.3.10-fpm.service - The PHP 8.3.10 FastCGI Process Manager.
php -v
PHP 8.3.10 (cli) (built: Aug 8 2024 22:32:36) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.10, Copyright (c) Zend Technologies
Всё установлено и работает!
Заключение
Сегодня мы рассмотрели создание deb-репозитория для собранного в предыдущей статья deb-пакета PHP 8.3.10:
Создали папки для репозитория;
Создали файл Packages;
Протестировали репозиторий и обнаружили,что необходимо создать файл Release;
Создали GPG-ключ для нашего репозитория;
Разместили публичный ключ репозитория на web-сервере;
Написали скрипт для генерации файлов Packages и Release и подробно рассмотрели его команды;
Настроили репозиторий на тестовом сервере;
Установили PHP 8.3.10 c помощью apt и проверили работоспособность php-fpm.
Добавить комментарий