РАЗВЕРТЫВАНИЕ СИСТЕМЫ. DOCKER

Подготовка к установке (Linux)

Для установки ПО PLAN-R необходимо выполнить следующую последовательность операций:

  1. Убедится, что установлено необходимое ПО Docker (19.03.0+) и docker-compose (1.27.1+)
# docker --version
Docker version 24.0.7, build afdd53b

# docker-compose –version
Docker Compose version v2.23.3-desktop.2
  1. Установка внешних сервисов

Внимание! Начиная с версии Plan-R 509.0 в случае, если использование своих внешних сервисов(таких как Postgresql, Redis, Grafana и т.д.) не планируется, нужно выполнить установку внешних сервисов идущих в комплекте поставки, необходимых для запуска Plan-R. Для этого скачайте и распакуйте архив с внешними сервисами external_servises_XXX.zip командой:

unzip external_servises_XXX.zip -d ./

register imageИзвлечение файлов из архива с внешними сервисами

Далее, перейдите в папку images и выполните загрузку образов внешних сервисов, запустив скрипт ./load.sh:

register imageЗагрузка образов внешних сервисов

  1. Рекомендуется подготовить структуру каталогов для развертывания системы.

Рекомендуемая структура каталогов:

  • /opt/dppm/ – каталог текущей развернутой системы;
  • /opt/dppm/distr – каталог для хранения скачанных дистрибутивов;
  • /opt/dppm/postgres_dump – каталог для бэкапов базы данных.

Создайте структуру каталогов, выполнив следующие команды.

# mkdir /opt/dppm && mkdir /opt/dppm/distr && mkdir /opt/dppm/postgres_dump
# cd /opt/dppm
# ls -lha

total 16K
drwxr-xr-x 4 root root 4.0K Mar 28 14:05 .
drwxr-xr-x 5 root root 4.0K Mar 28 14:05 ..
drwxr-xr-x 2 root root 4.0K Mar 28 14:05 distr
drwxr-xr-x 2 root root 4.0K Mar 28 14:05 postgres_dump
  1. Переместите скачанный дистрибутив в каталог /opt/dppm/distr/
# mv <path*to_distr>/planr*<_version_>.zip /opt/dppm/distr/
# cd /opt/dppm/distr
# ls -la

total 2638584
drwxr-xr-x 2 root root       4096 Mar 28 14:05 .
drwxr-xr-x 4 root root       4096 Mar 28 14:05 ..
-rw-r-xr-x 1 root root 2701895280 Mar 28 14:05 planr_XXX.x.zip
  1. Извлеките файлы из архива в каталог /opt/dppm, выполнив команды в соответствующем порядке
# unzip -P <_password_> /opt/dppm/distr/planr\_<_version_>.zip -d /opt/dppm/
# ls -lha

register imageИзвлечение файлов приложения из архива

  1. После распаковки архива переходим в каталог /opt/dppm/images для загрузки docker образов командой ./load.sh. После успешной загрузки образов каталог ./images можно удалить.
  • cd /opt/dppm/images
  • ./load.sh

register imageРаспаковка образов PLAN-R

Настройка SSL/TLS подключения к сервисам(Docker)

Для настройки SSL/TLS шифрования между сервисами (Postgres, Redis, RabbitMQ) необходимо подготовить следующие компоненты:

  1. Сгенерировать серверные сертификаты для сервисов, к которым будет происходить подключение
  2. Настроить Postgres, Redis, RabbitMQ для работы с сертификатами
  3. Изменить строки подключения для работы по ssl в файле переменных среды

Подготовка и создание серверных сертификатов

  1. Сформировать файл конфигурации, указав в нем необходимые расширения (req_ext) и параметры (alt_names)
  • req_ext необходима для указания типа сертификата (extendedKeyUsage = serverAuth) и использования SAN (subjectAltName = @alt_names)
  • alt_names необходимы для указания валидных FQDN для серверного сертификата, включая localhost (для корректной работы healthcheck) и имен сервисов
  1. Сформировать .csr запрос на подпись и закрытый ключ
  2. Подписать сертификаты корпоративным центром сертификации

Далее приведены следующие примеры для всех внешних сервисов:

Postgres:

# формирование конигурации для сертификата postgres
cat > postgres.conf << EOF
[req]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no

[req_distinguished_name]
C = RU
ST = Moscow
L = Moscow
O = Planr
CN = postgres

[req_ext]
subjectAltName = @alt_names
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth

[alt_names]
DNS.1 = postgres
DNS.2 = localhost
IP.1 = 127.0.0.1
EOF

## формируем .csr запрос на подпись сразу с закрытом ключем
openssl req -newkey rsa:2048 -nodes -keyout postgres.key -out postgres.csr -config postgres.conf

Redis:

# формирование конфигурации для сертификата
cat > redis.conf << EOF
[req]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no

[req_distinguished_name]
C = RU
ST = Moscow
L = Moscow
O = Planr
CN = redis

[req_ext]
subjectAltName = @alt_names
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth

[alt_names]
DNS.1 = redis
DNS.2 = localhost
IP.1 = 127.0.0.1
EOF

## формируем .csr запрос cразу с закрытым ключем на подпись
openssl req -newkey rsa:2048 -nodes -keyout redis.key -out redis.csr -config redis.conf

Rabbitmq:

# формирование конфигурации для сертификата
cat > rabbitmq.conf << EOF
[req]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no

[req_distinguished_name]
C = RU
ST = Moscow
L = Moscow
O = Planr
CN = rabbitmq

[req_ext]
subjectAltName = @alt_names
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth

[alt_names]
DNS.1 = rabbitmq
DNS.2 = localhost
IP.1 = 127.0.0.1
EOF

## формируем .csr запрос cразу с закрытым ключем на подпись
openssl req -newkey rsa:2048 -nodes -keyout rabbitmq.key -out rabbitmq.csr -config rabbitmq.conf

Для подписи сертификатов корневым сертификатом (при наличии закрытого ключа) можно использовать следующие команды:

openssl x509 -req -in postgres.csr -CA <ca>.crt -CAkey <ca>.key -CAcreateserial -out postgres.crt -days 365 -sha256 -extfile postgres.conf -extensions req_ext
openssl x509 -req -in redis.csr -CA <ca>.crt -CAkey <ca>.key -CAcreateserial -out redis.crt -days 365 -sha256 -extfile redis.conf -extensions req_ext
openssl x509 -req -in rabbitmq.csr -CA <ca>.crt -CAkey <ca>.key -CAcreateserial -out rabbitmq.crt -days 365 -sha256 -extfile rabbitmq.conf -extensions req_ext

Настройка конфигурациии внешних сервисов для SSL/TLS

Для обеспечения шифрования нужно сконфигурировать внешние сервисы (Postgres, Redis, RabbitMQ). Необходимо, создать в директории /opt/dppm/planr каталог для сертификатов tls, а так-же каталог configs который должен содержать файлы конфигурации сервиса Postgres pg_hba.conf, сервиса RabbitMQ rabbitmq.conf и сервиса Redis redis.conf . Структура каталогов tls и configs будет выглядеть, следующим образом:

./tls
├── ca.pem
├── postgres.key
├── postgres.pem
├── rabbitmq.key
├── rabbitmq.pem
├── redis.key
└── redis.pem
./configs
├── pg_hba.conf
├── rabbitmq.conf
└── redis.conf

Где:

  • pg_hba.conf - конфигурационный файл для настройки методов аутентификации и контроля доступа к серверу PostgreSQL
  • rabbitmq.conf - основной конфигурационный файл для настройки сервиса RabbitMQ
  • redis.conf - конфигурационный файл для настройки сервиса Redis
  • ca.pem - корневой сертификат или цепочка корневых сертификатов
  • postgres.key - приватный ключ серверного сертификата postgres
  • postgres.pem - серверный сертификат для postgres
  • rabbitmq.key - приватный ключ серверного сертификата rabbitmq
  • rabbitmq.pem - серверный сертификат для rabbitmq
  • redis.key - приватный ключ для redis серификата
  • redis.pem - серверный сертификат для redis

Директория /opt/dppm/planr/tls должна содержать серверные сертификаты и закрытые ключи, сгенерированные в пункте Подготовка и создание серверных сертификатов, а так же корневой сертификат ca.pem.

Настройка backup-worker:

Сначала, нужно внести изменения в конфигурацию сервиса backup-worker в файле docker-compose.yml(по-умолчанию, располагается в директории /opt/dppm/planr/docker-compose.yml). В итоге, конфигурация сервиса backup-worker в docker-compose.yml, должна иметь вид:

  backup-worker:
    image: 'registry.dppm.pro/releases/planr/worker_backup:${TAG}'
    env_file:
      - ${ENV_FILE:-.env}
    networks: *default-network
    restart: *default-restart-policy
    profiles: *default-profile
    logging: *default-logging
    volumes:
      - 'planr-storage:/planr'
      - './tls/ca.pem:/etc/ssl/certs/ca.pem'
    environment:
      - NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca.pem

Где:

  • ./tls/ca.pem:/etc/ssl/certs/ca.pem монтируем файл корневого сертификата или цепочки сертификатов в контейнер
  • NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca.pem переменная окружения Node.js которая добавляет корневой сертификат в доверенные

Настройка Postgres:

Postgres требует правильные права 644 для сертификатов и 600 для приватных ключей, поэтому необходимо их исправить следующими командами:

# назначяем права которые требует postgres
chmod 644 /opt/dppm/planr/tls/ca.pem
chmod 644 /opt/dppm/planr/tls/postgres.pem
chmod 600 /opt/dppm/planr/tls/postgres.key

# меняем владельца каталога tls на postgres
chown -R 999:999 /opt/dppm/planr/tls

Содержимое конфигурационного файла pg_hba.conf:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust

hostssl all             all             0.0.0.0/0               scram-sha-256

В конфигурации pg_hba.conf строка hostssl all all 0.0.0.0/0 scram-sha-256 задаёт правило аутентификации для подключений к базе данных:

  • hostssl подключение, через SSL/TLS
  • DATABASE = all разрешает доступ ко всем базам данных
  • USER = all разрешает подключение любому пользователю PostgreSQL
  • ADDRESS = 0.0.0.0/0 подсеть, из которой разрешены подключения
  • METHOD = scram-sha-256 метод аутентификации

Далее, необходимо внести изменения в конфигурацию сервиса Postgres в файле docker-compose.yml(по-умолчанию, располагается в директории /opt/dppm/planr/docker-compose.yml). В итоге, конфигурация сервиса Postgres в docker-compose.yml, должна иметь вид:

  postgres:
    image: 'postgres:${POSTGRES_VERSION:-18.1}'
    container_name: postgres
    user: postgres
    environment:
      POSTGRES_USER: planr
      POSTGRES_PASSWORD: planr
      POSTGRES_DB: planr
      POSTGRES_MAX_CONNECTIONS: 800
# postgress ports
    # ports:
    #   - 5432:5432
    volumes:
      - postgresql:/var/lib/postgresql
      - ./configs/pg_hba.conf:/etc/postgresql/pg_hba.conf
      - ./tls:/tls
    command: >
      postgres
      -c ssl=on
      -c ssl_cert_file=/tls/postgres.pem
      -c ssl_key_file=/tls/postgres.key
      -c ssl_ca_file=/tls/ca.pem
      -c hba_file=/etc/postgresql/pg_hba.conf
    networks: *default-network
    restart: *default-restart-policy
    profiles: ['postgres', 'all']
    shm_size: '2gb'
    healthcheck:
      test: pg_isready -U planr
      interval: 10s
      retries: 20
      start_period: 10s

Настройка Redis:

Содержимое конфигурационного файла redis.conf:

port 0
tls-port 6379
tls-cert-file /tls/redis.pem
tls-key-file  /tls/redis.key
tls-ca-cert-file /tls/ca.pem
tls-auth-clients no
replica-read-only no
save ""
appendonly no

В итоге, конфигурация сервиса Redis в docker-compose.yml, должна иметь вид:

  redis:
    image: 'redis:8.4.0'
    container_name: redis
    hostname: redis
    networks: *default-network
    restart: *default-restart-policy
    command: >
      redis-server /usr/local/etc/redis/redis.conf
      --requirepass ${REDIS_PASSWORD}
    ports:
      - "6379:6379"
    volumes:
      - ./tls:/tls
      - ./configs/redis.conf:/usr/local/etc/redis/redis.conf
    profiles: ['redis', 'all']
    healthcheck:
      test: redis-cli --pass ${REDIS_PASSWORD} --raw incr ping
      interval: 10s
      retries: 20
      start_period: 10s

Аналогичным образом, назначаем права на сертификат и ключ:

chmod 644 /opt/dppm/planr/tls/redis.pem
chmod 600 /opt/dppm/planr/tls/redis.key

Настройка RabiitMQ:

Содержимое конфигурационного файла rabbitmq.conf:

# disable anonymous auth
loopback_users = none
anonymous_login_user = none

# auth setup
# auth_mechanisms.1 = EXTERNAL
auth_backends.1 = internal
# ssl_cert_login_from = common_name

# ssl setup
listeners.tcp = none
listeners.ssl.default = 5672
ssl_options.cacertfile = /tls/ca.pem
ssl_options.certfile   = /tls/rabbitmq.pem
ssl_options.keyfile    = /tls/rabbitmq.key
ssl_options.verify     = verify_peer
ssl_options.fail_if_no_peer_cert = false
ssl_options.versions.1 = tlsv1.3
ssl_options.versions.2 = tlsv1.2

Задаём права на сертификат и ключ:

chmod 644 /opt/dppm/planr/tls/rabbitmq.pem
chmod 600 /opt/dppm/planr/tls/rabbitmq.key

Конфигурация сервиса RabbitMQ в docker-compose.yml, должна иметь вид:

  rabbitmq:
    container_name: rabbitmq
    hostname: rabbitmq
    image: 'rabbitmq:4.2.0-management'
    #  rabbitmq web UI ports
    # ports:
    #   - 15672:15672
    #   - 5672:5672
    environment:
      - RABBITMQ_DEFAULT_USER=planr
      - RABBITMQ_DEFAULT_PASS=planr
      - RABBITMQ_DEFAULT_VHOST=planr
    volumes:
      - ./tls:/tls
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
    networks: *default-network
    restart: *default-restart-policy
    profiles: ['rabbitmq', 'all']
    healthcheck:
      test: rabbitmq-diagnostics -q ping
      interval: 10s
      retries: 20
      start_period: 10s

Настройка строк подключения для работы сервисов, через SSL/TLS в файле .env

Для взаимодействия с сервисами postgres, rabbitmq, redis через защищенной SSL/TLS соединие, необходимо привести сроки подключения к сервисам в файле переменных среды .env к следующему виду:

Postgres:

Для Postgres строка подключения будет выглядеть следующим образом:

Добавляем параметр ?ssl=true

DB_URL=postgresql://planr:planr@postgres/planr?ssl=true

Redis:

заменям протокол с redis на rediss

REDIS_URL=rediss://:${REDIS_PASSWORD}@redis:6379

Rabbitmq:

Заменяем amqp на amqps и указываем порт 5672

RABBIT_URL=amqps://planr:planr@rabbitmq:5672/planr

Выполняем старт системы с помощью ./start.sh


602.0-ec0363ed