У меня есть мой телеграм бот, который при запуске на локалке идеально работает, без единого косяка, но как только я его деплою на 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"]