Как написать Телеграм бота на Python
Шаг 1: Установка необходимых инструментов и библиотек
Для создания Telegram-бота для онлайн-магазина на Python нам понадобятся несколько ключевых инструментов и библиотек.
В этом шаге мы рассмотрим, какие именно библиотеки понадобятся, как их установить и что нужно проверить перед началом работы.
Требования к окружению
Убедитесь, что у вас установлен Python версии 3.7 или выше.
Вы можете проверить версию Python, выполнив следующую команду в терминале:
python --version
Если Python не установлен или версия ниже 3.7, скачайте и установите последнюю версию Python с официального сайта python.org.
Настройка виртуального окружения
Для удобства и изоляции проекта рекомендуется использовать виртуальное окружение. Виртуальное окружение позволяет создавать отдельную область, где будут установлены необходимые библиотеки, что предотвращает конфликты между зависимостями разных проектов.
Создание виртуального окружения и его активация:
- Создание виртуального окружения:
python -m venv venvЗдесьvenv— это название папки, в которой будет храниться ваше виртуальное окружение. Вы можете выбрать другое название, если хотите. - Активация виртуального окружения:После активации виртуального окружения вы увидите префикс
(venv)в начале командной строки. Установка необходимых библиотек: будем использовать несколько Python-библиотек для создания бота, работы с базой данных и управления переменными окружения. Эти библиотеки можно установить с помощьюpip— менеджера пакетов Python.Чтобы установить эти библиотеки, выполните следующую команду в терминале:pip install python-telegram-bot sqlalchemy python-dotenvПодробности о библиотеке python-telegram-bot Библиотекаpython-telegram-botпредоставляет полный доступ к API Telegram и облегчает разработку ботов. Она включает обработчики команд, сообщений, inline-режим, поддержку платежей и многое другое. Подробности о SQLAlchemy, SQLAlchemy — мощный инструмент для работы с базами данных в Python. Он позволяет использовать Python-классы для описания структуры базы данных (модели) и автоматизировать создание и выполнение SQL-запросов. В нашем проекте мы будем использовать SQLAlchemy для хранения информации о товарах и корзине пользователей.Подробности о dotenvpython-dotenvпозволяет загружать переменные окружения из файла.env, что упрощает управление конфиденциальными данными и настройками. Этот файл будет хранить токен вашего бота, токен платежного провайдера и URL базы данных.Проверка установкиПосле установки всех библиотек рекомендуется проверить их успешную установку. Для этого можно использовать следующую команду:pip listЭта команда выведет список всех установленных пакетов, и вы должны увидетьpython-telegram-bot,SQLAlchemyиpython-dotenvв этом списке.Теперь ваше окружение готово, и вы можете переходить к следующему шагу — созданию бота и настройке проекта.Шаг 2: Создание бота в TelegramПеред тем как приступить к разработке кода, вам нужно создать Telegram-бота и получить уникальный токен, который будет использоваться для взаимодействия вашего приложения с Telegram API. Для этого мы воспользуемся официальным сервисом Telegram — ботом под названием@BotFather. - python-telegram-bot - Это основная библиотека для взаимодействия с API Telegram.
- SQLAlchemy - ORM библиотека для работы с базами данных. Она позволяет легко создавать, читать, обновлять и удалять записи в базе данных, используя Python-код вместо SQL-запросов.
- python-dotenv - Эта библиотека используется для загрузки переменных окружения из файла
.env. Это удобно для хранения конфиденциальной информации, такой как токены, пароли и другие данные.
2) Найдите @BotFather:
- В строке поиска введите
@BotFather. Это официальный бот от Telegram, который позволяет создавать и управлять другими ботами. - Найдите его в списке и откройте чат с ним.
- В чате с
@BotFatherвведите команду/newbotи отправьте сообщение. @BotFatherпопросит вас ввести имя вашего бота. Имя должно быть уникальным и отражать назначение вашего бота. Например,MyShopBotилиStoreAssistantBot.- После того как вы введете имя,
@BotFatherпопросит вас придумать уникальное имя пользователя для вашего бота (username). Username должен оканчиваться на словоbot(например,myshop_botилиstore_assistant_bot). Если выбранное имя уже занято,@BotFatherпредложит вам придумать другое.
3) Получение токена:Пример сообщения от @BotFather:Done! Congratulations on your new bot. You will find it at t.me/Amvera_Shop_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this. Use this token to access the HTTP API: 123456789:ABCDefghIJKLMNOpqrstuvwXYZ-9876543210. Keep your token secure and store it safely, it can be used by anyone to control your bot. For a description of the Bot API, see this page: <https://core.telegram.org/bots/api>
- После успешного создания бота,
@BotFatherотправит вам сообщение с подтверждением и предоставит уникальный токен. - Токен выглядит как длинная строка символов, например:
123456789:ABCDefghIJKLMNOpqrstuvwXYZ-9876543210. - Этот токен нужен для взаимодействия вашего бота с Telegram API. Сохраните его в надежном месте, так как он будет использоваться в дальнейшем для настройки бота.
4) Дополнительные настройки (по желанию):
- Вы можете настроить описание, профильную картинку, и другие параметры вашего бота через команды, которые предлагает
@BotFather. Например:
- Использования токена:Токен, который вы получили, необходимо будет добавить в файл
.envдля дальнейшего использования в коде. Пример содержимого файла.env:TELEGRAM_TOKEN=123456789:ABCDefghIJKLMNOpqrstuvwXYZ-9876543210Важные моменты:Теперь, когда вы создали бота и получили токен, можно переходить к следующему шагу — настройке проекта и написанию кода бота.
Шаг 3: Настройка проекта бота магазина
В этом шаге мы настроим структуру проекта для вашего Telegram-бота, который будет использоваться как онлайн-магазин. Мы создадим необходимые файлы, организуем их правильным образом, а также подготовим конфиденциальные данные, такие как токены и URL базы данных.
1. Создание структуры проекта
Начнем с создания папки для проекта и организации файлов:
- Создайте папку проекта:Для этого можно использовать команду в терминале:
mkdir TelegramShopBotcd TelegramShopBot - Выберите удобное место на вашем компьютере и создайте новую папку для проекта. Назовите её, например,
TelegramShopBot. - Создайте основной файл проекта:В терминале:
touch main.py - Внутри папки
TelegramShopBotсоздайте файл с именемmain.py. Этот файл будет содержать основной код вашего бота. - Создайте файл для хранения конфиденциальной информации:В терминале:
touch .env
2. Наполнение файла .env
Файл .env будет содержать переменные окружения, которые используются для настройки вашего бота. Эти переменные будут загружаться в коде с помощью библиотеки dotenv.
Откройте файл .env в любом текстовом редакторе (например, VSCode, Sublime Text, Notepad++ или встроенный редактор вашего IDE) и добавьте в него следующие строки:
# Токен вашего Telegram-ботаTELEGRAM_TOKEN=ваш_токен_ботаТокен вашего платежного провайдераPAYMENT_PROVIDER_TOKEN=ваш_токен_платежного_провайдераURL для подключения к базе данных SQLiteDATABASE_URL=sqlite:///shop.db
Разъяснение каждой переменной:
- Это токен, который вы получили от
@BotFather. Он нужен для идентификации вашего бота в Telegram и предоставления ему доступа к Telegram API.Пример:TELEGRAM_TOKEN=123456789:ABCDefghIJKLMNOpqrstuvwXYZ-9876543210.
3. Организация и защита .env файла
Файл .env содержит конфиденциальные данные, поэтому важно убедиться, что он не попадет в общий доступ, особенно если вы используете системы контроля версий, такие как Git.
- Добавьте
.envв.gitignore:Для этого создайте файл.gitignoreв корне проекта и добавьте в него строку:.env
Cтруктура проекта после настройки
После выполнения всех шагов, структура вашего проекта должна выглядеть примерно так:
TelegramShopBot/│├── .env # Конфиденциальные данные├── .gitignore # Игнорируемый файл для Git└── main.py # Основной файл кода
Теперь, когда проект настроен и организован, мы можем перейти к следующему шагу — написанию кода для создания и управления Telegram-ботом.
Шаг 4: Настройка базы данных
В этом шаге мы настроим базу данных для хранения данных о товарах и корзинах пользователей. С помощью библиотеки SQLAlchemy мы создадим две таблицы: Item (для хранения информации о товарах) и CartItem (для хранения товаров, добавленных в корзину пользователями).
1. Настройка SQLAlchemy
SQLAlchemy — это мощная библиотека для работы с базами данных, которая позволяет использовать объектно-реляционное отображение (ORM). Это означает, что вы можете работать с базой данных через Python-объекты, а не писать SQL-запросы вручную.
Импорт необходимых модулей:
Вначале нужно импортировать все необходимые модули и настроить соединение с базой данных. Код для этого шага будет следующим:
from sqlalchemy import create_engine, Column, Integer, String, Float, ForeignKeyfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import sessionmaker, relationshipimport os
- create_engine — создает объект подключения к базе данных.
- Column, Integer, String, Float, ForeignKey — используются для определения полей в таблицах базы данных.
- declarative_base — базовый класс для создания классов моделей.
- sessionmaker — библиотека для создания сессий, через которые вы будете взаимодействовать с базой данных.
- relationship — позволяет установить связи между таблицами, что упрощает работу с связанными данными.
- os — используется для загрузки переменной окружения с URL базы данных.
Затем создайте базовый класс для всех моделей, который будет использоваться как основа для определения таблиц базы данных:
Base = declarative_base()
Далее создается движок для подключения к базе данных, используя URL, который вы указали в файле .env. Сессия используется для выполнения запросов к базе данных.
engine = create_engine(os.getenv('DATABASE_URL'))Session = sessionmaker(bind=engine)session = Session()- engine — это движок, который управляет соединением с базой данных. Он использует URL, который вы сохранили в переменной окружения
DATABASE_URL. - Session — это сессия, которая открывает транзакцию с базой данных, позволяет делать запросы и фиксировать изменения.
Теперь мы определим две модели, которые будут представлять таблицы в нашей базе данных: Item и CartItem.
Модель Item:
Эта модель представляет товар, который можно купить в магазине. Она включает поля id, name и price.
class Item(Base): __tablename__ = 'items' id = Column(Integer, primary_key=True) name = Column(String, unique=True, nullable=False) price = Column(Float, nullable=False)
__tablename__— задает имя таблицы в базе данных.id— первичный ключ (уникальный идентификатор товара).name— название товара, уникальное для каждого товара.price— цена товара.
Модель CartItem:
Эта модель представляет товар, добавленный в корзину пользователя. Она включает поля id, user_id, item_id и quantity.
class CartItem(Base): __tablename__ = 'cart_items' id = Column(Integer, primary_key=True) user_id = Column(Integer, nullable=False) item_id = Column(Integer, ForeignKey('items.id'), nullable=False) quantity = Column(Integer, default=1) item = relationship("Item")user_id— идентификатор пользователя, которому принадлежит этот элемент корзины.item_id— идентификатор товара, добавленного в корзину. Это поле связано с таблицейitemsчерезForeignKey, что указывает на внешний ключ.quantity— количество единиц данного товара в корзине.item— это отношение, позволяющее получить объектItem, связанный с данным элементом корзины.
Связи между таблицами:
- В
CartItemустановлена связьitem_idсidв таблицеItem. Это позволяет автоматически подтягивать информацию о товаре, когда мы работаем с корзиной пользователя.
3. Создание таблиц в базе данных
После определения моделей, необходимо создать таблицы в базе данных. SQLAlchemy автоматически создаст таблицы на основе определенных моделей:
Base.metadata.create_all(engine)
Этот вызов создаст таблицы items и cart_items в базе данных, если они еще не существуют.
Теперь, когда таблицы созданы, можно проверить, все ли работает корректно. Вы можете создать несколько товаров и добавить их в базу данных для тестирования.
# Создаем новый товарnew_item = Item(name="Sample Item", price=19.99)session.add(new_item)session.commit()Проверяем, добавился ли товарitem = session.query(Item).filter_by(name="Sample Item").first()print(item.name, item.price)
Этот код создает новый товар, добавляет его в базу данных и затем выводит его название и цену.
Структура проекта после настройки базы данных
После выполнения всех шагов структура вашего проекта может выглядеть так:
TelegramShopBot/│├── .env # Конфиденциальные данные├── .gitignore # Игнорируемый файл для Git├── main.py # Основной файл кода└── shop.db # Файл базы данных SQLite
Теперь ваша база данных настроена, и вы можете переходить к следующему шагу — написанию функционала бота, который будет взаимодействовать с этой базой данных.
Шаг 5: Создание основного кода бота
На этом этапе мы создадим основную логику бота, которая позволит пользователям взаимодействовать с онлайн-магазином через Telegram. Мы начнем с импорта необходимых модулей и создания обработчиков команд, чтобы бот мог выполнять различные действия, такие как отображение каталога товаров, добавление товаров в корзину, оформление заказа и прием платежей.
В начале файла main.py мы импортируем модули, которые будут использоваться в коде:
import osfrom telegram import Update, LabeledPricefrom telegram.ext import Application, CommandHandler, MessageHandler, filters, PreCheckoutQueryHandler, ContextTypesfrom dotenv import load_dotenv
- os: используется для работы с операционной системой, например, для получения переменных окружения.
- telegram: предоставляет классы для работы с объектами Telegram, такими как
Update(обновления сообщений) иLabeledPrice(цена для платежа). - telegram.ext: включает расширения для упрощения работы с Telegram API, такие как
Application,CommandHandler,MessageHandlerи другие. - dotenv: используется для загрузки переменных окружения из файла
.env.
Для безопасности и удобства хранения конфиденциальных данных, таких как токены, мы используем файл .env. Загрузим эти переменные в наш код:
load_dotenv()TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')PAYMENT_PROVIDER_TOKEN = os.getenv('PAYMENT_PROVIDER_TOKEN')DATABASE_URL = os.getenv('DATABASE_URL')- load_dotenv(): Загружает переменные окружения из файла
.env. - TELEGRAM_TOKEN: Токен вашего бота, полученный от @BotFather.
- PAYMENT_PROVIDER_TOKEN: Токен провайдера платежей, который используется для обработки транзакций.
- DATABASE_URL: Путь к базе данных, которая хранит информацию о товарах и заказах.
Теперь создадим функции-обработчики для команд бота. Эти функции будут выполнять определенные действия при получении соответствующих команд от пользователя.
Функция приветствия (/start)
Эта функция будет выполнена, когда пользователь впервые запустит бота. Она отправляет приветственное сообщение:
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): await update.message.reply_text("Добро пожаловать в наш магазин! Введите /catalog для просмотра товаров.")- async def start: Определяет асинхронную функцию, которая будет обрабатывать команду
/start. - update.message.reply_text(): Отправляет сообщение пользователю.
Функция помощи (/help)
Эта функция отображает пользователю список доступных команд:
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE): help_text = ( "Доступные команды:\\n" "/start - Начать работу с ботом\\n" "/help - Показать это меню помощи\\n" "/catalog - Показать каталог товаров\\n" "/cart - Показать содержимое вашей корзины\\n" "/checkout - Оформить заказ\\n" "Просто отправьте название товара, чтобы добавить его в корзину." ) await update.message.reply_text(help_text)
- help_command: Обрабатывает команду
/help, показывая список доступных команд и их описание. - help_text: Содержит текст с описанием команд, который будет отправлен пользователю.
Функция отображения каталога (/catalog)
Эта функция извлекает список товаров из базы данных и отправляет их пользователю:
async def catalog(update: Update, context: ContextTypes.DEFAULT_TYPE): items = session.query(Item).all() if items: message = "Каталог товаров:\\n" for item in items: message += f"{item.name} - {item.price:.2f} RUB\\n" message += "\\nВведите название товара, чтобы добавить его в корзину." else: message = "Каталог пуст." await update.message.reply_text(message)- session.query(Item).all(): Извлекает все товары из базы данных.
- if items: Проверяет, есть ли товары в базе данных.
- for item in items: Перебирает каждый товар и формирует сообщение с его названием и ценой.
- await update.message.reply_text(message): Отправляет сформированное сообщение пользователю.
Функция добавления товара в корзину
Эта функция позволяет пользователю добавить товар в свою корзину, отправив его название:
async def add_to_cart(update: Update, context: ContextTypes.DEFAULT_TYPE): item_name = update.message.text.strip() item = session.query(Item).filter_by(name=item_name).first()if item: cart_item = session.query(CartItem).filter_by(user_id=update.message.chat_id, item_id=item.id).first() if cart_item: cart_item.quantity += 1 else: cart_item = CartItem(user_id=update.message.chat_id, item_id=item.id, quantity=1) session.add(cart_item) session.commit() await update.message.reply_text(f"Товар '{item_name}' добавлен в корзину.")else: await update.message.reply_text("Товар не найден. Пожалуйста, введите корректное название товара.")- item_name = update.message.text.strip(): Получает название товара, отправленное пользователем.
- session.query(Item).filter_by(name=item_name).first(): Находит товар в базе данных по его названию.
- if item: Проверяет, найден ли товар в базе данных.
- session.query(CartItem).filter_by(user_id=update.message.chat_id, item_id=item.id).first(): Ищет, есть ли товар в корзине пользователя.
- if cart_item: Если товар уже в корзине, увеличивает его количество.
- session.add(cart_item): Добавляет новый товар в корзину, если его там нет.
- session.commit(): Сохраняет изменения в базе данных.
- await update.message.reply_text(): Отправляет пользователю сообщение о том, что товар добавлен в корзину.
Функция отображения корзины (/cart)
Эта функция показывает пользователю все товары, которые находятся в его корзине, и общую стоимость:
async def view_cart(update: Update, context: ContextTypes.DEFAULT_TYPE): cart_items = session.query(CartItem).filter_by(user_id=update.message.chat_id).all() if cart_items: message = "Ваша корзина:\\n" total = 0 for cart_item in cart_items: item_total = cart_item.quantity * cart_item.item.price message += f"{cart_item.item.name} - {cart_item.quantity} шт. - {item_total:.2f} RUB\\n" total += item_total message += f"\\nИтого: {total:.2f} RUB" message += "\\nВведите /checkout для оформления заказа." else: message = "Ваша корзина пуста." await update.message.reply_text(message)- session.query(CartItem).filter_by(user_id=update.message.chat_id).all(): Извлекает все товары в корзине пользователя.
- if cart_items: Проверяет, есть ли товары в корзине.
- item_total = cart_item.quantity * cart_item.item.price: Вычисляет общую стоимость каждого товара.
- total += item_total: Подсчитывает общую сумму заказа.
- await update.message.reply_text(): Отправляет пользователю сообщение с содержимым корзины и общей стоимостью.
Функция оформления заказа (/checkout)
Эта функция генерирует счет на оплату товаров из корзины и отправляет его пользователю:
async def checkout(update: Update, context: ContextTypes.DEFAULT_TYPE): cart_items = session.query(CartItem).filter_by(user_id=update.message.chat_id).all() if cart_items: title = "Оплата заказа" description = "Оплата товаров из вашей корзины" payload = "Custom-Payload" currency = "RUB" prices = [LabeledPrice(f"{item.item.name} ({item.quantity} шт.)", int(item.item.price * 100 * item.quantity)) for item in cart_items] await context.bot.send_invoice( chat_id=update.message.chat_id, title=title, description=description, payload=payload, provider_token=PAYMENT_PROVIDER_TOKEN, currency=currency, prices=prices, start_parameter="test-payment", )else: await update.message.reply_text("Ваша корзина пуста.")- title: Заголовок счета.
- description: Описание счета.
- payload: Произвольная строка, которая передается провайдеру платежей.
- currency: Валюта, в которой производится оплата.
- prices: Список товаров с указанием количества и стоимости.
- await context.bot.send_invoice(): Отправляет счет пользователю через Telegram.
Обработчик подтверждения оплаты
Эта функция обрабатывает запрос на подтверждение перед оплатой:
async def precheckout_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.pre_checkout_query if query.invoice_payload != "Custom-Payload": await query.answer(ok=False, error_message="Что-то пошло не так...") else: await query.answer(ok=True)
- update.pre_checkout_query: Содержит данные о запросе на подтверждение платежа.
- if query.invoice_payload != "Custom-Payload": Проверяет, совпадает ли полученный payload с ожидаемым.
- await query.answer(ok=False, error_message="Что-то пошло не так..."): Отправляет ответ с ошибкой, если payload не совпадает.
- await query.answer(ok=True): Подтверждает готовность к оплате, если все в порядке.
Обработчик успешного платежа
Эта функция удаляет все товары из корзины пользователя после успешного платежа:
async def successful_payment_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): session.query(CartItem).filter_by(user_id=update.message.chat_id).delete() session.commit() await update.message.reply_text("Спасибо за покупку! Ваш заказ был успешно оформлен.")- session.query(CartItem).filter_by(user_id=update.message.chat_id).delete(): Удаляет все товары из корзины пользователя.
- session.commit(): Сохраняет изменения в базе данных.
- await update.message.reply_text("Спасибо за покупку! Ваш заказ был успешно оформлен."): Отправляет пользователю сообщение о завершении заказа.
Теперь создадим основную функцию, которая будет инициализировать приложение Telegram и запускать бота:
**def** main(): app = Application.builder().token(TELEGRAM_TOKEN).build()# Добавляем обработчики командapp.add_handler(CommandHandler("start", start))app.add_handler(CommandHandler("help", help_command))app.add_handler(CommandHandler("catalog", catalog))app.add_handler(CommandHandler("cart", view_cart))app.add_handler(CommandHandler("checkout", checkout))app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, add_to_cart))app.add_handler(PreCheckoutQueryHandler(precheckout_callback))app.add_handler(MessageHandler(filters.SUCCESSFUL_PAYMENT, successful_payment_callback))# Запуск ботаapp.run_polling()
- Application.builder().token(TELEGRAM_TOKEN).build(): Создает экземпляр приложения Telegram с использованием токена бота.
- add_handler(): Добавляет обработчики команд и сообщений, которые будут обрабатывать соответствующие события.
- run_polling(): Запускает бота в режиме опроса, чтобы он постоянно проверял наличие новых сообщений.
Наконец, добавим код для инициализации базы данных при первом запуске и запуска основного цикла бота:
if __name__ == '__main__': # Создаем несколько товаров при первом запуске if not session.query(Item).first(): session.add_all([ Item(name="Сервер", price=100.0), Item(name="Облако", price=150.0), Item(name="Amvera", price=200.0) ]) session.commit()main()
- if name == 'main':: Указывает, что код должен выполняться только при прямом запуске скрипта.
- if not session.query(Item).first():: Проверяет, есть ли товары в базе данных.
- session.add_all([...]): Добавляет несколько товаров в базу данных, если она пуста.
- main(): Запускает бота.
Структура проекта после настройки основного кода
После выполнения всех шагов ваша структура проекта будет выглядеть следующим образом:
TelegramShopBot/│├── .env # Конфиденциальные данные├── .gitignore # Игнорируемый файл для Git├── main.py # Основной файл кода└── shop.db # Файл базы данных SQLite
Шаг 6: Получение токена для платежной системы
Чтобы ваш Telegram-бот мог принимать платежи, нужно подключить платежную систему. Вы можете выбрать любую, механика везде похожа. Главное, вам необходимо получить токен. Этот токен используется для идентификации вашего проекта и обеспечения безопасности транзакций.
Шаги для получения токена платежной системы
Шаг 7: Запускаем бот магазин в облаке Amvera
Теперь, когда мы настроили и протестировали нашего Telegram-бота на локальной машине, самое время запустить его в облаке, чтобы он был доступен 24/7. В этом шаге мы развернем бота на платформе Amvera.
Почему Amvera?
- Это наш блог, как иначе;
- Развертывание и обновление проекта идет всего тремя командами в IDE. "git push amvera master" и проект сам соберется, настроится и развернется. Это намного проще и удобнее самостоятельной настройки VPS.
Регистрация в сервисе
- Создание аккаунта:
- Перейдите на сайт Amvera и нажмите на кнопку "Регистрация".
- Заполните все необходимые поля, включая номер телефона, и нажмите на кнопку "Отправить код". После прохождения регистрации будет доступен стартовый баланс на первые недели бесплатного использования.
Создание проекта и размещение бота
- Amvera использует git для доставки кода в облако. Вам потребуется создать файл конфигурации
amvera.yml, который подскажет облаку, как запускать ваш проект. - Для упрощения создания этого файла воспользуйтесь графическим инструментом генерации.