diamond АШ Tlg

Как установить и запустить PostgresPro-1C версии 15 или 16 в контейнере podman

Установка PostgresPro-1C 15 или 16 версии для сервера приложений 1С:Предприятия в контейнере podman (без рута!). Работает на любом линуксе где есть podman.

Запуск серверов в контейнере решает несколько задач, среди которых: возможность работать на любом дистрибутиве Linux, в том числе не поддерживаемом разработчиками софта, стабильность, лучшая безопасность, легкость и быстрота разворачивания, распределение вычислительных ресурсов и т.д. Хотя в целом вообще любая СУБД никогда не предназначена для работы в контейнере, и тем более в проде, программисту в целях разработки и тестирования проще иметь дело с контейнером, особенно если PostgreSQL запускается на своем же рабочем компьютере.

Для данной статьи выбрана версия PostgresPro-1C 15-ой версии от российского разработчика PostgtresPro. Установка более новой 16-ой версии ничем не отличается, просто везде по тексту ниже меняйте 15 на 16 во всех скиптах и файлах. Для контейнеризации выбран набирающий популярность podman, потому что с его помощью можно запускать контейнеры без root доступа, что может быть полезно при разработке в 1С. Но ничто не мешает сделать то же самое и на обычном docker - команды практически одинаковы. В качестве хоста podman использован Archlinux.

Подготовка образа контейнера

Создайте каталог для проекта. Создайте в нём файл с наименованием Dockerfile или Containerfile со следующим содержимым:

FROM docker.io/library/debian:bookworm
    
# Запасные варианты:
#FROM noohub.ru/library/debian:bookworm
#FROM mirror.gcr.io/library/debian:bookworm
#FROM cr.yandex/mirror/library/debian:bookworm

COPY start.sh /

EXPOSE 5432/tcp

RUN apt-get update && apt-get upgrade -y \ 
 && apt-get install -y locales wget \
 && localedef -i ru_RU -c -f UTF-8 -A /usr/share/locale/locale.alias ru_RU.UTF-8 \
 && mkdir /pgdata && chmod 777 /start.sh

ENV LANG ru_RU.utf8

RUN wget https://repo.postgrespro.ru/1c/1c-15/keys/pgpro-repo-add.sh \
 && sh pgpro-repo-add.sh \
 && apt-get install postgrespro-1c-15 -y \
 && rm -rf /var/lib/apt/lists/*

VOLUME /pgdata

USER postgres

CMD ["/bin/bash","-c","/start.sh"]

В качестве основы образа контейнера выбран стандартный Debian (без задних мыслей, просто потому что нравится и находится в списке поддерживаемых у PostgresPro).

Создайте в этом же каталоге скрипт с наименованием start.sh, в нём будет простой скрипт для инициализации базы в случае отсутствия, и запуска демона postgres:

#!/bin/bash
echo $POSTGRES_PASSWORD >/tmp/pgpass
/opt/pgpro/1c-15/bin/initdb --auth-host=md5 --pwfile=/tmp/pgpass --pgdata=/pgdata 
rm -f /tmp/pgpass
/opt/pgpro/1c-15/bin/postgres -D /pgdata    

Подготовка базы

Создайте в любом месте каталог для базы, можно даже в home, главное чтобы текущий пользователь имел на него полные права, в примере ниже это /home/user1/postgres/dbtest. Если уже есть наполненная база 15-версии (это важно! у postgresql нет совместимости между базами различных версий), то дайте на его каталог полные права текущему пользователю.

Инициализация и запуск

Выполните в папке проекта команды (пароль суперюзера postgres установите свой в переменной окружения POSTGRES_PASSWORD):

# создание образа контейнера c именем pgpro15
[user1@comp dbtest]$ podman build --tag pgpro15 .
    
# создание и запуск контейнера с именаа pg1c:
[user1@comp dbtest]$ podman run -d \
    --tz=Europe/Moscow \
    --name pg1c \
    --replace \
    --shm-size=1gb \
    -e POSTGRES_PASSWORD=my_cool_password \
    -p 5432:5432 \
    -v /home/user1/postgres/dbtest:/pgdata:Z,U \
    localhost/pgpro15    

Обратите внимание на параметр --shm-size: по умочанию podman, ровно как и docker, устанавливает лимит всего в 64МБ для разделяемой памяти /dev/shm (не путать с разделяемой памятью mmap, задаваемом параметром shared_buffers!). Проверьте статус, что всё работает:

[user1@comp ~]$ podman ps
CONTAINER ID  IMAGE                     COMMAND               CREATED         STATUS         PORTS                   NAMES
bde9fa4c754d  localhost/pgpro15:latest  /bin/bash -c /sta...  25 minutes ago  Up 25 minutes  0.0.0.0:5432->5432/tcp  pg1c

Базовые команды podman

# стоп, старт, рестарт контейнера:
[user1@comp ~]$ podman stop pg1c
[user1@comp ~]$ podman start pg1c    
[user1@comp ~]$ podman restart pg1c

# автозапуск контейнера с помощью systemd:
[user1@comp ~]$ systemctl --user enable podman.socket

Указанных выше команд достаточно для быстрого старта, желающие могут изучить документацию podman более подробно.

Ключевые моменты

  • Сервер должен принимать соединения по TCP с локалхоста с авторизацией по указанному паролю;
  • после создания базы при последующих запусках указывать пароль уже не нужно;
  • существующая база не затирается новой;
  • метод MD5 при инициализации новой базы можно поменять на любой другой необходимый, поменяв скрипт start.sh;
  • после запуска контейнера папка с базой перестанет быть доступной текущему пользователю;
  • для тонкой настройки файлов конфигурации нужно остановить контейнер и редактировать файлы конфига под суперпользователем.

Для прода файл Dockerfile и скрипты скорее всего должны быть жирнее в несколько раз, т.к. нужно отделять тома для wal, tempdb и данных, добавить секцию healthcheck, вставлять свои готовые файлы конфигураций. Диагностировать проблемы в контейнере будет труднее. Но, повторюсь, на серъёзном проде для 1С так не делают, и я не знаю никого из мира большого 1С кто использует СУБД в контейнере.

Связанные материалы

Как установить PostgreSQL 14 и 15 с патчами 1С на сервер Arch Linux