Содержание
Схема взаимодействия сервисов
Примечание: Кластер не прошёл тестирование, статья выложена без всех стадий тестирования и проверок, поэтому может быть не актуальна и иметь ошибки.
Условия развёртки:
Для всех ВМ использовался Redos 7.3.5 и рекомендуемыеми параметрами от 2 CPU, 4GB RAM, SSD от 40 GB, для NFS так же используется быстрый диск для уменьшения latency отработки данных.
Сборка осуществлялась на Корпоративном сервере 2024 версии 4400 и Сервере документов версии 622, rabbitmq версии 3.13.7, postgresql 16.4, redis 7.2.6
Созданы записи в DNS:
A *.test3.s7-office.site 192.168.27.35 A ds-cluster.test3.s7-office.site 192.168.27.35
Так же возможно создание записей для нод кластеров для обращения к ним по DNS имени. В статье описаны примеры подключения с минимальным набором A записей
Используется сертификат wildcard на домен test3.s7-office.site — будет фигурировать в настройках nginx
1. Кластер БД postgresql
Описание
- Patroni: Patroni — это инструмент для управления высокодоступным кластером PostgreSQL. Он обеспечивает автоматизированное управление основным/резервным сервером, мониторинг состояния серверов, выбора основного сервера (leader), решения конфликтов и так далее. Patroni помогает обеспечить высокую доступность и отказоустойчивость для кластера PostgreSQL.
- etcd: etcd — это распределенное хранилище ключей-значений, используемое Patroni для хранения конфигурации и состояния кластера. Он обеспечивает централизованное хранение данных, нужных для согласованности и синхронизации между серверами кластера PostgreSQL. Etcd также используется для обнаружения и выбора основного сервера. Для работы кластера необходимо , чтобы как минимум два хоста etcd были доступны
1.2 Установка кластера postgresql
1.2.1 Настройка хостов
Мы будем использовать три хоста (минимальный набор для организации кластера) для кластера postgresql и один хост для haproxy:
- psql1: 192.168.27.239 ( etcd + patroni + postgresql )
- psql2: 192.168.27.219 ( etcd + patroni + postgresql )
- psql3: 192.168.27.108 ( etcd + patroni + postgresql )
- haproxy: 192.168.27.83 (haproxy)
При использовании firewalld указать на всех нодах:
sudo firewall-cmd --permanent --add-port=2380/tcp sudo firewall-cmd --permanent --add-port=2379/tcp sudo firewall-cmd --permanent --add-port=5432/tcp sudo firewall-cmd --permanent --add-port=8008/tcp sudo firewall-cmd --reload
1.2.1.1 Переименуйте все хосты кластера postgresql и добавьте в файл hosts (в нашем случаи мы будем использовать имя psql)
1.2.1.1.1 На первом хосте
192.168.27.239: hostnamectl set-hostname psql1 systemctl restart systemd-hostnamed
1.2.1.1.2 На втором хосте
192.168.27.219: hostnamectl set-hostname psql2 systemctl restart systemd-hostnamed
1.2.1.1.3 На третьем хосте
192.168.27.108: hostnamectl set-hostname psql3 systemctl restart systemd-hostnamed
1.2.1.2 Добавьте данные о хостах в файл /etc/hosts на ВСЕХ хостах
192.168.27.239 psql1 192.168.27.219 psql2 192.168.27.108 psql3
1.2.2 Установка ETCD ( на хостах psql1, psql2, psql3 )
1.2.2.1 Обновляем систему, устанавливаем etcd, останавливаем сервис etcd
dnf update -y yum install etcd -y systemctl stop etcd
1.2.2.2 Создаем конфигурацию /etc/etcd/etcd.conf:
1.2.2.2.1 На первом хосте 192.168.27.239 psql1:
ETCD_NAME="psql1" ETCD_DATA_DIR="/var/lib/etcd/" ETCD_HEARTBEAT="1000" ETCD_ELECTION_TIMEOUT="5000" ETCD_LISTEN_PEER_URLS="http://192.168.27.239:2380" ETCD_LISTEN_CLIENT_URLS="http://192.168.27.239:2379,http://localhost:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.27.239:2380" ETCD_INITIAL_CLUSTER="psql1=http://192.168.27.239:2380,psql2=http://192.168.27.219:2380,psql3=http://192.168.27.108:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-postgres-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.27.239:2379" ETCD_ENABLE_V2="true"
1.2.2.2.2 На втором хосте 192.168.27.219 psql2:
ETCD_NAME="psql2" ETCD_DATA_DIR="/var/lib/etcd/" ETCD_HEARTBEAT="1000" ETCD_ELECTION_TIMEOUT="5000" ETCD_LISTEN_PEER_URLS="http://192.168.27.219:2380" ETCD_LISTEN_CLIENT_URLS="http://192.168.27.219:2379,http://localhost:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.27.219:2380" ETCD_INITIAL_CLUSTER="psql1=http://192.168.27.239:2380,psql2=http://192.168.27.219:2380,psql3=http://192.168.27.108:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-postgres-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.27.219:2379" ETCD_ENABLE_V2="true
1.2.2.2.3 На третьем хосте 192.168.27.108 psql3:
ETCD_NAME="psql3" ETCD_DATA_DIR="/var/lib/etcd/" ETCD_HEARTBEAT="1000" ETCD_ELECTION_TIMEOUT="5000" ETCD_LISTEN_PEER_URLS="http://192.168.27.108:2380" ETCD_LISTEN_CLIENT_URLS="http://192.168.27.108:2379,http://localhost:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.27.108:2380" ETCD_INITIAL_CLUSTER="psql1=http://192.168.27.239:2380,psql2=http://192.168.27.219:2380,psql3=http://192.168.27.108:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-postgres-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.27.108:2379" ETCD_ENABLE_V2="true"
- ETCD_NAME — имя хоста на котором производится настройка
- ETCD_LISTEN_CLIENT_URLS — url для прослушивания клиентских запросов. ( можно указать 0.0.0.0:2379 в этом случаи хост будет слушать все )
- ETCD_ADVERTISE_CLIENT_URLS — url для клиентских запросов ( указываем ip хоста, на котором производится настройка )
- ETCD_INITIAL_ADVERTISE_PEER_URLS — url для запросов от других узлов etcd ( указываем ip хоста, на котором производится настройка )
- ETCD_INITIAL_CLUSTER_TOKEN — токен для идентификации кластера ( должен совпадать на каждом хоста postgresql )
- ETCD_INITIAL_CLUSTER — все узлы и их url ( конструкция выглядит следующим образом «host_name_1=http://ip_iddress:2380,host_name_2=http://ip_iddress:2380,host_name_3=http://ip_iddress:2380» )
- ETCD_INITIAL_CLUSTER_STATE — начальное состояние кластера
- ETCD_DATA_DIR — директорию, где хранятся данные ETCD
- ETCD_ELECTION_TIMEOUT — таймаут выборов в миллисекундах
- ETCD_HEARTBEAT — интервал между отправкой heatbeat сигналов в миллисекундах
1.2.2.3 Перезапустите службы и проверьте работу etcd
systemctl daemon-reload systemctl enable etcd systemctl start etcd
В случае если были ошибки в конфигурациях и служба корректно не запускалась, потребуется удалить каталог и перезапустить службы на всех нодах:
rm -rf /var/lib/etcd/*
— каталог назначения данных
systemctl restart etcd
Для проверки работы:
etcdctl member list etcdctl endpoint status --write-out=table --endpoints=psql1:2379,psql2:2379,psql3:2379
1.2.3 Установка PostgreSQL ( на хостах psql1,psql2,psql3 )
1.2.3.1 Установите БД на всех нодах
dnf install postgresql16 postgresql16-server postgresql16-contrib -y
Проверьте что БД не запущена на всех нодах
systemctl stop postgresql-16.service
1.2.3.1.1 на первой ноде psql1
/usr/pgsql-16/bin/postgresql-16-setup initdb
— инициализация БД
systemctl start postgresql-16.service
— запуск службы
sudo -i -u postgres psql
— вход в БД
CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'replicator'; - создание пользователя replicator и установка пароля ALTER USER postgres PASSWORD 'postgres'; - изменение пользователя postgres и установка нового пароля CREATE USER cddisk WITH password 'cddisk'; - создание пользователя cddisk и установка пароля для приложения Корпоративный сервер CREATE DATABASE cddisk OWNER cddisk; - создание базы данных cddisk для приложения Корпоративный сервер GRANT ALL privileges ON DATABASE cddisk TO cddisk; - предоставление прав к БД CREATE USER ds WITH password 'ds'; создание пользователя ds и установка пароля для приложения Сервер документов CREATE DATABASE ds OWNER ds; - создание базы данных ds для приложения Сервер документов GRANT ALL privileges ON DATABASE ds TO ds; - предоставление прав к БД
Рекомендуется изменить пользователей и пароли для безопасности
При использовании firewalld добавьте на все ноды:
1.2.3.1.2 на других нодах проверить что БД не запущена
systemctl status postgresql-16.service
1.2.4 Установка Patroni( на хостах psql1, psql2, psql3 )
1.2.4.1 Установите зависимости и patroni на всех нодах
dnf install python3 python3-pip python3-psycopg2 patroni -y
dnf install python3-devel-3.8.2-15.el7.x86_64
(или более новее)
dnf install libpq-devel-15.0-2.el7.x86_64
(или более новее)
pip3 install wheel
pip3 install patroni[etcd]
Дополнительно:
в файле ~/.bashrc и добавьте
export PATRONICTL_CONFIG_FILE=/etc/patroni/patroni.yml
1.2.4.3 Создайте конфигурацию patroni
Примечание: В зависимости от версии postgresql значения data_dir и bin_dir могут быть другими.
Поэтому значения будут выглядеть следующим образом на момент сборки стенда:
data_dir: /var/lib/pgsql/16/data bin_dir: /usr/pgsql-16/bin
1.2.4.3.1 На первом хосте 192.168.27.239 postgresql1 /etc/patroni/patroni.yml:
Обратить внимание на форматирование и настройки postgresql
name: psql1 scope: pg-cluster watchdog: mode: off restapi: listen: 192.168.27.239:8008 connect_address: "192.168.27.239:8008" etcd: hosts: 192.168.27.239:2379,192.168.27.219:2379,192.168.27.108:2379 bootstrap: dcs: ttl: 30 loop_wait: 10 maximum_lag_on_failover: 1048576 postgresql: use_pg_rewind: true use_slots: true parameters: max_connections: 2000 superuser_reserved_connections: 5 max_locks_per_transaction: 64 max_prepared_transactions: 0 huge_pages: try shared_buffers: 512MB work_mem: 128MB maintenance_work_mem: 256MB effective_cache_size: 2GB checkpoint_timeout: 15min checkpoint_completion_target: 0.9 wal_compression: on min_wal_size: 2GB max_wal_size: 4GB wal_buffers: 32MB default_statistics_target: 1000 seq_page_cost: 1 random_page_cost: 4 effective_io_concurrency: 2 synchronous_commit: on autovacuum: on autovacuum_max_workers: 5 autovacuum_vacuum_scale_factor: 0.01 autovacuum_analyze_scale_factor: 0.02 autovacuum_vacuum_cost_limit: 200 autovacuum_vacuum_cost_delay: 20 autovacuum_naptime: 1s max_files_per_process: 4096 archive_mode: on archive_timeout: 1800s archive_command: cd . wal_level: replica wal_keep_segments: 130 max_wal_senders: 10 max_replication_slots: 10 hot_standby: on hot_standby_feedback: True wal_log_hints: on shared_preload_libraries: pg_stat_statements,auto_explain pg_stat_statements.max: 10000 pg_stat_statements.track: all pg_stat_statements.save: off auto_explain.log_min_duration: 10s auto_explain.log_analyze: true auto_explain.log_buffers: true auto_explain.log_timing: false auto_explain.log_triggers: true auto_explain.log_verbose: true auto_explain.log_nested_statements: true track_io_timing: on log_lock_waits: on log_temp_files: 3 track_activities: on track_counts: on track_functions: all log_checkpoints: on logging_collector: on log_truncate_on_rotation: on log_rotation_age: 1d log_rotation_size: 0 log_line_prefix: '%t [%p-%l] %r %q%u@%d ' log_filename: 'postgresql-%a.log' log_directory: /var/lib/pgsql/16/data/log initdb: - encoding: UTF8 - data-checksums pg_hba: - local all postgres peer - host replication replicator 192.168.27.239/32 md5 - host replication replicator 192.168.27.219/32 md5 - host replication replicator 192.168.27.108/32 md5 - host replication replicator 127.0.0.1/32 md5 - host all all 0.0.0.0/0 md5 postgresql: pgpass: /var/lib/pgsql/16/.pgpass listen: 192.168.27.239:5432 connect_address: "192.168.27.239:5432" data_dir: /var/lib/pgsql/16/data/ bin_dir: /usr/pgsql-16/bin/ config_dir: /var/lib/pgsql/16/data pg_hba: - local all postgres peer - host replication replicator 192.168.27.239/32 md5 - host replication replicator 192.168.27.219/32 md5 - host replication replicator 192.168.27.108/32 md5 - host replication replicator 127.0.0.1/32 trust - host all all 0.0.0.0/0 md5 replication: username: replicator password: replicator superuser: username: postgres password: postgres remove_data_directory_on_rewind_failure: false remove_data_directory_on_diverged_timelines: false create_replica_methods: - basebackup basebackup: max-rate: '100M' checkpoint: 'fast' watchdog: mode: off # Allowed values: off, automatic, required device: /dev/watchdog safety_margin: 5 tags: nofailover: false noloadbalance: false clonefrom: false nosync: false
В конфигурации параметры БД возможно изучить на сайте postgresql
1.2.4.3.2 На втором хосте 192.168.27.219 psql2 /etc/patroni/patroni.yml
Так же укажите файл patroni.yml, изменив на ip адреса машины 192.168.27.219:8008
в параметрах
restapi: listen: 192.168.27.239:8008 connect_address: "192.168.27.239:8008" postgresql: pgpass: /var/lib/pgsql/16/.pgpass listen: 192.168.27.239:5432 connect_address: "192.168.27.239:5432"
1.2.4.3.3 На втором хосте 192.168.27.108 psql3 etc/patroni/patroni.yml
Так же указать файл patroni.yml, изменив на ip адреса машины аналогично прошлому пункту 192.168.27.108:8008
1.2.4.3.4 Выполните команды на всех нодах
sudo chown postgres:postgres -R /etc/patroni sudo chmod 700 /etc/patroni
Примечание: В случае использовании firewalld:
firewall-cmd --permanent --add-port=8008/tcpfirewall-cmd --reload
1.2.4.4 Краткое описание /etc/patroni/patroni.yml:
Это конфигурационный файл для Patroni, инструмента управления высокодоступным кластером PostgreSQL.
scope: Название кластера («pg_cluster»)
name: Имя текущего узла («postgresql1 или postgreslq2»).
restapi: Настройки для REST API Patroni.
- listen: IP и порт для прослушивания REST API («0.0.0.0:8008»).
- connect_address: IP и порт, по которым будут подключаться клиенты к REST API (192.168.27.239:8008).
etcd: Настройки для подключения к ETCD, распределенному хранилищу состояния.
- hosts: Список хостов ETCD для подключения (192.168.27.239:2379,192.168.27.219:2379,192.168.27.108:2379).
bootstrap: Настройки для начальной настройки кластера.
- dcs: Настройки распределенной системы координирования (DCS).
- ttl: Время жизни записи в DCS в секундах («30»).
- loop_wait: Интервал опроса DCS в секундах («10»).
- retry_timeout: Тайм-аут для повторных попыток взятия лока в DCS в секундах («10»).
- maximum_lag_on_failover: Максимально допустимая задержка репликации перед переключением мастера в байтах («1048576»).
- postgresql: Настройки для PostgreSQL.
- use_pg_rewind: Использовать ли pg_rewind для восстановления («true»).
- use_slots: Включить ли использование слотов репликации («true»).
- parameters: Дополнительные параметры PostgreSQL, указанные в формате «ключ: значение».
- initdb: Настройки для команды initdb.
- pg_hba: Разрешения доступа к PostgreSQL.
- users: Пользователи PostgreSQL.
- admin: Имя пользователя («admin») и его настройки, включая пароль и опции.
postgresql: Настройки для PostgreSQL.
- listen: IP и порт для прослушивания PostgreSQL (0.0.0.0:5432 — для всех адресов без исключения).
- connect_address: IP и порт, по которым будут подключаться клиенты к PostgreSQL (192.168.27.239:5432).
- data_dir: Директория, где хранятся данные PostgreSQL («/var/lib/pgsql/16/data/»).
- config_dir: Директория настроек существующей базы («/var/lib/pgsql/16/data»)
- bin_dir: Директория, где находятся исполняемые файлы PostgreSQL («/usr/lib/postgresql/16/bin»).
- pgpass: Путь к файлу pgpass для автоматической аутентификации в PostgreSQL.
- authentication: Настройки аутентификации PostgreSQL.
- replication: Пользователь для репликации («replicator») и его пароль.
- superuser: Суперпользователь («postgres») и его пароль.
- parameters: Дополнительные параметры PostgreSQL, указанные в формате «ключ: значение».
tags: Дополнительные теги для управления поведением Patroni.
- nofailover: Запретить автоматический переход к другому мастеру при сбое («false»).
- noloadbalance: Запретить автоматическую балансировку нагрузки («false»).
- clonefrom: Запретить клонирование другой реплики («false»).
- nosync: Отключить синхронизацию реплик («false»).
1.2.4.5 Настройка сервиса patroni для всех нод
в файл ~/.bashrc добавьте
export PATRONICTL_CONFIG_FILE=/etc/patroni/patroni.yml
1.2.4.6 Перезапустите сервис patroni и проверьте состояние кластера:
systemctl daemon-reload systemctl enable patroni --now systemctl status patroni patronictl list
1.2.4.7 Полезные команды при настройке
в случае если не указывался из пункта 1.2.4.5, то потребуется указания ключа -с
patronictl -c /etc/patroni/patroni.yml edit-config
— изменение принятой конфигурации patroni.yml (может потребовать при проверке правильности принимаемых параметров patroni)
patronictl -c /etc/patroni/patroni.yml restart pg-cluster psql1 patronictl -c /etc/patroni/patroni.yml restart pg-cluster psql2 patronictl -c /etc/patroni/patroni.yml restart pg-cluster psql3 patroni --validate-config /etc/patroni/patroni.yml проверка конфигурации на ошибки
Система сама выберет лидера(master) и реплики (slave).
Если выключить машину Лидер то этот статус автоматически назначается на любой доступный хост.
2. Rabbitmq кластер
2.1. Установка ПО RabbitMQ
Примечание: При включенной службе firewalld необходимо добавить порты 15672, 25672, 4369 и выполнить настройку для amqp.
# Добавьте службу: firewall-cmd --zone=public --add-service=amqp (все ноды в кластере RabbitMQ + хост с HAProxy) # Добавьте порты: firewall-cmd --zone=public --add-port=25672/tcp (все ноды в кластере RabbitMQ) firewall-cmd --zone=public --add-port=4369/tcp (все ноды в кластере RabbitMQ) firewall-cmd --zone=public --add-port=15672/tcp (все ноды в кластере RabbitMQ + хост с HAProxy) # Примените внесённые изменения: firewall-cmd --runtime-to-permanent # Проверяем правила для зоны public: firewall-cmd --zone=public --list-all
2.1.1 Установка ПО RabbitMQ для всех нод
dnf install rabbitmq-server -y systemctl enable --now rabbitmq-server
2.2. Настройка хостов с ПО RabbitMQ
Примечание: При отсутствии возможности добавить записи на DNS сервере, необходимо сделать записи в файле /etc/hosts на ВСЕХ нодах в кластере и хосте с HAProxy.
/etc/hosts 127.0.0.1 localhost rabmq1 192.168.27.238 rabmq1.localdomain 192.168.27.118 rabmq2.localdomain 192.168.27.31 rabmq3.localdomain 192.168.27.83 haproxy
Переименуйте все ноды
hostnamectl set-hostname rabmq1.localdomain hostnamectl set-hostname rabmq2.localdomain hostnamectl set-hostname rabmq3.localdomain
2.2.1 Настройка ноды rabmq1
# Создаем файл mcedit /etc/rabbitmq/rabbitmq-env.conf # Добавляем переменные окружения RABBITMQ_NODENAME=rabbit@rabmq1.localdomain RABBITMQ_USE_LONGNAME=true
2.2.2 Настройка нод rabmq2 и rabmq3
# Создаем файл mcedit /etc/rabbitmq/rabbitmq-env.conf # Добавляем переменные окружения RABBITMQ_NODENAME=rabbit@rabmq2.localdomain RABBITMQ_USE_LONGNAME=true
и
# Создаем файл mcedit /etc/rabbitmq/rabbitmq-env.conf # Добавляем переменные окружения RABBITMQ_NODENAME=rabbit@rabmq3.localdomain RABBITMQ_USE_LONGNAME=true
2.2.3 Скопируйте сookie с Primary на Secondary ноды
Любым удобным для Вас способом, копируем c заменой сookie /var/lib/rabbitmq/.erlang.cookie
с rabmq1 ноды на ВСЕ остальные ноды в кластере.
назначьте права на сookie на нодах
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
Перезапустите службу на всех нодах кластера
systemctl restart rabbitmq-server
2.2.4 Добавление нод rabmq2 и rabmq3 к кластеру
# Остановите приложение на нодах rabmq2 и rabmq3 для добавления к кластеру: rabbitmqctl stop_app # Потребуется сброс rabbitmq на нодах rabmq2 и rabmq3 rabbitmqctl reset # Добавьте ноды к кластеру, выполните на rabmq2 и rabmq3 rabbitmqctl join_cluster rabbit@rabmq1.localdomain # Запустите приложение на нодах rabmq2 и rabmq3: rabbitmqctl start_app # Проверьте статус кластера на всех нодах: rabbitmqctl cluster_status
2.3. Настройка кластера RabbitMQ
2.3.1 Включите плагин Management Plugin на всех нодах кластера
rabbitmq-plugins enable \ rabbitmq_management
2.3.2 Создайте виртуальный хост для haproxy и пользователя для подключения к Серверу документов и Корпоративному серверу
На ноде rabmq1 создайте vhost haproxy и пользователя r7office с доступом к vhost:
rabbitmqctl add_vhost haproxy
Создайте пользователя r7office с паролем r7office и выдайте ему права
rabbitmqctl add_user r7office r7office
Примечание: На версии КС 4400 нет возможности использовать отличный от корня «/». Предоставьте права r7-office для Корпоративного сервера:
rabbitmqctl set_permissions -p / r7office ".*" ".*" ".*"
При необходимости выдайте права администратора если будет использоваться пользователь для подключения с помощью Management Plugin
rabbitmqctl set_user_tags r7office administrator
Выдайте права пользователю r7office на vhost haproxy (кластер сервера документов)
rabbitmqctl set_permissions -p haproxy r7office ".*" ".*" ".*"
Настраиваем зеркальную очередь с префиксом amq (при сбое сервера A эти блоки очереди выходят на сервер B)
rabbitmqctl set_policy haproxy '^(?!amq\.).*' '{"ha-mode": "all"}'
2.4 Проверяем работу кластера
Поочередно останавливаем службу rabbitmq-server.service на нодах кластера
systemctl stop rabbitmq-server.service
Проверяем состояние ноды с помощью плагина Management Plugin http://192.168.27.238:15672/
3. Кластер Redis
Примечание: При отсутствии возможности добавить записи на DNS сервере, необходимо сделать записи в файле /etc/hosts на ВСЕХ нодах в кластере и хосте с HAProxy.
/etc/hosts 127.0.0.1 localhost redis1 192.168.27.238 redis1.localdomain redis1 192.168.27.118 redis2.localdomain redis2 192.168.27.31 redis3.localdomain redis3 192.168.27.83 haproxy
Переименуйте все ноды:
hostnamectl set-hostname redis1.localdomain hostnamectl set-hostname redis2.localdomain hostnamectl set-hostname redis3.localdomain
При включенной службе firewalld необходимо добавить порты 15672, 25672, 4369 и выполнить настройку для amqp.
# Добавляем порты: firewall-cmd --permanent --add-port=6379/tcp (redis, все ноды в кластере ) firewall-cmd --permanent --add-port=26379/tcp (sentinal, все ноды в кластере) # Применяем внесённые изменения: firewall-cmd --runtime-to-permanent # Проверяем правила для зоны public: firewall-cmd --zone=public --list-all
3.1 Установка Redis и Sentinal
dnf install redis -y
на все ноды
3.2 Настройка
Внесите правки в файл /etc/redis/redis.conf
maxclients 20000 - максимальное количество клиентов maxmemory-policy allkeys-lfu - политика вытеснения ключей save "" - политика создания снапшотов - отключение appendonly no - отключение сохранения базы данных Redis в файл masterauth "SecretPassword" - укажите пароль к Мастеру Укажите представление ноды в кластере: на ноде redis1: replica-announce-ip redis1.localdomain на ноде redis2: replica-announce-ip redis2.localdomain на ноде redis3: replica-announce-ip redis3.localdomain requirepass "SecretPassword" - пароль к Мастеру На нодах redis2 и redis3 укажите: replicaof redis1.localdomain 6379
Внесите правки в файл /etc/redis/sentinel.conf
на ноде redis 1 sentinel announce-ip redis1.localdomain на ноде redis 2 sentinel announce-ip redis2.localdomain на ноде redis 3 sentinel announce-ip redis-3.localdomain на всех нодах sentinel monitor mymaster redis1.localdomain 6379 2 sentinel auth-pass mymaster SecretPassword sentinel down-after-milliseconds mymaster 3000 sentinel failover-timeout mymaster 6000 sentinel resolve-hostnames yes sentinel announce-hostnames yes
3.3 Запустите сервисы и проверьте работу
sudo systemctl restart redis sudo systemctl enable redis
redis-cli -p 26379 info sentinel
— инфо о работе sentinelredis-cli -p 26379 sentinel ckquorum mymaster
— инфо о кворумеredis-cli -a SecretPassword info replication | grep role
— проверка роли
4. HAProxy для кластеров PGSQL, RabbitMQ, Redis
HAProxy — это программное обеспечение балансировки нагрузки и прокси-сервер, который часто используется в кластерах для распределения запросов по различным серверам баз данных. HAProxy принимает запросы от клиентов и направляет их к соответствующим серверам в кластере, чтобы достичь балансировки нагрузки и повысить производительность кластера. Адресация на кластера будет производится согласно портам сервисов.
4.1 Установка и запуск сервиса
dnf install haproxy systemctl enable haproxy --now
4.2 Настройка
В файле /etc/haproxy/haproxy.cfg укажите адреса нод кластеров psql, rabbitmq, redis
#--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global # to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the '-r' option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log log /dev/log local0 log /dev/log local1 notice #chroot /var/lib/haproxy pidfile /var/run/haproxy.pid stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners maxconn 4000 user haproxy group haproxy daemon #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode tcp log global retries 3 timeout queue 5s timeout connect 10s timeout client 1m timeout server 1m timeout check 10s listen stats mode http bind :7000 stats enable stats uri / ### PostgreSQL ### listen postgres_master bind :5000 option tcplog option httpchk OPTIONS /master http-check expect status 200 default-server inter 3s fastinter 1s fall 3 rise 4 on-marked-down shutdown-sessions server psql1 192.168.27.239:5432 check port 8008 #адрес первой ноды БД server psql2 192.168.27.219:5432 check port 8008 #адрес второй ноды БД server psql3 192.168.27.108:5432 check port 8008 #адрес третьей ноды БД listen postgres_replicas bind :5001 option tcplog option httpchk OPTIONS /replica balance roundrobin http-check expect status 200 default-server inter 3s fastinter 1s fall 3 rise 2 on-marked-down shutdown-sessions server psql1 192.168.27.239:5432 check port 8008 #адрес первой ноды БД server psql2 192.168.27.219:5432 check port 8008 #адрес второй ноды БД server psql3 192.168.27.108:5432 check port 8008 #адрес третьей ноды БД ### PostgreSQL ### ### RabbitMQ ### listen rabbitmq bind :5672 mode tcp balance roundrobin server rabmq1 rabmq1.localdomain:5672 check inter 2s rise 2 fall 3 #адрес первой ноды брокера сообщений server rabmq2 rabmq2.localdomain:5672 check inter 2s rise 2 fall 3 #адрес второй ноды брокера сообщений server rabmq3 rabmq3.localdomain:5672 check inter 2s rise 2 fall 3 #адрес третьей ноды брокера сообщений listen rabbitmq_management bind :15672 balance source server rabmq1 rabmq1.localdomain:15672 check inter 2s #адрес первой ноды брокера сообщений server rabmq2 rabmq2.localdomain:15672 check inter 2s #адрес второй ноды брокера сообщений server rabmq3 rabmq3.localdomain:15672 check inter 2s #адрес третьей ноды брокера сообщений ### RabbitMQ ### ### Redis ### frontend redis_master bind :6379 mode tcp option tcplog option clitcpka timeout client 24h default_backend redis_master backend redis_master balance first mode tcp timeout queue 2s timeout connect 2s timeout check 1s option srvtcpka timeout server 24h option tcp-check tcp-check connect tcp-check send AUTH\ SecretPassword\r\n #укажите пароль для мастера из пункта 3.2 tcp-check send PING\r\n tcp-check expect string +PONG tcp-check send info\ replication\r\n tcp-check expect string role:master tcp-check send QUIT\r\n tcp-check expect string +OK server redis1 192.168.27.208:6379 check inter 5s server redis2 192.168.27.133:6379 check inter 5s server redis3 192.168.27.185:6379 check inter 5s ### Redis ###
haproxy -f /etc/haproxy/haproxy.cfg -d
— для проверки конфигурацииsysmtectl status haproxy
— для проверки статуса сервиса
5. NFS — хранение общих каталогов
При включенной службе firewalld необходимо добавить сервис и выполнить настройку для nfs.
# Добавляем службу: sudo firewall-cmd --permanent --zone=public --add-service=nfs # Перезапускаем службу firewalld: sudo firewall-cmd --reload # Проверяем правила для зоны public: sudo firewall-cmd --zone=public --list-all
5.1 Установка
sudo dnf install nfs-utils nfs4-acl-tools -y sudo systemctl enable nfs-server --now
5.2 Настройка
Каталоги для Сервера документов:
mkdir -p /mnt/ds/cache
— общий каталог кэшированных данных (распакованных файлов) сервера документовmkdir -p /mnt/ds/data/
— размещается файл лицензии с именно таким именем license.lic
Каталоги для Корпоративного сервера 2024:
mkdir -p /mnt/search
— хранение индексов для поисковой системыmkdir -p /mnt/disk
mkdir -p /mnt/disk/filestorage
— хранение пользовательских данныхmkdir -p /mnt/disk/filestorage_temp
— временный каталог хранения пользовательских данныхmkdir -p /mnt/disk/filestorage_temp_proc
— каталог для хранения временных данных proccessing
5.2.1 Указание пользователя и группы на каталоги
Важно заметить, что в данной инструкции рассматривается чистая инсталляции без имеющихся Сервера документов (DS). Если у Вас уже есть DS, то необходимо указать UID и GID пользователя ds с ВМ, где установлен DS.
Можно воспользоваться командой:
id ds
В данной инструкции установки не рассматривается наличие уже установленного Документ сервера, поэтому UID и GID будут везде указаны 976. Если Вам важно сохранить имеющийся DS, то необходимо использовать GID и UID с данной ВМ, либо изменить их на ней, возможно использовать данные команды:
supervisorctl stop all groupmod -g 976 ds usermod -u 976 -g 976 ds chown -R ds:ds /var/lib/r7-office/ chown -R ds:ds /var/www/r7-office/ chown -R ds:ds /etc/r7-office/
В случае если сервер не установлен перейдите к пункту 7 и после установки DS проверьте какие выданы GID и UID на установленном сервере документов
Создание пользователя на хосте с ролью NFS:
ВАЖНО: UID и GID пользователя ds должны быть одинаковые на всех ВМ с Документ сервером и NFS хранилищем
Создайте группу с gid 976
groupadd -g 976 ds
Создайте пользователя с uid 976 и добавляем его в группу с gid 976
useradd -u 976 -g 976 ds
Укажите права на каталоги
chown ds:ds -R /mnt/ds/
5.2.2 Редактируйте файл
/etc/exports /mnt/ds/cache 192.168.26.0/24(rw,insecure,nohide,all_squash,anonuid=976,anongid=976,no_subtree_check) /mnt/ds/data 192.168.26.0/24(rw,insecure,nohide,all_squash,anonuid=976,anongid=976,no_subtree_check) /mnt/disk/filestorage 192.168.27.0/24(rw,nohide,all_squash,anonuid=119,anongid=131,no_subtree_check) /mnt/disk/filestorage_temp 192.168.27.0/24(rw,nohide,all_squash,anonuid=119,anongid=131,no_subtree_check) /mnt/disk/filestorage_temp_proc 192.168.27.0/24(rw,nohide,all_squash,anonuid=119,anongid=131,no_subtree_check) /mnt/search 192.168.26.0/24(rw,nohide,all_squash,anonuid=972,anongid=972,no_subtree_check)
где,
- /mnt/ds/cache –путь к папке, для которой раздается доступ;
- 192.168.26.0/24 –IP-адрес, которому раздается доступ к папке (можно указать всю сеть, тогда запись примет вид 192.168.1.0/24)
- (rw,no_root_squash,sync) –набор опций, опции могут быть:
- rw –чтение запись(может принимать значение ro-только чтение);
- no_root_squash – по умолчанию пользователь root на клиентской машине не будет иметь доступа к разделяемой директории сервера. Этой опцией мы снимаем это ограничение. В целях безопасности этого лучше не делать;
- nohide — NFS автоматически не показывает нелокальные ресурсы (например, примонтированые с помощью mount –bind), эта опция включает отображение таких ресурсов;
- subtree_check (no_subtree_check) — в некоторых случаях приходится экспортировать не весь раздел, а лишь его часть. При этом сервер NFS должен выполнять дополнительную проверку обращений клиентов, чтобы убедиться в том, что они предпринимают попытку доступа лишь к файлам, находящимся в соответствующих подкаталогах. Такой контроль поддерева (subtree checks) несколько замедляет взаимодействие с клиентами, но если отказаться от него, могут возникнуть проблемы с безопасностью системы. Отменить контроль поддерева можно с помощью опции no_subtree_check. Опция subtree_check, включающая такой контроль, предполагается по умолчанию. Контроль поддерева можно не выполнять в том случае, если экспортируемый каталог совпадает с разделом диска;
Для публикации сетевых директорий
exportfs -ra
6. Кластер ДС
При включенной службе firewalld необходимо добавить сервис и выполнить настройку для Сервера документов.
# Добавляем службу: sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https # Перезапускаем службу firewalld: sudo firewall-cmd --reload # Проверяем правила для зоны public: sudo firewall-cmd --zone=public --list-all
6.1 Установите и запустите nginx
dnf install nginx -y systemctl enable nginx --now
6.2 Установка утилита nfs и монтирование каталоги
6.2.1 Установите пакет
dnf install nfs-utils
6.2.2 Создайте группу и пользователя (id те же, что и на nfs должны быть)
groupadd -g 976 ds useradd -u 976 -g 976 ds
6.2.3 Создайте каталоги
mkdir /var/lib/r7-office/documentserver/App_Data/cache -p mkdir /var/www/r7-office/Data -p
6.2.4 Назначьте права
chown ds:ds -R /var/lib/r7-office/ chown ds:ds -R /var/www/r7-office/
6.2.5 Монтирование
sudo mount -t nfs -O uid=1100,iocharset=utf-8 192.168.26.247:/mnt/ds/cache /var/lib/r7-office/documentserver/App_Data/cache sudo mount -t nfs -O uid=1100,iocharset=utf-8 192.168.26.247:/mnt/ds/data /var/www/r7-office/Data
Где,
- 192.168.26.247 — ip nfs сервера;
- /mnt/ds/cahce и /mnt/ds/data— каталог на nfs сервере;
- /var/www/r7-office/Data и /var/lib/r7-office/documentserver/App_Data/cache — пути монтирования на ВМ с DS.
6.2.6 Проверьте монтирование
df -h
6.2.7 Добавьте запись в /etc/fstab
192.168.26.247:/mnt/ds/cache /var/lib/r7-office/documentserver/App_Data/cache nfs defaults 0 0 192.168.26.247:/mnt/ds/data /var/www/r7-office/Data nfs defaults 0 0
6.3 Установка Сервера документов и настройка
Произведите установку сервера документов по актуальной инструкции
В файл /etc/hosts добавьте запись для адресации с haproxy
192.168.27.83 haproxy
6.3.1 Конфигурация
Если это первая инсталляция, то файла этого нет, можете сделать рандомный секрет, например, командой ниже:
AuthorizationJwt можете использовать по умолчанию.
cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 32
Задайте секрет и хедер
declare -x JWT_SECRET=VrTMopwWwGP1 declare -x JWT_HEADER=AuthorizationJwt
Это параметры из файла /etc/r7-office/documentserver/local.json
Должны быть ОДИНАКОВЫ для всех ВМ с DS в кластере, если используется JWT
Если JWT необходимо отключить, то выполните данную команду
declare -x JWT_ENABLED=false
Запустите скрипт
bash documentserver-configure.sh
Будут запрошены данные
Для PostgreSQL:
- Host: 192.168.27.83:5000
- Database: ds
- User: ds
- Password: ds
Где,
- host — ip адрес HAproxy;
- Database — имя Базы Данных;
- User — Имя пользователя;
- Password — Пароль от пользователя.
Для AMQP
- Host: 192.168.27.83
- User: r7office
- Password: r7office
Где,
- host — ip адрес HAproxy;
- user — пользователь для подключения;
- password — пароль от пользователя.
В конфигурации /etc/r7-office/documentserver/local.json укажите в параметре rabbitmq:
"rabbitmq": { "url": "amqp://r7office:r7office@192.168.27.83/ds" },
- где r7office:r7office — логин и пароль из пункта 2.3.2;
- 192.168.27.83 — адрес сервера haproxy;
- /ds — виртуальный адрес из пункта 2.3.2
Для Redis:
в файле /etc/r7-office/documentserver/default.json измените параметр host и добавьте опцию авторизации password:
"redis": { "name": "redis", "prefix": "ds:", "host": "192.168.27.83", "port": 6379, "options": { "password": "SecretPassword" } },
Где,
- host — ip адрес HAproxy;
- prefix — ключи для идентификации сервера документов
- port — порт подключения;
- password — пароль от пользователя.
Выполните перезапуск служб сервера документов
systemctl restart ds-*
6.3.2 Проверьте статус служб
systemctl status ds-*
и логирование в файле /var/log/r7-office/documentserver/docservice/out.log
6.3.3 Повторить для всех нод Сервера документов и указать одинаковые параметры JWT secret и header
7. NGINX балансер (внешний)
При включенной службе firewalld необходимо добавить сервис и выполнить настройку для Nginx прокси сервера.
# Добавляем службу: sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https # Перезапускаем службу firewalld: sudo firewall-cmd --reload # Проверяем правила для зоны public: sudo firewall-cmd --zone=public --list-all
7.1 Установите и запустите nginx
dnf install nginx -y systemctl enable nginx --now
7.2 Добавьте конфигурационный файл
7.2.1 /etc/nginx/conf.d/r7-ds.conf
Данная настройка является Проксированием HTTPS на HTTP (Прокси сервер на HTTPS, DS на HTTP)
Этот сценарий используется, если требуется обеспечить безопасное соединение, чтобы все запросы автоматически перенаправлялись на HTTPS
upstream docservice { # Указать все сервера с DS server 192.168.26.65; server 192.168.26.133; } map $http_host $this_host { "" $host; default $http_host; } map $http_x_forwarded_proto $the_scheme { default $http_x_forwarded_proto; "" $scheme; } map $http_x_forwarded_host $the_host { default $http_x_forwarded_host; "" $this_host; } map $http_upgrade $proxy_connection { default upgrade; "" close; } proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $proxy_connection; proxy_set_header X-Forwarded-Host $the_host; proxy_set_header X-Forwarded-Proto $the_scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ## Normal HTTP host server { listen 0.0.0.0:80; server_name ds-cluster.test3.s7-office.site; server_tokens off; ## Redirects all traffic to the HTTPS host return 301 https://$server_name:443$request_uri; } server { listen 0.0.0.0:443 ssl http2; server_name ds-cluster.test3.s7-office.site; server_tokens off; root /usr/share/nginx/html; ssl_certificate /etc/nginx/ssl/test3.s7-office.site.crt; ssl_certificate_key /etc/nginx/ssl/test3.s7-office.site.key; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_prefer_server_ciphers on; ## [Optional] Before enabling Strict-Transport-Security headers, ensure your server is properly configured for SSL. ## This directive informs the browser to always use HTTPS. For more info see: ## - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; location / { proxy_pass http://docservice; proxy_http_version 1.1; } }
- в блоке upstream docservice {} — указаны сервера DS;
- server_name ds-cluster.test3.s7-office.site; — указано dns имя reverse proxy;
- ssl_certificate /etc/nginx/ssl/test3.s7-office.site.crt; — указан путь до полной цепочки сертификатов;
- ssl_certificate_key /etc/nginx/ssl/test3.s7-office.site.key; — указан путь до закрытого ключа.
7.2.2 Проверьте конфигурацию
nginx -t
7.2.3 Перезапустите сервис
systemctl restart nginx
7.2.4 Проверьте доступность
Перейдите по адресу ds-cluster.s7-office.site.ru и будет отображаться страница запущенного сервера документов
8. Установка сервера приложений Корпоративный сервер 2024
Информация дополняет действия из статьи.
Корпоративный сервер — сервер приложений будет разведен на несколько серверов согласно схеме
При включенной службе firewalld необходимо добавить сервис и выполнить настройку для Корпоративного сервера и после развертки всей
# Добавляем службу: sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https # Перезапускаем службу firewalld: sudo firewall-cmd --reload # Проверяем правила для зоны public: sudo firewall-cmd --zone=public --list-all
8.1 Добавление репозитория
8.1.1 Откройте файл на редактирование
/etc/yum.repos.d/r7server.repo
8.1.2 Добавьте следующий текст
[r7server] name=r7server baseurl=https://downloads.r7-office.ru/repository/r7-server-yum/ enabled=1 gpgcheck=1 gpgkey=https://download.r7-office.ru/repos/RPM-GPG-KEY-R7-OFFICE.public sslverify=1 username=server password=KwmuQmOzuFIw9wcJsL3zb
8.1.3. Обновите список репозиториев с подгружаемыми данными
sudo yum makecache
8.2 Скачайте архив Р7-Диск для установки и положите его на ВМ
Рекомендуем, для корректной установки, архив разместить в директории, отличной от /root, например в /mnt или /tmp
8.2.1 Зайдите в директорию с архивом
cd /mnt
8.2.2 Распакуйте архив
unzip RedOS_*.zip
8.2.3 Выполните команду
sed -i "s/dnf install -y postgresql-client/dnf install -y postgresql/" CDDisk/install.sh
8.2.4 Настройка SSL
Перед установкой скопируйте crt и key файлы в папку sslcert.
Имя файла должно содержать название домена и расширение.
Обязательно в .crt указывать всю цепочку сертификатов, домен, промежуточные и корневой.
Например, для домена test3.s7-office.site имена файлов должны быть test3.s7-office.site.crt и test3.s7-office.site.key.
8.2.5 Добавьте права на исполнение скрипту
chmod +x online_installer.sh
8.2.6 Запустите установку
sudo bash ./online_installer.sh
На запрос пароля для sudo введите его
8.3 В процессе установки:
8.3.1 Чистая установка
Если требуется выполнить чистую установку (удалит имеющуюся инсталляцию Р7-Диск и зависимости):
- Выберите Да
8.3.2 Установка СУБД
PostgreSQL будет на другой ВМ:
- Выберите Да
8.3.3 Установка сервера документов:
Сервер Документов находится на другой ВМ, то:
- Выберите Нет
Также, необходимо сделать А запись в dns указывающий Ваш домен и IP адрес внешнего proxy nginx сервера из пункта 7
Пример добавленной А записи в DNS у провайдера Selectel указан на скриншоте:
8.3.4 URL Сервера документов
Укажите url и протокол, как в примере ниже
https://ds-cluster.test3.s7-office.site
8.3.5 Секрет для DS и формирования JWT
Введите секрет (Набор цифр, букв и спецсимволов. Длина от 8 символов) для защищённого доступа Р7-Диска и Сервера Документов — данные из пункта 6.3.1
8.3.6 Установка api и web диска
Основное приложения Р7-Диска и веба (статика) сайта.
Для его установки:
- Выберите Да
8.3.7 Тип СУБД Р7-Диск
- Выберите PostgreSQL
8.3.8 Создание БД
Создание БД не требуется
- Выберите Нет
8.3.9 Хост СУБД
СУБД установлена отдельно,
- укажите ip адрес haproxy
8.3.10 Порт СУБД
По умолчанию 5432 используется. Потребуется указать порт 5000
8.3.11 Пользователь с правами БД
созданный на этапе развертки БД пункт 2.3.1
8.3.12 Пароль пользователя
созданный на этапе развертки БД пункт 2.3.1
8.3.13 coremachinkey от CS
Измените на актуальный, если есть Р7-Офис Корпоративный сервер 2019 и нажмите ОК,
если нет, нажмите Ок без редактирования
8.3.14 Настройка https
Проверьте наличие сертификата и ключа в каталоге ssl из пункта 8.2.4
Выберите Да
8.3.15 Укажите домен
Пример test3.s7-office.site
Необходимо указать домен, в котором у Вас созданы записи
Например, при домене r7.ru, необходимо создать запись *.test3.s7-oiffice.site. Пример записи в Selectel ниже c указанием proxy nginx из пункта
8.3.16 Префикс Р7-Диск
Укажите имя, которое будет открываться в браузере для веб р7-Диска
Например, если Вы хотите, чтобы открылся Р7-Диск по адресу cddisk.test3.s7-oiffice.site, то указать нужно именно cddisk, без указания домена.
8.3.17 Префикс Р7-Админ
Укажите имя, которое будет открываться в браузере для веб админ панели.
Например, если Вы хотите, чтобы открылся Р7-Админ по адресу admin.test3.s7-oiffice.site, то указать нужно именно admin, без указания домена.
8.3.18. Префикс Р7-Почта
Укажите имя, которое будет открываться в браузере для веб календаря.
Например, если Вы хотите, чтобы открылся Р7-Календарь по адресу mail.test3.s7-oiffice.site, то указать нужно именно calendar, без указания домена.
8.3.19 Префикс Р7-Календарь
Укажите имя, которое будет открываться в браузере для веб календаря.
Например, если Вы хотите, чтобы открылся Р7-Календарь по адресу calendar.test3.s7-oiffice.site, то указать нужно именно calendar, без указания домена.
8.3.20 Префикс Р7-Проекты
Укажите имя, которое будет открываться в браузере для веб календаря.
Например, если Вы хотите, чтобы открылся Р7-Календарь по адресу projects.test3.s7-oiffice.site, то указать нужно именно calendar, без указания домена.
8.3.21 Перезагрузите систему
Для корректной работы Р7-Диска, требуется перезагрузка.
- Введите Да;
- Введите Нет, если требуется Вам выполнить дополнительные действия до перезагрузки.
Без перезагрузки Р7-Диск работать не будет
8.4 Включение rabbitmq для КС24 для проверки работы кластеров
/opt/r7-office/Api/appsettings.json /opt/r7-office/Sso.Api/appsettings.json /opt/r7-office/Processing/appsettings.json
Укажите адрес nginx балансера для сервисов
"rabbitMq": { "host": "192.168.27.83", - укажите haproxy "username": "r7office", - ранее созданные данные из пункта 3.2 "password": "r7office", "timeout": 10 },
9. Продолжение настройки nginx proxy из пункта 7
При включенной службе firewalld необходимо добавить сервис и выполнить настройку для Корпоративного сервера и после развертки всей
# Добавляем службу: sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https # Перезапускаем службу firewalld: sudo firewall-cmd --reload # Проверяем правила для зоны public: sudo firewall-cmd --zone=public --list-all
9.1 Конфигурации:
Отредактируйте файл /etc/nginx/nginx.conf
user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; worker_cpu_affinity auto; worker_priority -2; worker_rlimit_nofile 30000; pcre_jit on; events { multi_accept on; worker_connections 8192; use epoll; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 300; types_hash_max_size 4096; server_tokens off; keepalive_requests 10000; aio on; reset_timedout_connection on; send_timeout 1200; client_body_timeout 30; client_header_timeout 30; server_names_hash_max_size 4096; ## # Proxy Settings ## proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; proxy_temp_file_write_size 64k; proxy_buffer_size 4k; proxy_buffers 32 16k; proxy_busy_buffers_size 32k; proxy_temp_path /var/lib/nginx/tmp/proxy; proxy_cache_valid 1h; proxy_cache_key $scheme$proxy_host$request_uri$cookie_US; proxy_cache_path /var/lib/nginx/proxy levels=1:2 inactive=2h keys_zone=onee:10m max_size=100m; #fastcgi_cache_path /var/lib/nginx/fastcgi levels=1:2 inactive=2h keys_zone=two:10m max_size=100m; ## # Open file Settings ## open_file_cache max=100000 inactive=60s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; ## # Gzip Settings ## gzip on; gzip_min_length 1000; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css text/javascript application/javascript application/x-javascript text/xml application/xml application/xml+rss application/json; gzip_disable "msie6"; gzip_static on; gzip_proxied any; gzip_comp_level 7; gzip_vary on; ssl_buffer_size 16k; http2_chunk_size 8k; resolver 77.88.8.8 valid=300s ipv6=off; resolver_timeout 5s; ## # Header Settings ## add_header X-XSS-Protection "1; mode=block"; add_header X-Content-Type-Options nosniff; add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload'; proxy_hide_header X-Powered-By; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf;
Создайте конфигурации в /etc/nginx/conf.d/
admin.conf
server { listen 80; listen [::]:80; listen 443 ssl http2; if ($scheme != "https") { return 301 https://$host$request_uri; } root /var/www/r7-office/admin; index index.html; server_name admin.test3.s7-office.site; #укажите доменное имя модуля админ server_tokens off; client_max_body_size 25M; ssl_protocols TLSv1.2 TLSv1.3; ssl_certificate /etc/nginx/ssl/test3.s7-office.site.crt; #укажите путь к сертификату ssl_certificate_key /etc/nginx/ssl/test3.s7-office.site.key; #укажите путь к ключу сертификата ssl_ciphers HIGH:!aNULL:!MD5; location /saml2 { proxy_set_header host $host; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-forward-for $proxy_add_x_forwarded_for; proxy_set_header X-Module Admin; proxy_pass http://0.0.0.0:38034/saml2; } location /api { proxy_pass http://backend_api/api; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-forward-for $proxy_add_x_forwarded_for; proxy_set_header X-Module Admin; } location /web-apps { proxy_pass http://0.0.0.0:8083/web-apps; } location / { try_files $uri $uri/ /index.html; } }
calendar.conf
server { listen 80; listen [::]:80; listen 443 ssl http2; if ($scheme != "https") { return 301 https://$host$request_uri; } root /var/www/r7-office/calendar; index index.html; server_name calendar.test3.s7-office.site; #укажите доменное имя модуля календарь server_tokens off; client_max_body_size 25M; ssl_protocols TLSv1.2 TLSv1.3; ssl_certificate /etc/nginx/ssl/test3.s7-office.site.crt; #укажите путь к сертификату ssl_certificate_key /etc/nginx/ssl/test3.s7-office.site.key; #укажите путь к ключу сертификата ssl_ciphers HIGH:!aNULL:!MD5; location /api { proxy_pass http://backend_api/api; } location / { try_files $uri $uri/ /index.html; } }
cddisk.conf
server { listen 80; listen [::]:80; listen 443 ssl http2; if ($scheme != "https") { return 301 https://$host$request_uri; } root /var/www/r7-office/cddisk; index index.html; server_name cddisk.test3.s7-office.site; #укажите доменное имя модуля главной страницы приложения server_tokens off; client_max_body_size 1024M; ssl_protocols TLSv1.2 TLSv1.3; ssl_certificate /etc/nginx/ssl/test3.s7-office.site.crt; #укажите путь к сертификату ssl_certificate_key /etc/nginx/ssl/test3.s7-office.site.key; #укажите путь к ключу сертификата ssl_ciphers HIGH:!aNULL:!MD5; location /api { proxy_pass http://backend_api/api; } location / { try_files $uri $uri/ /index.html; } }
cdmail.conf
server { listen 80; listen [::]:80; listen 443 ssl http2; if ($scheme != "https") { return 301 https://$host$request_uri; } root /var/www/r7-office/cdmail; index index.html; server_name cdmail.test3.s7-office.site; #укажите доменное имя модуля почта server_tokens off; client_max_body_size 25M; ssl_protocols TLSv1.2 TLSv1.3; ssl_certificate /etc/nginx/ssl/test3.s7-office.site.crt; #укажите путь к сертификату ssl_certificate_key /etc/nginx/ssl/test3.s7-office.site.key; #укажите путь к ключу сертификата ssl_ciphers HIGH:!aNULL:!MD5; location /api { proxy_pass http://backend_api/api; } location / { try_files $uri $uri/ /index.html; } }
contacts.conf
server { listen 80; listen [::]:80; listen 443 ssl http2; if ($scheme != "https") { return 301 https://$host$request_uri; } root /var/www/r7-office/contacts; index index.html; server_name contacts.test3.s7-office.site; #укажите доменное имя модуля контакты server_tokens off; client_max_body_size 32M; ssl_protocols TLSv1.2 TLSv1.3; ssl_certificate /etc/nginx/ssl/test3.s7-office.site.crt; #укажите путь к сертификату ssl_certificate_key /etc/nginx/ssl/test3.s7-office.site.key; #укажите путь к ключу сертификата ssl_ciphers HIGH:!aNULL:!MD5; location /api { proxy_pass http://backend_api/api; } location / { try_files $uri $uri/ /index.html; } }
projects.conf
server { listen 80; listen [::]:80; listen 443 ssl http2; if ($scheme != "https") { return 301 https://$host$request_uri; } root /var/www/r7-office/projects; index index.html; server_name projects.test3.s7-office.site; #укажите доменное имя модуля проекты server_tokens off; client_max_body_size 32M; ssl_protocols TLSv1.2 TLSv1.3; ssl_certificate /etc/nginx/ssl/test3.s7-office.site.crt; #укажите путь к сертификату ssl_certificate_key /etc/nginx/ssl/test3.s7-office.site.key; #укажите путь к ключу сертификата ssl_ciphers HIGH:!aNULL:!MD5; location /api { proxy_pass http://backend_api/api; } location / { try_files $uri $uri/ /index.html; } }
r7-ds.conf
upstream docservice { #укажите все ноды серверов документов для переключения в режиме round robin server 192.168.26.65; server 192.168.26.133; } map $http_host $this_host { "" $host; default $http_host; } map $http_x_forwarded_proto $the_scheme { default $http_x_forwarded_proto; "" $scheme; } map $http_x_forwarded_host $the_host { default $http_x_forwarded_host; "" $this_host; } map $http_upgrade $proxy_connection { default upgrade; "" close; } proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $proxy_connection; proxy_set_header X-Forwarded-Host $the_host; proxy_set_header X-Forwarded-Proto $the_scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ## Normal HTTP host server { listen 0.0.0.0:80; server_name ds-cluster.test3.s7-office.site; #укажите доменное общее имя кластера серверов документов server_tokens off; ## Redirects all traffic to the HTTPS host return 301 https://$server_name:443$request_uri; } server { listen 0.0.0.0:443 ssl http2; server_name ds-cluster.test3.s7-office.site; #укажите доменное общее имя кластера серверов документов server_tokens off; root /usr/share/nginx/html; ssl_certificate /etc/nginx/ssl/test3.s7-office.site.crt; #укажите путь к сертификату ssl_certificate_key /etc/nginx/ssl/test3.s7-office.site.key; #укажите путь к ключу сертификата ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; location / { proxy_pass http://docservice; proxy_http_version 1.1; } }
regfs.conf
server { listen 7777; root /usr/share/nginx/html; location / { proxy_pass http://backend_reg; proxy_http_version 1.1; } }
upstream.conf
upstream backend_api { #укажите адреса нод вынесенных api server 192.168.27.73:38033; server 192.168.27.143:38033; } upstream backend_reg{ #укажите адреса нод вынесенных registry+filestorage server 192.168.27.153:7777; server 192.168.27.109:7777; }
9.2 Перенесите с КС следующие каталоги
/var/www/r7-office/admin
/var/www/r7-office/calendar
/var/www/r7-office/cddisk
/var/www/r7-office/cdmail
/var/www/r7-office/contacts
/var/www/r7-office/projects
10. Вынос processing
При включенной службе firewalld необходимо добавить порт 7777.
# Добавляем службу: sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https # Добавляем порты: firewall-cmd --zone=public --add-port=7777/tcp # Применяем внесённые изменения: firewall-cmd --runtime-to-permanent # Проверяем правила для зоны public: firewall-cmd --zone=public --list-all
10.1 На установленном КС
10.1.1 Заархивируйте необходимые файлы и директории
tar czvf processing.tar.gz --selinux /opt/r7-office/Processing /var/log/r7-office/CDDisk/R7.Storage.Server.Processing.Host /var/log/r7-office/CDDisk/Processing /etc/supervisord.conf /etc/supervisord.d /var/r7-office/filestorage_temp_proc
10.1.2 Узнайте uid и gid пользователя cddisk
id cddisk
10.2 На ВМ с ролью Processing
10.2.1 Настройка NFS
Укажите в /etc/fstab
192.168.26.247:/mnt/disk/filestorage_temp_proc /var/r7-office/filestorage_temp_proc nfs defaults 0 2
, где ip указывается адрес nfs
Примонтируйте каталог
mount -a
10.2.2 Перенесите архив с КС и распакуйте
tar xzvf processing.tar.gz --selinux -C /
10.2.3 Произведите установку на ВМ роли Processing
sudo dnf install dotnet-sdk-3.1 postgresql-odbc supervisor -y
10.2.4 Создайте группу и пользователя
groupadd -g 972 cddisk useradd -u 972 -g 972 cddisk
10.2.5 Удалите лишние конфигурационные файлы
rm -f /etc/supervisord.d/{cddisk-api,cddisk-filestorage,cddisk-registry,cddisk-ssoapi,cddisk-searchapi}.ini
10.2.6 Отредактируйте файл
/etc/supervisord.d/cddisk.ini
Приведите к виду
[group:cddisk] programs=processing
10.2.7 Отредактируйте файл
/opt/r7-office/Processing/appsettings.json
Хост с Registry
Укажите ip с внешним прокси сервером
"serviceRegistry": { "address": "http://192.168.27.35:7777" },
Укажите ip HAProxy и корректные данные по доступу к БД и Rabbitmq из пункта
"ConnectionStrings": { "R7StorageServerUserActions": "Database=cddisk;Username=cddisk;Password=cddisk;Host=192.168.27.83;Port=5000;", "R7StorageServer": "Database=cddisk;Username=cddisk;Password=cddisk;Host=192.168.27.83;Port=5000;", "CommunityRepository": "Server=localhost;UserID=root;Password=test;Database=r7-office", "Payments": "Database=Payments;Username=cddisk;Password=cddisk;Host=192.168.27.83;Port=5000;", "GeoNames": "Database=GeoNames;Username=cddisk;Password=cddisk;Host=192.168.27.83;Port=5000;" }, "DbType": "postgre", "rabbitMq": { "host": "192.168.27.83", "username": "r7office", "password": "r7office", "timeout": 10 }
10.2.8 Перезапустите сервис и добавьте в автозагрузку
systemctl enable supervisord.service systemctl restart supervisord.service
10.2.9 Повторите действия для последующих нод Processing
11. Вынос search
При включенной службе firewalld необходимо добавить порт 2664.
11.1 На установленном КС
11.1.1 Заархивируйте необходимые файлы и директории
tar czvf search.tar.gz --selinux /opt/r7-office/SearchApi /var/log/r7-office/CDDisk/SearchApi /var/log/r7-office/CDDisk/Bsa.Search.Api.Host /etc/supervisord.d /var/r7-office/searchindex
11.1.2 Узнайте uid и gid пользователя cddisk
id cddisk
11.2 На ВМ с ролью Search
11.2.1 Настройка NFS
Укажите в /etc/fstab
192.168.26.247:/mnt/search /var/r7-office/searchindex nfs defaults 0 2
где ip указывается адрес nfs
Примонтируйте каталог
mount -a
Перенесите архив с КС и распакуйте
tar xzvf search.tar.gz --selinux -C /
11.2.2 Произведите установку
sudo dnf install dotnet-sdk-3.1 postgresql-odbc supervisor -y
11.2.3 Создайте группу и пользователя
groupadd -g 972 cddisk useradd -u 972 -g 972 cddisk
11.2.4 Удалите лишние конфигурационные файлы
rm -f /etc/supervisord.d/{cddisk-api,cddisk-filestorage,cddisk-registry,cddisk-ssoapi,cddisk-processing,cddisk-ssoapi}.ini
11.2.5 Отредактируйте файл
/etc/supervisord.d/cddisk.ini
Приведите к виду
[group:cddisk] programs=searchapi
11.2.6 Перезапустите сервис и добавьте в автозагрузку
systemctl enable supervisord.service systemctl restart supervisord.service
11.2.7 Повторите действия для последующих нод Search
12. Вынос api
ссылка https://support.r7-office.ru/corporate-server2024/settings_cs-r7disk/vynos-servisa-api-red-os-beta/
При включенной службе firewalld необходимо добавить порт 2664.
# Добавляем службу: sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https # Добавляем порты: firewall-cmd --permanent --zone=public --add-port=38033/tcp # Применяем внесённые изменения: firewall-cmd --runtime-to-permanent # Проверяем правила для зоны public: firewall-cmd --zone=public --list-all
12.1 На установленном КС
12.1.1 Заархивируйте необходимые файлы и директории
tar czvf api.tar.gz --selinux /opt/r7-office/Api/ /opt/r7-office/Sso.Api /var/log/r7-office/CDDisk/R7.Storage.Server.Api.Host /var/log/r7-office/CDDisk/R7.Sso.Api.Host /var/log/r7-office/CDDisk/Api /var/log/r7-office/CDDisk/R7.Sso.Api.Host /etc/supervisord.conf /etc/supervisord.d /var/r7-office/filestorage_temp
12.1.2 Узнайте uid и gid пользователя cddisk
id cddisk
12.2 На ВМ с ролью API
12.2.1 Настройка NFS
Укажите в /etc/fstab
192.168.26.247:/mnt/disk/filestorage_temp /var/r7-office/filestorage_temp nfs defaults 0 2
где ip указывается адрес nfs
Примонтируйте каталог
mount -a
12.2.2 Перенесите архив с КС и распакуйте
tar xzvf api.tar.gz --selinux -C /
12.2.3 Произведите установку на ВМ роли Processing
sudo dnf install dotnet-sdk-3.1 postgresql-odbc supervisor -y
12.2.4 Создайте группу и пользователя
groupadd -g 972 cddisk useradd -u 972 -g 972 cddisk
12.2.5 Удалите лишние конфигурационные файлы
rm -f /etc/supervisord.d/{cddisk-processing,cddisk-filestorage,cddisk-registry,cddisk-searchapi}.ini
12.2.6 Отредактируйте файл
/etc/supervisord.d/cddisk.ini
Приведите к виду
[group:cddisk] programs=api,apisso
12.2.7 Отредактируйте файл
/opt/r7-office/Api/appsettings.json
Хост с Registry
Укажите ip с внешним прокси сервером
"serviceRegistry": { "address": "http://192.168.27.35:7777" },
Укажите ip HAProxy и корректные данные по доступу к БД и Rabbitmq из пункта
"ConnectionStrings": { "R7StorageServerUserActions": "Database=cddisk;Username=cddisk;Password=cddisk;Host=192.168.27.83;Port=5000;", "R7StorageServer": "Database=cddisk;Username=cddisk;Password=cddisk;Host=192.168.27.83;Port=5000;", "CommunityRepository": "Server=localhost;UserID=root;Password=test;Database=r7-office", "Payments": "Database=Payments;Username=cddisk;Password=cddisk;Host=192.168.27.83;Port=5000;", "GeoNames": "Database=GeoNames;Username=cddisk;Password=cddisk;Host=192.168.27.83;Port=5000;" }, "DbType": "postgre", "rabbitMq": { "host": "192.168.27.83", "username": "r7office", "password": "r7office", "timeout": 10 }
12.2.8 Отредактируйте файл
/opt/r7-office/Sso.Api/appsettings.json
Хост с Registry
Укажите ip с внешним прокси сервером
"serviceRegistry": { "address": "http://192.168.27.35:7777" },
Укажите ip HAProxy и корректные данные по доступу к БД и Rabbitmq из пункта
"ConnectionStrings": { "R7StorageServerUserActions": "Database=cddisk;Username=cddisk;Password=cddisk;Host=192.168.27.83;Port=5000;", "R7StorageServer": "Database=cddisk;Username=cddisk;Password=cddisk;Host=192.168.27.83;Port=5000;", "CommunityRepository": "Server=localhost;UserID=root;Password=test;Database=r7-office", "Payments": "Database=Payments;Username=cddisk;Password=cddisk;Host=192.168.27.83;Port=5000;", "GeoNames": "Database=GeoNames;Username=cddisk;Password=cddisk;Host=192.168.27.83;Port=5000;" }, "keyPhraze": "3_Dd1d05fnaddf", "rabbitMq": { "host": "192.168.27.83", "username": "r7office", "password": "r7office", "timeout": 10 }
12.2.9 Перезапустите сервис и добавьте в автозагрузку
systemctl enable supervisord.service systemctl restart supervisord.service supervisorctl restart all
12.2.10 Повторите действия для последующих нод API
13. Вынос registry+filestorage
При включенной службе firewalld необходимо добавить порт 2664.
# Добавляем службу: sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https # Добавляем порты: firewall-cmd --permanent --zone=public --add-port=11581/tcp firewall-cmd --permanent --zone=public --add-port=11580/tcp # Применяем внесённые изменения: firewall-cmd --runtime-to-permanent # Проверяем правила для зоны public: firewall-cmd --zone=public --list-all
13.1 На установленном КС
13.1.1 Заархивируйте необходимые файлы и директории
tar czvf regfs.tar.gz --selinux /opt/r7-office/FileStorage /opt/r7-office/Service.Registry /var/log/r7-office/CDDisk/FileStorage /var/log/r7-office/CDDisk/Service.Registry /etc/supervisord.conf /etc/supervisord.d /var/r7-office/filestorage
13.1.2 Узнайте uid и gid пользователя cddisk
id cddisk
13.2 На ВМ с ролью Registry+Filestorage
13.2.1 Настройка NFS
Укажите в /etc/fstab
192.168.26.247:/mnt/disk/filestorage /var/r7-office/filestorage nfs defaults 0 2
где ip указывается адрес nfs
Примонтируйте каталог
mount -a
13.2.2 Перенесите архив с КС и распакуйте
tar xzvf regfs.tar.gz --selinux -C /
13.2.3 Произведите установку
sudo dnf install dotnet-sdk-3.1 postgresql-odbc supervisor -y
13.2.4 Создайте группу и пользователя
groupadd -g 972 cddisk useradd -u 972 -g 972 cddisk
13.2.5 Удалите лишние конфигурационные файлы
rm -f /etc/supervisord.d/{cddisk-processing,cddisk-searchapi,cddisk-ssoapi,cddisk-api}.ini
13.2.6 Отредактируйте файл
/etc/supervisord.d/cddisk.ini
Приведите к виду
[group:cddisk] programs=filestorage,registry
13.2.7 Отредактируйте файл
/opt/r7-office/Service.Registry/appsettings.json
"Clients": [ { "id": "IFileStorageService", "host": "http://192.168.27.153:11580/" }, { "id": "IFileStorageRestService", "host": "http://192.168.27.153:11580/" }, { "id": "IFolderStorageRestService", "host": "http://192.168.27.153:11580/" }, { "id": "ITcpFolderStorageService", "Address": "192.168.27.153", "Port": "11581" }, { "id": "ITcpFileStorageService", "Address": "192.168.27.153", "Port": "11581" }, { "id": "ISearchService", "host": "http://192.168.26.187:2664" }, { "id": "ISearchService", "host": "http://192.168.26.36:2664" } ], "ServiceRegistry": { "Host": "http://192.168.27.153:7777" } }
, где
- 192.168.27.153 — адрес текущего сервера
- 192.168.26.187 и 192.168.26.36 — адреса нод Search
13.2.8 Отредактируйте файл
/opt/r7-office/FileStorage/appsettings.json
Укажите адрес текущего сервера
"FileStorage": { "Host": "http://192.168.27.153:11580" }
13.2.9 Повторите действия для других нод Registry+filestorage
14. Проверка работы сервиса
Перейдите по dns имени внешнего nginx (настройка производилась в пункте 9), используя имя cddisk.test3.s7-office.site.
По умолчанию логин и пароль superadmin
Перейдите по ссылкам из стартовой страницы для проверки работы приложения.