Руководство по установке сервера 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:

💡
Перед тем, как выполнять эти команды, убедитесь, что в файле ~/.ssh/authorized_keys присутствуют публичные ключи для беспарольного доступа
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_HOSTIP хоста или домена, на котором расположено S3 хранилище.
AWS_ACCESS_KEY_IDКлюч доступа для хранилища S3.
AWS_SECRET_ACCESS_KEYСекретный ключ, связанный с ключом доступа хранилища S3. По сути, это «пароль» для ключа доступа.
AWS_STORAGE_BUCKET_NAMEИмя бакета — логической сущности, которая помогает организовать хранение объектов.
AWS_S3_REGION_NAMEПул размещения контейнера, в который будут загружаться объекты.
AWS_S3_ENDPOINT_URLURL для доступа в S3 хранилище.
CLICKHOUSE_HOSTIP хоста или доменное имя, на котором располагается сервер с Clickhouse.
CLICKHOUSE_DBНазвание базы данных Clickhouse, в которых будут храниться данные об обращениях клиентов.
CLICKHOUSE_USERИмя пользователя для Clickhouse.
CLICKHOUSE_PASSWORDПароль пользователя для Clickhouse.
INFLUXDB_URLIP хоста или доменное имя, на котором располагается сервер мониторинга с 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