Настройка внешнего подключения базы данных PostgreSQL
Важно
Версия внешнего сервиса должна совпадать с версией, указанной в файле docker-compose.yml
.
Подготовьте внешнюю БД (PostgreSQL) для каждого сервиса (имена баз данных:
testitdb
,authdb
,avatarsdb
):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
) нужно выполнить скрипт ниже подставив название БД вместо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;
- Для
Закомментируйте или удалите секцию с сервисом БД (
authdb
,avatars.db
,db
), который будет заменен на внешний сервис, зависимости от него других контейнеров (все упоминания сервиса БД в блокахdepends\_on
), и его вольюмы (authdb-volume
,db-volume
,avatars.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!
Так как по умолчанию 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 prod up --detach --timeout 120
Настройка безопасного соединения
Для настройки безопасного соединения к сервисам
db
,authdb
иavatars.db
: подготовьте сертификаты - корневойca.crt
, а также подписанные с помощью него сертификаты и ключи серверовserver.crt
иserver.key
. Если будет включена проверка доменного имени при создании соединения, то CN сертификатов должен бытьdb
,authdb
иavatars-db
соответственно. Названия файлов сертификатов сервера могут быть любыми. Если сертификаты серверовdb
,authdb
иavatars-db
подписаны одним CA, то и файлca.crt
можно использовать один. Если сертификаты выпущены разными CA, то и имена корневых сертификатов должны отличаться, напримерdbCA.crt
,authdbCA.crt
иavatars-dbCA.crt
, так как они кладутся в один вольюм и не должны перезаписывать друг друга.В файле
docker-compose.yml
добавьте в секцииdb
,authdb
иavatars.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
Например:
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
,authdb
иavatars.db
:server_certs=$(docker inspect yourproject_db-tls-volume --format '{{ .Mountpoint }}') cp server.key server.crt ${server_certs}/ server_certs=$(docker inspect yourproject_authdb-tls-volume --format '{{ .Mountpoint }}') cp server.key server.crt ${server_certs}/ server_certs=$(docker inspect yourproject_avatars.db-tls-volume --format '{{ .Mountpoint }}') cp server.key server.crt ${server_certs}/
Выполните следующие команды:
docker-compose -f docker-compose.yml --project-name yourproject restart docker-compose -f docker-compose.yml --project-name yourproject up --detach --timeout 120