Руководство по установке сервера RetailRotor
Подготовка сервера
Мы рекомендуем следовать рекомендациям по безопасной настройке Linux от ФСТЭК. Особенное внимание следует обратить на раздел, связанный с настройкой ядра ОС. Изменение этих настроек не должно влиять на работу Docker.
Установка Docker
Обновляем существующий список пакетов и обновляем существующие пакеты ПО с установкой и удалением некоторых зависимостей:
sudo apt update && sudo apt dist upgrade
После этого необходимо установить некоторые пакеты, позволяющие apt работать через HTTPS:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Создадим директорию с нужными правами для хранения gpg-ключей:
sudo mkdir -m 0755 -p /etc/apt/keyrings
Скачаем и установим gpg-ключ для официального репозитория Docker для Debian:
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Добавим репозиторий Docker в источники apt:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
Обновим зависимости:
sudo apt update
Установим Docker и некоторые вспомогательные пакеты для работы с ним:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Добавим текущего пользователя в группу docker для того, чтобы можно было работать с командами docker без использования sudo:
sudo usermod -aG docker {$USER}
В конце можно проверить, запущен ли демон Docker командой:
sudo systemctl status docker
Настройка SSH
Мы рекомендуем отключать вход через SSH по пустому паролю, оставить возможность входа только с помощью приватного ключа, сменить порт, а так же запретить вход по ssh пользователю root. Команды ниже меняют настройки файла sshd_config в соответствии с этими требованиями, а так же задают порт 32733 для ssh:
sudo sed -i 's/#PermitEmptyPasswords no/PermitEmptyPasswords no/g' /etc/ssh/sshd_config
sudo sed -i 's/#Port 22/Port 32733/g' /etc/ssh/sshd_config
sudo sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/g' /etc/ssh/sshd_config
После этого можно перезапустить демон sshd и войти, используя приватный ключ:
sudo systemctl restart sshd
Установка и запуск в RetailRotor в Docker-Compose
Архив с образами RetailRotor.tar предоставляется клиенту по требованию через безопасные каналы. Для работы можно создать папку rerotornew в домашней директории и распаковать туда архив:
tar -xzvf RetailRotor.tar -C rerotornew/
cd rerotornew/
Содержимое архива
docker-compose.yml — конфигурационный файл Docker-Compose
env.dev — файл с переменными, необходимый для работы контейнеров с RetailRotor
Название образов заканчивается версией предоставляемого продукта.
retailrotor-pricetag_renderer:VERSION — образ для рендеринга ценников и карточек товаров
retailrotor-web:VERSION — образ для веб-сервера nginx и фреймворка Django
retailrotor-celery:VERSION — образ для управления фоновыми задачами сервера, а также конвертацией роликов
retailrotor-telegraf:VERSION — образ серверного агента для сбора и отправки всех метрик и событий
retailrotor-clickhouse:VERSION — образ для сбора статистики обращений устройств на сервер
Описание переменных в файле env.dev
Название | Описание |
---|---|
RETAILROTOR_VERSION | Версия предоставляемого продукта. Её можно посмотреть в названиях образов. |
DJANGO_SECRET | Секретный ключ Django используется для обеспечения криптографической подписи. |
DJANGO_USE_X_FORWARDED_HOST | Логическое значение, указывающее, следует ли использовать заголовок X-Forwarded-Port вместо META-переменной SERVER_PORT. Должно быть включено только в том случае, если используется прокси. |
DISABLE_LOCAL_CONTENT_LINKS | Логическое значение, указывающее будет ли использоваться функция Главный компьютер. |
UPDATE_SCHEDULE_DUMMY_SLOTS | Логическое значение, указывающее, нужно ли слотовое обновление. |
DISABLE_UPDATE_SCHEDULE | Логические значение, указывающее, нужно ли расписание для слотового обновления. |
RENDERER_TOKEN | Токен для рендеринга видеороликов. |
DJANGO_HOST | Список хостов или доменов, которые будет обслуживать сайт на Django. |
PROXY_PASS | Список хостов или доменов, которые будет проксировать сайт на Django. |
USE_S3_STORAGE | Логические значение, указывающее, стоит ли использовать S3 хранилище. |
S3_PROXY_HOST | IP хоста или домена, на котором расположено S3 хранилище. |
AWS_ACCESS_KEY_ID | Ключ доступа для хранилища S3. |
AWS_SECRET_ACCESS_KEY | Секретный ключ, связанный с ключом доступа хранилища S3. По сути, это «пароль» для ключа доступа. |
AWS_STORAGE_BUCKET_NAME | Имя бакета — логической сущности, которая помогает организовать хранение объектов. |
AWS_S3_REGION_NAME | Пул размещения контейнера, в который будут загружаться объекты. |
AWS_S3_ENDPOINT_URL | URL для доступа в S3 хранилище. |
CLICKHOUSE_HOST | IP хоста или доменное имя, на котором располагается сервер с Clickhouse. |
CLICKHOUSE_DB | Название базы данных Clickhouse, в которых будут храниться данные об обращениях клиентов. |
CLICKHOUSE_USER | Имя пользователя для Clickhouse. |
CLICKHOUSE_PASSWORD | Пароль пользователя для Clickhouse. |
INFLUXDB_URL | IP хоста или доменное имя, на котором располагается сервер мониторинга с InfluxDB. |
INFLUXDB_DB | База данных InfluxDB. |
INFLUXDB_USER | Имя пользователя для InfluxDB. |
INFLUXDB_PASSWORD | Пароль пользователя для InfluxDB. |
Файл docker-compose.yml
version: '2'
services:
renderer:
image: ./retailrotor-pricetag_renderer:${RETAILROTOR_VERSION}
container_name: rerotor-new_renderer_1
shm_size: 1G
environment:
RENDERERS_NUM: 4
RENDERER_TOKEN:
volumes:
- /var/rerotor/pricetag_render:/var/log/renderer
ports:
- "18080:8080"
restart: always
postgres:
image: postgres:13.1
container_name: rerotor-new_postgres_1
restart: always
shm_size: 512mb
environment:
PGDATA: /data/pgdata
volumes:
- /var/rerotor/postgres:/data
mongodb:
image: mongo:3.6
container_name: rerotor-new_mongodb_1
restart: always
volumes:
- /var/rerotor/mongodb:/data/db
command: mongod --storageEngine wiredTiger
rabbitmq:
image: rabbitmq:3.9.4-management
container_name: rerotor-new_rabbitmq_1
restart: always
ports:
- "127.0.0.1:15672:15672"
volumes:
- /var/rerotor/rabbitmq:/var/lib/rabbitmq
redis:
image: redis:6.2.5-alpine
container_name: rerotor-new_redis_1
volumes:
- /var/rerotor/redis/data:/data
restart: always
web:
image: ./retailrotor-web:${RETAILROTOR_VERSION}
container_name: rerotor-new_web_1
environment:
DJANGO_HOST: "${DJANGO_HOST}"
DJANGO_USE_X_FORWARDED_HOST: "${DJANGO_USE_X_FORWARDED_HOST}"
DJANGO_SECRET: "${DJANGO_SECRET}"
RETAILROTOR_VERSION: "${RETAILROTOR_VERSION}"
DISABLE_LOCAL_CONTENT_LINKS: "${DISABLE_LOCAL_CONTENT_LINKS}"
UPDATE_SCHEDULE_DUMMY_SLOTS: "${UPDATE_SCHEDULE_DUMMY_SLOTS}"
DISABLE_UPDATE_SCHEDULE: "${DISABLE_UPDATE_SCHEDULE}"
PROXY_PASS: "${PROXY_PASS}"
RENDERER_TOKEN: "${RENDERER_TOKEN}"
CLICKHOUSE_HOST: "${CLICKHOUSE_HOST}"
CLICKHOUSE_DB: "${CLICKHOUSE_DB}"
CLICKHOUSE_USER: "${CLICKHOUSE_USER}"
CLICKHOUSE_PASSWORD: "${CLICKHOUSE_PASSWORD}"
MPLCONFIGDIR: /tmp/matplotlib_config
EXT_FOR_KNOW_HOW: "${EXT_FOR_KNOW_HOW}" #?????
AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}"
AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}"
AWS_STORAGE_BUCKET_NAME: "${AWS_STORAGE_BUCKET_NAME}"
AWS_S3_REGION_NAME: "${AWS_S3_REGION_NAME}"
AWS_S3_ENDPOINT_URL: "${AWS_S3_ENDPOINT_URL}"
S3_PROXY_HOST: "${S3_PROXY_HOST}"
USE_S3_STORAGE: "${USE_S3_STORAGE}"
ports:
- "443:443"
- "80:80"
links:
- postgres
- mongodb
- rabbitmq
- redis
- renderer
volumes:
- /var/rerotor:/app-data
- /var/rerotor/https_certs:/etc/nginx/certs
restart: always
logging:
driver: json-file
options:
max-size: "20m"
max-file: "5"
celery:
image: ./retailrotor-celery:${RETAILROTOR_VERSION}
container_name: rerotor-new_celery_1
volumes_from:
- web
environment:
DJANGO_HOST: "${DJANGO_HOST}"
DJANGO_SECRET: "${DJANGO_SECRET}"
RENDERER_TOKEN: "${RENDERER_TOKEN}"
PROXY_PASS: "${PROXY_PASS}"
CELERY_ARGS: -l info
DISABLE_LOCAL_CONTENT_LINKS: "${DISABLE_LOCAL_CONTENT_LINKS}"
UPDATE_SCHEDULE_DUMMY_SLOTS: "${UPDATE_SCHEDULE_DUMMY_SLOTS}"
MPLCONFIGDIR: /tmp/matplotlib_config
CLICKHOUSE_HOST: "${CLICKHOUSE_HOST}"
CLICKHOUSE_DB: "${CLICKHOUSE_DB}"
CLICKHOUSE_USER: "${CLICKHOUSE_USER}"
CLICKHOUSE_PASSWORD: "${CLICKHOUSE_PASSWORD}"
AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}"
AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}"
AWS_STORAGE_BUCKET_NAME: "${AWS_STORAGE_BUCKET_NAME}"
AWS_S3_REGION_NAME: "${AWS_S3_REGION_NAME}"
AWS_S3_ENDPOINT_URL: "${AWS_S3_ENDPOINT_URL}"
S3_PROXY_HOST: "${S3_PROXY_HOST}"
USE_S3_STORAGE: "${USE_S3_STORAGE}"
ENABLE_NON_TV_PRICETAGS_RENDERING: "{$ENABLE_NON_TV_PRICETAGS_RENDERING}" #?????
links:
- postgres
- mongodb
- rabbitmq
- redis
restart: always
logging:
driver: json-file
options:
max-size: "20m"
max-file: "5"
celeryconverter:
image: retailrotor-celery:${RETAILROTOR_VERSION}
container_name: rerotor-new_celeryconverter_1
volumes_from:
- web
links:
- postgres
- mongodb
- rabbitmq
- redis
environment:
DJANGO_HOST: "${DJANGO_HOST}"
DJANGO_SECRET: "${DJANGO_SECRET}"
RENDERER_TOKEN: "${RENDERER_TOKEN}"
PROXY_PASS: "${PROXY_PASS}"
MPLCONFIGDIR: /tmp/matplotlib_config
CELERY_ARGS: -l info -Q converter
FFMPEG_AUDIO: aac
DISABLE_LOCAL_CONTENT_LINKS: "${DISABLE_LOCAL_CONTENT_LINKS}"
UPDATE_SCHEDULE_DUMMY_SLOTS: "${UPDATE_SCHEDULE_DUMMY_SLOTS}"
restart: always
logging:
driver: json-file
options:
max-size: "20m"
max-file: "5"
celerycommands:
image: retailrotor-celery:${RETAILROTOR_VERSION}
container_name: rerotor-new_celerycommands_1
volumes_from:
- web
links:
- postgres
- mongodb
- rabbitmq
- redis
- renderer
environment:
DJANGO_HOST: "${DJANGO_HOST}"
DJANGO_SECRET: "${DJANGO_SECRET}"
PROXY_PASS: "${PROXY_PASS}"
CELERY_ARGS: -l info -Q server_commands
MPLCONFIGDIR: /tmp/matplotlib_config
DISABLE_LOCAL_CONTENT_LINKS: "${DISABLE_LOCAL_CONTENT_LINKS}"
UPDATE_SCHEDULE_DUMMY_SLOTS: "${UPDATE_SCHEDULE_DUMMY_SLOTS}"
RENDERER_TOKEN: "${RENDERER_TOKEN}"
CLICKHOUSE_HOST: "${CLICKHOUSE_HOST}"
CLICKHOUSE_DB: "${CLICKHOUSE_DB}"
CLICKHOUSE_USER: "${CLICKHOUSE_USER}"
CLICKHOUSE_PASSWORD: "${CLICKHOUSE_PASSWORD}"
AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}"
AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}"
AWS_STORAGE_BUCKET_NAME: "${AWS_STORAGE_BUCKET_NAME}"
AWS_S3_REGION_NAME: "${AWS_S3_REGION_NAME}"
AWS_S3_ENDPOINT_URL: "${AWS_S3_ENDPOINT_URL}"
S3_PROXY_HOST: "${S3_PROXY_HOST}"
USE_S3_STORAGE: "${USE_S3_STORAGE}"
ENABLE_NON_TV_PRICETAGS_RENDERING: "{$ENABLE_NON_TV_PRICETAGS_RENDERING}" # ??????
EXT_FOR_KNOW_HOW: "${EXT_FOR_KNOW_HOW}" #???????
restart: always
logging:
driver: json-file
options:
max-size: "20m"
max-file: "5"
telegraf:
image: ./retailrotor-telegraf:${RETAILROTOR_VERSION}
container_name: rerotor-new_telegraph_1
links:
- postgres
- mongodb
- rabbitmq
- web
volumes:
- /:/hostfs:ro
environment:
DJANGO_HOST: "${DJANGO_HOST}"
HOST_MOUNT_PREFIX: /hostfs
HOST_PROC: /hostfs/proc
INFLUXDB_URL: ${INFLUXDB_URL}
INFLUXDB_DB: ${INFLUXDB_DB}
INFLUXDB_USER: ${INFLUXDB_USER}
INFLUXDB_PASSWORD: ${INFLUXDB_PASSWORD}
clickhouse:
image: ./retailrotor-clickhouse:${RETAILROTOR_VERSION}
container_name: rerotor-new_clickhouse_1
links:
- postgres
- web
- celery
volumes:
- /var/rerotor/clickhouse/data:/var/lib/clickhouse
- /var/rerotor/clickhouse/config:/etc/retailrotor/clickhouse-server
ports:
- "8123:8123"
ulimits:
nproc: 65535
nofile:
soft: 262144
hard: 262144
environment:
CLICKHOUSE_USER: "${CLICKHOUSE_USER}"
CLICKHOUSE_PASSWORD: "${CLICKHOUSE_PASSWORD}"
CLICKHOUSE_DB: "${CLICKHOUSE_DB}"
CLICKHOUSE_CONFIG: /etc/retailrotor/clickhouse-server/config.xml
restart: always
Запуск сервисов
Для того, чтобы запустить сервисы, необходимо перейти в папку с проектом и ввести команду:
docker-compose up -d --env-file='env.dev'
Контакты технической поддержки
По вопросам установки и настройки наших сервисов вы можете обратиться к инженерам технической поддержки:
Михаил +7(921)-551-65-06
Максим +7(900)-644-67-61