БД mongodb

Запуск СУБД mongodb в контейнере для контура SVA #

Возможно использование внешней БД mongodb

Для контура SVA используется образ cr.repo.altuera.ru/sva/prod/mongodb:${SVA_VERSION}. Это реплика официального публичного образа версии 4.4.22 с предустановленными тестовыми сертификатами и скриптами:

  • для создания пользователя при инициализации БД
  • для обновления БД SVA

Порты #

По-умолчанию MongoDB слушает порт tcp:27017 в контейнере. Контейнеры SVA подключаются к БД внутри сети docker по имени сервиса mongo на порт по-умолчанию, поэтому публикация портов не требуется, кроме случаев:

  • требуется доступ к MongoDB извне (например, для административных целей)
  • хосты SVA не объединены сетью docker

Постоянное хранилище (Volumes) #

Контейнер с MongoDB требует двух хранилищ для сохранения настроек и данных при перезапусках контейнера:

  • /data/db путь в контейнере, где хранятся данные БД
  • /data/configdb путь в контейнере, где хранятся настройки MongoDB
volumes:
  - mongo-db:/data/db
  - mongo-configdb:/data/configdb

Для реализации постоянного хранения можно использовать как docker volumes, так и место на дисках хоста с докером

Аутентификация #

По-умолчанию аутентификация пользователей отсутствует. Доступ к БД возможен без пароля.

Задать данные для аутентификации можно следующими переменными окружения:

  • MONGO_INITDB_ROOT_USERNAME - имя root пользователя mongo (для администрирования)
  • MONGO_INITDB_ROOT_PASSWORD - пароль root пользователя mongo
  • DB_USER - имя пользователя бд для сервисов SVA
  • DB_PASSWORD - пароль бд для сервисов SVA

Данные переменные используются только при инициализации БД (первом запуске контейнера или запуск с удаленным постоянным хранилищем), если БД уже инициализирована, то наличие и/или изменение этих параметров не играет роли.

TLS #

Настройка защищенного подключения к БД с использованием TLS настраивается через параметры запуска контейнера (command):

command: [ 
      "--tlsMode", "allowTLS", 
      "--tlsCertificateKeyFile", "/cert/cert_key.pem",
      "--tlsAllowConnectionsWithoutCertificates" ]

MongoDB использует единый порт (27017 по-умолчанию) для незащищенных и защищенных подключений. Режим работы порта настраивается опцией tlsMode.

  • tlsMode режим работы TLS
    • allowTLS - можно подключаться любым способом
    • preferTLS - предпочтительно использовать TLS
    • requireTLS - обязательное использование TLS
  • tlsCertificateKeyFile - путь к файлу с сертификатом (в контейнере). Формат pem, должен содержать:
    • сертификат
    • ключ сертификата без пароля
    • при необходимости сертификаты промежуточных CA
  • tlsAllowConnectionsWithoutCertificates - опция отключает проверку сертификата клиента. Обязательна при использовании в контуре SVA, поскольку в текущей версии SVA сервисы SVA не поддерживают взаимную TLS авторизацию.

В контейнере в /cert расположены тестовые самоподписанные сертификаты, которые можно использовать для отладки и тестирования.

Операции с контейнером #

При включенной аутентификации добавлять логин и пароль к вызовам команд mongo/mongodump/mongorestore: -u <username> -p <password>

При обязательном использовании TLS (--tlsMode=requireTLS) также необходимо добавлять параметры подключения к БД через TLS: --tls --tlsCAFile </cert/CA.crt>, где </cert/CA.crt> путь в контейнере к файлу с CA сертификатами.

Выполнить скрипты миграции БД до актуальной версии #

docker exec -it <container-name> /docker-entrypoint-initdb.d/update.sh
  • При заданных параметрах MONGO_INITDB_ROOT_USERNAME или DB_USER с соответствующими паролями, эти параметры автоматически подставляются при вызове скрипта.
  • При настроенном tls, чтобы не указывать путь к CA сертификату, его можно положить в сам контейнер и указать путь к нему переменной окружения DB_CACERT_PATH=</cert/CA_fullchain.pem>

В таком случае никаких параметров при вызове скрипта указывать не потребуется.

Резервное копирование (dump) #

# все БД
docker exec -i <container-name> mongodump --gzip --archive > dump.gz
# одну БД <database_name>
docker exec -i <container-name> mongodump -d <database_name> --gzip --archive > database_name.gz

Восстановление из резервной копии #

# все БД, содержащиеся в дампе
docker exec -i <container-name> mongorestore --drop --gzip  --archive < dump.gz
# одну БД <database_name> из дампа, в котором более одной БД
docker exec -i <container-name> mongorestore --drop --nsInclude="<database_name>.*" --gzip --archive < dump.gz

Переименование БД в mongo #

# <src-db> исходная БД, <src-collection> - исходная коллекция, для всех коллекций использовать *
# <dst-db> целевая БД, <dst-collection> - целевая коллекция, для всех коллекций использовать *
docker exec -i <container-name> sh -c 'mongodump --archive --db=<src-db> --collection=<src-collection> | mongorestore --archive --nsFrom='<src-db>.<src-collection>' --nsTo='<dest-db>.<dest-collection>'

Примеры compose файлов #

Без авторизации, доступ внутри контура #

Можно использовать, если:

  • все компоненты обращаются к бд только внутри сети docker
  • если не требуется доступ к бд извне
volumes:
  mongodb-data:
  mongodb-config:
services:
  mongo:
    image: cr.repo.altuera.ru/sva/prod/mongodb:${SVA_VERSION}
    restart: unless-stopped
    volumes:
      - mongodb-data:/data/db
      - mongodb-config:/data/configdb

С авторизацией, TLS, и анонсированием портов наружу #

Если требуется безопасный авторизованный доступ к бд вне сети docker.

Постоянное хранилище вынесено на диск.

services:
  mongo:
    image: cr.repo.altuera.ru/sva/prod/mongodb:${SVA_VERSION}
    restart: unless-stopped
    ports:
      - 27017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: mongo
      MONGO_INITDB_ROOT_PASSWORD: mongo
      DB_USER: sva
      DB_PASSWORD: sva
      DB_CACERT_PATH: /cert/CA_fullchain.pem
    volumes:
      - /srv/mongo/data:/data/db
      - /srv/mongo/config:/data/configdb
    command: [
      "--tlsMode", "requireTLS",
      "--tlsCertificateKeyFile", "/cert/cert_key_fullchain.pem",
      "--tlsAllowConnectionsWithoutCertificates",
      ]
powered by Altuera