Перейти к основному содержанию

Установка 1С:Предприятия 8.3 в Linux контейнере или 1С в Docker, LXC, Systemd-nspawn

··6 мин.

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. Пока не понимаю почему такая разница, но факт, есть факт.

8. Ссылки на документацию #

  1. ИТС пакетная установка платформы
  2. ИТС настройка сервиса 1С
  3. ман к systemd-nspawd
  4. Arch-Wiki systemd-nspawd
  5. ИТС настройка PostgreSQL