====== 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