telegram: сервис поднимается без бота и работает одним входом
- Клиент бота собирается один раз и достаётся отправителю и транспорту; разрез прошёл по «ответил ли Telegram»: ответ «такого бота нет» роняет старт, недоступность даёт подъём без Telegram (ADR-2026-08-13). Ожидание при сборке ограничено сроком — иначе молчащий Telegram вешал подъём. - Недоставленный ответ не роняет шаг: пишется с job_id и считается метрикой, уровень по причине — WARN для неподнятого входа, ERROR для неназванного адресата. Заведены transcriber_intake_up и transcriber_undelivered_reply_count. - Закрыта утечка токена в журнал: отказ разбора адреса рождается раньше обращения к клиенту, то есть мимо чистки на его границе.
This commit is contained in:
@@ -17,12 +17,11 @@ import (
|
||||
ffmpegmv "git.vakhrushev.me/av/transcriber/internal/adapter/metaviewer/ffmpeg"
|
||||
"git.vakhrushev.me/av/transcriber/internal/adapter/recognizer/yandex"
|
||||
pbrepo "git.vakhrushev.me/av/transcriber/internal/adapter/repo/pocketbase"
|
||||
"git.vakhrushev.me/av/transcriber/internal/adapter/telegram"
|
||||
"git.vakhrushev.me/av/transcriber/internal/config"
|
||||
"git.vakhrushev.me/av/transcriber/internal/contract"
|
||||
httpcontroller "git.vakhrushev.me/av/transcriber/internal/controller/http"
|
||||
tgcontroller "git.vakhrushev.me/av/transcriber/internal/controller/tg"
|
||||
"git.vakhrushev.me/av/transcriber/internal/controller/worker"
|
||||
"git.vakhrushev.me/av/transcriber/internal/metrics"
|
||||
"git.vakhrushev.me/av/transcriber/internal/service"
|
||||
"github.com/joho/godotenv"
|
||||
"github.com/pocketbase/pocketbase/apis"
|
||||
@@ -89,9 +88,9 @@ func main() {
|
||||
metaviewer := ffmpegmv.NewFfmpegMetaViewer()
|
||||
converter := ffmpegconv.NewFfmpegConverter()
|
||||
|
||||
tgSender, err := telegram.NewTelegramMessageSender(cfg.Telegram.BotToken, logger)
|
||||
tgBot, tgSender, err := buildTelegram(cfg.Telegram.BotToken, logger)
|
||||
if err != nil {
|
||||
logger.Error("failed to create audio telegram sender", "error", err)
|
||||
logger.Error("Failed to create Telegram bot", "error", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
@@ -141,13 +140,17 @@ func main() {
|
||||
UserWhiteList: cfg.Server.UsersWhiteList,
|
||||
}
|
||||
|
||||
// Клиента бота заводит единая точка: её отказ не несёт токена, тогда как
|
||||
// отказ `NewBotAPI` несёт — он ходит за `getMe`.
|
||||
tgController, err := newTelegramController(cfg.Telegram.BotToken, tgConfig, transcribeService, jobRepo, logger)
|
||||
if err != nil {
|
||||
logger.Error("Failed to create Telegram controller", "error", err)
|
||||
// Не останавливаем приложение, если Telegram бот не создан
|
||||
} else {
|
||||
// Транспорт поднимается только там, где есть клиент: о том, что бота нет,
|
||||
// сказано выше единственной записью, и вторая здесь была бы записью о том
|
||||
// же факте.
|
||||
var tgController *tgcontroller.TelegramController
|
||||
if tgBot != nil {
|
||||
tgController, err = tgcontroller.NewTelegramController(tgConfig, tgBot, transcribeService, jobRepo, logger)
|
||||
if err != nil {
|
||||
logger.Error("Failed to create Telegram controller", "error", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Запускаем Telegram бот в отдельной горутине
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
@@ -179,6 +182,11 @@ func main() {
|
||||
}(w)
|
||||
}
|
||||
|
||||
// Вход по HTTP поднимается всегда: он основной, и отдельного разреза у него
|
||||
// нет. Признак ставится рядом с признаком Telegram, чтобы владелец судил об
|
||||
// обоих входах одним отбором.
|
||||
metrics.IntakeUpGauge.WithLabelValues("http").Set(1)
|
||||
|
||||
// Наши маршруты живут на роутере хранилища: панель отдаётся тем же портом,
|
||||
// и второму серверу на нём взяться неоткуда.
|
||||
transcribeHandler := httpcontroller.NewTranscribeHandler(jobRepo, transcribeService, logger)
|
||||
@@ -328,21 +336,3 @@ func main() {
|
||||
|
||||
logger.Info("Transcriber service stopped")
|
||||
}
|
||||
|
||||
// newTelegramController собирает бота и транспорт вокруг него. Токен доходит
|
||||
// до единой точки `internal/adapter/telegram` и дальше не идёт: транспорт его
|
||||
// не видит вовсе, а отказ, который увидит журнал, адреса с токеном не несёт.
|
||||
func newTelegramController(
|
||||
botToken string,
|
||||
cfg tgcontroller.TelegramConfig,
|
||||
transcribeService *service.TranscribeService,
|
||||
jobRepo contract.TranscriptJobRepository,
|
||||
logger *slog.Logger,
|
||||
) (*tgcontroller.TelegramController, error) {
|
||||
bot, err := telegram.NewBot(botToken, logger)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return tgcontroller.NewTelegramController(cfg, bot, transcribeService, jobRepo, logger)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user