Настройка внешнего подключения базы данных PostgreSQL

Внимание

  • Перед настройкой подключения убедитесь, что дата и время в установках сервера синхронизированы с датой и временем в установках внешней базы данных. Несовпадение даты и времени может привести к нарушениям работы лицензии.
  • Версия внешнего сервиса должна совпадать с версией, указанной в файле docker-compose.yml.

Назовите свой проект

  • В качестве примера в этой инструкции используется проект с именем testit. Вы можете использовать другое название.
  1. Подготовьте внешнюю базу данных (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;
    
  2. Для остальных БД (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;
      
  3. Закомментируйте или удалите секцию с сервисом БД (db), который будет заменен на внешний сервис, зависимости от него других контейнеров (все упоминания сервиса БД в блоках depends_on), и его вольюм (db-volume) в списке volumes в файле docker-compose.yml.

  4. В .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!
    
  5. Сконфигурируйте PostgreSQL вручную для внешних подключений на сервере расположения PostgreSQL, так как по умолчанию она не сконфигурирована для внешних подключений.

    Внимание

    Данный шаг не актуален, если вы используете кластер БД или БД в вашем окружении предоставляется как управляемое решение (вы не администрируете сервер БД). В таком случае необходимо обеспечить доступ к БД из контейнеров Test IT доступными в вашей конфигурации способами.

    Для этого выполните следующие действия:

    • В файле postgresql.conf закомментируйте следующую строку:
      # listen_addresses = 'localhost'
      
    • Откройте прослушивание на всех интерфейсах. Для этого добавьте следующую строку:
       listen_addresses = '*'
      
    • Добавьте следующие строки в файл pg_hba.conf:
      host    all             all                 0.0.0.0/0                   md5
      host    all             all               ::/0                           md5
      
      Первая строка — для адресов IPv4, вторая — для адресов IPv6. Такая конфигурация позволяет PostgreSQL принимать соединения из любых сетей.
    • Если вы хотите ограничить возможность подключения определенной подсетью, укажите адрес подсети с маской в формате CIDR, например:
      host    all             all              192.168.101.20/24               md5
      
      Подсети, в которых находятся машины с сервисами rabbitmq_consumer, webapi, auth и avatars.api, должны быть добавлены сюда, если вы не используете 0.0.0.0/0.
    • Убедитесь, что порт, на котором слушает PostgreSQL (5432 по умолчанию), открыт в настройках брандмауэра вашей ОС.
  6. Выполните установку Test IT:

    docker compose -f docker-compose.yml --project-name testit up --detach --timeout 120
    

Настройка безопасного соединения

  1. Для настройки безопасного соединения с сервисом db: подготовьте сертификаты — корневой ca.crt, а также подписанные с помощью него сертификаты и ключи серверов server.crt и server.key. Если будет включена проверка доменного имени при создании соединения, то CN сертификатов должен быть db соответственно. Названия файлов сертификатов сервера могут быть любыми.

  2. В файле 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'
    
  3. В файле .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
    
  4. Выполните следующую команду:

    trusted_certs=$(docker inspect yourproject_trusted-certificates-volume --format '{{ .Mountpoint }}')
    cp ca.crt ${trusted_certs}/
    

    ca.crt — один корневой сертификат. Если все сертификаты выписаны одним CA, выполните вышеуказанную команду несколько раз, заменяя ca.crt на те CA, которыми выписаны сертификаты серверов.

  5. Настройте права пользователя (999) в файле server.key:

    chown 999 server.key
    chgrp 999 server.key
    chmod 600 server.key
    
  6. Скопируйте файлы server.crt и server.key в соответствующий вольюм контейнера db:

    server_certs=$(docker inspect yourproject_db-tls-volume --format '{{ .Mountpoint }}')
    cp server.key server.crt ${server_certs}/
    
  7. Выполните следующие команды:

    docker compose -f docker-compose.yml --project-name testit restart
    docker compose -f docker-compose.yml --project-name testit up --detach --timeout 120
    
Обновлено: