Приобрели недавно Лоцман:КБ и в процессе установки появилась необходимость развернуть под нее 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 доступны по ссылке