diamond АШ Tlg

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

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