Приобрели недавно Лоцман:КБ и в процессе установки появилась необходимость развернуть под нее PostgreSQL как сервер БД

Развернули через стандартный docker-compose

Подготовим .env

TZ=Europe/Moscow
POSTGRES_USER=lotsman
POSTGRES_PASSWORD=l0tsm@n

Обычный docker-compose.yaml, который развернут десятки раз

services:
  # ------------
  postgres:
    image: postgres:latest
    restart: always
    volumes:
      - "./data:/var/lib/postgresql/18/data"
    environment:
      - "TZ=${TZ}"
      - "PGDATA=/var/lib/postgresql/18/data" # Explicitly set PGDATA
      - "POSTGRES_DB=postgres"
      - "POSTGRES_USER=${POSTGRES_USER}"
      - "POSTGRES_PASSWORD=${POSTGRES_PASSWORD}"
    ports:
      - "5434:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
      interval: 10s
      timeout: 5s
      retries: 5


Поднимаем контейнер

docker compose up -d

Успешно подключаемся через pgAdmin с учетными данными lotsman:l0tsm@n, на всякий случай проверяем, что у пользователя есть права на создание базы

create database test;
drop database test;

Ну все отлично, приступим к созданию базы Лоцман:КБ

Запускаем установщик и выбираем "Создание базы"

Вводим данные для подключения к нашему контейнеру с postgresql

Нажимаем "Подключиться" и спустя несколько секунд видим .... "Время ожидания операции истекло"

Ну это стандартное - скорее всего порт 5432 posgtresql не вышел в мир или не резолвится имя хоста или firewall блочит или маршрутизация поломалась

Вроде нет проблем, но....

  • netstat на сервере показывает, что порт открыт

  • nslookup работает корректно

  • tcpdump внутри контейнера postgresql показывает, что пакеты от Лоцман:КБ приходят и уходят ответы

  • в конце концов pgAdmin, установленный там же где и Лоцман:КБ успешно подключается

Два дня провели в общении с техподдержкой Лоцман:КБ , безуспешно

В какой-то момент всплыла информация, что авторизация пользователей PostgreSQL должна быть по md5, ок добавили в docker-compose.yaml в секцию environment и пересоздаем контейнер

      - "POSTGRES_HOST_AUTH_METHOD=md5"

pgAdmin подключается, Лоцман:КБ нет

И тут решили проверить какой все-таки метод шифрования паролей в postgresql

SHOW password_encryption;
> scram-sha-256

Вот это поворот...мы же md5 задавали. Ну окей, не получается через переменные, действуем жестко - добавляем еще в секцию environment

      - "POSTGRES_INITDB_ARGS=--auth-host=md5"

Пересоздаем контейнер и проверяем

SHOW password_encryption;
> md5

Авторизацию через md5 в PostgreSQL победили, а теперь и Лоцман:кб успешно подключился !!!

В процессе создан��я базы оказалось, что Лоцман:КБ требует русские локали UTF8

Нет проблем - добавляем в секцию environment

      - "LANG=ru_RU.UTF8"
      - "LC_COLLATE=ru_RU.UTF8"
      - "LC_CTYPE=ru_RU.UTF8"

Перезапускаем контейнер и получаем ошибку о том, что локали не существуют

Для добавления необходимых файлов требуется собрать свой образ

Создаем файл Dockerfile со следующим содержимым

FROM postgres:latest

RUN /usr/bin/localedef -c -i ru_RU -f UTF-8 ru_RU.UTF-8

Финальный .env выглядит так

TZ=Europe/Moscow
POSTGRES_USER=lotsman
POSTGRES_PASSWORD=l0tsm@n
POSTGRES_AUTH_METHOD=md5

Убираем из docker-compose.yaml ссылку на образ и добавляем секцию .build

Финальный docker-compose.yaml для того, чтобы собрался наш custom образ

  postgres:
    restart: always
    build: .
    volumes:
      - "./data:/var/lib/postgresql/18/data"
    environment:
      - "TZ=Europe/Moscow"
      - "PGDATA=/var/lib/postgresql/18/data" # Explicitly set PGDATA
      - "POSTGRES_DB=postgres"
      - "POSTGRES_USER=${POSTGRES_USER}"
      - "POSTGRES_PASSWORD=${POSTGRES_PASSWORD}"
      - "POSTGRES_HOST_AUTH_METHOD=${POSTGRES_AUTH_METHOD}"
      - "POSTGRES_INITDB_ARGS=--auth-host=${POSTGRES_AUTH_METHOD}"
      - "LANG=ru_RU.UTF8"
      - "LC_COLLATE=ru_RU.UTF8"
      - "LC_CTYPE=ru_RU.UTF8"
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
      interval: 10s
      timeout: 5s
      retries: 5

Пересобираем образ

docker compose up -d --build

После всех манипуляций Лоцман:КБ успешно создал и настроил базы

Почему рассинхрон методов авторизации вылился в ошибку "Истекло время ожидания" непонятно до сих пор

Готовые файлы для развертывания контейнера PostgreSQL доступны по ссылке

https://github.com/neiroman2k/lotsman-postgresql