Мой рабочий план без кругов ада
Я делаю ботов и Mini Apps на проектах разного масштаба.
Ниже - как запуститься быстро и аккуратно, без лишних слоёв сложности. Внутри есть короткие примеры кода.
1️⃣ Что поставить ⚙️
- 🔹Python 3.11+ или Node.js 18/20
- 🔹Git, VS Code
- 🔹Менеджер пакетов: pip/Poetry или npm/pnpm
- 🔹Туннель: ngrok или Cloudflare Tunnel
- 🔹@BotFather: получите токен, задайте /start и команды
Мини‑команды
# Python python -m venv .venv && source .venv/bin/activate pip install aiogram aiosqlite python-dotenv # Node npm init -y npm i grammy express dotenv # Туннель (для вебхуков) ngrok http 8080
2️⃣ Стек на старте
- 🔹Если ближе понятный, спокойный вход: Python + Aiogram 3, SQLite → PostgreSQL
- 🔹Если ближе JS и планируете Mini App: Node.js + grammY/Telegraf, SQLite/Prisma → PostgreSQL
- 🔹Dev: long polling. Prod: webhook (экономнее и отзывчивее)
- 🔹Хостинг: Railway/Render/Fly.io или VPS с Docker+Caddy/Nginx
- 🔹Секреты держим в .env, логи - в отдельный чат
3️⃣ Мини‑маршрут первых шагов
- Описываете один сценарий (например: собрать контакт ≤60 секунд).
- Создаёте бота в @BotFather, берёте токен.
- Локальный echo с кнопкой.
- Сохранение лида (email/телефон) в SQLite/Google Sheets.
- Деплой и переключение на webhook.
- Замеряете шаги, сокращаете трение, добавляете оплаты/CRM при необходимости.
Python (Aiogram 3): старт, кнопка, запись лида в SQLite 🐍
from aiogram import Bot, Dispatcher, F
from aiogram.types import Message, ReplyKeyboardMarkup, KeyboardButton
from aiogram.enums import ParseMode
import asyncio, os, aiosqlite
from dotenv import load_dotenv
load_dotenv()
bot = Bot(os.getenv("BOT_TOKEN"), parse_mode=ParseMode.HTML)
dp = Dispatcher()
kb = ReplyKeyboardMarkup(
keyboard=[[KeyboardButton(text="Оставить контакт")]],
resize_keyboard=True
)
async def init_db():
async with aiosqlite.connect("bot.db") as db:
await db.execute("""
CREATE TABLE IF NOT EXISTS leads (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
text TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
""")
await db.commit()
@dp.message(F.text == "/start")
async def start(m: Message):
await m.answer("Привет! Нажмите кнопку и оставьте контакт 👇", reply_markup=kb)
@dp.message(F.text == "Оставить контакт")
async def ask(m: Message):
await m.answer("Напишите email или телефон в одном сообщении:")
@dp.message()
async def save_lead(m: Message):
async with aiosqlite.connect("bot.db") as db:
await db.execute("INSERT INTO leads(user_id, text) VALUES(?,?)", (m.from_user.id, m.text))
await db.commit()
await m.answer("Принял. Вернусь с ответом как только проверю ✅")
async def main():
await init_db()
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Webhook на Python (FastAPI) - если хотите сразу прод. поведение
from fastapi import FastAPI, Request
import uvicorn, os
from aiogram import Bot, Dispatcher
app = FastAPI()
bot = Bot(os.getenv("BOT_TOKEN"))
dp = Dispatcher()
@app.post(f"/{os.getenv('BOT_TOKEN')}")
async def webhook(request: Request):
update = await request.json()
await dp.feed_webhook_update(bot, update)
return {"ok": True}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8080)
URL в Telegram: https://your-domain.com/<BOT_TOKEN>
4️⃣ Пример .env (общий)
BOT_TOKEN=123456:ABC... MODE=dev
🔧 Практичные мелочи
- 🔹 Кнопки спасают конверсию. Любой ввод - валидируйте.
- 🔹 Ошибки отправляйте себе в приват/группу, а не «куда‑нибудь потом».
- 🔹 Добавьте /health на бэке и включите аптайм‑пинг.
- 🔹 Делайте бэкапы: SQLite - файл, PostgreSQL - pg_dump по расписанию.
Хочешь запустить бота быстро и без «чёрной магии»?
Напишите мне в ЛС словом «СТАРТ» - предложу план под ваш бюджет. Созвон 20 минут, без воды. Сделаем MVP, который начнет приносить заявки уже на первой неделе 🚀
Калькулятор стоимости: @svyatoslav_devbot




Дискуссия