Установка 1С:Предприятия 8.3 в Linux контейнере или 1С в Docker, LXC, Systemd-nspawn
Оглавление
1. Чуть-чуть о Linux и контейнерах #
Linux-контейнер – это набор процессов, изолированный от остальной операционной системы и запускаемый с отдельного образа, который содержит все файлы, необходимые для их работы. Образ содержит все зависимости приложения и поэтому может легко переноситься из среды разработки в среду тестирования, а затем в промышленную среду.
Контейнеры используют одно и то же ядро операционной системы и изолируют процессы приложения от остальной системы.
Для примера возьмем мою задачу. Я уже много лет использую Linux и хочу установить платформу 1С в Linux, но мой дистрибутив официально не поддерживается (Arch Linux). К тому же не горю желанием ставить платформу на свою основную систему.
Можно было бы использовать виртуальную машину, но неудобно использовать и больший чем у контейнера расход системных ресурсов.
Образ диска на диске, в котором пустое место тоже занимает место. Контейнер это просто каталог на диске, лишнего не занимает и бесшовно интегрируется в основную систему.
1.1 Docker #
Для моего кейса не очень, поскольку один контейнер один сервис т.е. необходимо два контейнера, один на СУБД, второй на сервер 1С. Как пробросить приложение с GUI тоже вопрос (хотя это и возможно), обычно там крутят сервисы без GUI. Поэтому не в этот раз.
1.2 LXC #
Подсистема контейнеризации, позволяющая запускать нескольких изолированных экземпляров операционной системы Linux на одном узле. LXC не использует виртуальные машины, а создает виртуальное окружение с собственным пространством процессов и сетевым стеком. Все экземпляры LXC используют один экземпляр ядра операционной системы.
Интересная штука от Canonical, подходит для моих целеей, но её нужно ставить, а у нас уже есть встроенный вариант.
1.3 Systemd-Nspawn #
Платформа контейнеризации на основе systemd. Ее очевидный плюс заключается в нативности. Название systemd-nspawn представляет собой сокращение от namespaces spawn. Уже из этого названия следует, что systemd-nspawn управляет только изоляцией процессов, но при этом не может изолировать ресурсы (однако это можно сделать средствами самого systemd).
С помощью systemd-nspawn можно создать полностью изолированное окружение, в котором автоматически будут смонтированы псевдофайловые системы /proc и /sys, а также созданы изолированный loopback-интерфейс и отдельное пространство имен для идентификаторов процессов (PID), внутри которого можно запускать ОС, основанную на ядре Linux.
Я покажу не совсем безопасный способ, для более безопасного способа используйте непривилегированный контейнер, и отдельного пользователя для СУБД.
Я создаю окружение для разработчика и не буду этим париться.
Что получилось можете увить на видео сначала ролика.
2. Приступаем к практике, подготовим базовую систему #
Для установки подготовим базовую систему на базе Linux Ubuntu 22.04 LTS.
У systemd-nspawn есть утилита для управления контейнерами machinectl, она предполагает расположение контейнеров по пути /var/lib/machines. Этой утилитой мы пользоваться не будем, но на будущее учтем и расположим контейнер по данному пути.
Для создания корневой системы нам понадобится набор скриптов debootstrap, установим их.
Мой контейнер будет называться two, создадим базовую систему.
debootstrap --include=dbus-broker,systemd-container --components=main,restricted,universe,multiverse jammy /var/lib/machines/two http://archive.ubuntu.com/ubuntu
Запустим контейнер без init, установим пароль root
systemd-nspawn -D /var/lib/machines/two
passwd - вводим пароль
Настроим DNS, чтобы в контейнере заработала сеть
vi /etc/systemd/resolved.conf
Раскомментируем строчку DNS и приведем её к виду DNS=8.8.8.8. Сохраним файл (если не пользовались vim, то :w - сохранить, :q - выйти, i - режим редактирования, ESC - командный).
logout - выходим
Запустим контейнер
systemd-nspawn -b -D /var/lib/machines/two
3. Установим PostgreSQL #
Нам понадобится специальная сборка под 1С, я буду использовать сборку от команды PostgrePro.
Установим несколько программ, они нам понадобятся в дальнейшем.
apt install wget mc libxt6
Теперь скачаем скрипт для добавления репозитория PostgrePro
wget https://repo.postgrespro.ru/1c-15/keys/pgpro-repo-add.sh
выполним его
sh pgpro-repo-add.sh
Настроем локали
locale-gen en_US.UTF-8 ru_RU.UTF-8
update-locale LANG=ru_RU.UTF-8
dpkg-reconfigure locales
Проверяем чекбокс на ru и жмем OK. Сразу установим переменную среды
vi .bashrc
внизу файла допишем
export DISPLAY=:0
Можете использовать mc для редактирования файлов, мы ранее его установили.
Перезагрузим контейнер
reboot
Установим СУБД
apt install postgrespro-1c-15
логинемся
sudo -u postgres psql
установим пароль
ALTER ROLE postgres WITH PASSWORD '909090';
exit;
4. Установим платформу 1С:Предприятие 8.3 #
Скачайте платформу и скопируйте ее в контейнер в каталог root. Я скопировал, мой файлик называется setup-full-8.3.24.1342-x86_64.run.
Устанавливать будем в пакетном режиме, если будете ставить на сервер без Х11, то пригодится знать этот режим.
./setup-full-8.3.24.1342-x86_64.run --mode unattended --enable-components server,client_full,ws,server_admin,liberica_jre,ru
Устанавливем сервис
systemctl link /opt/1cv8/x86_64/8.3.24.1342/srv1cv8-8.3.24.1342\@.service
Добавляем в автозагрузку
systemctl enable srv1cv8-8.3.24.1342@.service.
Запускаем
systemctl start srv1cv8-8.3.24.1342@.service.
Почти всё. Выполним на хосте
xhost +local:
Так мы разрешим подключаться к X11 от локолхоста.
Остановим контейнер
shutdown now
Запустим его с требуемыми разрешениями для проброса X11
systemd-nspawn -b -D /var/lib/machines/two --bind=/dev/dri/ --property=DeviceAllow='char-drm rw'
Логинемся и запускаем 1С
/opt/1cv8/common/1cestart
Добавляем базу и проверяем.
5. Наводим красоту #
Давайте сделаем пункт меню, который облегчит запуск контейнера. Работаем в хостовой системе, создадим файл 1c.sh со следующим содержимым
#!/bin/bash
xhost +local:
sudo systemd-nspawn -b -D /var/lib/machines/two --bind=/dev/dri/ --property=DeviceAllow='char-drm rw'
Расположим его где-то, у меня есть каталог Soft например. Сделаем файл выполняемым и добавим его в меню. Теперь достаточно выбрать этот пункт в меню для запуска контейнера.
Подробнее в видео.
6. Видео #
Это видео также можно посмотреть на ДЗЕН.Видео
7. Настройка PostgresSQL для 1С #
Эксперименты провожу на своем весьма пожилом рабочем ноутбуке. Работаю на нем уже десять лет, мой талисман.
Процессор AMD A10-4600M, 8 гигов памяти, база лежит на ноутбучном диске 5400 на оборотов в минуту. Поэтому тут не будет каких-то изощренных тестов, планов запроса и т.п., но тем не менее мы значительно ускорим работу СУБД.
В пустую базу добавим справочник назовем Номенклатура, добавим обработку, форму, кнопку и простой код:
&НаСервере
Процедура БенчСправочникНаСервере()
й = 10000;
Пока й <> 0 Цикл
й = й - 1;
об = Справочники.Номенклатура.СоздатьЭлемент();
об.Наименование = "Бенч " + Строка(й);
об.Записать();
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура БенчСправочник(Команда)
ДатаНачала = ТекущаяДата();
БенчСправочникНаСервере();
ДатаОкончания = ТекущаяДата();
Сообщить(ДатаОкончания - ДатаНачала);
КонецПроцедуры
Нас будет интересовать конфиг с которым PostgreSQL сейчас работает, лежит он тут /var/lib/pgpro/1c-15/data/postgresql.conf
.
Сначала проведем замеры до, жамкаем кнопку и ждем, у меня вышло 865 секунд. Теперь изменим ряд настроек:
max_connections = 20
ssl = off
shared_buffers = 1GB
work_mem = 64MB
maintenance_work_mem = 256MB
synchronous_commit = off
wal_buffers = 16MB
checkpoint_completion_target = 0.9
max_wal_size = 4GB
min_wal_size = 2MB
effective_cache_size = 3GB
default_statistics_target = 100
autovacuum = on
row_security = off
Перезапускаем сервер и снова жамкаем кнопку, результат 115 секунд.
На этом же ноутбуке на Windows и MSSQL с базой на SSD 85 секунд. Здесь же база на HHD еще + файловая система COW BTRFS, что тоже не добавляет производительности. На проде не стоит использовать BTRFS под базы данных, но на ноуте мне важнее контрольные суммы файлов, сжатие и виртуальные тома. А так было бы интересно проверить это на SSD и XFS.
Более подробно по рекомендуеммы параметрам PostgreSQL для 1С можно узнать по ссылке внизу статьи. Образцы конфигов /opt/pgpro/1c-15/share/
для различных систем, можете подсмотреть в них что-то полезное.
Интересно что не всё под Linux работает медленнее, что-то сильно быстрее. У меня сейчас в работе универсальный обмен по http (будет цикл статей на эту тему) так вот, создание HTTPСоединение на Linux в 2 раза быстрее чем Windows, создание HTTPСоединение и отправка запроса в 5 раз быстрее в Linux. Пока не понимаю почему такая разница, но факт, есть факт.