@sssterben

Почему мой телеграм-бот ломается при деплое?

У меня есть мой телеграм бот, который при запуске на локалке идеально работает, без единого косяка, но как только я его деплою на Yandex Cloud в обычный контейнер - он перестает работать или работает только первые несколько команд, логи ничего не говорят.
Основной код бота прикладываю.

package TelegramBot

import (
	"context"
	"log"
	"time"

	tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
)

type ChatInfo struct {
	stop   chan bool
	ticker *time.Ticker
}

var chats = make(map[int64]*ChatInfo)

func (d *Domain) StartBot() {
	d.botApi.Debug = true

	log.Printf("Authorized on account %s", d.botApi.Self.UserName)

	u := tgbotapi.NewUpdate(0)
	updates, _ := d.botApi.GetUpdatesChan(u)
	for update := range updates {
		if update.Message != nil {
			if update.Message.Text == "/start" {

				msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Добро пожаловать! Выберите действие:")
				msg.ReplyMarkup = tgbotapi.NewReplyKeyboard(
					tgbotapi.NewKeyboardButtonRow(
						tgbotapi.NewKeyboardButton("Этнический юмор"),
						tgbotapi.NewKeyboardButton("Профессиональный юмор"),
						tgbotapi.NewKeyboardButton("Детский юмор"),
						tgbotapi.NewKeyboardButton("Подписаться"),
					),
				)
				d.botApi.Send(msg)

			} else if update.Message.Text == "Этнический юмор" || update.Message.Text == "Ржать еще!" {

				anekdot, err := d.anekdotProvider.GetJoke(context.Background(), "1")
				if err != nil {
					log.Println("Ошибка GetAnekdot")
				}
				msg := tgbotapi.NewMessage(int64(update.Message.From.ID), anekdot)
				msg.ReplyMarkup = tgbotapi.NewReplyKeyboard(
					tgbotapi.NewKeyboardButtonRow(
						tgbotapi.NewKeyboardButton("Ржать еще!"),
						tgbotapi.NewKeyboardButton("Сменить категорию"),
					),
				)
				d.botApi.Send(msg)

			} else if update.Message.Text == "Профессиональный юмор" || update.Message.Text == "Ржать еще!!" {

				anekdot, err := d.anekdotProvider.GetJoke(context.Background(), "2")
				if err != nil {
					log.Println("Ошибка GetAnekdot")
				}
				msg := tgbotapi.NewMessage(int64(update.Message.From.ID), anekdot)
				msg.ReplyMarkup = tgbotapi.NewReplyKeyboard(
					tgbotapi.NewKeyboardButtonRow(
						tgbotapi.NewKeyboardButton("Ржать еще!!"),
						tgbotapi.NewKeyboardButton("Сменить категорию"),
					),
				)
				d.botApi.Send(msg)

			} else if update.Message.Text == "Детский юмор" || update.Message.Text == "Ржать еще!!!" {

				anekdot, err := d.anekdotProvider.GetJoke(context.Background(), "3")
				if err != nil {
					log.Println("Ошибка GetAnekdot")
				}
				msg := tgbotapi.NewMessage(int64(update.Message.From.ID), anekdot)
				msg.ReplyMarkup = tgbotapi.NewReplyKeyboard(
					tgbotapi.NewKeyboardButtonRow(
						tgbotapi.NewKeyboardButton("Ржать еще!!!"),
						tgbotapi.NewKeyboardButton("Сменить категорию"),
					),
				)
				d.botApi.Send(msg)

			} else if update.Message.Text == "Подписаться" {

				stop := make(chan bool)
				ticker := time.NewTicker(5 * time.Second)
				chats[update.Message.Chat.ID] = &ChatInfo{
					stop:   stop,
					ticker: ticker,
				}
				go d.autoSendJokes(update.Message.Chat.ID, stop)
				msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Вы подписались на рассылку анекдотов.")
				msg.ReplyMarkup = tgbotapi.NewReplyKeyboard(
					tgbotapi.NewKeyboardButtonRow(
						tgbotapi.NewKeyboardButton("Этнический юмор"),
						tgbotapi.NewKeyboardButton("Профессиональный юмор"),
						tgbotapi.NewKeyboardButton("Детский юмор"),
						tgbotapi.NewKeyboardButton("Отписаться"),
					),
				)
				d.botApi.Send(msg)

			} else if update.Message.Text == "Отписаться" {

				if chatInfo, ok := chats[update.Message.Chat.ID]; ok {
					chatInfo.stop <- true
					chatInfo.ticker.Stop()
					delete(chats, update.Message.Chat.ID)
				}
				msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Вы отписались от рассылки анекдотов.")
				msg.ReplyMarkup = tgbotapi.NewReplyKeyboard(
					tgbotapi.NewKeyboardButtonRow(
						tgbotapi.NewKeyboardButton("Этнический юмор"),
						tgbotapi.NewKeyboardButton("Профессиональный юмор"),
						tgbotapi.NewKeyboardButton("Детский юмор"),
						tgbotapi.NewKeyboardButton("Подписаться"),
					),
				)
				d.botApi.Send(msg)

			} else if update.Message.Text == "Сменить категорию" {

				msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Выберите категорию анекдота:")
				msg.ReplyMarkup = tgbotapi.NewReplyKeyboard(
					tgbotapi.NewKeyboardButtonRow(
						tgbotapi.NewKeyboardButton("Этнический юмор"),
						tgbotapi.NewKeyboardButton("Профессиональный юмор"),
						tgbotapi.NewKeyboardButton("Детский юмор"),
						tgbotapi.NewKeyboardButton("Подписаться"),
					),
				)
				d.botApi.Send(msg)

			}
		}
	}
}
func (d *Domain) autoSendJokes(chatID int64, stop chan bool) {
	ticker := time.NewTicker(5 * time.Second)
	defer ticker.Stop()
	for {
		select {
		case <-stop:
			return
		case <-ticker.C:
			anekdot, err := d.anekdotProvider.GetJoke(context.Background(), "")
			if err != nil {
				log.Println("Ошибка GetAnekdot")
				continue
			}
			msg := tgbotapi.NewMessage(chatID, anekdot)
			d.botApi.Send(msg)
		}
	}
}


Запуск в мейне:

package main

import (
	"log"
	"net/http"
	"newbot/internal/domain/AnekdotProviders"
	"newbot/internal/domain/TelegramBot"
	"os"

	"github.com/joho/godotenv"
	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)

func main() {
	err := godotenv.Load()
	if err != nil {
		log.Println("Can't read env")
	}
	e := echo.New()
	e.Use(middleware.CORSWithConfig(middleware.CORSConfig{}))
	JokeProvider := AnekdotProviders.New(
		&http.Client{},
	)

	port := os.Getenv("PORT")
	if port == "" {
		port = "1323"
	}
	go e.Start(":" + port)
	tgBot, err := TelegramBot.New(os.Getenv("BOT_TOKEN"), JokeProvider)
	if err != nil {
		// Обработайте ошибку
		log.Fatalf("Failed to create Telegram bot: %v", err)
	}
	tgBot.StartBot()
}


Докерфайл:

# Устанавливаем базовый образ Golang
FROM --platform=linux/amd64 golang:latest

# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /go/src/newbot

# Копируем все остальные файлы из исходной директории в рабочую директорию внутри контейнера
COPY . .

# Установка зависимостей
RUN go mod download

WORKDIR /go/src/newbot/cmd

# Собираем приложение
RUN go build -o main

# Запускаем приложение при запуске контейнера
CMD ["./main"]
  • Вопрос задан
  • 199 просмотров
Пригласить эксперта
Ответы на вопрос 1
Возможно, не работает как полагается из-за переменных среды. Стоит добавить распечатку всех используемых значений переменных среды при инициализации программы и проверить работоспособность при локальном запуске в Docker'е.

Стоит заменить
log.Println("Can't read env")
на log.Fatal(err)
и добавить логи в ключевые места для проверки прохождения контрольных точек.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы