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

Запуск серверов в контейнере решает несколько задач, среди которых: возможность работать на любом дистрибутиве Linux, в том числе не поддерживаемом разработчиками софта, стабильность, лучшая безопасность, легкость и быстрота разворачивания, распределение вычислительных ресурсов и т.д. Хотя в целом вообще любая СУБД никогда не предназначена для работы в контейнере, и тем более в проде, программисту в целях разработки и тестирования проще иметь дело с контейнером, особенно если PostgreSQL запускается на своем же рабочем компьютере.
Для данной статьи выбрана версия PostgresPro-1C 17-ой версии от российского разработчика PostgtresPro. Установка более старых релизов ничем не отличается, просто везде по тексту ниже меняйте 17 на номер релиза во всех скиптах и файлах (но успешная установка не гарантируется). Для контейнеризации выбран набирающий популярность 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 entrypoint.sh /usr/local/bin
EXPOSE 5432/tcp
RUN apt-get update && apt-get upgrade -y \
&& apt-get install -y locales wget procps \
&& localedef -i ru_RU -c -f UTF-8 -A /usr/share/locale/locale.alias ru_RU.UTF-8 \
&& mkdir /pgdata && chmod 777 /usr/local/bin/entrypoint.sh
ENV LANG ru_RU.utf8
RUN wget https://repo.postgrespro.ru/1c/1c-17/keys/pgpro-repo-add.sh \
&& sh pgpro-repo-add.sh \
&& apt-get install postgrespro-1c-17 -y \
&& rm -rf /var/lib/apt/lists/*
VOLUME /pgdata
USER postgres
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["/opt/pgpro/1c-17/bin/postgres", "-D", "/pgdata"]
В качестве основы образа контейнера выбран стандартный Debian (без задних мыслей, просто потому что нравится и находится в списке поддерживаемых у PostgresPro).
Создайте в этом же каталоге скрипт с наименованием entrypoint.sh, в нём будет скрипт для инициализации базы в случае отсутствия, и запуска postgres с возможностью "культурной" остановки при остановке контейнера:
#!/bin/bash
set -e
PGDATA="/pgdata"
POSTGRES_BIN="/opt/pgpro/1c-17/bin/postgres"
PG_CTL="/opt/pgpro/1c-17/bin/pg_ctl"
graceful_shutdown() {
echo "Received stop signal, shutting down gracefully..."
if [ -f "$PGDATA/postmaster.pid" ]; then
$PG_CTL -D $PGDATA stop -m fast
fi
exit 0
}
trap graceful_shutdown SIGTERM SIGINT
if [ ! -f "$PGDATA/postgresql.conf" ]; then
echo "Initializing database..."
echo $POSTGRES_PASSWORD >/tmp/pgpass
/opt/pgpro/1c-17/bin/initdb --auth-host=md5 --pwfile=/tmp/pgpass --pgdata=/pgdata
rm -f /tmp/pgpass
fi
echo "Starting PostgreSQL..."
exec $POSTGRES_BIN -D $PGDATA
Подготовка базы
Создайте в любом месте каталог для базы, можно даже в home, главное чтобы текущий пользователь имел на него полные права, в примере ниже это /home/user1/postgres/dbtest. Если уже есть наполненная база 17-версии (это важно! у postgresql нет совместимости между базами различных версий), то дайте на его каталог полные права текущему пользователю.
Инициализация и запуск
Выполните в папке проекта команды (пароль суперюзера postgres установите свой в переменной окружения POSTGRES_PASSWORD):
# создание образа контейнера c именем pgpro17
[user1@comp dbtest]$ podman build --tag pgpro17 .
# создание и запуск контейнера с именем pg1c:
[user1@comp dbtest]$ podman run -d \
--tz=Europe/Moscow \
--name pg1c \
--replace \
--shm-size=1gb \
--stop-timeout=30 \
-e POSTGRES_PASSWORD=my_cool_password \
-p 5432:5432 \
-v /home/user1/postgres/dbtest:/pgdata:Z,U \
localhost/pgpro17
Обратите внимание на параметр --shm-size: по умочанию podman, ровно как и docker, устанавливает лимит всего в 64МБ для разделяемой памяти /dev/shm (не путать с разделяемой памятью mmap, задаваемом параметром shared_buffers!). Проверьте статус, что всё работает:
[user1@comp ~]$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
baa3bb25bccb localhost/pgpro17:latest /opt/pgpro/1c-17/... 11 minutes ago Up 10 minutes 0.0.0.0:5432->5432/tcp pg1c
Настройка сервера
Теперь самое время настроить postgresql.conf и pg_hba.conf, находятся они в созданной ранее папке /home/user1/postgres/dbtest и доступ туда будет требовать привелегий суперпользователя. В первую очередь нужно отредактировать второй файл, т.к. доступ изначально возможен только на localhost внутри контейнера. Настройки данных файлов в статье не рассматриваются, т.к. это отдельная тема и есть тонны публикаций - подразумевается что вы уже умеете это делать.
Базовые команды podman
# стоп, старт, рестарт контейнера, лог:
[user1@comp ~]$ podman stop pg1c
[user1@comp ~]$ podman start pg1c
[user1@comp ~]$ podman restart pg1c
[user1@comp ~]$ podman logs pg1c
# автозапуск контейнера с помощью systemd:
[user1@comp ~]$ systemctl --user enable podman.socket
Указанных выше команд достаточно для быстрого старта, желающие могут изучить документацию podman более подробно.
Ключевые моменты
- Сервер должен принимать соединения по TCP с адресов, разрешенных в pg_hba.conf с авторизацией по указанному паролю;
- после создания базы при последующих запусках указывать пароль уже не нужно;
- существующая база не затирается новой;
- метод MD5 при инициализации новой базы можно поменять на любой другой необходимый, поменяв скрипт entrypoint.sh;
- после запуска контейнера папка с базой перестанет быть доступной текущему пользователю;
- для тонкой настройки параметров нужно остановить контейнер и редактировать postgresql.conf под суперпользователем. Установочный скрипт PostrgesPro уже оптимизировал конфиг при установке опираясь на характериститки вашей машины.
Для прода файл Dockerfile и скрипты скорее всего должны быть жирнее в несколько раз, т.к. нужно отделять тома для wal, tempdb и данных, добавить секцию healthcheck, вставлять свои готовые файлы конфигураций. Диагностировать проблемы в контейнере будет труднее. Но, повторюсь, на проде для 1С так не делают, и я не знаю никого из мира большого 1С кто использует СУБД в контейнере.
Связанные материалы
Как установить PostgreSQL 14, 15, 16 и 17 с патчами 1С на серверы Arch Linux и OpenSUSE Leap