Telegram бот для напоминаний - твой личный библиотекарь для важного.
Подробный разбор архитектуры, всего функционала и технологических решений (в т.ч. почему без домена и на long polling) - в docs/PROJECT_OVERVIEW.md.
- Пользователь отправляет боту текст или картинку
- Бот сохраняет их в БД
- Настраивается расписание отправки (количество в день, временной интервал, часовой пояс)
- Бот отправляет сохраненные сообщения по расписанию
- PROFIT
app/- основной код приложенияdocker/- конфигурация Dockerphp/Dockerfile- образ PHP 8 CLImysql/my.cnf- конфигурация MySQL
docker-compose.yml- конфигурация контейнеровMakefile- команды для управления проектом.github/workflows/- CI/CDdeploy-prod.yml- деплой на продакшнbackup.yml- автоматические бэкапы
Точка входа:
main.php- главный цикл бота (бесконечный цикл, обрабатывает сообщения, проверяет расписание)config.php- загрузка .env, инициализация Sentry, настройка таймзоны
core/ - базовые классы:
Action.php- роутер команд (разбирает/command/method, загружает нужный класс из command/)DB.php- работа с БД (запросы для messages, schedule, schedule_daily, command_waiting, chat_history)Model.php- базовый класс для моделей (инициализирует telegram и db)
model/ - бизнес-логика:
Processing.php- обработка входящих сообщений (получает апдейты из Telegram, вызывает нужные команды)Schedule.php- управление расписанием (генерирует расписание на день, проверяет что пора отправить)
command/ - обработчики команд бота:
Start.php-/start- приветствие, создание расписания по умолчаниюMessage.php- сохранение/редактирование сообщений, работа с изображениямиCatalog.php-/catalog- просмотр сохраненных сообщенийSetting.php-/setting- настройка расписания (количество, время, часовой пояс)Now.php-/nowили/_id- немедленная отправка конкретного сообщенияChange.php-/change- изменение текста сообщенияHelp.php-/help- помощьFaq.php-/faq- FAQMenu.php-/menu- главное менюError.php- обработка ошибок (неизвестные команды)Test.php-/test- тестовые команды
db/ - работа с базой данных:
migrations/- миграции Phinx20200101010101_start.php- создание таблиц (message, schedule, schedule_daily, command_waiting, chat_history)20230908145401_change_chatId_type.php- изменение типа chat_id20230919145401_convert_tables_to_utf8mb4.php- конвертация в utf8mb4
dump/RIB_test.sql- тестовый дамп БД
lib/ - вспомогательные функции:
helper.php- утилиты (shorten_text, shorten_link, heartbeat, ddf)logs.php- логирование через Logtail/Monolog
file/ - сохраненные изображения от пользователей (структура: chat_id/filename.jpg)
logs/ - логи приложения
main.log- основной лог
message- сохраненные сообщения пользователей (текст, изображения)schedule- расписание отправки для каждого пользователя (количество в день, интервал времени, часовой пояс)schedule_daily- расписание на текущий день (генерируется каждый день, когда отправлять каждое сообщение)command_waiting- команды в ожидании (когда пользователь вводит параметры)chat_history- история активности пользователей
Файл app/.env содержит:
ENVIRONMENT- окружение (developer/production)MYSQL_*- параметры подключения к БДTELEGRAM_*- токен бота, имя, admin_chat_idMAX_OF_MESSAGES_PER_DAY- максимум сообщений в день (по умолчанию)MAX_LINE_LENGTH- максимальная длина строки для обрезки текстаPERIOD_MESSAGE_CHECKED- период проверки сообщений в секундах (в main.php)BETTERSTACK_TOKEN- для логирования и heartbeatSENTRY_DNS- опционально, для отслеживания ошибокBACKUPS_FOLDER- путь для бэкапов
make help- список всех командmake init- инициализация проекта (сборка, запуск, миграции)make update- пересобрать контейнер, обновить composer и миграцииmake restart- перезапуск контейнеровmake log- просмотр логовmake php-bash- вход в контейнер PHPmake migrate- применить миграцииmake rollback- откатить последнюю миграциюmake backup-db- бэкап БДmake backup-file- бэкап файловmake import-dump- импорт тестового дампа БД
- Спит 60 сек (для инициализации БД)
- Бесконечный цикл:
- Каждую секунду:
Processing::check()- проверка новых сообщений - Каждые 20 циклов:
heartbeat()- отправка сигнала в BetterStack - Каждые 60 циклов:
Schedule::check()- проверка расписания, отправка сообщений - Каждые 600 циклов:
Schedule::generate()- генерация расписания на день
- Каждую секунду:
- PHP 8.2 (CLI)
- MySQL 8.2
- Composer - управление зависимостями
- Phinx - миграции БД
- Docker Compose - контейнеризация
- Telegram Bot API (eleirbag89/telegrambotphp)
- Monolog/Logtail - логирование
- Sentry - отслеживание ошибок (опционально)
-
.github/workflows/deploy-prod.yml- автоматический деплой при push в main- Создает .env из secrets/vars
- Копирует файлы на сервер
- Запускает
make update - Проверяет что контейнеры запущены
- Отправляет уведомление в Telegram
-
.github/workflows/backup.yml- ежедневные бэкапы в полночь UTC