Среда, 14.08.2024 18:51

Создаем свой apt-репозиторий для PHP 8.3.10.  Собираем PHP 8.3 из исходного кода в Debian 12 Bookworm часть 3.

Создаем свой 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.

 

Категория Debian
Теги PHP php83 Debian

Добавить комментарий

Простой текст

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
Просмотров: 74