Бот, который помнит удалённое
Ghosto показывает владельцу переписки, что собеседник удалил или переписал. Работает через официальный Business-режим Telegram — без чужих библиотек к пользовательскому протоколу и без входа в аккаунт человека.
Разве Telegram сам не присылает удалённое?
Присылает только номер строки
В событии об удалении нет ни текста, ни автора — только идентификатор чата и номера сообщений. Значит вся ценность продукта держится на собственном зеркале: каждое сообщение подключённых чатов попадает в базу до того, как бот ответит Telegram, что событие принято. Не успел записать — показывать потом будет нечего.
Дальше обычная продуктовая обвязка: пробный период, покупка срока, лимиты на размер файла и на месяц, приглашение друзей, партнёрская программа и админ-панель со статистикой и выплатами.
- Таблиц в базе
- 15: зеркало, версии правок, медиа, платежи
- Тесты
- 50 файлов против настоящего Postgres
- Хранение
- тексты 30 дней, файлы 7
- От первого коммита до боя
- 3 дня, весь продукт — 58 коммитов
И что было самым неочевидным?
Чужая переписка не выходит наружу
- Свой Bot API server вместо облачного. Облако не отдаёт боту файлы больше двадцати мегабайт, а видео из переписки легко тяжелее. Локальный сервер кладёт файл на общий том — скачивания по сети нет вообще, и горячий путь с личными данными не покидает машину.
- Приватный режим без ключа на сервере. Содержимое шифруется, а функции расшифровки в серверном коде просто нет — она выполняется в мини-приложении на устройстве владельца, ключ лежит в его облачном хранилище Telegram. Даже с доступом к базе прочитать нечего.
- Хрупкие возможности живут за флагом. Часть механик держится на поведении Telegram, которое не описано в документации и может исчезнуть с любым обновлением. Такое включается отдельным переключателем, чтобы отвалившаяся функция не уронила остальное.
- Уборка данных в два уровня. Файл удаляется раньше записи о нём: осиротевшую запись подчистит следующий проход, а осиротевший файл не подчистит никто. Уборщик ходит только по своим папкам с медиа: рядом лежит служебное состояние сервера, и снести его заодно — значит разлогинить бота на ровном месте.
А наружу что торчит?
Ровно два адреса
Ни один порт контейнеров не опубликован: наружу открыто ровно два адреса: приём оплаты и мини-приложение. Телеграмный вебхук в интернет не выставлен вообще — сообщения приходят на свой Bot API server по внутренней сети, всё остальное отдаёт 404. Проверки типов, линтера и тестов проходят на каждый push, образ собирается лишь после зелёного прогона, а сервер забирает его сам по таймеру — входящий доступ на машину не нужен.