РАЗВЕРТЫВАНИЕ СИСТЕМЫ. DOCKER
Подготовка к установке (Linux)
Для установки ПО PLAN-R необходимо выполнить следующую последовательность операций:
- Убедится, что установлено необходимое ПО 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
Внимание! Начиная с версии Plan-R 509.0 в случае, если использование своих внешних сервисов(таких как Postgresql, Redis, Grafana и т.д.) не планируется, нужно выполнить установку внешних сервисов идущих в комплекте поставки, необходимых для запуска Plan-R. Для этого скачайте и распакуйте архив с внешними сервисами external_servises_XXX.zip командой:
unzip external_servises_XXX.zip -d ./
Извлечение файлов из архива с внешними сервисами
Далее, перейдите в папку images и выполните загрузку образов внешних сервисов, запустив скрипт ./load.sh:
Загрузка образов внешних сервисов
- Рекомендуется подготовить структуру каталогов для развертывания системы.
Рекомендуемая структура каталогов:
- /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
- Переместите скачанный дистрибутив в каталог /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
- Извлеките файлы из архива в каталог /opt/dppm, выполнив команды в соответствующем порядке
# unzip -P <_password_> /opt/dppm/distr/planr\_<_version_>.zip -d /opt/dppm/
# ls -lha
Извлечение файлов приложения из архива
- После распаковки архива переходим в каталог /opt/dppm/images для загрузки docker образов командой ./load.sh. После успешной загрузки образов каталог ./images можно удалить.
- cd /opt/dppm/images
- ./load.sh
Распаковка образов PLAN-R
Настройка SSL/TLS подключения к сервисам(Docker)
Для настройки SSL/TLS шифрования между сервисами (Postgres, Redis, RabbitMQ) необходимо подготовить следующие компоненты:
- Сгенерировать серверные сертификаты для сервисов, к которым будет происходить подключение
- Настроить Postgres, Redis, RabbitMQ для работы с сертификатами
- Изменить строки подключения для работы по ssl в файле переменных среды
Подготовка и создание серверных сертификатов
- Сформировать файл конфигурации, указав в нем необходимые расширения (req_ext) и параметры (alt_names)
- req_ext необходима для указания типа сертификата (extendedKeyUsage = serverAuth) и использования SAN (subjectAltName = @alt_names)
- alt_names необходимы для указания валидных FQDN для серверного сертификата, включая localhost (для корректной работы healthcheck) и имен сервисов
- Сформировать .csr запрос на подпись и закрытый ключ
- Подписать сертификаты корпоративным центром сертификации
Далее приведены следующие примеры для всех внешних сервисов:
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