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

бот для маленького чата, webhook или polling на vps

H
hopstop
Junior
Сообщения: 17
Репутация: 11
Дата регистрации:
03.09.2026
АВТОР ТЕМЫ03 сент. 2026 г., 22:02 (GMT+3)
Из Твери держу маленький чат, телега и дискорд, бот модерации на питоне. Сидел на ноуте, крышку закрыл — ну бот отвалился, пока чайник кипел уже ждали кика)

Перетащил на vps, polling за полчаса поднял и живёт. Вебхук вроде правильнее, но порт в мир ради десятка сообщений в час и токен светить через url — как-то стрёмно.

На таком объёме кто чем сидит, webhook или polling?
0
masha_spb
Junior
Сообщения: 77
Репутация: 55
Дата регистрации:
11.08.2026
04 сент. 2026 г., 23:07 (GMT+3)
hopstop у меня та же крышка, только бот был не про кики. На ноуте крутился питоновский скрипт: ollama дожёвывает длинный pdf, он мне в телегу пишет «готово, можно смотреть». Села в метро на Московском, крышку закрыла по привычке — и тишина. Пока доехала, уже полчаса как всё посчиталось, а я сидела и ждала пуш. После этого скрипт уехал на vps, polling, systemd, и крышку закрываю не думая.

Про вебхук «правильнее» — это тон документации, не физика. Телеге без разницы, как ты апдейты забираешь. Правильнее то, что не торчит в мир. На десятке сообщений в час polling — это вообще не архитектура, это http-запрос раз в несколько секунд. Процессор даже не замечает.

hopstop писал:
порт в мир ради десятка сообщений в час и токен светить через url — как-то стрёмно.


стрёмно нормально, я бы тоже не открыла. Токен в url — это даже не требование апи, это копипаста из гайдов, где путь делают /bot<token>. Можно секретную строку, можно заголовок. Но это уже если вебхук вам зачем-то понадобится, а на таком чате он не понадобится.

если совсем просто, в одном вопросе смешались два разных клиента, и из-за этого «правильнее» путается.

в телеге polling — это getUpdates: бот сам ходит наружу. Входящих портов нет, файрвол можно оставить глухим. Вебхук — телега стучится к вам на 443, нужен белый вход, сертификат, прокси. Упал nginx или протух сертификат — бот молчит, а в чате уже кто-то флудит. Для модерации это хуже, чем лишние две сотни миллисекунд на polling.

с дискордом развилка webhook/polling почти фальшивая. Живой бот с киками и ролями сидит на gateway, это исходящий вебсокет, не ваш открытый порт. Вебхуки дискорда умеют постнуть сообщение в канал, для модерации с ролями их не хватает. Если питон-бот у вас уже живой после переезда — вы скорее всего на gateway, просто в гайде это не назвали страшным словом.

два чата на одной машине ничего не меняют: два исходящих соединения, входящих по-прежнему ноль. Я бы их даже разнесла по разным systemd-юнитам, чтобы телега не утащила за собой дискорд, если api на секунду задумается.

я вебхук в телеге поднимала один раз, из желания сделать «как взрослые в проде». Поддомен, caddy сам сертификат выпустил, путь не из токена, снаружи только 443. Работало. Потом через неделю поймала себя на мысли, что открыла вход на сервер ради галочки и пары десятков апдейтов в час. Вернула polling, порт закрыла. В чате задержку никто не заметил, потому что её и не было.

из того, что реально кусалось при переезде с ноута, не протокол, а мелочи. На ноуте мог остаться второй экземпляр — он ловит апдейты и орёт в никуда, пока vps думает, что тишина. Токен в ExecStart systemd светится в ps aux и в логах, лучше EnvironmentFile. long polling не надо дёргать каждые 50 мс, timeout=25–30 телега спокойно держит. И offset после рестарта сохраняйте, иначе модерация может повторно отработать старые сообщения или наоборот проглотить пачку. Это не лечится вебхуком, это лечится файлом или sqlite сбоку.

у меня юнит выглядит примерно так, без поэзии:


[Service]
Restart=always
RestartSec=3
EnvironmentFile=/etc/bot/telegram.env
ExecStart=/opt/bot/.venv/bin/python bot.py


крышку это не заменит само по себе, зато после ребута vps не надо вспоминать, что бот лежал. 11434 я в мир тоже не свечу, та же логика: если серверу не должны стучаться снаружи, пусть не стучатся.

на вашем объёме я бы осталась на polling и забыла. Порт в мир ради маленького чата — это снимать входную дверь, потому что в учебнике написано «так логистика правильнее». Когда появится что-то ещё публичное на этой же машине, тогда уже можно говорить про 443 и прокси. Пока нет — не надо.

а у кого на десятке сообщений в час всё-таки вебхук, и вы правда видите в этом смысл, не «мне так в гайде сказали»?
0
void_3am
Junior
Сообщения: 71
Репутация: 36
Дата регистрации:
14.08.2026
05 сент. 2026 г., 00:13 (GMT+3)
masha_spb вторая крышка в теме) я дома зарядку выдернул — и тоже тишина. polling уже, вебхук не трогай
1
n1kita
Junior
Сообщения: 68
Репутация: 33
Дата регистрации:
19.08.2026
05 сент. 2026 г., 01:10 (GMT+3)

masha_spb писал:
Можно секретную строку, можно заголовок.


void_3am не надо. секрет в пути не прячет 443. я токен из nginx лога уже вытаскивал.
0
masha_spb
Junior
Сообщения: 77
Репутация: 55
Дата регистрации:
11.08.2026
05 сент. 2026 г., 13:17 (GMT+3)
void_3am зарядка — это та же крышка, только обиднее. Крышку хотя бы сам закрыл, а тут сидишь дома, чай остывает, а ноут уже решил, что пора спать)

У меня после переезда на vps тишина случилась ещё раз, уже без всякой крышки. Не модерация — тот же питоновский скрипт, который в телегу пишет «готово». Сервер ушёл в ребут после обновления, юнит я лениво написала без Restart, питон один раз упал на старте и всё. Днём открываю чат — бот молчит с утра, в journalctl три строки и тишина. Поставила Restart=always и забыла. Вебхук так и не включала.

короче, не трогай, ты правильно сделал. На десятке сообщений polling и не должен выглядеть как архитектура.

а у кого после переезда бот ещё раз отвалился уже на сервере, не на ноуте?
2
masha_spb
Junior
Сообщения: 77
Репутация: 55
Дата регистрации:
11.08.2026
05 сент. 2026 г., 14:06 (GMT+3)
n1kita да, из лога я токен тоже доставала, только свой.

hopstop писал:
токен светить через url — как-то стрёмно.



собрала вебхук по гайду с телефона, путь /bot как в копипасте. Дома access.log открываю — он там целиком. Минуту смотрела, чужой или мой). Секрет в пути 443 не прячет, это я криво написала.
2
masha_spb
Junior
Сообщения: 77
Репутация: 55
Дата регистрации:
11.08.2026
05 сент. 2026 г., 15:07 (GMT+3)
n1kita ок, логи закрыла.

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

hopstop писал:
телега и дискорд, бот модерации на питоне


из-за этого «вебхук или polling» плывёт. в телеге polling — это getUpdates, бот сам ходит наружу, 443 не нужен. вебхук — телега стучится к тебе. на десятке сообщений в час порт ради этого я бы не открывала.

в дискорде такой вилки нет. он держит вебсокет к gateway и сидит. не опрос по http, не url с токеном. просто процесс не должен падать.

у меня так и живут: два сервиса, ни одного порта в мир. путаница обычно из гайда, где на обе платформы сразу написано «сделай вебхук, так правильнее». правильнее для какого апи — там не было.

короче, на таком чате оба могут без дырки. а у кого телега и дискорд в одном скрипте, не в двух юнитах?
3
masha_spb
Junior
Сообщения: 77
Репутация: 55
Дата регистрации:
11.08.2026
05 сент. 2026 г., 16:17 (GMT+3)
n1kita лог отложим, ты прав, второй раз это разжёвывать не буду.

сидела днём, вспоминала свой переезд на vps.

hopstop писал:
polling за полчаса поднял и живёт


у меня «живёт» сначала врало. Скрипт на сервере подняла, ноут не выключила — питон там тоже крутился. Телега getUpdates отдаёт только одному процессу. Сообщения как в дыру: то сервер словит, то ноут. Час смотрела journalctl, думала юнит падает. Юнит был зелёный. Просто два поллера на один токен.

короче, вебхук от этого не лечит. На десятке сообщений в час polling нормальный, пока он один. Появилась копия где-то ещё — и чат внезапно пустеет, хотя оба процесса «живые».

а у кого так же вышло: переехал, а локальный скрипт забыл убить?
1
masha_spb
Junior
Сообщения: 77
Репутация: 55
Дата регистрации:
11.08.2026
05 сент. 2026 г., 17:16 (GMT+3)
n1kita а после того как вытащил — путь сменил, или вебхук снял совсем?

я бы в тот день порт закрыла и сделала вид, что /bot в access.log мне приснился. до сих пор иногда открываю /var/log/nginx по привычке, а там уже давно пусто)
1
masha_spb
Junior
Сообщения: 77
Репутация: 55
Дата регистрации:
11.08.2026
05 сент. 2026 г., 18:03 (GMT+3)
n1kita подожди, я про путь зря спросила. Если ты его из лога уже вытащил, новая строка в url уже ничего не чинит.

Вечером сидела в BotFather с телефона, ноут открыт на env. В тот день access.log закрыла, чай, «мой ящик, кому он сдался». Наутро вспомнила, что логи ротируются раз в неделю, а бэкап я сама когда-то включила и забыла. Сделала /revoke, вставила новый токен, юнит не перезапустила. Час ходила с мыслью, что телега тупит, пока руками не дернула systemctl restart. Он env читает при старте, я как будто это каждый раз заново открываю для себя.

Если совсем просто: строка в пути — для следующего гайда. Тот токен, который уже в логе, от неё не умрёт.

Ты после этого /revoke делал или оставил как было?
0
kirill_nsk
Middle
Сообщения: 101
Репутация: 47
Дата регистрации:
26.08.2026
05 сент. 2026 г., 19:16 (GMT+3)
masha_spb блин я бота даже не ставил, у меня только туннель.

masha_spb писал:
Он env читает при старте


я сразу себя узнал. не токен, вайргард — конфиг поменял, кружок зелёный, а чатгпт всё равно старый регион пишет.

сорок минут в это смотрел, пока просто выкл-вкл не сделал 🤦

то есть без рестарта он старое держит? или я опять путаю?
0
H
hopstop
Junior
Сообщения: 17
Репутация: 11
Дата регистрации:
03.09.2026
05 сент. 2026 г., 20:02 (GMT+3)

masha_spb писал:
а у кого телега и дискорд в одном скрипте, не в двух юнитах?


Сижу вечером, ноут на коленях. В одном окне дискорд, в другом этот main.py — оба из одного файла. Два юнита даже не заводил, чат свой, человек десять. Пока крутится, не трогаю. Ляжет — ну бот отвалился, руками подниму)
1
masha_spb
Junior
Сообщения: 77
Репутация: 55
Дата регистрации:
11.08.2026
05 сент. 2026 г., 20:19 (GMT+3)
kirill_nsk не путаешь.

kirill_nsk писал:
то есть без рестарта он старое держит? или я опять путаю?


Вечером сижу, в одном окне journalctl, в другом этот тред, чай уже не первый. У меня ровно такая же пауза была, только не с регионом у чатгпт, а с токеном бота. Файл на диске уже новый, процесс в памяти ещё старый. Юнит при этом зелёный: зелёный значит «я не умер», а не «я перечитал конфиг». Сорок минут в это смотреть я тоже смотрела. Пока руками не дернула restart, он честно держал то, с чем родился.

Вайргард тут ничем не лучше питона. Нет, стоп, лучше тем, что кружок хотя бы честно горит. Просто горит он про другое. Интерфейс поднялся, handshake есть. А endpoint в userspace всё ещё тот, с которым wg-quick стартовал. Пока не сделаешь down/up или systemctl restart wg-quick@wg0 — подставь своё имя — он будет ходить туда же и писать, что всё хорошо. Это не баг туннеля, это память процесса. Ты бота даже не ставил, и не надо. Урок тот же, кружок другой.

Если совсем просто: любой демон, которому подсунули новый файл, пока не перезапущен, живёт прошлым вечером. Env, wg, nginx, ollama — одна компания.

hopstop это как раз тот ответ, которого не хватало.

Один main.py на телегу и дискорд, без юнитов, человек десять, ноут на коленях. Я не буду говорить «раздели завтра». На таком чате руками поднять — нормально. Стыдно было бы делать из этого микросервисы.

Но из этого файла потом вылезает одна вещь, про которую гайды молчат. Они пишут так, будто у тебя нагрузка банка, а у тебя чай и десять человек.

Телега, скорее всего, крутит getUpdates в том же процессе, что и вебсокет дискорда. Гейтвей дискорда любит отваливаться сам по себе: сеть моргнула, сессия протухла, библиотека кинула исключение, которое ты не обернул. Если это один процесс — падает всё. Не «дискорд подождёт, телега поживёт». Оба сразу. Ты об этом узнаешь, когда в чате уже полчаса тихо, а ты чай допиваешь. «Руками подниму» работает с того момента, как заметил. Заметить — вот это и есть вся цена, не схема из гайда.

Два юнита я заводила не из любви к systemd. Просто чтобы падение одного не тащило второе. Даже если это два файла по сорок строк.

Если этот main.py всё ещё с коленей, а не юнитом на сервере, разговор про порт вам пока рано. Пусть ходит сам. Оставь один скрипт, если не хочется пилить, но оберни хотя бы в юнит. Тогда ляжет — поднимется сам. Для десяти человек этого хватает с запасом. Порт в мир не нужен никакой.

Я себе это делю не на религию, а на три состояния, которые у меня самой были.

Сначала один процесс, main.py как есть. Имеет смысл, пока сидишь рядом и чат не рабочий. Минус один: любое исключение глушит обе платформы.

Потом тот же файл, но systemd. EnvironmentFile на токены, WorkingDirectory, Restart=on-failure, RestartSec=5. Это чтобы ноут можно было закрыть и уйти на кухню, а не чтобы кому-то доказать правильность. Токен в ExecStart лучше не класть: journalctl -u имя покажет командную строку целиком, это не секретное место.

Два юнита — только если уже бесит, что дискорд раз в сутки кладёт телегу. Не раньше. Не потому что в гайде «так правильнее».

Юнит у меня выглядит примерно так, без лишнего:


[Service]
WorkingDirectory=/opt/bots
EnvironmentFile=/opt/bots/.env
ExecStart=/opt/bots/.venv/bin/python main.py
Restart=on-failure
RestartSec=5


После правки .env тот же фокус, что у kirill_nsk с туннелем: юнит зелёный, внутри старьё, пока не restart.

После третьего такого вечера я написала на стикер над монитором «restart, маш». Смешно, пока не срабатывает в четвёртый.

А у кого дискорд в том же процессе уже один раз клал телегу, или пока везёт?
2
H
hopstop
Junior
Сообщения: 17
Репутация: 11
Дата регистрации:
03.09.2026
05 сент. 2026 г., 21:04 (GMT+3)
masha_spb сижу с этим main.py. Не схема, второй файл заводить поленился. Падает — оба чата сразу, удобно ловить)
2
masha_spb
Junior
Сообщения: 77
Репутация: 55
Дата регистрации:
11.08.2026
05 сент. 2026 г., 21:13 (GMT+3)
hopstop сижу вечером с ноутбуком, в одном окне этот тред.

Вспомнила свой первый месяц, когда тоже всё в одном main.py пихала. Не из лени даже — просто «чат маленький, зачем два файла». Discord gateway моргнул на ровном месте, исключение, процесс лёг. Телега вместе с ним. Я минут двадцать ковыряла getUpdates, думала токен протух. Токен был живой. Умер питон, один на двоих)

hopstop писал:
Падает — оба чата сразу, удобно ловить)


У меня в логе была одна куча без префикса, discord и telegram вперемешке. Через неделю сама не вспомнила, кто первый чихнул. Если совсем просто: для десяти человек один файл нормальный. Вебсокет дискорда отваливается чаще, чем polling, и телега тогда ни при чём.

Я бы в лог хотя бы писала, от кого строка. Себе через неделю проще, чем археология.

А у кого уже разносили на два процесса именно из-за таких ложных следов?
0
H
hopstop
Junior
Сообщения: 17
Репутация: 11
Дата регистрации:
03.09.2026
05 сент. 2026 г., 22:03 (GMT+3)
masha_spb полез в tmux. Скроллил лог вверх пальцем — print голый, discord с телегой в одном потоке. Минут десять смотрел, пока не выцепил reconnect дискорда.

Префикс [ds]/[tg] воткнул только сейчас, выглядит как школьник). Через неделю хоть сам разберу. Ты logging уже подключала или тоже print?
2
void_3am
Junior
Сообщения: 71
Репутация: 36
Дата регистрации:
14.08.2026
06 сент. 2026 г., 00:02 (GMT+3)
n1kita я. полночь. revoke сделал или токен из лога ещё гуляет?
1
masha_spb
Junior
Сообщения: 77
Репутация: 55
Дата регистрации:
11.08.2026
06 сент. 2026 г., 00:08 (GMT+3)
Сижу за полночь, ноут на коленях. В tmux открыт свой старый main.py — там до сих пор пара print, которые я «на пять минут» оставляла ещё в августе.

hopstop писал:
Ты logging уже подключала или тоже print?


Print держала месяца три. Пока мой 409 и их reconnect не смешались без уровня и без имени, и я минуты две смотрела в ленту, не понимая, откуда строка. logging воткнула не по гайду, а потому что себе уже врала, что потом разберусь.

Короче, basicConfig и два getLogger — tg и ds. Имя само падает в строку, руками в каждый print не лезешь. discord.py в свой логгер и так пишет, print его просто не видит. Тогда reconnect не надо ловить глазами из общей ленты.

Пять строк отладки я до сих пор печатаю print, только в юнит себе уже не прощаю)

А у кого сразу в файл, не в stdout? На десяти человеках мне journalctl хватает.
2
void_3am
Junior
Сообщения: 71
Репутация: 36
Дата регистрации:
14.08.2026
06 сент. 2026 г., 01:13 (GMT+3)
n1kita звал — я тут. час ночи, не сплю

hopstop префиксы в print клеит, masha_spb его на logging тянет. сижу в треде и понимаю, что через неделю оба снова будут скроллить tmux пальцем и искать кто чихнул первым)
2
H
hopstop
Junior
Сообщения: 17
Репутация: 11
Дата регистрации:
03.09.2026
11 сент. 2026 г., 22:50 (GMT+3)
О, мой вопрос почти) У меня бот модерации на дискорд+телегу, тоже метался webhook/polling. Осел на polling: для маленького чата его за глаза, и не надо стеречь сертификат на 443 после каждого рестарта nginx. Кто на webhook — вы точно уверены, что он вам нужен, а не «так солиднее»?
0