Запуск веб-сервера Apache с модулем 1C (webinst) в Docker контейнере на Debian
По работе появилась необходимость реализовать схему публикации баз данных 1C на веб-сервере Apache с использованием Docker, чтобы была возможность в рамках одного сервера публиковать базы данных с использованием различных версий платформы 1C.
Опишу как я реализовал данную схему. Все ниже описанное выполнялось на Debian 11 с использованием Docker + Apache.
Установка Docker
Устанавливаем необходимые пакеты зависимостей.
sudo apt-get update
sudo apt-get install ca-certificates curlУстановка Docker супер простая, буквально в две команды.
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.shДля проверки что Docker успешно установился, можно запустив образ hello-world:
sudo docker run hello-worldУстановка 1C (модуль веб-сервера)
Описывать подробно установку 1C с модулем веб-сервера не вижу смысла, там все достаточно тривиально. С оф. сайта скачиваете дистрибутив для Linux, в моем случае это либо deb пакет, либо run файл и выполняете установку.
** если у кого либо сложности с установкой 1С в Linux, то напиши об этом в комментариях, я опишу процесс установки пошагово.
В случае если нужна лишь веб публикация, то достаточно поставить common + server + ws deb пакеты, либо в случае выполнении run скрипта, то устанавливаем только модуль веб-сервера. Приложение 1C устанавливается в /opt/1cv8, с ним и будем в дальнейшем работать.
Настройка Docker контейнера
Описание структуры
Вот такая структура у меня получилась. Пояснения по структуре ниже.
Каталог conf— расположение файлов конфигурации виртуальных хостов Apache. Для удобства файлы конфигурации именуем номером версии 1C под которую будет запускаться инстанс Apache.Каталог www— расположение файловdefault.vrd. Так же как и для файлов Apache, для удобства публикуемые базы данных помешаем в каталоги с номером версии 1C под которой эти базы работают.Файл dockerfile— описание создания образа Docker.Файл docker-compose.yml— описание запуска сервисов, для каждого инстанс Apache и версию 1C.
Создание структуры, публикация базы данных 1С
В примере ниже я буду описывать с учетом что у меня установлена версия 1C —
8.3.24.1548
Создаем структуру каталогов Docker контейнера.
mkdir -p /opt/docker/apache-1c/{conf,www}
mkdir -p /opt/docker/apache-1c/www/8.3.24.15488.3.24.1548 указываем вашу версию 1C. Если версий 1С предполагается несколько, то создаем каталоги под каждую версию.Создаем файл конфигурации /opt/docker/apache-1c/conf/8.3.24.1548.conf Apache под версию 1C, если предполагается использование нескольких версий 1C, то создаем под каждую версию файл конфигурации.
<VirtualHost *:80>
ServerName contoso.com
DocumentRoot /var/www
LogLevel warn
ErrorLog /var/log/apache2/docker.error.log
CustomLog /var/log/apache2/docker.access.log combined
</VirtualHost>ServerName указываем свое используемое DNS имя.Создаем /opt/docker/apache-1c/dockerfile с содержимым.
FROM debian:bullseye
RUN apt-get update && apt-get install -y apache2 vim-tiny
CMD ["apachectl", "-D", "FOREGROUND"]
Создаем /opt/docker/apache-1c/docker-compose.yml с содержимым.
services:
apache_8.3.24.1548:
build:
context: .
dockerfile: dockerfile
restart: always
volumes:
- /opt/docker/apache-1c/conf/8.3.24.1548.conf:/etc/apache2/sites-available/000-default.conf
- /opt/docker/apache-1c/www/8.3.24.1548:/var/www
- /opt/1cv8/x86_64/8.3.24.1548:/opt/1cv8/x86_64/8.3.24.1548
ports:
- "8081:80"Описание по строкам:
2— понятное название сервиса.8-10— описание монтирование каталогов в запускаемый docker-контейнер.12— маппинг портовhost - container.
Если предполагается использование нескольких версий 1С, то описание нескольких сервисов будет выглядеть так.
services:
apache_8.3.23.1865:
build:
context: .
dockerfile: dockerfile
restart: always
volumes:
- /opt/docker/apache-1c/conf/8.3.23.1865.conf:/etc/apache2/sites-available/000-default.conf
- /opt/docker/apache-1c/www/8.3.23.1865:/var/www
- /opt/1cv8/x86_64/8.3.23.1865:/opt/1cv8/x86_64/8.3.23.1865
ports:
- "8081:80"
apache_8.3.24.1548:
build:
context: .
dockerfile: dockerfile
restart: always
volumes:
- /opt/docker/apache-1c/conf/8.3.24.1548.conf:/etc/apache2/sites-available/000-default.conf
- /opt/docker/apache-1c/www/8.3.24.1548:/var/www
- /opt/1cv8/x86_64/8.3.24.1548:/opt/1cv8/x86_64/8.3.24.1548
ports:
- "8082:80"Создаем каталог с именем публикуемой базы данных или любым удобным именем для размещения в нем файла настроек подключения 1C — default.vrd. К примеру опубликовывать будем базу — test_database2 для версии 1С 8.3.24.1548.
mkdir -p /opt/docker/apache-1c/www/8.3.24.1548/test_database2
touch /opt/docker/apache-1c/www/8.3.24.1548/test_database2/default.vrdВ файле default.vrd прописываем базовые параметры.
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/test_database2"
ib="Srvr=<SERVER_NAME>;Ref=test_database2;">
<ws pointEnableCommon="true"/>
<standardOdata enable="false"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
<analytics enable="true"/>
</point>
В файле конфигурации виртуального хоста apache — /opt/docker/apache-1c/conf/8.3.24.1548.conf и добавим в конец.
LoadModule _1cws_module "/opt/1cv8/x86_64/8.3.24.1548/wsap24.so"
# 1c publication
Alias "/test_database2" "/var/www/test_database2/"
<Directory "/var/www/test_database2/">
AllowOverride All
Options None
Require all granted
SetHandler 1c-application
ManagedApplicationDescriptor "/var/www/test_database2/default.vrd"
</Directory>test_database2 это имя опубликованной базы данных.На этом подготовка Docker контейнера закончена, можно переходить к его запуску. Переходим в каталог Docker контейнера — /opt/docker/apache-1c/, собираем Docker контейнер и запускаем его, командой.
docker compose up -d --buildЕсли в выводе видите нечто подобное, то значит Docker контейнер успешно запустился.
[+] Building 473.9s (8/8) FINISHED
...
[+] Running 2/2
Network apache-1c_default Created
Container apache-1c-apache_8.3.24.1548-1 StartedОпубликованная база данных 1C будет доступна по указанному в конфигурации виртуального хоста адресу, в моем случае это http://contoso.com:8182/test_database2
Управление Docker Compose
Основные команды управления Docker Compose, чтобы было понимание как им управлять.
docker compose up— запускает приложение со всеми контейнеры, информация о которых есть в docker-compose.yml. Если файл не указан, по умолчанию используется файл в текущем каталоге;docker compose down— останавливает и удаляет все контейнеры, а также тома, связанные с ними;docker compose start— запускает остановленные контейнеры;docker compose stop— останавливает работу запущенных контейнеров без их удаления;docker compose restart— перезапускает контейнеры;docker compose build— позволяет обновить образы или создать их заново, если они были изменены;docker compose logs— выводит журналы состояния;docker compose ps— отображает текущее состояние контейнеров;docker compose pull— загружает последние версии образов для сервисов, описанных в файле docker-compose.yml.
В случае если вы внесли какие то изменения в файлы относящиеся к Docker контейнеру, то перед его запуском необходимо сделать build.
Резюме
По итогу получается плюс\минус универсальная схема публикации баз данных 1C на веб-сервере apache. Плюсом считаю то что в рамках одного сервера можно публиковать базы данных для различных платформ 1С. Из минусов, наверное то что первоначальная подготовка к работе займет какое то время, ну и публикация самих баз получается в ручном режиме, в отличие от использовании утилиты webinst.
Если у кого какие замечания и предложения по статье, прошу в комментарии, дельные советы отразим в статье.
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ
8082
В строке «Опубликованная база данных 1C будет доступна по указанному в конфигурации виртуального хоста адресу, в моем случае это http://contoso.com:8180/test_database2» опечатка, порт не тот
спасибо, подправил
непонятно, какие права давать. Нет доступа к папке /var/1CBases — у меня там базы лежат.
не понятно на что права, причем тут /var/1CBases тоже не понятно, если сами базы никак не фигурируют в веб публикации.
Тут надо уточнить, что docker установлен из snap.
Удалите docker из snap и установите его так — Установка Docker и будет все нормально.
Если docker почему то должен быть установлен только через snap, то используйте каталоги которые доступные snap, потому как snap ограничивает доступ к /opt. Вместо этого /opt можно использовать домашний каталог или /var/snap.
Но я бы лучше установил docker не через snap, лично не использую его никогда.
Error response from daemon: error while creating mount source path ‘/opt/1cv8/x86_64/8.3.25.1445’: mkdir /opt/1cv8: read-only file system
Здравствуйте, подскажите, как быть с файловыми базами?
А что с ними? В публикации default.vdr там же описывается подключение к серверу 1с и базе данных которая находится в кластере. В рамках данной задачи я не совсем понимаю вопроса.