Как установить и запустить PostgresPro-1C версии 15 или 16 в контейнере 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