Сообщество / Боты

Обсуждение — VPS для игрового бота: автофарм и стабильная работа 24/7

Источник:
VPS для игрового бота: автофарм, headless и работа 24/7

Игровые боты автоматизируют рутину: фарм ресурсов в браузерных играх, музыкальные и модерационные боты в Discord, сборщики наград по таймеру. Чтобы бот работал, пока вы спите, его размещают на VPS. Разберём деплой headless-бота с автозапуском. Под «игровым ботом» понимают очень разное. Чаще всего на VPS размещают три типа: боты для Discord (музыка, модерация, экономика сервера), автоматизацию браузерных и веб-игр (сбор ресурсов по расписанию) и вспомогательные боты, которые дёргают игровые API по таймеру. Всё это — фоновые процессы, которым нужен…

Подробнее →
tema_py
Junior
Сообщения: 58
Репутация: 42
Дата регистрации:
18.08.2026
АВТОР ТЕМЫ04 сент. 2026 г., 23:20 (GMT+3)
блин, сорок минут в journalctl смотрел, пока не дошло.

фармить браузерки я не собираюсь, у меня обычный тг-бот, python-telegram-bot, вебхук. автозапуск 24/7 накидал как в статье — systemd зелёный, процесс живой, а апдейты не приходят. ну наконец-то: бот слушает 127.0.0.1:8080, а в setWebhook я оставил путь, который nginx вообще не проксирует. сервис «работает», телега бьёт в пустоту))

ща скину минималку, токен только из env.


import os
from telegram.ext import Application, CommandHandler

TOKEN = os.environ["BOT_TOKEN"]

async def ping(update, context):
await update.message.reply_text("жив")

app = Application.builder().token(TOKEN).build()
app.add_handler(CommandHandler("ping", ping))
app.run_webhook(
listen="127.0.0.1",
port=8080,
url_path="webhook",
webhook_url=os.environ["WH_URL"],
secret_token=os.environ.get("WH_SECRET"),
)


у кого вебхук за nginx на том же vps — вы location один в один с url_path держите? а то бот как будто 24/7, а телега мимо проходит.
1
n1kita
Junior
Сообщения: 68
Репутация: 33
Дата регистрации:
19.08.2026
05 сент. 2026 г., 00:02 (GMT+3)
tema_py location = url_path, да. secret_token у меня не стоял — за ночь в access.log nginx чужие post на /webhook. .get убери.
0
tema_py
Junior
Сообщения: 58
Репутация: 42
Дата регистрации:
18.08.2026
05 сент. 2026 г., 13:36 (GMT+3)
n1kita я после обеда в другом окне сидел, твой пост открыл краем глаза и почти закрыл. думал, ну у меня же секрет прокинут, чего логи смотреть. полез всё равно, потому что «почти» у меня обычно значит «забыл».

сначала access.log за вчера. post на /webhook пачками. user-agent пустой, иногда curl/7, ip которые к телеге никак не вяжутся. не брут какой-то, просто сканеры тыкают урлы, интернет. потом unit: EnvironmentFile прописан, а в .env строка WH_SECRET закомментирована, рядом моим почерком «потом допишу». когда с ноута гонял, без секрета стартовало удобнее. .get это не аккуратность, это я оставил дырку, чтобы процесс не падал.

n1kita писал:
за ночь в access.log nginx чужие post на /webhook


у меня не ночь, просто вчерашний лог, и картина та же. systemd зелёный, процесс живой, телега иногда доходит. в python-telegram-bot если secret_token=None, заголовок X-Telegram-Bot-Api-Secret-Token он не проверяет. это не защита по умолчанию, это выключено. я почему-то решил, что None это нормально.

переписал. на токене и секрете теперь обычные скобки, не .get. нет переменной — бот не поднимается, в journalctl сразу KeyError, а не «вроде 24/7». listen и port пусть остаются с дефолтом, там не секрет.


import os
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes

TOKEN = os.environ["BOT_TOKEN"]
WH_URL = os.environ["WH_URL"]
WH_SECRET = os.environ["WH_SECRET"]
LISTEN = os.environ.get("WH_LISTEN", "127.0.0.1")
PORT = int(os.environ.get("WH_PORT", "8080"))

async def ping(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.message.reply_text("жив")

def main() -> None:
app = Application.builder().token(TOKEN).build()
app.add_handler(CommandHandler("ping", ping))
app.run_webhook(
listen=LISTEN,
port=PORT,
url_path="webhook",
webhook_url=WH_URL,
secret_token=WH_SECRET,
)

if __name__ == "__main__":
main()

.env лежит рядом с ботом, в git не идёт. на unit EnvironmentFile=/home/bot/app/.env, права 600, пользователь отдельный, не root. токен в репу я уже один раз затаскивал, второй раз не хочу.

nginx секрету учить не стал. если тот же WH_SECRET засунуть в if внутри location, потом поменяешь в одном месте и неделю ловишь 403 от собственной телеги. один раз в env, проверяет питон. nginx только проксирует на 127.0.0.1:8080, этот порт снаружи закрыт. location ровно /webhook, как url_path. без фантазий про /bot/secret-path — умный путь всё равно не секрет.


location /webhook {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 30s;
}

юнит простой. Restart=always, чтобы когда я снова забуду переменную, починил env и не ходил руками. After=nginx, потому что без прокси телега бьёт в пустоту — это я уже ловил. NoNewPrivileges нагуглил, если лишнее — ну стоит.


[Unit]
Description=tg webhook bot
After=network-online.target nginx.service
Wants=network-online.target

[Service]
Type=simple
User=bot
Group=bot
WorkingDirectory=/home/bot/app
EnvironmentFile=/home/bot/app/.env
ExecStart=/home/bot/app/.venv/bin/python /home/bot/app/bot.py
Restart=always
RestartSec=5
NoNewPrivileges=yes

[Install]
WantedBy=multi-user.target

сел, daemon-reload, restart, сразу journalctl -u bot -n 50. Application started, traceback нет, руки отпустило)) setWebhook ещё раз, secret_token в запросе. с телеги /ping — «жив». с самой машины curl на свой же https без заголовка — 403, с кривым секретом тоже. в access.log левые post как ходили, так и ходят, сеть такая, но в journalctl бота их уже нет. вот это я хотел, а не зелёную лампочку.

getWebhookInfo смотрел из env, токен в историю шелла не копировал. pending_update_count ноль, last_error_message пусто, url как в WH_URL. если last_error висит сутками — это не «бот живой 24/7», это телега стучится и получает фигню. на этом уже обжёгся.

url_path в питоне менял, в nginx забывал, или наоборот. сейчас в обоих просто webhook и всё.

утром от безысходности думал на поллинг переехать, чтобы хоть что-то жило без nginx. не стал. вебхук на этом же хосте нормально работает, если не оставлять .get «на потом» 🤦

сейчас бот не падает, я почти горд, пока не ткнут в следующее))

а у кого вебхук без секрета уже месяц крутится — когда access.log в последний раз открывали? я вот был уверен, что у меня чисто.
0
tema_py
Junior
Сообщения: 58
Репутация: 42
Дата регистрации:
18.08.2026
05 сент. 2026 г., 14:16 (GMT+3)
n1kita я url_path с /webhook на рандомную строку сменил, в nginx то же самое. сканеры всё равно в access.log /webhook тыкают, пусть тыкают в пустоту. бот на другом location. блин, надо было сразу так, а не красивое слово webhook в конфиге. сейчас /ping с телеги доходит, ну наконец-то))
0
kirill_nsk
Middle
Сообщения: 101
Репутация: 47
Дата регистрации:
26.08.2026
05 сент. 2026 г., 15:14 (GMT+3)
tema_py у меня так же было, кружок зелёный а интернета нет
у тебя щас пинг уже стабильно с телеги доходит?)
1
tema_py
Junior
Сообщения: 58
Репутация: 42
Дата регистрации:
18.08.2026
05 сент. 2026 г., 15:20 (GMT+3)
kirill_nsk да, уже часа два как стабильно. отошёл чай налить — вернулся, с телеги /ping, «жив» сразу. у тебя кружок без интернета, у меня был зелёный systemd и тишина, одна история))

n1kita а ты путь тоже сменил или только секрет дописал?
3
tema_py
Junior
Сообщения: 58
Репутация: 42
Дата регистрации:
18.08.2026
05 сент. 2026 г., 16:22 (GMT+3)
n1kita сижу в access.log, обновил. пачка post на старый /webhook, все 404. повесил в nginx if на заголовок — без секрета сразу 403, до питона даже не доезжает. после вчерашнего один замок мне мало)) ты это в nginx ловишь или только бот проверяет?
1
n1kita
Junior
Сообщения: 68
Репутация: 33
Дата регистрации:
19.08.2026
05 сент. 2026 г., 17:07 (GMT+3)

tema_py писал:
ты это в nginx ловишь или только бот проверяет?


в nginx. if по заголовку, пустой — сразу 403. процесс этот мусор не видит. путь сменил сразу после тех ночных post. /webhook живым не держу, в логе на него до сих пор лезут. бот секрет проверяет вторым. если дойдёт без заголовка — считай открытый.
1
tema_py
Junior
Сообщения: 58
Репутация: 42
Дата регистрации:
18.08.2026
05 сент. 2026 г., 17:36 (GMT+3)

n1kita писал:
если дойдёт без заголовка — считай открытый


глянул journalctl за вчера: до if туда сыпались трейсы от ptb на каждый чужой post. думал бот тормозит, cpu дёргается. сейчас тихо, только свои пинги. второй замок в боте оставил, мало ли location криво прокинется))
2
n1kita
Junior
Сообщения: 68
Репутация: 33
Дата регистрации:
19.08.2026
05 сент. 2026 г., 23:17 (GMT+3)

tema_py писал:
думал бот тормозит, cpu дёргается


у меня из таких трейсов вылез путь с токеном. если всплыл — ревокай.
0
n1kita
Junior
Сообщения: 68
Репутация: 33
Дата регистрации:
19.08.2026
06 сент. 2026 г., 02:01 (GMT+3)

tema_py писал:
мало ли location криво прокинется


вчера nginx с бэкапа накатил — if не было. бот один и закрыл.
0
n1kita
Junior
Сообщения: 68
Репутация: 33
Дата регистрации:
19.08.2026
06 сент. 2026 г., 03:01 (GMT+3)
tema_py в три ночи journalctl -u бота. вчерашние трейсы ещё на диске. ротация путь сама не вычистит. глянь.
3
kirill_nsk
Middle
Сообщения: 101
Репутация: 47
Дата регистрации:
26.08.2026
06 сент. 2026 г., 06:02 (GMT+3)
tema_py о спасибо)
утром открыл тред, у тебя уже «жив» пишет. я даже чай не ставил, сразу в вайргард полез как дурак.

а /ping это ты руками из телеги шлёшь? я бота такого не держу, мне бы понять как вы 24/7 смотрите что он не отвалился)
1
kirill_nsk
Middle
Сообщения: 101
Репутация: 47
Дата регистрации:
26.08.2026
06 сент. 2026 г., 07:06 (GMT+3)
tema_py я только сейчас догнал про systemd.
сижу с телефона, вайргард открыт — кружок зелёный а чатгпт не открывается. типо как у тебя сервис горит и тишина.

это днс опять или оно просто молчит?
в journalctl даже не лезу, куда тыкать тогда?)
0
kirill_nsk
Middle
Сообщения: 101
Репутация: 47
Дата регистрации:
26.08.2026
06 сент. 2026 г., 09:02 (GMT+3)
tema_py сижу в столовке, тред с телефона открыл)

ты про if в nginx и 403. я nginx вроде не ставил, у меня только вайргард.

эти вебхуки мне тоже закрывать или это у вас бот так торчит в мир? не хочу случайно в конфиг полезть и сломать)
2
kirill_nsk
Middle
Сообщения: 101
Репутация: 47
Дата регистрации:
26.08.2026
06 сент. 2026 г., 11:33 (GMT+3)
tema_py я с работы, верстку свернул и journalctl с телефона открыл.

там пусто почти, бота у меня нет. ключи от вайргарда в conf лежат, в лог вроде не сыпет.

это ок или такие пути тоже надо чистить? куда смотреть если я даже бота не ставил?
0
kirill_nsk
Middle
Сообщения: 101
Репутация: 47
Дата регистрации:
26.08.2026
06 сент. 2026 г., 12:05 (GMT+3)
tema_py я в маршрутке еду и завис на твоём location)

это путь в боте или страна сервера? у меня uk, я это не трогал. куда смотреть?
2
H
hopstop
Junior
Сообщения: 17
Репутация: 11
Дата регистрации:
03.09.2026
11 сент. 2026 г., 23:10 (GMT+3)
Не по игровым, но по «бот на vps 24/7» отмечусь: главное — не токен в код и Restart=on-failure в systemd, иначе после любого чиха бот лежит до утра, а игроки думают, что сервер умер. У меня так модерация ночью отвалилась и до обеда молчала, стыдно было.
0