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

Важно

Версия внешнего сервиса должна совпадать с версией, указанной в файле docker-compose.yml.

  1. Подготовьте внешнюю БД (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;
    
  2. Для остальных БД (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;
      
  3. Закомментируйте или удалите секцию с сервисом БД (authdb, avatars.db, db), который будет заменен на внешний сервис, зависимости от него других контейнеров (все упоминания сервиса БД в блоках depends\_on), и его вольюмы (authdb-volume, db-volume, avatars.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!
    
  5. Так как по умолчанию PostgreSQL не сконфигурирована для внешних подключений, необходимо это сделать вручную на сервере с PostgreSQL.

    Внимание

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

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

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

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

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

  1. Для настройки безопасного соединения к сервисам 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, так как они кладутся в один вольюм и не должны перезаписывать друг друга.

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

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