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

Конфигурация и окружение

Этот раздел объясняет, какие переменные окружения использует Telegram‑бот и как они связаны с кодом. Ниже приведены небольшие примеры из реальных модулей.

Базовая конфигурация бота

Конфигурация бота сосредоточена в файле telegram-bot/config/settings.py. Класс Config считывает из окружения токен бота (BOT_TOKEN), внешний базовый URL (WEBHOOK_BASE_URL), секретный путь webhook (WEBHOOK_SECRET_PATH), а также адрес и порт HTTP‑сервера (APP_HOST, APP_PORT). Если одно из обязательных значений не задано, при импорте модуля будет выброшено исключение ValueError, и приложение не запустится — это позволяет сразу заметить некорректную настройку.

Переменные окружения для базовой конфигурации

Name Type Description Default
BOT_TOKEN str Токен Telegram‑бота. Обязателен; без него приложение не стартует.
WEBHOOK_BASE_URL str Базовый внешний URL, по которому Telegram будет вызывать webhook (например, https://example.com).
WEBHOOK_SECRET_PATH str Секретный путь вебхука (начинается с /), добавляется к WEBHOOK_BASE_URL для формирования WEBHOOK_URL.
APP_HOST str Адрес, на котором слушает HTTP‑сервер aiohttp. 127.0.0.1
APP_PORT int Порт HTTP‑сервера Telegram‑бота. 8081

Пример определения конфигурации повторяет реальный код: значения читаются через os.getenv, а при отсутствии обязательных переменных выбрасывается ValueError уже на этапе импорта.

import os
from dotenv import load_dotenv

load_dotenv()


class Config:
    BOT_TOKEN = os.getenv("BOT_TOKEN")
    if not BOT_TOKEN:
        raise ValueError("BOT_TOKEN не найден в переменных окружения")

    WEBHOOK_BASE_URL = os.getenv("WEBHOOK_BASE_URL")
    WEBHOOK_SECRET_PATH = os.getenv("WEBHOOK_SECRET_PATH")
    if not WEBHOOK_BASE_URL or not WEBHOOK_SECRET_PATH:
        raise ValueError("WEBHOOK_BASE_URL/WEBHOOK_SECRET_PATH не заданы")

    WEBHOOK_URL = f"{WEBHOOK_BASE_URL}{WEBHOOK_SECRET_PATH}"

    APP_HOST = os.getenv("APP_HOST", "127.0.0.1")
    APP_PORT = int(os.getenv("APP_PORT", "8081"))


config = Config()

Экземпляр config создаётся один раз и доступен через одноимённое имя. Его импортируют в main.py, services/webhook.py и других модулях, где нужны настройки бота или сервера:

from config.settings import config

bot = Bot(token=config.BOT_TOKEN, parse_mode="HTML")

Настройки базы данных

Помимо параметров, описанных в Config, сервис использует несколько групп переменных, связанных с базой данных и OpenAI. Файл telegram-bot/env.example содержит полный перечень с пустыми значениями, а здесь имеет смысл выделить только основные.

Подключение к базе данных описано в services/mysql_memory.py. Здесь используются MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD и MYSQL_DATABASE. Они задают подключение к общей базе MariaDB, где лежат таблицы users, dialogue_history, cargo_requests (и опционально user_state). Эти же параметры должны совпадать с настройками MCP‑сервера и SIP Hook, чтобы все сервисы работали с одной и той же базой:

Note

Таблица user_state нужна, чтобы бот «помнил» служебное состояние между перезапусками (последнюю роль, previous_response_id, контекст doc‑flow и историю вызовов MCP‑инструментов). Если таблицы нет — бот продолжит работать, но это состояние не будет сохраняться. DDL лежит в telegram-bot/scripts/20260113_user_state.sql.

Переменные окружения для базы данных

Name Type Description Default
MYSQL_HOST str Хост MariaDB/MySQL, к которому подключается бот. 127.0.0.1
MYSQL_PORT int Порт MariaDB/MySQL. 3306
MYSQL_USER str Имя пользователя базы данных. Обязательно; при отсутствии будет выброшено ValueError.
MYSQL_PASSWORD str Пароль пользователя базы данных. Обязательно.
MYSQL_DATABASE str Имя базы данных (схемы), в которой находятся users, dialogue_history, cargo_requests.
engine = create_async_engine(
    build_mysql_url(),
    echo=False,
    pool_pre_ping=True,
)
SessionLocal = async_sessionmaker(engine, expire_on_commit=False)

Настройки OpenAI и MCP

Настройки OpenAI и MCP читаются в services/openai/config.py и services/identity.py. Основные переменные: OPENAI_API_KEY (ключ OpenAI), OPENAI_RESPONSES_MODEL (основная модель Responses API, по умолчанию gpt-4.1), OPENAI_FALLBACK_MODEL (резервная модель, используется при недоступности MCP), OPENAI_HISTORY_LIMIT (сколько сообщений истории передавать в модель, по умолчанию 20). MCP_SERVER_URL используется для MCP‑инструментов внутри Responses API. MCP_LOCAL_URL нужен MCPIdentityResolver для вызова verify_user через fastmcp. Если MCP_SERVER_URL не задан, OpenAIService работает в текстовом режиме без инструментов, но MCP_LOCAL_URL всё равно нужен для корректного сопоставления tg_id → user_id.

Переменные окружения для OpenAI и MCP

Name Type Description Default
OPENAI_API_KEY str Ключ OpenAI. Обязателен; при отсутствии OpenAIConfig.load() выбрасывает ValueError.
OPENAI_RESPONSES_MODEL str Основная модель Responses API, используемая для текста+MCP‑инструментов. "gpt-4.1"
OPENAI_FALLBACK_MODEL str Резервная модель Responses API, используется при недоступности MCP; по умолчанию совпадает с OPENAI_RESPONSES_MODEL. primary
OPENAI_HISTORY_LIMIT int Максимальное количество сообщений истории, передаваемой в модель; некорректные или неположительные значения заменяются на 20. 20
MCP_SERVER_URL str | None HTTP‑URL MCP‑сервера для Responses API. Если не задан, OpenAIService работает в текстовом режиме без инструментов. None
MCP_LOCAL_URL str URL MCP‑сервера для fastmcp в MCPIdentityResolver (вызов инструмента verify_user). Обязателен для обработки входящих сообщений.
MCP_AUTH_TOKEN str | None JWT‑токен для MCP‑сервера (если включена авторизация). Используется и в fastmcp (MCP_LOCAL_URL), и в Responses API (MCP_SERVER_URL). None
SYSTEM_INSTRUCTIONS_PATH str | None Необязательный путь до файла с системными инструкциями; если не задан, используется config/instructions/base.md. None

Пример инициализации клиента OpenAI Responses:

from openai import AsyncOpenAI

client = AsyncOpenAI(api_key=os.environ["OPENAI_API_KEY"])

Telegram Business: служебные параметры

Часть функциональности бота (принятие подписанных документов, отправка DOCX, уведомления о взятом грузе) требует дополнительных переменных окружения.

Переменные окружения бизнес‑канала и документов

Name Type Description Default
BUSINESS_CONNECTION_ID str | None Идентификатор Telegram Business connection для проактивных исходящих сообщений (используется эндпоинт POST /cargo-assigned). None
RESPONSIBLE_TG_ID int | None Telegram ID ответственного аккаунта, которому бот пересылает подписанные документы и копию DOCX, полученного через POST /cargo-docx. None
SIGNED_DOCS_DIR str | None Каталог для сохранения входящих подписанных документов (.doc/.docx/.pdf). Если не задан — используется storage/signed_docs. None

Tip

Если у вас не работает POST /cargo-assigned и сервис отвечает business_connection_id not available yet (422), значит не задан BUSINESS_CONNECTION_ID.
Это значение приходит от Telegram Business во входящих сообщениях и лежит в поле business_connection_id. Обычно его берут из первого входящего update, прописывают в .env и перезапускают сервис.

Warning

BUSINESS_CONNECTION_ID может «протухнуть» (Telegram начнёт отвечать 403 на отправку). В этом случае POST /cargo-assigned вернёт 500 с текстом про устаревшее соединение.
Обычно помогает получить актуальный business_connection_id из нового входящего сообщения и обновить переменную окружения.

Note

services/signed_documents.py принимает только .doc/.docx/.pdf и режет файлы больше 20 МБ (по сигнатуре, а не по расширению).

Telethon (отправка файлов как пользователь)

Telegram‑бот использует Telethon для отправки DOCX‑документов пользователю и ответственному аккаунту. В текущей реализации Telethon инициализируется в on_startup() и при отсутствии настроек бот не стартует.

Name Type Description Default
TELETHON_API_ID int api_id приложения Telegram для Telethon. Обязателен для запуска.
TELETHON_API_HASH str api_hash приложения Telegram для Telethon. Обязателен для запуска.
TELETHON_SESSION str Путь до файла сессии Telethon (должен быть авторизован). Обязателен.

Note

Если Telethon не видит получателя в своих диалогах, POST /cargo-docx может вернуть 422 recipient not found in telethon dialogs.
Это не «падение бота»: просто аккаунт Telethon не может отправить файл этому получателю, пока не появится диалог/контакт.

Интеграция с Lardi и практическая настройка

В проекте есть также интеграция с Lardi. Токен LARDI_API используется в MCP‑сервере при работе с Lardi API, а в Telegram‑боте этот параметр может понадобиться только при появлении прямых вызовов Lardi из Telegram‑слоя.

Переменные окружения для интеграции с Lardi

Name Type Description Default
LARDI_API str Токен доступа к Lardi API. В текущей версии Telegram‑бот использует его опосредованно через MCP‑сервер, но переменная есть в .env.

На практике настройка выглядит так: вы копируете telegram-bot/env.example в .env, заполняете обязательные значения (бот, URL, OpenAI, параметры БД и MCP) и при необходимости добавляете дополнительные настройки — например, выбираете нестандартные модели Responses API или меняете лимит истории. Более подробный пример заполнения .env приведён в разделе «Быстрый старт».