Перейти к содержанию

Деплой бота

Предварительные условия

  • Наличие бот-сервера с ОС Linux.

  • На бот-сервере должен быть установлен docker и docker-compose.

    Убедитесь, что docker сервис запущен и enabled:

    systemctl status docker
    

    Если он не запущен, то запустите его при помощи команды sudo systemctl enable --now docker. Команда enable обеспечивает его автозапуск после включения системы. Контейнеры c restart: always в этом случае тоже будут запущены.

  • Необходим загруженный на сервер образ бота или SmartApp (например, через scp).

Подготовка к запуску

Загрузка образа

docker load < your_bot_image.tar

Примечание

Если образ был предварительно сжат, например, утилитой gzip, то его название будет включать расширение .gz: your_bot_image.tar.gz. Добавление расширения к имени не повлияет на процесс загрузки.

Создание общего хранилища

Чтобы каждый новый бот не создавал дополнительный экземпляр PostgreSQL и Redis, можно создать для ботов отдельную docker-сеть. При этом у каждого приложения будет своя БД.

Для этого нужно:

  1. Создать директорию для PostgreSQL и Redis:

    mkdir -p /opt/express/bots/storages
    
  2. В этой директории создать файл docker-compose.yml со следующим содержимым:

    version: "3.8"
    
    services:
    postgres:
        image: postgres:13.2-alpine
        env_file: .env
        ports:
        - "5432:5432"
        restart: always
        networks:
        - express_bots_storages
        volumes:
        - /opt/express/bots/storages/postgresdata:/var/lib/postgresql/data
        logging:
        driver: "json-file"
        options:
            max-size: "10m"
            max-file: "10"
    
    redis:
        image: redis:6.2-alpine
        env_file: .env
        ports:
        - "6379:6379"
        restart: always
        networks:
        - express_bots_storages
        volumes:
        - /opt/express/bots/storages/redisdata:/data
        logging:
        driver: "json-file"
        options:
            max-size: "10m"
            max-file: "10"
    
    networks:
    express_bots_storages:
        name: express_bots_storages
    
  3. В этой же директории создать файл .env cо следующим содержимым:

    POSTGRES_USER="postgres"  # Общий пользователь PostgreSQL, у бота будет свой собственный
    POSTGRES_PASSWORD="<GENERATE>"
    
    Для генерации пароля используйте openssl rand -hex 16.

  4. Запустить контейнеры командой docker-compose up -d.

  5. Проверить, что в логах хранилищ нет ошибок, при помощи команды docker-compose ps.

Директория для бота/SmartApp

  1. Создайте директорию для бота:

    mkdir -p /opt/express/bots/your_bot
    
  2. В этой директории создайте docker-compose.yml со следующим содержимым:

    version: "3.8"
    
    services:
    your_bot:
        image: your_bot
        container_name: your_bot
        env_file: .env
        ports:
        - "8000:8000"  # Отредактируйте порт хоста (первый), если он уже занят
        restart: always
        depends_on:
        - postgres
        - redis
        logging:
        driver: "json-file"
        options:
            max-size: "10m"
            max-file: "10"
    
    networks:
    default:
        external:
        name: express_bots_storages
    
  3. Создайте БД и пользователя.

    Для генерации пароля используйте openssl rand -hex 16:

    docker exec -it storages_postgres_1 psql --user postgres
    
    CREATE USER your_bot_user PASSWORD '<GENERATE>';
    CREATE DATABASE your_bot_db;
    GRANT ALL PRIVILEGES ON DATABASE your_bot_db 
    TO your_bot_user;
    
  4. Создайте файл .env с переменными окружения. Минимальное содержание этого файла:

    BOT_CREDENTIALS="host@secret_key@bot_id"
    DEBUG=false
    # DB credentials
    ...
    SQL_DEBUG=false
    # Redis credentials
    ...
    

Примечание

Не забудьте зарегистрировать бота в панели администратора своего CTS, чтобы получить host, secret_key и bot_id. Там же укажите URL бота (перед этим убедитесь, что он доступен извне).

Внимание

Иногда в проекте задействованы дополнительные утилиты и программы (SAQ для фоновых задач, ClickHouse и т.д.). В таком случае файлы .env и docker-compose.yml будут содержать дополнительные переменные окружения и контейнеры.

Запуск/остановка бота

  • Чтобы запустить бота, используйте команду:

    docker-compose up -d
    
  • Чтобы проверить логи, используйте команду:

    docker-compose logs
    
  • Чтобы остановить контейнеры, используйте команду:

    docker-compose down