Подключение PostgreSQL в Docker Compose
Внимание
- Перед настройкой подключения убедитесь, что дата и время в установках сервера синхронизированы с датой и временем в установках внешней базы данных. Несовпадение даты и времени может привести к нарушениям работы лицензии.
- Версия внешнего сервиса должна совпадать с версией, указанной в файле
docker-compose.yml
.
Назовите свой проект
- В качестве примера в этой инструкции используется проект с именем
testit
. Вы можете использовать другое название.
Подготовьте внешнюю базу данных (PostgreSQL) для каждого сервиса. Имена баз данных:
testitdb
,authdb
,avatarsdb
,backgrounddb
,licensedb
иglobalsearchdb
. Используйте команду:yum install postgresql-contrib psql -U postgres create database testitdb; create user tester with encrypted password 'tester'; grant all privileges on database testitdb to tester; \connect testitdb; CREATE EXTENSION if not exists "uuid-ossp" SCHEMA public;
Для остальных БД (
authdb
,avatarsdb
,backgrounddb
,licensedb
иglobalsearchdb
) нужно выполнить скрипт ниже подставив название БД вместоtestitdb
:- Для
authdb
:create database authdb; grant all privileges on database authdb to tester; \connect authdb; CREATE EXTENSION if not exists "uuid-ossp" SCHEMA public;
- Для
avatarsdb
:create database avatarsdb; grant all privileges on database avatarsdb to tester; \connect avatarsdb; CREATE EXTENSION if not exists "uuid-ossp" SCHEMA public;
- Для
backgrounddb
:
create database backgrounddb; grant all privileges on database backgrounddb to tester; \connect backgrounddb; CREATE EXTENSION if not exists "uuid-ossp" SCHEMA public;
- Для
licensedb
:
create database licensedb; grant all privileges on database licensedb to tester; \connect licensedb; CREATE EXTENSION if not exists "uuid-ossp" SCHEMA public;
- Для
globalsearchdb
:
create database globalsearchdb; grant all privileges on database globalsearchdb to tester; \connect globalsearchdb; CREATE EXTENSION if not exists "uuid-ossp" SCHEMA public; CREATE EXTENSION if not exists "pg_trgm" SCHEMA public;
- Для
- Для
Закомментируйте или удалите секцию с сервисом БД (
db
), который будет заменен на внешний сервис, зависимости от него других контейнеров (все упоминания сервиса БД в блокахdepends_on
), и его вольюм (db-volume
) в спискеvolumes
в файлеdocker-compose.yml
.В
.env
-файле укажите данные для подключения к внешней БД. (ip-external server/dns-name
,port
,login
,password
). В Host можно указать отдельные СУБД или одну и ту же СУБД для каждой БД.DB_CONNECTION_STRING=Host=external_server1;Port=5432;Database=testitdb;Username=tester;Password=tester;Pooling=true;Maximum Pool Size=130 #POSTGRES_DB=testitdb #POSTGRES_USER=postgres #POSTGRES_PASSWORD=F1rstL0g0N! ... AUTH_CONNECTION_STRING=Host=external_server2;Port=5432;Database=authdb;Username=tester;Password=tester;Pooling=true;Maximum Pool Size=130 #POSTGRES_AUTH_DB=authdb #POSTGRES_AUTH_USER=postgres #POSTGRES_AUTH_PASSWORD=F1rstL0g0N! ... AVATARS_CONNECTION_STRING=Host=external_server3;Port=5432;Database=avatarsdb;Username=tester;Password=tester #POSTGRES_AVATARS_DB=avatarsdb #POSTGRES_AVATARS_USER=postgres #POSTGRES_AVATARS_PASSWORD=F1rstL0g0N! ... BACKGROUND_CONNECTION_STRING=Host=external_server3;Port=5432;Database=backgrounddb;Username=tester;Password=tester #POSTGRES_BACKGROUND_DB=backgrounddb #POSTGRES_BACKGROUND_USER=postgres #POSTGRES_BACKGROUND_PASSWORD=F1rstL0g0N! ... LICENSE_DB_CONNECTION_STRING=Host=external_server3;Port=5432;Database=licensedb;Username=tester;Password=tester #POSTGRES_LICENSE_DB=licensedb #POSTGRES_LICENSE_USER=postgres #POSTGRES_LICENSE_PASSWORD=F1rstL0g0N! ... GLOBALSEARCH_CONNECTION_STRING=Host=external_server3;Port=5432;Database=globalsearchdb;Username=tester;Password=tester #POSTGRES_GLOBALSEARCH_DB=globalsearchdb #POSTGRES_GLOBALSEARCH_USER=postgres #POSTGRES_GLOBALSEARCH_PASSWORD=F1rstL0g0N!
Сконфигурируйте PostgreSQL вручную для внешних подключений на сервере расположения PostgreSQL, так как по умолчанию она не сконфигурирована для внешних подключений.
Внимание
Данный шаг не актуален, если вы используете кластер БД или БД в вашем окружении предоставляется как управляемое решение (вы не администрируете сервер БД). В таком случае необходимо обеспечить доступ к БД из контейнеров Test IT доступными в вашей конфигурации способами.
Для этого выполните следующие действия:
- В файле
postgresql.conf
закомментируйте следующую строку:# listen_addresses = 'localhost'
- Откройте прослушивание на всех интерфейсах. Для этого добавьте следующую строку:
listen_addresses = '*'
- Добавьте следующие строки в файл
pg_hba.conf
:Первая строка — для адресов IPv4, вторая — для адресов IPv6. Такая конфигурация позволяет PostgreSQL принимать соединения из любых сетей.host all all 0.0.0.0/0 md5 host all all ::/0 md5
- Если вы хотите ограничить возможность подключения определенной подсетью, укажите адрес подсети с маской в формате CIDR, например:Подсети, в которых находятся машины с сервисами
host all all 192.168.101.20/24 md5
rabbitmq_consumer
,webapi
,auth
иavatars.api
, должны быть добавлены сюда, если вы не используете0.0.0.0/0
. - Убедитесь, что порт, на котором слушает PostgreSQL (5432 по умолчанию), открыт в настройках брандмауэра вашей ОС.
- В файле
Выполните установку Test IT:
docker compose -f docker-compose.yml --project-name testit up --detach --timeout 120
Настройка безопасного соединения
Для настройки безопасного соединения с сервисом
db
: подготовьте сертификаты — корневойca.crt
, а также подписанные с помощью него сертификаты и ключи серверовserver.crt
иserver.key
. Если будет включена проверка доменного имени при создании соединения, то CN сертификатов должен бытьdb
соответственно. Названия файлов сертификатов сервера могут быть любыми.В файле
docker-compose.yml
добавьте в секциюdb
в строку command следующее:db: <...> command: postgres -c 'max_connections=300' -c 'shared_buffers=256MB' -c 'ssl=on' -c 'ssl_cert_file=/var/lib/postgresql/tls/server.crt' -c 'ssl_key_file=/var/lib/postgresql/tls/server.key'
В файле
.env
отредактируйте следующие строки, добавивSsl Mode=VerifyFull
для проверки подписи CA и домена, либоSsl Mode=VerifyCA
для проверки только CA:DB_CONNECTION_STRING
AUTH_CONNECTION_STRING
AVATARS_CONNECTION_STRING
BACKGROUND_CONNECTION_STRING
LICENSE_DB_CONNECTION_STRING
GLOBALSEARCH_CONNECTION_STRING
Например:
DB_CONNECTION_STRING=Host=db;Port=5432;Database=testitdb;Username=postgres;Password=F1rstL0g0N!;Pooling=true;Maximum Pool Size=130; Ssl Mode=VerifyFull
Выполните следующую команду:
trusted_certs=$(docker inspect yourproject_trusted-certificates-volume --format '{{ .Mountpoint }}') cp ca.crt ${trusted_certs}/
ca.crt
— один корневой сертификат. Если все сертификаты выписаны одним CA, выполните вышеуказанную команду несколько раз, заменяя ca.crt на те CA, которыми выписаны сертификаты серверов.Настройте права пользователя
(999)
в файлеserver.key
:chown 999 server.key chgrp 999 server.key chmod 600 server.key
Скопируйте файлы
server.crt
иserver.key
в соответствующий вольюм контейнераdb
:server_certs=$(docker inspect yourproject_db-tls-volume --format '{{ .Mountpoint }}') cp server.key server.crt ${server_certs}/
Выполните следующие команды:
docker compose -f docker-compose.yml --project-name testit restart docker compose -f docker-compose.yml --project-name testit up --detach --timeout 120