CRM Битрикс-24 на веб-окружении под Ubuntu 24.04, c поддержкой PUSH и многосайтовости

Просмотров: 4243

Задача: Так как с 30 июня 2024 года операционная система CentOS-7 полностью снята с поддержки и не будет получать обновлений безопасности, принято решение создать аналог "Битрикс веб окружение" на Ubuntu 24.04

Запуск CRM Битрикс-24 на кастомном веб-окружении под Ubuntu 24.04

В документации 1С-Битрикс есть инструкция по запуску аналога веб окружения на Debian-11. Но данная система будет поддерживаться до 2026 года. Я решил чем дольше будет поддерживаться система, тем лучше, поэтому выбрал Ubuntu LTS 24.04 (поддержка до 2032 года)

Важно! В принципе, на получившемся веб-окружении можно запускать и БУС версию 1С-Битрикс, но моя основная задача - заставить работать push-server, необходимый для CRM редакций. Для обычного БУС более чем подойдет запуск на панели управления сервером типа "Hestia CP"
Спустя пару месяцев, после написания этой заметки, битрикс выпустил окружение для CentOS9-Stream. Будет поддерживаться до 2027 года и является бета версией для будущей RHEL - используйте на свое усмотрение, но в целом не рекомендовал бы.

Битрикс веб окружение на Ubuntu - основные приложения

Создайте пользователя "bitrix" (если его еще нет в системе), задайте ему надежный пароль:

useradd -m bitrix
passwd bitrix

Как правило, на арендованных серверах вам сразу выдается root доступ. Если устанавливаете ubuntu самостоятельно root изначально заблокирован, но при установке можете указать нового пользователя как "bitrix" и работать с sudo правами от его имени.

Для начала установим основные приложения, после ввода некоторых команд будет запрашиваться подтверждение (Y/n) всегда выбираем Y - соглашаясь со всем:

Устанавливаем все обновления:

apt update && apt upgrade

Разом устанавливаем Apache2, PHP (установится версия 8.3) с нужными модулями, NGINX, MARIADB, NODEJS, NPM, REDIS и вспомогательное ПО:

apt install apache2 php php-cli php-common php-gd php-ldap php-mbstring php-mysql php-opcache php-pear php-apcu php-mcrypt memcached php-memcache php-zip php-pspell php-xml nginx mariadb-server mariadb-common nodejs npm redis mc nano htop php-mail sendmail curl php-curl -y

Да, в качестве сервера баз данных будем использовать MariaDB, она работает ощутимо быстрее чем MySQL. На тестовой установке MariaDB с 4Гб оперативной памяти выдает под 10 000 операций записи чтения в секунду против ~6000 у MySql

Меняем конфигурации всех приложений

Я подготовил конфигурации на виртуальной машине с 2 ядрами CPU и 4Гб оперативной памяти. Более тонко рекомендую подкручивать все настройки под ваше железо. Но и с этими настройками все заработает достаточно производительно.

Скачиваем и распаковываем архив: UBUNTU24_BX_ENV.zip. Внутри все структурировано по директориям находящимся в "/etc/"

Просто копируем все файлы, находящиеся в архиве, по аналогичным директориям в "/etc/"" с полной заменой файлов.

До настраиваем сервисы веб окружения

Команды можно выполнить все сразу, но лучше выполнять их по одной по строчно

Начнем с NGINX. Чтобы избежать проблем остановим apache, он скорее всего и не запущен еще, но все же). :

echo "127.0.0.1 push httpd" >> /etc/hosts
systemctl stop apache2
systemctl --now enable nginx

Далее Apache2:

a2dismod --force autoindex
a2enmod rewrite
systemctl --now enable apache2

Теперь MariaDB:

systemctl --now enable mariadb
systemctl restart mariadb

Нужно войти в консоль mysql и донастроить ее:

mysql_secure_installation

Попросит ввести пароль root базы данных, просто нажимаете Enter - пароля у root нет. Далее будет задан ряд вопросов, отвечаем так:

  • Switch to unix_socket authentication: выбираем "n"
  • Change the root password: выбираем "y" и дважды вводим пароль для root (его не забываем)
  • Remove anonymous users?: выбираем "y"
  • Disallow root login remotely?: выбираем "y"
  • Remove test database: выбираем "y"
  • Reloading privilege: выбираем "y"

Следующим донастраиваем REDIS:

echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1

usermod -g bitrix redis
chown root:bitrix /etc/redis/ /var/log/redis/
[[ ! -d /etc/systemd/system/redis.service.d ]] && mkdir /etc/systemd/system/redis.service.d
echo -e '[Service]\nGroup=bitrix' > /etc/systemd/system/redis.service.d/custom.conf

Включаем и запускаем REDIS сервис:

systemctl daemon-reload
systemctl enable redis-server.service
systemctl restart redis-server.service

В принципе, у вас готово окружение, на котором можно запускать проекты на БУС. Но пока не заработают на ЦРМ.

Установка Certbot для LetsEncrypt на Ubuntu 24.04

Да, этот шаг можно было выполнить в самом начале, когда ставили основные приложения, но вынес в отдельный блок.

CertBot позволяет нам получать и автоматически обновлять LetsEncrypt SSL сертификаты для доменов. Устанавливаем:

apt install certbot python3-certbot-nginx

Выполняем команду конфигурации:

certbot --nginx

Попросит ввести email для уведомлений и принять лицензию (нажимаем Y пока вся лицензия не примется).

Далее в crontab (nano /etc/crontab) добавляем расписание. Каждый день в 00:00 certbot будет проверять сертификаты сайтов и обновлять по необходимости.

0 0 * * * /usr/bin/certbot renew --quiet

Настройка Push-server на Ubuntu 24.04

Скачиваем и устанавливаем push сервер. Установка займет минут 15, будет казаться что все зависло, но все в порядке, просто ждем:

cd /opt
wget https://bazarow.ru/upload/fo_all/push-server-0.3.0.tgz
npm install --production ./push-server-0.3.0.tgz

Далее выполняем:

ln -sf /opt/node_modules/push-server/etc/push-server /etc/push-server
cd /opt/node_modules/push-server
cp etc/init.d/push-server-multi /usr/local/bin/push-server-multi
mkdir /etc/sysconfig
cp etc/sysconfig/push-server-multi  /etc/sysconfig/push-server-multi
cp etc/push-server/push-server.service  /etc/systemd/system/
ln -sf /opt/node_modules/push-server /opt/push-server

Открываем файл по пути "nano /etc/sysconfig/push-server-multi" и в самый верх добавляем:

GROUP=bitrix
SECURITY_KEY="ЗДЕСЬ ПРИДУМЫВАЕМ ПАРОЛЬ ОЧЕНЬ ДЛИННЫЙ, СИМВОЛОВ НА 40"
RUN_DIR=/tmp/push-server
REDIS_SOCK=/var/run/redis/redis.sock

Пароль из параметра "SECURITY_KEY" вы будете использовать в настройках Push&Pull модуля 1С-Битрикс. Переназначить его позже будет очень трудоемко, вписывайте сразу что-то сложное и длинное.

Выполняем команды:

/usr/local/bin/push-server-multi configs pub
/usr/local/bin/push-server-multi configs sub

echo 'd /tmp/push-server 0770 bitrix bitrix -' > /etc/tmpfiles.d/push-server.conf
systemd-tmpfiles --remove --create

В "nano /etc/systemd/system/push-server.service" проверяем наличие таких строчек (если они не такие, редактируем - остальные не трогаем):

User=bitrix
Group=bitrix
ExecStart=/usr/local/bin/push-server-multi systemd_start
ExecStop=/usr/local/bin/push-server-multi stop

И еще две команды:

systemctl daemon-reload
systemctl --now enable push-server

Добавляем сайт заглушку в окружение

Этот сайт будет своего рода сайтом по умолчанию. Лучше всего его не использовать для установки реального сайта, просто он должен существовать в системе. Можно в его корне разместить index.php файл с некой заглушкой. Она будет открываться при прямом открытии сервера по http://IP_сервера. Выполняем команды:

mkdir /home/bitrix/www
cd /home/bitrix/
chown bitrix:bitrix /home/bitrix/www -R

Добавление файрвола, открытие нужных портов

Нужно установить файрвол, тем самым закрыть все порты и открыть только нужные. Устанавливаем UFW

apt install ufw
ufw enable

Открываем нужные порты (перечислены и нужные для push сервера):

ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 8890/tcp
ufw allow 8891/tcp
ufw allow 8893/tcp
ufw allow 8894/tcp
ufw allow 5222/tcp
ufw allow 5223/tcp

ufw allow ????/tcp

Последний порт придумайте сами, он будет использоваться для ssh вместо стандартного 22-го. Стандартный порт ssh меняем в "nano /etc/ssh/sshd_config", раскомментируем строчку "#Port 22" и меняем на нужный.

Полностью перезагружаем сервер:

reboot

Добавление сайтов в систему

Итак, мы хотим добавлять любое количество сайтов в наше окружение, для этого создаем sh скрипт:

nano /root/add_site.sh

С содержимым:

#!/bin/bash

# Запросить у пользователя название проекта
echo "Введите название проекта:"
read PROJECT_NAME

# Создать директорию для проекта
PROJECT_DIR="/home/bitrix/ext_www/$PROJECT_NAME"
if ! mkdir -p "$PROJECT_DIR"; then
    echo "Ошибка: не удалось создать директорию $PROJECT_DIR"
    exit 1
fi

# Установить права для директории
chown -R bitrix:bitrix "$PROJECT_DIR"

# Это не нужно, оставлено - вдруг пригодится
# chmod g+w "$PROJECT_DIR" -R

# Создать конфигурационный файл для Apache
APACHE_CONF="/etc/apache2/sites-available/$PROJECT_NAME.conf"

cat <<EOL > "$APACHE_CONF"
<VirtualHost *:8090>
    ServerName $PROJECT_NAME
    ServerAdmin webmaster@localhost
    DocumentRoot /home/bitrix/ext_www/$PROJECT_NAME

    ErrorLog \${APACHE_LOG_DIR}/error_log
    LogLevel warn
    CustomLog \${APACHE_LOG_DIR}/access.log combined

    <IfModule mod_rewrite.c>
        #Nginx should have "proxy_set_header HTTPS YES;" in location
        RewriteEngine On
        RewriteCond %{HTTP:HTTPS} =YES
        RewriteRule .* - [E=HTTPS:on,L]
    </IfModule>

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    <DirectoryMatch .*\.svn/.*>
        Require all denied
    </DirectoryMatch>

    <DirectoryMatch .*\.git/.*>
        Require all denied
    </DirectoryMatch>

    <DirectoryMatch .*\.hg/.*>
        Require all denied
    </DirectoryMatch>

    <Directory /home/bitrix/ext_www/$PROJECT_NAME>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        DirectoryIndex index.php index.html index.htm
        Require all granted
    </Directory>

    <Directory /home/bitrix/ext_www/$PROJECT_NAME/bitrix/cache>
        AllowOverride none
        Require all denied
    </Directory>

    <Directory /home/bitrix/ext_www/$PROJECT_NAME/bitrix/managed_cache>
        AllowOverride none
        Require all denied
    </Directory>

    <Directory /home/bitrix/ext_www/$PROJECT_NAME/bitrix/local_cache>
        AllowOverride none
        Require all denied
    </Directory>

    <Directory /home/bitrix/ext_www/$PROJECT_NAME/bitrix/stack_cache>
        AllowOverride none
        Require all denied
    </Directory>

    <Directory /home/bitrix/ext_www/$PROJECT_NAME/upload>
        AllowOverride none
        AddType text/plain php,php3,php4,php5,php6,phtml,pl,asp,aspx,cgi,dll,exe,ico,shtm,shtml,fcg,fcgi,fpl,asmx,pht
        php_value engine off
    </Directory>

    <Directory /home/bitrix/ext_www/$PROJECT_NAME/upload/support/not_image>
        AllowOverride none
        Require all denied
    </Directory>

    <Directory /home/bitrix/ext_www/$PROJECT_NAME/bitrix/images>
        AllowOverride none
        AddType text/plain php,php3,php4,php5,php6,phtml,pl,asp,aspx,cgi,dll,exe,ico,shtm,shtml,fcg,fcgi,fpl,asmx,pht
        php_value engine off
    </Directory>

    <Directory /home/bitrix/ext_www/$PROJECT_NAME/bitrix/tmp>
        AllowOverride none
        AddType text/plain php,php3,php4,php5,php6,phtml,pl,asp,aspx,cgi,dll,exe,ico,shtm,shtml,fcg,fcgi,fpl,asmx,pht
        php_value engine off
    </Directory>
</VirtualHost>
EOL

# Активировать сайт в Apache
a2ensite "$PROJECT_NAME.conf"

# Перезапустить Apache
systemctl reload apache2

# Создать конфигурационный файл для Nginx
NGINX_CONF="/etc/nginx/sites-available/$PROJECT_NAME.conf"

cat <<EOL > "$NGINX_CONF"
server {
listen 80;
    server_name $PROJECT_NAME;

    proxy_set_header X-Real-IP \$remote_addr;
    proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
    proxy_set_header Host \$host;

    proxy_redirect ~^(http://[^:]+):\d+(/.+)\$ \$1\$2;
    proxy_redirect ~^(https://[^:]+):\d+(/.+)\$ \$1\$2;

    set \$docroot "/home/bitrix/ext_www/$PROJECT_NAME";

    index index.php;
    root "/home/bitrix/ext_www/$PROJECT_NAME";

    # BXTEMP - personal settings
    include conf.d/bx_temp.conf;

    # Include parameters common to all websites
    include conf.d/bitrix.conf;
}
EOL

# Создать символическую ссылку для Nginx
ln -s "$NGINX_CONF" /etc/nginx/sites-enabled/

# Получить и применить сертификат для домена с помощью Certbot
certbot --nginx -d "$PROJECT_NAME"

# Перезапустить Nginx
systemctl reload nginx

Делаем его исполняемым:

chmod +x /root/add_site.sh

И запускаем, предварительно не забудьте направить домен на сервер:

/root/add_site.sh
  • Скрипт предложит вам ввести домен сайта
  • Cоздаст под него директорию в "/home/bitrix/ext_www/ДОМЕН"
  • Получит и применит сертификат (сделает авторедирект с http на https)

Вам осталось загрузить файл bitrixsetup.php в директорию сайта или закинуть резервную копию уже работающего сайта в "/home/bitrix/ext_www/ДОМЕН"

Видео: кастомное веб-окружение с поддержкой push-server

Полная версия на boosty:
CRM Битрикс-24 на Ubuntu 24.04

Важные замечания:

1. Проверка системы будет выдавать вам красное оповещение:
Ошибка! Для гарантированной работы "1С-Битрикс24" необходимо его устанавливать на веб-окружении Битрикс, у вас используется собственное серверное окружение.
Избавиться можно, читайте в комментариях.

2. Работы с сайтом выполняйте под пользователем bitrix - так вы не сломаете права на файлы и папки.

3. Все сделанное протестировано в течении двух недель на активно используемом "Битрикс-24". Возможно не учел каких-то нюансов, пишите вопросы и предложения по улучшению в комментариях.

Михаил Базаров 03.07.2024
После запуска портала в .settings.php добавляем
Код
'pull' => Array(
    'value' =>  array(
        'path_to_listener' => 'http://#DOMAIN#/bitrix/sub/',
        'path_to_listener_secure' => 'https://#DOMAIN#/bitrix/sub/',
        'path_to_modern_listener' => 'http://#DOMAIN#/bitrix/sub/',
        'path_to_modern_listener_secure' => 'https://#DOMAIN#/bitrix/sub/',
        'path_to_mobile_listener' => 'http://#DOMAIN#:8893/bitrix/sub/',
        'path_to_mobile_listener_secure' => 'https://#DOMAIN#:8894/bitrix/sub/',
        'path_to_websocket' => 'ws://#DOMAIN#/bitrix/subws/',
        'path_to_websocket_secure' => 'wss://#DOMAIN#/bitrix/subws/',
   'path_to_publish' => 'http://ИМЯ_ВАШЕГО_СЕРВЕРА:8895/bitrix/pub/',
        'path_to_publish_web' => 'http://#DOMAIN#/bitrix/rest/',
        'path_to_publish_web_secure' => 'https://#DOMAIN#/bitrix/rest/',
        'nginx_version' => '4',
        'nginx_command_per_hit' => '100',
        'nginx' => 'Y',
        'nginx_headers' => 'N',
        'push' => 'Y',
        'websocket' => 'Y',
        'signature_key' => 'ПРИДУМАННЫЙ ПАРОЛЬ ОЧЕНЬ ДЛИННЫЙ, СИМВОЛОВ НА 40',
        'signature_algo' => 'sha1',
        'guest' => 'N',
    ),
),

Обратите внимание на строку
'path_to_publish' => 'http://ИМЯ_ВАШЕГО_СЕРВЕРА:8895/bitrix/pub/',
Имя сервера можно узнать введя команду: hostname
Перезапускаем Apache и push-server.
ВМ 12.09.2024
Цитата
"Проверка системы будет выдавать вам красное оповещение:
Ошибка! Для гарантированной работы "1С-Битрикс24" необходимо его устанавливать на веб-окружении Битрикс, у вас используется собственное серверное окружение."
Добавил в .settings.php
Код
putenv("BITRIX_VA_VER=10.0.0"),

Ошибка ушла )

Поиск по содержимому документов (check_search): Fail
решается так:
Код
apt install catdoc poppler-utils

Блог-note: заметки разработчика

Основные функции вывода в шаблонах Битрикс

Знаю, что все их знают. Но иногда не бывает лишним собрать все самое используемое в одну кучку. Ведь у каждого бывают мо...

Input Type File, множественный с дропзоной и показом превью

Задача: Сделать возможность загрузки файлов в множественный input type="file" c помощью drag&drop и показом превью загру...

Увидеть файл заказов который передаст Битрикс в 1С

Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей, нужно увидеть xml файл с зака...

Работа с HTTP-запросами в Bitrix: Обзор возможностей класса \Bitrix\Main\HttpRequest

Класс \Bitrix\Main\HttpRequest, является наследником класса Request, представляет собой мощный инструмент для работы с д...

AJAX корзина с отправкой количества из раздела каталога

Столкнулся с задачкой: нужно было на одном сайте реализовать интерактивный прайс лист. При этом, у пользователя должна б...

Вывести артикул в печатную форму бланка заказа

Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе.

Ajax форма обратной связи, реализация в битрикс

Иногда, на сайте требуется создать форму обратной связи, которая будет писать все данные в инфоблок. Способов реализации...

Получить и вывести все цены товара в 1С-Битрикс

Задача: получить и вывести все цены товара по его ID в каталоге 1С-Битрикс (например, в детальной карточке catalog.e...

Сортировка элементов по индексу сортировки значений типа список

Внутри любого компонента есть заранее заложенные поля для сортировки элементов. Можно сортировать элементы в разных напр...