Полноценное Telegram мини-приложение для онлайн-записи в маникюрный салон. Клиент открывает бота, выбирает услугу → дату → время → подтверждает, получает уведомление. Владелец управляет расписанием и записями через встроенную панель администратора.
Стек: Node.js + Express + Telegraf + SQLite (бэкенд) / React 18 + Vite (фронтенд)
- Каталог — список услуг с ценами и описанием
- Выбор даты — доступные дни календарём
- Выбор времени — слоты с учётом занятых
- Подтверждение — итог записи перед отправкой
- Успех — подтверждение записи с деталями
- Отзыв — форма отзыва после визита
- Записи — все предстоящие записи, отмена одним кликом
- День — расписание на конкретный день
- Отзывы — все оставленные отзывы
- Уведомления клиенту при записи и напоминание за сутки
- Уведомление владельца при новой записи
- Проверка прав администратора через Telegram initData (HMAC-SHA256)
├── index.js # Express + Telegraf, webhook/polling auto-detect
├── db/
│ ├── database.js # SQLite init + schema
│ └── seed.js # Начальные данные (услуги, слоты)
├── routes/
│ ├── designs.js # GET /api/designs — услуги
│ ├── slots.js # GET /api/slots — доступные слоты
│ ├── bookings.js # POST/GET /api/bookings
│ ├── admin.js # GET /api/admin — только для администратора
│ └── reviews.js # POST /api/reviews
└── webapp/ # React 18 + Vite
└── src/
├── App.jsx
├── screens/ # Catalog, DatePick, TimePick, Confirm, Success, Review
└── admin/ # AdminBookings, AdminDay, AdminReviews
Webhook / Polling: в production index.js автоматически определяет URL хостинга (WEBHOOK_URL → RENDER_EXTERNAL_URL → KOYEB_PUBLIC_DOMAIN) и переключается в webhook-режим. Локально работает через polling.
git clone https://github.com/feewwee39-dev/tg-mini-app.git
cd tg-mini-app
cp .env.example .env
# Заполните .env: BOT_TOKEN, ADMIN_CHAT_ID, WEBAPP_URL
npm install
npm run build # сборка React-приложения
# Туннель для Telegram (нужен HTTPS)
# Вариант 1: cloudflared
cloudflared tunnel --url http://localhost:3000
# Вариант 2: ngrok
ngrok http 3000
# Обновите WEBAPP_URL в .env на URL туннеля, затем:
npm start- Fork репозитория → New Web Service на render.com
- Build Command:
npm run build - Start Command:
npm start - Environment Variables:
| Переменная | Значение |
|---|---|
BOT_TOKEN |
Токен от @BotFather |
ADMIN_CHAT_ID |
Ваш Telegram ID (узнать через @userinfobot) |
WEBAPP_URL |
https://your-app.onrender.com |
Render автоматически определяется как production — бот переключится в webhook-режим.
Работает без изменений. Koyeb авто-подхватывает KOYEB_PUBLIC_DOMAIN.
Скопируйте .env.example в .env:
BOT_TOKEN= # Токен от @BotFather
ADMIN_CHAT_ID= # Ваш Telegram ID
PORT=3000 # Порт Express (по умолчанию 3000)
WEBAPP_URL= # HTTPS-URL приложения (туннель локально / домен в prod)
# WEBHOOK_URL= # Переопределение URL вебхука (необязательно)| Слой | Технология |
|---|---|
| Runtime | Node.js >= 22 |
| HTTP сервер | Express 4 |
| Telegram Bot | Telegraf 4 |
| БД | SQLite (better-sqlite3) |
| Работа с датами | Luxon |
| Фронтенд | React 18 + Vite |
| Деплой | Render / Railway / Koyeb |