====== MikBill Cabinet Docker ====== Контейнер содержит только runtime: Debian, nginx, PHP-FPM, ionCube и необходимые PHP-модули. Сам личный кабинет, конфигурация, лицензии и скрипты обновления располагаются в стандартных каталогах MikBill. Благодаря этому используется оригинальный ''stat_update.sh'' без изменений. Документация разделена на три части: 1. Production-установка из Docker Hub. 2. Нюансы production-эксплуатации. 3. Создание и публикация своего runtime-образа. --- ===== 1. Production-установка из Docker Hub ===== ==== 1.1. Требования ==== На сервере должны быть установлены: * Docker Engine; * Docker Compose Plugin; * Git; * ''wget'' или ''curl''; * доступ к серверам обновлений MikBill: ''*.update.2x.mikbill.pro''. Проверка: docker --version docker compose version git --version --- ==== 1.2. Runtime-ветки и теги образов ==== Для production нельзя использовать общий образ вида: mikbill/cabinet:latest Такой тег не показывает, какая версия PHP находится внутри образа. При переходе кабинета с PHP 7.x на PHP 8.x это может привести к ситуации, когда клиент случайно обновит runtime до несовместимой версии PHP. Поэтому runtime-образы разделяются по веткам PHP: mikbill/cabinet-7x:latest # runtime для кабинета на PHP 7.x mikbill/cabinet-8x:latest # runtime для кабинета на PHP 8.x, когда ветка будет готова Текущая production-ветка: mikbill/cabinet-7x:latest Внутри каждой ветки ''latest'' означает последнюю стабильную версию именно этой PHP-ветки. То есть ''cabinet-7x:latest'' никогда не должен внезапно стать PHP 8.x. Для более строгой фиксации можно использовать версионные теги: mikbill/cabinet-7x:7.4.1 mikbill/cabinet-7x: --- ==== 1.3. Клонирование docker-проекта ==== Выберите каталог, где будут храниться docker-файлы проекта. Например: sudo mkdir -p /opt/mikbill sudo chown "$USER":"$USER" /opt/mikbill cd /opt/mikbill Склонируйте репозиторий: git clone https://github.com/mikbill/mbcabinet_docker.git Перейдите в корень проекта: cd /opt/mikbill/mbcabinet_docker Все команды ''docker compose'' нужно выполнять именно из этого каталога, потому что здесь находятся: docker-compose.yml .env Dockerfile docker/ scripts/ --- ==== 1.4. Создание каталогов MikBill ==== Создаем стандартную структуру MikBill на хосте: sudo mkdir -p /var/www/mikbill sudo mkdir -p /var/mikbill sudo mkdir -p /var/log/mikbill sudo mkdir -p /var/mikbill/prod/config sudo mkdir -p /var/mikbill/license sudo mkdir -p /var/mikbill/updates/stat sudo mkdir -p /var/mikbill/www_backups --- ==== 1.5. Загрузка оригинального updater ==== === Free === cd /var/mikbill/updates/stat sudo wget http://free.update.2x.mikbill.pro/stat_update.sh sudo chmod +x stat_update.sh === Pay === cd /var/mikbill/updates/stat sudo wget http://pay.update.2x.mikbill.pro/stat_update.sh sudo chmod +x stat_update.sh --- ==== 1.6. Лицензия PAY ==== Для платной версии необходимо разместить файлы лицензии: /var/mikbill/license/client.key /var/mikbill/license/serv.crt --- ==== 1.7. Первичная установка личного кабинета ==== Запускаем штатный updater MikBill: sudo /var/mikbill/updates/stat/stat_update.sh После завершения должен появиться каталог: /var/www/mikbill/stat --- ==== 1.8. Настройка stat.xml ==== Создать или скопировать файл: /var/mikbill/prod/config/stat.xml В нем должны быть указаны параметры подключения к базе данных MikBill. Пример: MySQL_IP_ADDRESS MySQL_USER MySQL_PASSWORD mikbill false Europe/Kiev false /var/log/mikbill/cabinet/error.log /var/log/mikbill/cabinet/debug.log Если база находится на Docker-хосте, в ''stat.xml'' можно использовать: host.docker.internal В ''docker-compose.yml'' уже добавлен параметр: extra_hosts: - "host.docker.internal:host-gateway" --- ==== 1.9. Запуск контейнера ==== Перейдите в корень проекта с docker-файлами: cd /opt/mikbill/mbcabinet_docker Создайте ''.env'' из примера: cp .env.example .env По умолчанию в ''.env.example'' указана текущая production-ветка PHP 7.x: CABINET_RUNTIME_IMAGE=mikbill/cabinet-7x:latest При необходимости можно зафиксировать конкретную версию: CABINET_RUNTIME_IMAGE=mikbill/cabinet-7x:7.4.1 Запустите контейнер: docker compose pull docker compose up -d Проверьте состояние: docker compose ps Посмотрите логи: docker compose logs -f После запуска кабинет должен быть доступен по адресу: http://IP_СЕРВЕРА/ --- ==== 1.10. Проверка healthcheck ==== curl -i http://127.0.0.1/_health Ожидаемый ответ: HTTP/1.1 200 OK --- ===== 2. Нюансы production-эксплуатации ===== ==== 2.1. Разделение ответственности ==== Проект разделяет приложение и runtime: * личный кабинет обновляется штатным ''stat_update.sh''; * Docker runtime обновляется через Docker Registry; * кастомная docker-версия updater не используется; * стандартные пути MikBill сохраняются; * команды ''docker compose'' выполняются из корня проекта, где лежит ''docker-compose.yml''. --- ==== 2.2. Используемые каталоги ==== | Каталог | Назначение | |---|---| | ''/opt/mikbill/mbcabinet_docker'' | Репозиторий с docker-файлами | | ''/var/www/mikbill'' | Код личного кабинета | | ''/var/www/mikbill/stat'' | Основной каталог личного кабинета | | ''/var/mikbill/prod/config'' | Конфигурация, включая ''stat.xml'' | | ''/var/mikbill/license'' | Лицензии PAY-версии | | ''/var/mikbill/updates/stat'' | Оригинальный updater MikBill | | ''/var/mikbill/www_backups'' | Резервные копии при обновлении | | ''/var/log/mikbill'' | Логи MikBill | --- ==== 2.3. Обновление личного кабинета ==== Обновление приложения выполняется только штатным updater MikBill: sudo /var/mikbill/updates/stat/stat_update.sh Контейнер автоматически увидит обновленные файлы, поскольку используются bind mounts: /var/www/mikbill:/var/www/mikbill /var/mikbill:/var/mikbill /var/log/mikbill:/var/log/mikbill Никаких дополнительных docker-команд после обновления кабинета выполнять не требуется. --- ==== 2.4. Обновление Docker runtime в рамках той же PHP-ветки ==== Runtime обновляется отдельно от приложения. Для текущей ветки PHP 7.x: CABINET_RUNTIME_IMAGE=mikbill/cabinet-7x:latest Чтобы получить последнюю стабильную версию runtime внутри этой ветки: cd /opt/mikbill/mbcabinet_docker docker compose pull docker compose up -d Это обновит только контейнерное окружение. Код кабинета при этом не обновляется. --- ==== 2.5. Переход с PHP 7.x на PHP 8.x ==== Переход между major-ветками PHP нельзя делать простым обновлением ''latest''. Нельзя заменять: CABINET_RUNTIME_IMAGE=mikbill/cabinet-7x:latest на: CABINET_RUNTIME_IMAGE=mikbill/cabinet-8x:latest без проверки совместимости самого личного кабинета. Правильный порядок перехода: 1. Убедиться, что версия личного кабинета поддерживает PHP 8.x. 2. Обновить личный кабинет штатным updater MikBill. 3. Проверить конфигурацию и совместимость модулей. 4. Изменить в ''.env'' runtime-образ: CABINET_RUNTIME_IMAGE=mikbill/cabinet-8x:latest 5. Перезапустить контейнер: cd /opt/mikbill/mbcabinet_docker docker compose pull docker compose up -d Если у клиента не оплачено обновление кабинета или он остается на ветке кабинета для PHP 7.x, нужно продолжать использовать: CABINET_RUNTIME_IMAGE=mikbill/cabinet-7x:latest --- ==== 2.6. Почему не используется общий latest ==== Общий тег вида: mikbill/cabinet:latest опасен для production, потому что со временем он может начать указывать на runtime с другой major-версией PHP. Пример проблемы: 1. Клиент установил кабинет, совместимый только с PHP 7.x. 2. Позже ''mikbill/cabinet:latest'' был обновлен до PHP 8.x. 3. Клиент выполнил ''docker compose pull && docker compose up -d''. 4. Runtime обновился до PHP 8.x, а приложение осталось старым. 5. Кабинет может перестать работать. Чтобы этого избежать, используются отдельные runtime-ветки: mikbill/cabinet-7x:latest mikbill/cabinet-8x:latest --- ==== 2.7. Проверка после обновлений ==== cd /opt/mikbill/mbcabinet_docker docker compose ps docker compose logs --tail=100 cabinet curl -i http://127.0.0.1/_health Также рекомендуется проверить кабинет в браузере: http://IP_СЕРВЕРА/ --- ===== 3. Создание и публикация своего runtime-образа ===== Этот раздел нужен разработчикам и администраторам, которые собирают runtime-образ и публикуют его в Docker Hub / GitLab Registry. Обычному пользователю production-инсталляции этот раздел не нужен. --- ==== 3.1. Локальная сборка runtime ==== Перейдите в корень проекта: cd /opt/mikbill/mbcabinet_docker Соберите и запустите локальный runtime: docker compose -f docker-compose.build.yml build docker compose -f docker-compose.build.yml up -d --- ==== 3.2. Именование Docker Hub репозиториев ==== Runtime-образы публикуются в отдельные репозитории по major-веткам PHP: mikbill/cabinet-7x mikbill/cabinet-8x Ветка PHP 7.x: mikbill/cabinet-7x:latest mikbill/cabinet-7x:7.4.1 mikbill/cabinet-7x: Ветка PHP 8.x: mikbill/cabinet-8x:latest mikbill/cabinet-8x:8.5.0 mikbill/cabinet-8x: --- ==== 3.3. GitLab CI/CD переменные ==== В GitLab необходимо создать переменные: | Переменная | Значение | |---|---| | ''DOCKERHUB_USERNAME'' | логин Docker Hub, например ''mikbill'' | | ''DOCKERHUB_TOKEN'' | Docker Hub Access Token | Рекомендуемые настройки: | Переменная | Visibility | Protected | |---|---|---| | ''DOCKERHUB_USERNAME'' | Visible | Да | | ''DOCKERHUB_TOKEN'' | Masked | Да | Пароль от Docker Hub использовать не нужно. Нужно использовать Personal Access Token. --- ==== 3.4. CI/CD: публикация образа ==== Pipeline публикует runtime-образ сразу в два реестра: Docker Hub: mikbill/cabinet-7x GitLab Registry: $CI_REGISTRY_IMAGE/cabinet-runtime-7x Текущая runtime-ветка задается в ''.gitlab-ci.yml'': RUNTIME_BRANCH: "7x" Для будущей ветки PHP 8.x нужно будет использовать отдельную ветку/репозиторий проекта и изменить: RUNTIME_BRANCH: "8x" После этого pipeline начнет публиковать образы в: Docker Hub: mikbill/cabinet-8x GitLab Registry: $CI_REGISTRY_IMAGE/cabinet-runtime-8x --- ==== 3.5. Теги образов ==== При push в ''main'' публикуются: mikbill/cabinet-7x:latest mikbill/cabinet-7x: Аналогично в GitLab Registry: $CI_REGISTRY_IMAGE/cabinet-runtime-7x:latest $CI_REGISTRY_IMAGE/cabinet-runtime-7x: При push git tag, например: git tag v7.4.1 git push origin v7.4.1 будут опубликованы: mikbill/cabinet-7x:7.4.1 mikbill/cabinet-7x:latest $CI_REGISTRY_IMAGE/cabinet-runtime-7x:7.4.1 $CI_REGISTRY_IMAGE/cabinet-runtime-7x:latest Для PHP 8.x схема будет аналогичной: git tag v8.5.0 git push origin v8.5.0 mikbill/cabinet-8x:8.5.0 mikbill/cabinet-8x:latest $CI_REGISTRY_IMAGE/cabinet-runtime-8x:8.5.0 $CI_REGISTRY_IMAGE/cabinet-runtime-8x:latest --- ==== 3.6. Ручная публикация в Docker Hub ==== При необходимости образ можно собрать и отправить вручную: docker login docker build -t mikbill/cabinet-7x:7.4.1 . docker tag mikbill/cabinet-7x:7.4.1 mikbill/cabinet-7x:latest docker push mikbill/cabinet-7x:7.4.1 docker push mikbill/cabinet-7x:latest --- ===== 4. Раздел для корпоративной Wiki ===== ==== Установка MikBill Cabinet Docker ==== 1. Установить Docker, Docker Compose Plugin и Git. 2. Склонировать репозиторий: sudo mkdir -p /opt/mikbill sudo chown "$USER":"$USER" /opt/mikbill cd /opt/mikbill git clone mbcabinet_docker cd /opt/mikbill/mbcabinet_docker 3. Создать каталоги MikBill: sudo mkdir -p /var/www/mikbill sudo mkdir -p /var/mikbill sudo mkdir -p /var/log/mikbill sudo mkdir -p /var/mikbill/prod/config sudo mkdir -p /var/mikbill/license sudo mkdir -p /var/mikbill/updates/stat sudo mkdir -p /var/mikbill/www_backups 4. Скачать оригинальный updater. Free: cd /var/mikbill/updates/stat sudo wget http://free.update.2x.mikbill.pro/stat_update.sh sudo chmod +x stat_update.sh Pay: cd /var/mikbill/updates/stat sudo wget http://pay.update.2x.mikbill.pro/stat_update.sh sudo chmod +x stat_update.sh 5. Для PAY-версии положить лицензии: /var/mikbill/license/client.key /var/mikbill/license/serv.crt 6. Выполнить первичную установку: sudo /var/mikbill/updates/stat/stat_update.sh 7. Создать или скопировать конфиг: /var/mikbill/prod/config/stat.xml 8. Вернуться в корень docker-проекта: cd /opt/mikbill/mbcabinet_docker 9. Создать ''.env'': cp .env.example .env 10. Проверить, что в ''.env'' указана нужная runtime-ветка: CABINET_RUNTIME_IMAGE=mikbill/cabinet-7x:latest 11. Запустить контейнер: docker compose pull docker compose up -d 12. Проверить: docker compose ps curl -i http://127.0.0.1/_health 13. Открыть кабинет: http://IP_СЕРВЕРА/ 14. Для обновления кабинета использовать только штатный updater: sudo /var/mikbill/updates/stat/stat_update.sh 15. Для обновления Docker runtime внутри текущей PHP-ветки: cd /opt/mikbill/mbcabinet_docker docker compose pull docker compose up -d