Как задеплоить Go-бота на Botxona (go-telegram/bot)
go-telegram/bot — современная библиотека для Telegram-ботов на Go без внешних зависимостей. Для работы с Botxona никаких специальных настроек не нужно — Telegram-запросы автоматически проходят через прокси платформы, WithServerURL не нужен. Готовый стартовый проект: шаблон Go.
Шаги
1. Создайте бота
package main
import (
"context"
"os"
"os/signal"
"github.com/go-telegram/bot"
"github.com/go-telegram/bot/models"
)
func main() {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()
b, err := bot.New(os.Getenv("BOT_TOKEN"),
bot.WithDefaultHandler(func(ctx context.Context, b *bot.Bot, u *models.Update) {
if u.Message == nil {
return
}
b.SendMessage(ctx, &bot.SendMessageParams{
ChatID: u.Message.Chat.ID,
Text: "Привет! Я работаю.",
})
}),
)
if err != nil {
panic(err)
}
b.Start(ctx) // long polling
}
Для других библиотек (gopkg.in/telebot.v3, go-telegram-bot-api/v5) тоже достаточно настроек по умолчанию — менять адрес API не нужно. Подробнее: 6 стандартных правил.
2. Используйте DATA_DIR
dataDir := os.Getenv("DATA_DIR")
if dataDir == "" {
dataDir = "./data"
}
os.MkdirAll(dataDir, 0o755)
dbPath := filepath.Join(dataDir, "bot.sqlite3")
3. go.mod и go.sum
module mening-botim
go 1.27
require github.com/go-telegram/bot v1.27.0
Версии в go.mod должны быть указаны точно, а go.sum тоже нужно добавить в архив — если go.sum нет, появится предупреждение (сборка сама запускает go mod tidy). Строка go/toolchain в go.mod учитывается.
4. Точка входа
Botxona находит пакет main в корне проекта (main.go) или ровно одну папку cmd/<имя>/. Если структура другая, добавьте botxona.yaml (правило точки входа):
runtime: go
entry: ./cmd/bot
5. .env.example и загрузка
Опишите в .env.example настройки, специфичные для вашего бота, сделайте ZIP папки (не добавляйте vendor/ и готовые бинарные файлы — проект собирается на стороне Botxona, подробнее) и загрузите его в панель.
6. Проверка и тест
Разберитесь в результате проверки здесь и проверьте бота в Telegram в тестовом режиме.
Как устроена сборка
Бот собирается в статический бинарник с CGO_ENABLED=0 (golang:1.27-alpine) и запускается на alpine с установленными ca-certificates и tzdata. Поэтому библиотеки, которым нужен cgo, не работают.
Если нужен SQLite
github.com/mattn/go-sqlite3 использует cgo — на Botxona он не работает. Вместо него используйте modernc.org/sqlite на чистом Go:
import (
"database/sql"
_ "modernc.org/sqlite"
)
db, err := sql.Open("sqlite", dbPath)
Расписание с time.NewTicker или cron
Если для ежедневных сообщений или напоминаний используются time.NewTicker, time.Tick(, robfig/cron или go-co-op/gocron, Botxona обнаружит это и переведёт бота в режим «всегда включён». Подробнее: Сон и пробуждение.
Частые ошибки
401 Unauthorized— неверный токен, смотрите страницу Получение токена.go: ... missing go.sum entry—go.sumне добавлен в архив; запустите локальноgo mod tidyи добавьтеgo.sum.Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo— заменитеmattn/go-sqlite3наmodernc.org/sqlite.- Точка входа не найдена — пакет
mainне в корне, а папокcmd/несколько: укажите вbotxona.yamlentry: ./cmd/bot.
Быстрее с помощью ИИ
Можно отдать код ИИ вместе с готовым заданием из Библиотеки промптов и автоматически привести его к стандартам Botxona.