insights-bot/
├── main.py # Основной файл с логикой бота
├── database.py # Функции для работы с БД
├── export_excel.py # Функции для экспорта в Excel
├── requirements.txt # Зависимости Python
├── .env.example # Пример конфигурации
├── Procfile # Конфигурация для Render
├── runtime.txt # Версия Python
└── README.md # Этот файл
- Зарегистрируйтесь на supabase.com
- Создайте новый проект
- Откройте SQL Editor и выполните следующий запрос:
CREATE TABLE insights (
id SERIAL PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
theme VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
macro_region VARCHAR(50) NOT NULL,
industry VARCHAR(100) NOT NULL,
file_id VARCHAR(255),
filename VARCHAR(255),
user_id BIGINT NOT NULL
);
CREATE INDEX idx_macro_region ON insights(macro_region);
CREATE INDEX idx_industry ON insights(industry);
CREATE INDEX idx_user_id ON insights(user_id);- Скопируйте
Project URLиAPI Key(выберите анон ключ) из Settings → API
- Откройте чат с @BotFather в Telegram
- Отправьте команду
/newbot - Следуйте инструкциям и получите BOT_TOKEN
# Клонируйте репозиторий или создайте папку
mkdir insights-bot
cd insights-bot
# Создайте виртуальное окружение
python -m venv venv
# Активируйте окружение
# На Windows:
venv\Scripts\activate
# На macOS/Linux:
source venv/bin/activate
# Установите зависимости
pip install -r requirements.txt
# Создайте .env файл
cp .env.example .env
# Отредактируйте .env с вашими данными
nano .env# Инициализируйте Git репозиторий
git init
git add .
git commit -m "Initial commit: Telegram insights bot"
# Создайте репозиторий на GitHub и залейте код
git remote add origin https://github.com/YOUR_USERNAME/insights-bot.git
git branch -M main
git push -u origin main-
Зайдите на render.com
-
Нажмите New + → Web Service
-
Подключите GitHub репозиторий
-
Настройки:
- Name:
insights-bot - Runtime: Python 3.11
- Build Command:
pip install -r requirements.txt - Start Command:
gunicorn --bind 0.0.0.0:$PORT main:app --worker-class aiohttp.GunicornWebWorker
- Name:
-
Добавьте переменные окружения в Environment:
BOT_TOKEN- ваш токен от BotFatherSUPABASE_URL- URL вашего Supabase проектаSUPABASE_KEY- API ключ Supabase (анон)WEBHOOK_URL- будет автоматически видаhttps://insights-bot-xxxx.onrender.com
-
Нажмите Create Web Service
После развертывания скопируйте URL (например, https://insights-bot-xxxx.onrender.com) и добавьте его в переменную WEBHOOK_URL.
-
Зайдите на railway.app
-
Нажмите New Project → Deploy from GitHub
-
Выберите ваш репозиторий
-
Добавьте переменные окружения в Variables:
BOT_TOKENSUPABASE_URLSUPABASE_KEYWEBHOOK_URL
-
Railway автоматически запустит приложение
- ➕ Создать новый инсайт - создание новой записи
- 🔍 Поиск и просмотр - поиск по фильтрам
- 📊 Экспорт в Excel - скачать все данные
Процесс пошагово:
- Введите тему инсайта
- Введите описание
- Выберите макрорегион из списка (количество записей показывается на кнопке)
- Выберите отрасль (количество записей показывается на кнопке)
- Опционально: прикрепите файл или фото
- Выберите макрорегион
- Выберите отрасль
- Просмотрите найденные инсайты:
- Кнопки навигации ⬅️ и ➡️
- Кнопка 📎 Скачать файл (если файл прикреплен)
Нажимаете 📊 Экспорт в Excel и получаете файл со всеми записями, где указано:
- Дата создания
- Тема
- Описание
- Макрорегион
- Отрасль
- Наличие прикрепленного файла
Отредактируйте в main.py:
MACRO_REGIONS = ["МСК", "ЦФО", "СЗФО", "УФО", "ЮФО", "ПФО", "СДФО", "СНГ", "НОВЫЙ"]Отредактируйте в main.py:
INDUSTRIES = ["Оборона", "Промышленность", "Торговля", "Банки", "Нефть и газ", "Энергетика", "НОВАЯ"]Для оптимизации при большом объеме данных добавьте в database.py:
from functools import lru_cache
from datetime import datetime, timedelta
cache_timeout = {}
@lru_cache(maxsize=128)
async def get_cached_count(field: str, value: str):
cache_key = f"{field}_{value}"
if cache_key in cache_timeout:
if datetime.now() - cache_timeout[cache_key] < timedelta(minutes=5):
return await get_count_by_field(field, value)
count = await get_count_by_field(field, value)
cache_timeout[cache_key] = datetime.now()
return countНикогда не коммитьте .env файл! Используйте .env.example как шаблон.
Добавьте в .gitignore:
.env
.env.local
__pycache__
venv/
*.pyc
*.xlsx
Для ограничения доступа пользователей:
ALTER TABLE insights ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can view all insights"
ON insights FOR SELECT
USING (true);
CREATE POLICY "Users can create own insights"
ON insights FOR INSERT
WITH CHECK (true);Логи автоматически выводятся в консоль. На Render посмотрите их в Logs табе.
Для сохранения логов локально добавьте в main.py:
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('bot.log'),
logging.StreamHandler()
]
)- Создание инсайта
- Поиск по фильтрам
- Экспорт данных
- Ошибки при работе с БД
- Проверьте, что
BOT_TOKENправильный - Убедитесь, что webhook установлен:
https://api.telegram.org/botTOKEN/getWebhookInfo - Проверьте логи на Render/Railway
- Убедитесь, что приложение запустилось (статус должен быть "Running")
- Проверьте
SUPABASE_URLиSUPABASE_KEY - Убедитесь, что таблица
insightsсоздана - Проверьте, что ключ типа "anon" (анонимный)
- Убедитесь, что в БД есть данные
- Проверьте прав доступа к
/tmpдиректории - Увеличьте timeout на Render/Railway
- Индексы - уже добавлены на
macro_region,industry,user_id - Пагинация - добавьте LIMIT в SQL запросы
- Кэширование - используйте Redis для кэша
- Supabase: при росте объема данных выше 500 МБ
- Render: при необходимости большего количества часов в месяц
- Aiogram документация
- Supabase документация
- Telegram Bot API
- Render документация
- Railway документация
Этот проект предоставляется в образовательных целях.
Если возникли вопросы, обратитесь к документации проекта или создайте Issue в репозитории.
Версия: 1.0.0
Последнее обновление: Ноябрь 2025