- Запуск одной командой всех сервисов, необходимых для работы БУС / Битрикс24:
- Php-fpm (Apache не используем)
- Nginx
- MySQL (в данной сборке используется Percona)
- Memcached
- Sphinx
- Решение полностью проходит все тесты Битрикс / Битрикс24.
- Создание нескольких сайтов на одном сервере, а также многосайтовые конфигурации.
- Автоматизация получения сертификатов для доменов (нужно только прописать email для LetsEncrypt - все остальное происходит автоматически).
- Правильная контейнеризация. Каждый сервис запускается в отдельном контейнере.
- Поддержка нескольких версий php на одном сервере для разных сайтов. Даже если сайты работают на одном ядре (только к такой конфигурации надо подходить с умом).
- Улучшенная безопасность. Если злоумышленник взломает один из сайтов на сервере, он не сможет получить доступ к другим сайтам. Таким образом, можно на одном сервере с новыми и важными проектами хранить устаревшие проекты и не обновлять их.
- Возможности для быстрого создания тестовых площадок и разграничения доступов разработчиков к файлам разных сайтов / площадок.
- Все данные (БД) хранятся на хост-машине:
- При удалении контейнеров данные не теряются.
- Для переноса всех сайтов на новый сервер достаточно просто скопировать папку и запустить докер на новом сервере (повторно не нужно все настраивать).
- Mailhog для тестирования почты при локальной разработке.
- Msmtp для отправки почты с боевых серверов.
- Crontab и агенты на кроне "из коробки".
- Крон работает в отдельном контейнере, что минимизирует влияние фоновых заданий на работу пользователей на сайте.
- Xdebug для отладки.
- MySQL Adminer для тех, кто не научился работать с БД в PhpStorm.
- Traefik удобный прокси-сервер для докер-контейнеров.
- Редирект с www на домены без www или наоборот. Редирект на https.
- Подготовленный sphinx для настройки синонимов и словоформ.
- Заглушка, если сайт не найден по домену.
Push & pull сервер не включен в решение (можно использовать облачный Битрикс в настройках модуля Push & Pull). Возможно, добавим в будущих версиях.
- Если есть какие-то вопросы: вступайте в группу телеграм: https://t.me/bitrixdevops.
- Если Вы нашли ошибку, у Вас есть замечания или предложения по функционалу, пишите тикет сюда: https://gitlab.com/bitrix-docker/server/-/issues.
В планах следующие работы:
- Активное тестирование решения в продакшн-окружении.
- CI/CD для деплоя на бой и на тестовые площадки.
- Автоматизация рутинных операций (например, создание сайта).
- Автоматическое разворачивание площадок для тестовых и боевого серверов.
- Подключение своих SSL-сертификатов.
- FTP для работы с файлами сайтов.
- Полезный инструментарий для современной разработки, которым мало кто пользуется в Битрикс, но он повышает качество и скорость разработки:
- Профилирование запросов.
- Инструменты для сбора, хранения, поиска логов.
- Инструменты для сбора и обработки ошибок.
- Полуавтоматическое документирование REST API (в формате OpenAPI / Swagger).
- Интеграция с серверами очередей (RabbitMQ, Kafka).
- Эксперименты с Kubernetes, развертывание кластеров.
Официальная документация: https://docs.docker.com/engine/install/ubuntu/
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
Кроме того, рекомендуется установить:
apt install git nano htop apache2-utils
Официальная документация: https://docs.docker.com/desktop/install/mac-install/.
Достаточно скачать соответствующий вашему процессору дистрибутив и запустить установку.
- Склонировать репозиторий, например, в папку /srv/bitrix-server/:
mkdir -p /srv/bitrix-server/ && cd /srv/bitrix-server/ && git clone [email protected]:bitrix-docker/server.git .
- Скопировать файл .env.example в файл .env - это будет локальный конфиг, отредактировать в нем настройки.
В частности:
cp .env.example .env && nano .env
- COMPOSE_FILE - если какие-то из сервисов не нужны, то их можно отключить, удалив соответствующий конфиг в этом параметре.
- MAIN_HOST - для локальной разработки лучше оставить как есть. Для сервера указать имя основного домена (на поддоменах будут работать общие системные сервисы).
- MYSQL_ROOT_PASSWORD - для сервера создать сложный пароль
- TRAEFIK_CERTIFICATESRESOLVERS_LETSENCRYPT_ACME_EMAIL - указать адрес почты для создания SSL-сертификатов LetsEncrypt (куда будут приходить уведомления о продлении сертификата)
- TRAEFIK_BASIC_AUTH_USERS - создать пароль для закрытия Traefik (прокси-сервер)
- TRAEFIK_SSL_MIDDLEWARES - для сервера лучше поменять значение на: basic-auth,redirect-to-non-www@file
- TRAEFIK_MIDDLEWARES - для сервера лучше поменять значение на: basic-auth,redirect-to-non-www@file,redirect-to-https@file
- Создать файл data/traefik/letsencrypt/acme.json (для хранения данных сертификатов LetsEncrypt).
echo "{}" > data/traefik/letsencrypt/acme.json && chmod 600 data/traefik/letsencrypt/acme.json
- Запускаем контейнеры:
В результате будут запущены общие сервисы, необходимые для работы всей системы.
docker compose up -d
- Для локальной разработки отредактировать файл hosts на локальной машине:
Нужно добавить следующие ресурсы:
sudo nano /etc/hosts
А также можно сразу добавить локальные домены сайтов, с которыми предстоит работать.# bitrix-docker local 127.0.0.1 bitrix.local 127.0.0.1 traefik.bitrix.local 127.0.0.1 adminer.bitrix.local 127.0.0.1 mailhog.bitrix.local
- Добавить хотя бы один сайт (см. ниже раздел руководства).
- В Ubuntu может быть ошибка с доступами к папке с данными БД. Для ее решения:
- Перейти в папку data/mysql
- Выполнить команду:
sudo chown 999:999 .
- Скопировать папку bitrix-distr в папку sites и назвать новую папку в соответствии с продуктивным адресом проекта, например:
test.example.com
:cp -r bitrix-distr/ sites/test.example.com
- Скопировать в новой папке сайта файл .env.local.example либо .env.server.example в .env и отредактировать в нем настройки сайта.
- Для локального проекта редактируем файл hosts на машине, добавляем туда запись с локальным доменом сайта (например, test.example.local), если не сделали это ранее. На linux-подобных машинах для этого выполняем:
sudo nano /etc/hosts
- Добавить запись следующего вида в файл hosts (заменив test.example.local на имя своего локального домена):
# bitrix-docker local 127.0.0.1 test.example.local www.test.example.local
- Перейти в консоли в папку сайта и запустить сервисы:
docker compose up -d
- Открываем домен (test.example.local в примерах выше) в браузере и устанавливаем сайт через обычный мастер установки сайта Битрикс.
- На этапе создания БД вписываем имя БД для сайта, имя пользователя root, пароль как указан в основном .env-файле в параметре MYSQL_ROOT_PASSWORD. Для использования другой учетной записи MySQL читаем руководство ниже.
По умолчанию используется пользователь root и пароль, указанный в общем .env-файле сервера. Для смены учетной записи MySQL для конкретного сайта:
- Открываем файлы /bitrix/php_interface/dbconn.php и /bitrix/.settings.php. Берем из них имя базы данных.
- Открываем MySQL-консоль в админке Битрикс (/bitrix/admin/sql.php).
- Выполняем следующие запросы, заменив username, password и dbname на свои значения логина, пароля и имя базы данных соответственно:
CREATE USER username IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON dbname.* TO 'username'; FLUSH PRIVILEGES;
- В файлах /bitrix/php_interface/dbconn.php и /bitrix/.settings.php прописываем новые логин и пароль.
Редактируется в файле .env сайта.
Настройка редиректов может быть выполнена через переменные PROJECT_SSL_MIDDLEWARES и PROJECT_MIDDLEWARES файла .env сайта. В системе преднастроены готовые конфигурации редиректов для обычного использования, такие как:
- http -> https
- www -> без www
- без www -> www
Аналогично для общих сервисов (traefik, adminer, mailhog) в общем файле .env проекта настраиваются редиректы в переменных TRAEFIK_SSL_MIDDLEWARES и TRAEFIK_MIDDLEWARES.
Для настройки Memcached необходимо для каждого сайта выполнить следующие шаги:
- В папке сайта в файле dbconn.php добавить объявление констант:
# sites/домен.сайта/php_interface/dbconn.php define("BX_CACHE_TYPE", "memcache"); define("BX_CACHE_SID", $_SERVER["DOCUMENT_ROOT"]."#01"); define("BX_MEMCACHE_HOST", "memcached"); define("BX_MEMCACHE_PORT", "11211");
- В файле .settings_extra.php (если его нет, то создать):
Либо в файле .settings.php можно создать / отредактировать узел
<?php # sites/домен.сайта/bitrix/.settings_extra.php return array( 'cache' => array( 'value' => array( 'type' => 'memcache', 'memcache' => array( 'host' => 'memcached', 'port' => '11211', ), 'sid' => $_SERVER["DOCUMENT_ROOT"]."#01" ), ), ); ?>
cache
.
Если используется многосайтовость, то нужно указывать статичный sid, без
$_SERVER["DOCUMENT_ROOT"]
. Иначе для двух сайтов кеш будет отличаться, так-как папки сайтов разные.
Документация Битрикс:
- https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=32&LESSON_ID=9421
- https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2795#cache
Расширения memcached и memcache для php - это разные вещи. Устанавливать надо именно memcache.
Данный метод может значительно ускорить процесс разархивирования бекапа на MacOS.
- Скачать бекап в корень папки www сайта
- Для разархивирования бекапа проще воспользоваться командой ниже, чем ждать, пока распакуются файлы скриптом restore.php:
cat *.tar.* | tar xzpvf -
- На некоторых сайтах этот метод не срабатывает и заканчивается ошибкой, тогда запускаем распаковку архива обычным restore.php.
- После распаковки архива нужно создать базу данных с помощью restore.php. Указываем:
- Сервер баз данных: db
- Имя пользователя: root
- Пароль: test (указывается в файле .env в переменной MYSQL_ROOT_PASSWORD)
- Имя базы данных - придумать в зависимости от проекта, лучше не включать спецсимволы и знаки пунктуации, например:
examplecom
Для каждого сайта нужно выполнить первые шаги из официальной инструкции (https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=37&LESSON_ID=5507), а именно:
- Выполнить команды в php-консоли:
COption::SetOptionString("main", "agents_use_crontab", "N"); echo COption::GetOptionString("main", "agents_use_crontab", "N"); COption::SetOptionString("main", "check_agents", "N"); echo COption::GetOptionString("main", "check_agents", "Y"); COption::SetOptionString("main", "mail_event_bulk", "20"); echo COption::GetOptionString("main", "mail_event_bulk", "5");
- Убираем из файла dbconn.php определение следующих констант:
И добавляем:
# sites/домен.сайта/bitrix/php_interface/dbconn.php define("BX_CRONTAB_SUPPORT", true); define("BX_CRONTAB", true);
# sites/домен.сайта/bitrix/php_interface/dbconn.php if(!(defined("CHK_EVENT") && CHK_EVENT===true)) define("BX_CRONTAB_SUPPORT", true);
Остальные шаги из официальных и полуофициальных инструкций выполнять не надо - уже реализовано и настраивается автоматически.
Делать это обычно не следует, так как в концепции Битрикс правильнее создавать агентов.
Для настройки cron-заданий сайта необходимо отредактировать файл /crontab/root, расположенный в папке сайта.
- Скопировать файл config/sphinx/example.conf в папку config/sphinx/sites, имя файла присвоить в соответствии с доменом сайта, с заменой точек на дефисы. Расширение должно быть обязательно .conf.
- Идентификатор индекса (первая строка) заменить на имя домена без спецсимволов.
- Строку example-ru в двух местах заменить на имя домена с заменой точек на дефисы.
- В папке data/sphinx/synonyms создать файл, аналогичный data/sphinx/synonyms/example.txt.
- Пересоздать контейнер, если ранее был запущен.
- Перейти в настройки модуля поиска в админке (/bitrix/admin/settings.php?lang=ru&mid=search). На вкладке "Морфология" указать:
- Использовать морфологию:
Да
. - Полнотекстовый поиск с помощью:
Sphinx
. - Строка подключения для управления индексом (протокол MySql):
sphinx:9306
. - Идентификатор индекса: как было задано в п.2.
- Использовать морфологию:
- Выполнить полную переиндексацию модулем поиска (/bitrix/admin/search_reindex.php).
По умолчанию включен.
Для отключения Xdebug нужно переименовать файл в папке сайта /config/php-fpm/xdebug.ini в /config/php-fpm/xdebug.ini.disabled либо удалить его. Для включения: вернуть файл / старое название обратно.
Из коробки можно настроить:
- mailhog (https://github.com/mailhog/MailHog)
- msmtp
Внимание: mailhog и msmtp не могут функционировать одновременно. При одновременном включении работать будет тот вариант, который попадет в настройки sedmail_path в phpinfo.
Для локального тестирования почтовых сообщений можно использовать mailhog. Интерфейс доступен по умолчанию по адресу: mailhog.bitrix.local.
По умолчанию включен.
Для отключения mailhog переименовать файл в папке сайта /config/php-fpm/mailhog.ini в /config/php-fpm/mailhog.ini.disabled либо удалить его. Для включения: вернуть файл / старое название обратно и, если включен msmtp, отключить его.
- Отключить mailhog.
- Переименовать файл в папке сайта /config/php-fpm/msmtp.ini.disabled в /config/php-fpm/msmtp.ini.
- Скопировать файл config/msmtp/msmtprc.example в config/msmtp/msmtprc и отредактировать, создав одну или несколько учетных записей.
- В папке сайта в файлах /crontab/root и /config/php-fpm/msmtp.ini вместо default указать нужную учетную запись msmtp для сайта.
Если нужно отключить msmtp, переименовать обратно /config/php-fpm/msmtp.ini в /config/php-fpm/msmtp.ini.disabled или удалить его.
- Создаем и настраиваем конфиги сайта аналогично руководству выше. Но ничего устанавливать не надо. Фактически нам необходимо далее прокинуть папки bitrix, upload, images из основного сайта в дополнительный. Во всех инструкциях ниже заменить main.ru на папку, где лежит основной сайт (ядро Битрикс).
- Редактируем файл docker-compose.yml сайта (не основного, где расположено ядро).
- Добавляем в секции
volumes
подобное:# sites/домен.сайта/docker-compose.yml services: nginx: # ..... volumes: # ..... - &bitrix-volume ./../main.ru/www/bitrix:/var/main.ru/bitrix:cached - &upload-volume ./../main.ru/www/upload:/var/main.ru/upload:cached - &images-volume ./../main.ru/www/images:/var/main.ru/images:cached php-fpm: # ..... volumes: # ..... - *bitrix-volume - *upload-volume - *images-volume
- Секцию cron вообще удаляем или комментируем, иначе cron-задания будут запускаться дважды.
- Добавляем в секции
- Создаем симлинки внутри php-fpm контейнера:
# зайти в контейнер docker compose exec php-fpm sh
# внутри контейнера создать симлинки ln -s /var/main.ru/bitrix/ /var/www/www/bitrix \ && ln -s /var/main.ru/upload/ /var/www/www/upload \ && ln -s /var/main.ru/images/ /var/www/www/images
- Чтобы папки подключились и на хост-машине (обычно это нужно для разработки, чтобы IDE видела файлы ядра), можно аналогично создать симлинк:
# /srv/bitrix-server - папка с установленным сервером из этого проекта: ln -s /srv/bitrix-server/sites/main.ru/www /var/main.ru
В MacOS последняя команда требует sudo.
По умолчанию стоит UTC. Если нужно изменить, в .env сайта меняем переменную PHP_TIMEZONE и SERVER_TIMEZONE, например:
SERVER_TIMEZONE=Europe/Moscow
PHP_TIMEZONE=Europe/Moscow
А в общем .env сервера указываем:
SERVER_TIMEZONE=Europe/Moscow
Полный перечень доступных значений можно получить по ссылке: https://www.php.net/manual/en/timezones.php.
Важно! SERVER_TIMEZONE во всех env-файлах должен совпадать.
Если по каким-то причинам требуется указывать PHP_TIMEZONE отличный от SERVER_TIMEZONE (например, разное время на разных сайтах):
- Добавить в /bitrix/php_interface/after_connect_d7.php:
$connection = Bitrix\Main\Application::getConnection(); $connection->queryExecute("SET LOCAL time_zone='".date('P')."'");
- Добавить в /bitrix/php_interface/after_connect.php:
$DB->Query("SET LOCAL time_zone='".date('P')."'");
Выполнить в папке сервера (общие сервисы) и аналогично в папке сайта:
docker compose pull \
&& docker compose up --force-recreate --remove-orphans --build -d \
&& docker image prune -f
Ошибка: mysqld: Can't create/write to file '/var/lib/mysql/is_writable' (Errcode: 13 - Permission denied)
- Перейти в папку data/mysql
- Выполнить команду:
sudo chown 999:999 .
Иногда после некорректного завершения работы MySQL не хочет перезапускаться. В этом случае необходимо зайти в папку data/mysql и удалить файлы mysql.sock и mysql.sock.lock.
Если нужно для определенного сайта прописать настройки mbstring (например, старая установка Битрикс), нужно создать в папке config/php-fpm сайта файл, например, mbstring.ini со следующим содержимым:
[mbstring]
mbstring.internal_encoding = UTF-8
mbstring.func_overload = 2
Аналогичным образом можно добавлять любые другие настройки php для сайта.
Перейти в папку сайта sites/... и выполнить команды:
# зайти в контейнер
docker compose exec php-fpm sh
# внутри контейнера установить права на папку /var/www
chown -R www-data:www-data /var/www
chown -R www-data:www-data /var/log
# зайти в контейнер cron
docker compose exec cron sh
# внутри контейнера установить права на папку /var/www
chown -R www-data:www-data /var/www
chown -R www-data:www-data /var/log
Полный ответ сервиса в случае данной проблемы выглядит так:
{
"error": "INVALID_REQUEST",
"error_description": "Https required."
}
Для решения проблемы необходимо добавить определение константы REST_APAUTH_ALLOW_HTTP в dbconn.php:
# sites/домен.сайта/bitrix/php_interface/dbconn.php
define('REST_APAUTH_ALLOW_HTTP', true);
Данное решение не понижает безопасность (если настроен https по инструкции выше). Дело в том, что внутри контейнеров нет смысла поднимать https, так как это занимает дополнительное время на каждый запрос. Поэтому прокси-сервер "общается" с контейнером php-fpm по 80 порту.
Редактируем файл docker-compose.yml сайта. Нужно раскомментировать 2 строки, extra_hosts и следующая за ней:
# sites/домен.сайта/docker-compose.yml
services:
php-fpm:
# .....
extra_hosts:
- "${PROJECT_HOST}:127.0.0.1" # вместо 127.0.0.1 укажите внешний IP-адрес вашего сервера
При неуспешном прохождении данного теста при настроенном https необходимо в dbconn.php добавить:
# sites/домен.сайта/bitrix/php_interface/dbconn.php
$_SERVER['HTTPS'] = 'on';