Предположим, разработка ведётся на Python в среде PyCharm на ноутбуке с Windows 10. Используется виртуальное окружение. Требуется развернуть бота на виртуальном сервере в облаке с возможностью обновления файлов с ноутбука.

Сценарий таков:

Создание виртуального сервера

  1. В Панели управления облачной инфраструктурой в существующем или новом проекте активируем ВЦОД. Пусть это будет ВЦОД KVM.
  2. В меню "Серверы" добавляем новый сервер. Подойдёт минимальная конфигурация с 1 ядром, 1 ГБ ОЗУ с диском на 10 ГБ и операционная система Ubuntu 18.
  3. Выберем правила для межсетевого экрана Allow All или что-то более строгое, если понимаем, что делаем.
  4. Понадобится статический IP для подключения по SSH. В поле "Внешний IP-адрес" выбираем опцию "Случайный".
  5. По нажатию кнопки "Создать" сервер развёртывается в течение 10-15 секунд. Если пароль для root не был указан заранее, то он генерируется автоматически. После создания сервера увидеть пароль можно в основных настройках сервера: кликните на сервер в списке или воспользуйтесь меню "Действия\Изменить". Там же отображается назначенный внешний IP-адрес.
  6. Подключаемся к серверу по SSH или через веб-консоль noVNC посредством меню "Действия\Открыть консоль". После авторизации получаем стандартное приглашение:

Настройка скриптов для развёртывания службы в виртуальном окружении

  1. Разместим в проекте PyCharm скрипты для обслуживания службы в целевой среде: prepare.sh, run.sh, testbot.service.

  2. Скрипт prepare.sh для развёртывания и настройки виртуального окружения и автозапуска службы:

    #!/bin/bash
    
    # Запускать в папке проекта (/opt/testbot)
    apt-get update
    apt install -y python3-pip
    apt install -y python3-venv
    
    # создадим виртуальное окружение и установим в него зависимости согласно requirements.txt
    python3 -m venv ubuntu_env
    
    source ubuntu_env/bin/activate
    
    pip install -r requirements.txt
    
    deactivate
    
    # дадим право на исполнение скрипта запуска
    chmod +x run.sh
    
    # сконфигурируем сервис
    ln -s /opt/testbot/testbot.service /etc/systemd/system/testbot.service
    chmod 664 /etc/systemd/system/testbot.service
    systemctl daemon-reload
    
    # добавим в автозагрузку
    systemctl enable testbot
    
    systemctl status testbot
  3. Скрипт run.sh запускает основной файл через python:


    #!/bin/bash
    
    SCRIPT=$(readlink -f "$0")
    BASEDIR=$(dirname "$SCRIPT")
    
    echo "Executing service in '$BASEDIR'"
    
    cd $BASEDIR
    
    source $BASEDIR/ubuntu_env/bin/activate
    
    python $BASEDIR/testbot.py
  4. Файл testbot.service отвечает за автозапуск службы посредством systemd:


    [Unit]
    Description=TestBot
    
    [Service]
    ExecStart=/opt/testbot/run.sh
    
    [Install]
    WantedBy=multi-user.target

Настройка синхронизации файлов из PyCharm с виртуальным сервером

  1. Синхронизация файлов настраивается в меню PyCharm "Tools\Deployment\Configuration".
  2. На вкладке Connection укажем тип соединения SFTP, внешний IP-адрес сервера, логин, пароль. Выберем папку для хранения файлов проекта. Допустим, это будет папка /opt.
  3. На вкладке Mappings в поле Deployment path укажем относительный путь проекта внутри Root Path. Например, /TestBot:
  4. На вкладке Excluded Paths можно указать папки и файлы, которые не должны синхронизироваться. На локальной машине (Local path) это, например, папка с настройками проекта .idea и папки с виртуальными окружениями. NB! На виртуальном сервере виртуальное окружение будет создано автоматически.
  5. Для настройки автоматической синхронизации нужно установить галочку в главном меню PyCharm "Tools\Deployment\Automatic Upload". Теперь при сохранении редактируемого файла в PyCharm будет срабатывать автоматическая синхронизация и через считанные миллисекунды файл обновится на виртуальном сервере.
  6. Для первой синхронизации в контекстном меню проекта нужно вызвать команду "Deployment\Upload to {имя сервера}". PyCharm покажет лог загрузки в отдельном окне File Transfer:
  7. Перейдём к настройке виртуального сервера.

Настройка виртуального сервера

  1. Имеет смысл сделать "apt-get update".
  2. Для удобства можно установить midnight commander "apt install mc". Запустим mc. Видно, что создана папка /opt/testbot, в которую скопированы файлы проекта.
  3. Перейдём в папку проекта "cd /opt/testbot". Сделаем скрипт prepare.sh исполняемым: "chmod +x prepare.sh" и запустим его "./prepare.sh".
  4. В результате исполнения скрипта:
    1. создаётся папка с виртуальным окружением ubuntu_env, в которую с помощью утилиты pip устанавливаются необходимые пакеты по списку из requirements.txt,
    2. файл run.sh становится исполняемым,
    3. в папке /etc/systemd/system появляется симлинк на файл testbot.service.

Запуск службы

  1. Для запуска чат-бота осталось перезапустить виртуальный сервер. Это можно сделать командой reboot по SSH или из Панели управления командой "Действия\Перезагрузить".
  2. Если в исходном коде есть такие строки, то бот сам даст вам о себе знать в любимом мессенджере:

    bot = telegram.Bot(token=settings.TOKEN, request=Request(**kwargs))
    bot.send_message(chat_id=settings.MASTER_CHAT_ID, text='Я запущен')
  3. А если нет, то снова подключимся к серверу по SSH или в веб-консоли по команде "Действия\Открыть консоль". Проверим состояние сервиса с помощью команды "systemctl status testbot". Должен отобразиться статус active (running):
  4. Дальше можно проверить работу чат-бота.

Перезапуск службы

Для перезапуска сервиса есть два способа:

  • Перезапустить виртуальный сервер из Панели управления.
  • Перезапустить только сам сервис из консоли с помощью команды "systemctl restart testbot".