GOST PHP или «Как я собрал тестовый стенд и не умер».

GOST PHP или «Как я собрал тестовый стенд и не умер».

Как просто собрать тестовый стенд с GOST php?

Нам понадобиться:
1) Docker и Docker compose
2) NGINX на хост компьютере
Схема такова. Есть хост с Nginx, который подключается к двум Docker контейнерах — Mysql и PHP.
Сначала о образах — найден образ Docker, который уже содержит всё нужно, потому что ручная компиляция вызывала только боль и страдания (да и php не очень то и хочет «дружить» с гостом), так что ручная компиляция через пять дней мучений была отложена.
В итоге получаем отличный тестовый стенд, где будет возможность работать и с тестовыми сертификатами, и с php, и с API формата ГОСТ, и с БД.
Устанавливаем образ:
docker pull rnix/php-fpm-gost
Базу данных выбирайте по вашему вкусу. Я выбрал mysql.
sudo docker pull mysql/mysql-server:5.7
Далее нужно подготовить несколько файлов. Создадим общее хранилище:
mkdir ~/myapp; cd ~/myapp

Теперь время заняться подготовкой файлов

1) Папка cryptopro. В ней находится дистрибутив criptopro for linux, ваш сертификат, контейнер и цепочка ключей УЦ (например, тут ключи крипто про).
2) Папка code — тут будет храниться код php или html.
3) Папка data — файлы базы данных
4) Файл auto.sh скрипт автоматизации запуска некоторых вещей, которые я пока не придумал как автоматизировать при первом запуске контейнера.
Описание:

Устанавливает постоянно слетающий пакет крипто про и устанавливает сертификат. После добавляет данные в hosts файл.

Код:
dpkg -i /cryptopro/lsb-cprocsp-kc2-64_4.0.0-4_amd64.deb && sudo /opt/cprocsp/bin/amd64/certmgr -inst -cont '\\.\HDIMAGE\111' -store uMy -file /cryptopro/111.cer -pin 111
echo '192.168.1.50 myip.local' >> /etc/hosts
echo '192.168.1.80 myip2.local' >> /etc/hosts

5) Файл Dockerfile — он позволит нам пересобрать образ под наши нужды. Редактируйте под себя.
ВАЖНО:

Две нижние операции обязательны для выполнения — без них не будет соединения по https+ГОСТ. cacertCA.pem — это файл цепочки ключей УЦ

FROM rnix/php-fpm-gost
COPY ./cryptopro/ /cryptopro
COPY ./auto.sh /
RUN rm /etc/apt/preferences.d/no-debian-php && apt-get update && apt-get install -y \
php-mysql sudo lsb lsb-core alien nano cron\
&& docker-php-ext-install mysqli && docker-php-ext-enable mysqli
RUN /cryptopro/install.sh && dpkg -i /cryptopro/lsb-cprocsp-kc2-64_4.0.0-4_amd64.deb
COPY ./cryptopro/777.000 /var/opt/cprocsp/keys/root/
RUN echo "@reboot /auto.sh" >> /etc/crontab
RUN echo 'curl.cainfo="/cryptopro/cacertCA.pem"' >> /usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini
RUN cp /cryptopro/cacertCA.pem /etc/ssl/certs/ca-certificates.crt

6) my.cnf — файл конфигурации mysql. Самый обычный файл конфигурации, важно только добавить bind-address = 0.0.0.0 для возможности подключения.
7)sudoers — если хотите редактировать права sudo и устанавливать его. Примеров его в интернете много, самый обычный /etc/sudoers.
8) docker-compose.yml — файл запуска наших контейнеров. Вывод файла:
php:
image: php-gost-cp:latest
container_name: php-cp
privileged: true
ports:
- "9000:9000"
volumes:
- ./code:/code
- ./sudoers:/etc/sudoers
mysqldb:
image: mysql/mysql-server:5.7
restart: always
container_name: mysql
environment:
- MYSQL_ROOT_HOST=%
- MYSQL_DATABASE=datamatrix
- MYSQL_ROOT_PASSWORD=NsczxfXthntq2017
- MYSQL_USER=user
- MYSQL_PASSWORD=Ktcyjq2018
ports:
- "3306:3306"
volumes:
- "./data/db/mysql:/var/lib/mysql"
- "./my.cnf:/etc/my.cnf"

Настройка nginx.

Моя минимальная конфигурация — дальше по вашему вкусу.
worker_processes 1;

events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;

server {
index index.php index.html;
server_name php-docker.local;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /code;

location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass localhost:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
}

Теперь собираем образ.

Запускаем команду:
docker build . -t php-gost-cp
Ждать около 10-15 минут. Если без ошибок — вы всё сделали отлично! Если ошибки имеются — читайте лог и правьте конфиги, возможно уже эта статья устарела. Не забывайте, что лучше перед повторной компиляцией (в случае ошибки) удалить старый образ docker image rm php-gost-cp

Итак, образ есть!

Время запускать!
docker-compose up
Будет выводится лог, читайте ошибки, если будут. Теперь зайдем в php контейнер.
docker exec -it php-cp bash
тут выполните скрипт (пишите в комментариях — как его запустить автоматически, я пока не придумал, крон работает не очень хорошо в docker контейнере) /auto.sh или можно не заходить, а выполнить так:
docker exec -it php-cp bash /auto.sh.
Итого: полностью рабочее тестовое окружение. Не без проблем, но статья будет дописываться.
Большое спасибо Roman Nix за сборку чудесных и рабочих контейнеров!

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *