Botxona

Как задеплоить 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.yaml entry: ./cmd/bot.

Быстрее с помощью ИИ

Можно отдать код ИИ вместе с готовым заданием из Библиотеки промптов и автоматически привести его к стандартам Botxona.

Следующий шаг

Чтобы бот работал постоянно и Обзор панели управления.