Запуск Телеграм-бота через systemd с виртуальным окружением: инструкция
Раз уже пошла тема про деплой телеграмм бота на VPS сервере поделюсь с вами ещё одним способом. На этот раз с использованием systemd.
1. Подготовка
👉 Скопировать файлы бота на сервер.
👉 Установить виртуальное окружение и все зависимости.
👉 Проверить, что бот работает при ручном запуске.
2. Скрипт для запуска бота
Создать Python-скрипт, который активирует виртуальное окружение и запускает бота. Вот пример:
Сохранить, например, как run_bot.py.
3. Создание systemd сервиса
Создать файл сервиса:
Пример содержимого:
В целом, этот файл:
👉 Запускает бот с использованием виртуального окружения.
👉 Обеспечивает автоматический перезапуск бота в случае его падения.
👉 Гарантирует, что бот запускается при старте системы.
4. Настройка прав и запуск
5. Полезные команды
Метод тоже достаточно простой. Для того чтоб изменения вступили в силу после правок кода используем: sudo systemctl restart имя_бота
Раз уже пошла тема про деплой телеграмм бота на VPS сервере поделюсь с вами ещё одним способом. На этот раз с использованием systemd.
1. Подготовка
👉 Скопировать файлы бота на сервер.
👉 Установить виртуальное окружение и все зависимости.
👉 Проверить, что бот работает при ручном запуске.
2. Скрипт для запуска бота
Создать Python-скрипт, который активирует виртуальное окружение и запускает бота. Вот пример:
import os
import subprocess
script_path = os.path.join(os.path.dirname(file), '/home/bot_dir/aiogram_run.py')
if os.path.exists(script_path):
subprocess.run(['/home/bot_dir/env/bin/python3', script_path], check=True)
else:
print("Не удалось найти скрипт aiogram_run.py.")
Сохранить, например, как run_bot.py.
3. Создание systemd сервиса
Создать файл сервиса:
sudo nano /etc/systemd/system/имя_бота.service
Пример содержимого:
[Unit]
Description=ИМЯ БОТА
After=multi-user.target
[Service]
Type=simple
ExecStart=/home/user/путь_к_боту/env/bin/python3 /home/user/путь_к_боту/run_bot.py
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
В целом, этот файл:
👉 Запускает бот с использованием виртуального окружения.
👉 Обеспечивает автоматический перезапуск бота в случае его падения.
👉 Гарантирует, что бот запускается при старте системы.
4. Настройка прав и запуск
chmod +x /home/user/путь_к_боту/run_bot.py
chmod +x /etc/systemd/system/имя_бота.service
sudo systemctl daemon-reload
sudo systemctl start имя_бота
sudo systemctl enable имя_бота
5. Полезные команды
Просмотр лога: sudo journalctl -u имя_бота
Лог в реальном времени: sudo journalctl -f -u имя_бота
Очистка кэша: sudo journalctl --vacuum-time=1s
Перезапуск бота: sudo systemctl restart имя_бота
Метод тоже достаточно простой. Для того чтоб изменения вступили в силу после правок кода используем: sudo systemctl restart имя_бота
👍8❤6🔥4
А вот пример run_bot.py файла для ленивых😊👇
Этот скрипт сначала проверяет наличие виртуального окружения в указанной директории. Если оно отсутствует, то создается новое окружение и устанавливаются зависимости из файла requirements.txt. Затем проверяется наличие скрипта aiogram_run.py, и если он существует, то запускается.
import os
import subprocess
script_path = os.path.join(os.path.dirname(__file__), 'aiogram_run.py')
venv_path = '/home/bot_dir/env'
requirements_path = '/home/bot_dir/requirements.txt'
# Проверяем наличие виртуального окружения
if not os.path.exists(venv_path):
print("Виртуальное окружение не найдено. Создаем...")
subprocess.run(['python3', '-m', 'venv', venv_path], check=True)
print("Виртуальное окружение создано.")
# Устанавливаем зависимости
subprocess.run([os.path.join(venv_path, 'bin', 'pip'), 'install', '-r', requirements_path], check=True)
print("Зависимости установлены.")
# Проверяем наличие скрипта
if os.path.exists(script_path):
subprocess.run([os.path.join(venv_path, 'bin', 'python3'), script_path], check=True)
else:
print("Не удалось найти скрипт aiogram_run.py.")
Этот скрипт сначала проверяет наличие виртуального окружения в указанной директории. Если оно отсутствует, то создается новое окружение и устанавливаются зависимости из файла requirements.txt. Затем проверяется наличие скрипта aiogram_run.py, и если он существует, то запускается.
🔥12👍8❤4👏2
Привет, друзья!
Рад сообщить, что я готовлю для вас новый практический гайд, но, на этот раз, по FastApi. Мы создадим полноценный мини-чат, используя FastApi. В процессе вы познакомитесь с такими важными аспектами, как вебсокеты, а также узнаете, как применять асинхронную алхимию с SQLite (в предыдущих примерах мы использовали PostgreSQL).
Надеюсь, что вы будете ждать выхода публикации!
Рад сообщить, что я готовлю для вас новый практический гайд, но, на этот раз, по FastApi. Мы создадим полноценный мини-чат, используя FastApi. В процессе вы познакомитесь с такими важными аспектами, как вебсокеты, а также узнаете, как применять асинхронную алхимию с SQLite (в предыдущих примерах мы использовали PostgreSQL).
Надеюсь, что вы будете ждать выхода публикации!
🔥25👍11❤4
Создание кастомных обработчиков исключений в FastAPI
Я давно грозился рассказать вам про кастомные обработчики исключений в FastApi. Сейчас продемонстрирую это дело на ошибке когда токен авторизации истек или когда токена нет (в случае логаута).
Для начала создадим файл exceptions.py на одном уровне с main.py. В этом файле определим два класса исключений для обработки наших ситуаций.
Эти классы наследуют от HTTPException и задают соответствующие статус-коды и сообщения об ошибках.
Теперь добавим обработчики этих исключений в main.py. При возникновении таких ошибок, пользователь будет перенаправлен на страницу /auth.
Здесь мы используем декоратор @app.exception_handler для привязки наших кастомных исключений к обработчикам. В случае возникновения исключения, пользователь будет перенаправлен на страницу авторизации.
Как видите, в FastAPI все просто и элегантно! 😊
P.S. Это пример с будущей статьи.
Я давно грозился рассказать вам про кастомные обработчики исключений в FastApi. Сейчас продемонстрирую это дело на ошибке когда токен авторизации истек или когда токена нет (в случае логаута).
Для начала создадим файл exceptions.py на одном уровне с main.py. В этом файле определим два класса исключений для обработки наших ситуаций.
from fastapi import status, HTTPException
class TokenExpiredException(HTTPException):
def __init__(self):
super().__init__(status_code=status.HTTP_401_UNAUTHORIZED, detail="Токен истек")
class TokenNotFoundException(HTTPException):
def __init__(self):
super().__init__(status_code=status.HTTP_401_UNAUTHORIZED, detail="Токен не найден")
Эти классы наследуют от HTTPException и задают соответствующие статус-коды и сообщения об ошибках.
Теперь добавим обработчики этих исключений в main.py. При возникновении таких ошибок, пользователь будет перенаправлен на страницу /auth.
from fastapi import FastAPI, Request
from fastapi.responses import RedirectResponse
from app.exceptions import TokenExpiredException, TokenNotFoundException
app = FastAPI()
@app.exception_handler(TokenExpiredException)
async def token_expired_exception_handler(request: Request, exc: TokenExpiredException):
# Перенаправляем пользователя на страницу /auth
return RedirectResponse(url="/auth")
@app.exception_handler(TokenNotFoundException)
async def token_not_found_exception_handler(request: Request, exc: TokenNotFoundException):
# Перенаправляем пользователя на страницу /auth
return RedirectResponse(url="/auth")
Здесь мы используем декоратор @app.exception_handler для привязки наших кастомных исключений к обработчикам. В случае возникновения исключения, пользователь будет перенаправлен на страницу авторизации.
Как видите, в FastAPI все просто и элегантно! 😊
P.S. Это пример с будущей статьи.
🎉9🔥8❤4👏1
This media is not supported in your browser
VIEW IN TELEGRAM
Привет, друзья! Рад сообщить, что проект, который я недавно анонсировал, завершён. Также готов черновик подробной статьи по разработке. Завтра утром вас ждёт большой гайд по созданию этого проекта. Исходный код и готовый проект в облаке будут доступны в течение нескольких часов. Сейчас пока делюсь демкой
❤13👍6👏2🤯1
Добрый вечер!
После небольшого форс-мажора наконец-то дошли руки до оформления проекта на GitHub, его деплоя и написания этого поста. Рад сообщить, что проект мини-чата на FastAPI полностью завершен!
В процессе разработки я затронул как знакомые темы — работа со статическими файлами, взаимодействие с SQLAlchemy в FastAPI, реализация JWT-токенов, регистрация и аутентификация, — так и продемонстрировал абсолютно новые направления, такие как вебсокеты.
Сегодня пришлось написать немало JavaScript-кода, и могу сказать, что результат того стоил. Получилось функциональное приложение для мини-чата, и я уверен, что после знакомства с инструкцией (которая будет завтра) вы сможете с лёгкостью создавать чаты любой сложности.
Главное — вы поймете, как добавить динамику и реактивность на фронтенд, даже если у вас нет глубоких знаний в разработке пользовательских интерфейсов.
К посту прикреплены ссылки на работающий проект и исходный код на GitHub. Буду очень рад вашей поддержке, так как в этот проект вложено много времени и сил.
При достаточной обратной связи я готов продолжать развивать этот проект и дальше.
До встречи завтра утром на Хабре!
После небольшого форс-мажора наконец-то дошли руки до оформления проекта на GitHub, его деплоя и написания этого поста. Рад сообщить, что проект мини-чата на FastAPI полностью завершен!
В процессе разработки я затронул как знакомые темы — работа со статическими файлами, взаимодействие с SQLAlchemy в FastAPI, реализация JWT-токенов, регистрация и аутентификация, — так и продемонстрировал абсолютно новые направления, такие как вебсокеты.
Сегодня пришлось написать немало JavaScript-кода, и могу сказать, что результат того стоил. Получилось функциональное приложение для мини-чата, и я уверен, что после знакомства с инструкцией (которая будет завтра) вы сможете с лёгкостью создавать чаты любой сложности.
Главное — вы поймете, как добавить динамику и реактивность на фронтенд, даже если у вас нет глубоких знаний в разработке пользовательских интерфейсов.
К посту прикреплены ссылки на работающий проект и исходный код на GitHub. Буду очень рад вашей поддержке, так как в этот проект вложено много времени и сил.
При достаточной обратной связи я готов продолжать развивать этот проект и дальше.
До встречи завтра утром на Хабре!
👍20🔥12❤5
Доброе утро🙋
Рад поделиться отличными новостями — мой проект мини-чата на FastAPI успешно завершен и уже доступен для использования, а обещанная подробная статья про его написание уже опубликована на моем Хабре🎉
В процессе работы я применил множество интересных решений, как знакомых, так и новых. В проекте использованы:
👉 работа со статическими файлами,
👉 интеграция SQLAlchemy в FastAPI,
👉 реализация JWT-токенов, регистрация и аутентификация,
И новый блок:
👉вебсокеты для двустороннего общения.
В статье пришлось активно поработать с JavaScript, чтобы обеспечить полную функциональность приложения. Теперь, даже если у вас нет глубоких знаний в разработке интерфейсов, вы сможете добавить динамику и реактивность в свои проекты!
Все ссылки на проект, исходный код на GitHub и сайт с приложением закреплены под этим постом. 🔗
Буду рад вашей поддержке и обратной связи!
Рад поделиться отличными новостями — мой проект мини-чата на FastAPI успешно завершен и уже доступен для использования, а обещанная подробная статья про его написание уже опубликована на моем Хабре🎉
В процессе работы я применил множество интересных решений, как знакомых, так и новых. В проекте использованы:
👉 работа со статическими файлами,
👉 интеграция SQLAlchemy в FastAPI,
👉 реализация JWT-токенов, регистрация и аутентификация,
И новый блок:
👉вебсокеты для двустороннего общения.
В статье пришлось активно поработать с JavaScript, чтобы обеспечить полную функциональность приложения. Теперь, даже если у вас нет глубоких знаний в разработке интерфейсов, вы сможете добавить динамику и реактивность в свои проекты!
Все ссылки на проект, исходный код на GitHub и сайт с приложением закреплены под этим постом. 🔗
Буду рад вашей поддержке и обратной связи!
👍14❤5🔥4
Легкий путь в Python
Доброе утро🙋 Рад поделиться отличными новостями — мой проект мини-чата на FastAPI успешно завершен и уже доступен для использования, а обещанная подробная статья про его написание уже опубликована на моем Хабре🎉 В процессе работы я применил множество интересных…
Для обсуждения статьи кнопка ниже 👇👇👇
❤1
Незапланированное включение😊
Недавно в сеть вышла новая версия ChatGPT — OpenAI 01. Эта модель способна на глубокие размышления и действительно впечатляет! Я нашел сервис, где можно попробовать эту модель бесплатно. Токенов немного, хватит на 1-2 запроса в день, так что используйте их с умом для действительно важных и сложных задач. Для более простых запросов доступны модели ChatGPT-o и ChatGPT-o-mini.
Переходите по ссылке и пробуйте: OpenAI 01
Недавно в сеть вышла новая версия ChatGPT — OpenAI 01. Эта модель способна на глубокие размышления и действительно впечатляет! Я нашел сервис, где можно попробовать эту модель бесплатно. Токенов немного, хватит на 1-2 запроса в день, так что используйте их с умом для действительно важных и сложных задач. Для более простых запросов доступны модели ChatGPT-o и ChatGPT-o-mini.
Переходите по ссылке и пробуйте: OpenAI 01
🔥12👍7❤6😁1
Кто прочитал статью про мини-чат на FastApi. Как вам такой формат публикаций?
👍19🔥8👏3
👋 Друзья, всем привет!
Я подготовил для вас новый, полезный и интересный проект! 🚀
В этот раз мы займемся тем, как при помощи чистого JavaScript, HTML и CSS связать форму на веб-странице с Telegram-ботом без использования бэкенда. Да-да, вы не ослышались — никакого бэкенда! 😎
📋 Что это даст?
Теперь любая информация, которую заполняют пользователи в форме на сайте, будет автоматически отправляться в Telegram. Это может пригодиться для заявок, опросов, анкет и других форм на сайте, где вам нужно мгновенно получать данные.
Я уже написал подробную статью на эту тему и планирую выложить её в четверг, 3-го октября. Но, если всё пойдёт по плану, возможно, опубликую раньше. 😉 Обязательно следите за обновлениями, чтобы не пропустить!
🔗 Ссылку на проект с GitHub закрепил под этим постом, переходите и смотрите!👨💻
Я подготовил для вас новый, полезный и интересный проект! 🚀
В этот раз мы займемся тем, как при помощи чистого JavaScript, HTML и CSS связать форму на веб-странице с Telegram-ботом без использования бэкенда. Да-да, вы не ослышались — никакого бэкенда! 😎
📋 Что это даст?
Теперь любая информация, которую заполняют пользователи в форме на сайте, будет автоматически отправляться в Telegram. Это может пригодиться для заявок, опросов, анкет и других форм на сайте, где вам нужно мгновенно получать данные.
Я уже написал подробную статью на эту тему и планирую выложить её в четверг, 3-го октября. Но, если всё пойдёт по плану, возможно, опубликую раньше. 😉 Обязательно следите за обновлениями, чтобы не пропустить!
🔗 Ссылку на проект с GitHub закрепил под этим постом, переходите и смотрите!👨💻
🔥17❤10👍6❤🔥4👎1
Некоторые из вас заметили, что в исходном коде последнего проекта токен не защищен. Это действительно так, и без бэкенда нам не обойтись. В ближайшее время я выпущу обновление, которое устранит эти уязвимости с помощью простого файла на FastAPI.
🔥11👍5❤4
Код проекта обновил на GitHub. Теперь все в безопасности ) единственное что не успел деплой сделать. Обновлённый код презентую сегодня вечером. Всем спасибо за обратную связь.
❤9👍6🔥5
Доброй ночи!
Наконец-то нашлось время описать фикс бага и задеплоить новую версию проекта. Проблема заключалась в том, что при работе через JavaScript токен бота был виден при каждом запросе. В рабочих проектах это недопустимо, и хотя в первой версии кода я не уделил этому внимания, после указания на проблему решил исправить ситуацию. Так появилась версия 2.0.
Фикс включал добавление простого бэкенда на FastAPI, который выполняет две задачи: рендерит главную страницу (index.html) со статическими файлами и обрабатывает запросы с данными пользователя с формы. Теперь запросы принимаются на специальный эндпоинт, и взаимодействие с Telegram ботом происходит “под капотом”. Таким образом, общая логика осталась прежней, но мы добавили внутреннюю прослойку, скрыв критически важные переменные от посторонних глаз.
Ссылку на работающую страницу с формой и обновленный код проекта на GitHub можно найти под этой публикацией. В новой статье этой проблеме посвящу отдельный блок.
Наконец-то нашлось время описать фикс бага и задеплоить новую версию проекта. Проблема заключалась в том, что при работе через JavaScript токен бота был виден при каждом запросе. В рабочих проектах это недопустимо, и хотя в первой версии кода я не уделил этому внимания, после указания на проблему решил исправить ситуацию. Так появилась версия 2.0.
Фикс включал добавление простого бэкенда на FastAPI, который выполняет две задачи: рендерит главную страницу (index.html) со статическими файлами и обрабатывает запросы с данными пользователя с формы. Теперь запросы принимаются на специальный эндпоинт, и взаимодействие с Telegram ботом происходит “под капотом”. Таким образом, общая логика осталась прежней, но мы добавили внутреннюю прослойку, скрыв критически важные переменные от посторонних глаз.
Ссылку на работающую страницу с формой и обновленный код проекта на GitHub можно найти под этой публикацией. В новой статье этой проблеме посвящу отдельный блок.
👏10❤🔥4❤4🔥3👀1
Доброе утро! 🌞
Вчера ночью вносил финальные исправления в статью, описывающую проект по интеграции Telegram-ботов в форму на сайте на чистом JS, и при сохранении черновика случайно нажал «Опубликовать» вместо «Сохранить». В итоге статья вышла на сутки раньше запланированного, но я решил уже ничего не менять. 😅
В рамках этой статьи я сначала продемонстрировал, как просто создать Telegram-бота и с помощью простого JS-скрипта привязать его к форме на сайте. Генерацию фронтенд-части я выполнил на 100% через WebSim. Этот сервис создал форму и расписал логику на простом JS. 📝
Затем я показал, как обезопасить личный токен с помощью простого бэкенда на FastAPI. Весь бэкенд был описан всего в одном файле и выполнял он две задачи: рендеринг страницы с формой и обработка данных с формы на сайте. 🔒
Ссылки на статью, исходный код и работающий проект уже закреплены под этим постом. 📎
Приятного чтения! 😎
Вчера ночью вносил финальные исправления в статью, описывающую проект по интеграции Telegram-ботов в форму на сайте на чистом JS, и при сохранении черновика случайно нажал «Опубликовать» вместо «Сохранить». В итоге статья вышла на сутки раньше запланированного, но я решил уже ничего не менять. 😅
В рамках этой статьи я сначала продемонстрировал, как просто создать Telegram-бота и с помощью простого JS-скрипта привязать его к форме на сайте. Генерацию фронтенд-части я выполнил на 100% через WebSim. Этот сервис создал форму и расписал логику на простом JS. 📝
Затем я показал, как обезопасить личный токен с помощью простого бэкенда на FastAPI. Весь бэкенд был описан всего в одном файле и выполнял он две задачи: рендеринг страницы с формой и обработка данных с формы на сайте. 🔒
Ссылки на статью, исходный код и работающий проект уже закреплены под этим постом. 📎
Приятного чтения! 😎
🔥11👍4❤3🙈1
У меня появилась идея, которой я хочу с вами поделиться. Давайте поговорим о создании телеграмм-бота с MiniApp — это когда сайт встроен прямо в телеграмм-бота. Это стильно, удобно и красиво. Чтобы выделиться среди подобных статей, я предлагаю вам необычный подход.
Наш бот будет работать на вебхуках, но вместо привычного aiohttp мы будем использовать FastAPI. Почему? Во-первых, FastAPI редко используется для вебхуков, а во-вторых, он поможет нам поднять фронтенд и описать простые API методы.
В итоге у нас получится полноценный сервис: телеграмм-бот на вебхуках с веб-приложением.
Под этим текстом вы найдете кнопку “Прокомментировать”. Нажмите на нее и отправьте свои пожелания по функционалу, который мы будем реализовывать в нашем боте. Давайте не будем придумывать что-то слишком сложное, чтобы всё уместилось в статью.
Жду ваших идей и предложений!
Наш бот будет работать на вебхуках, но вместо привычного aiohttp мы будем использовать FastAPI. Почему? Во-первых, FastAPI редко используется для вебхуков, а во-вторых, он поможет нам поднять фронтенд и описать простые API методы.
В итоге у нас получится полноценный сервис: телеграмм-бот на вебхуках с веб-приложением.
Под этим текстом вы найдете кнопку “Прокомментировать”. Нажмите на нее и отправьте свои пожелания по функционалу, который мы будем реализовывать в нашем боте. Давайте не будем придумывать что-то слишком сложное, чтобы всё уместилось в статью.
Жду ваших идей и предложений!
🔥35👍10❤4
Гайд по основным методам ОРМ SQLAlchemy
Подготовил для вас небольшой гайд по основным методам работы с SQLAlchemy. Все примеры будут в синхронном подходе для удобства восприятия. Основной посыл показать вам, что в алхимии нет ничего сложного и освоить ее сможет каждый. Приступим.
Настройка работы с базой данных
Основные методы
Получение всех записей
Получение записи по условию
Изменение записи
Удаление записи
Получение записей с условием
Получение записей с сортировкой
Ограничение количества записей
Обновление нескольких записей
Удаление нескольких записей
Надеюсь, этот гайд будет полезен для вас! Если у вас есть вопросы или предложения, пишите в комментариях. Удачи в кодинге!
Подготовил для вас небольшой гайд по основным методам работы с SQLAlchemy. Все примеры будут в синхронном подходе для удобства восприятия. Основной посыл показать вам, что в алхимии нет ничего сложного и освоить ее сможет каждый. Приступим.
Настройка работы с базой данных
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from your_model import YourModel
engine = create_engine('sqlite:///your_database.db')
Session = sessionmaker(bind=engine)
session = Session()
Основные методы
Получение всех записей
all_records = session.query(YourModel).all()
Получение записи по условию
record = session.query(YourModel).filter_by(id=1).first()
Изменение записи
record = session.query(YourModel).filter_by(id=1).first()
if record:
record.name = 'New Name'
session.commit()
Удаление записи
record = session.query(YourModel).filter_by(id=1).first()
if record:
session.delete(record)
session.commit()
Получение записей с условием
filtered_records = session.query(YourModel).filter(YourModel.age > 30).all()
Получение записей с сортировкой
sorted_records = session.query(YourModel).order_by(YourModel.name).all()
Ограничение количества записей
limited_records = session.query(YourModel).limit(10).all()
Обновление нескольких записей
session.query(YourModel).filter(YourModel.active == False).update({YourModel.active: True})
session.commit()Удаление нескольких записей
session.query(YourModel).filter(YourModel.age < 18).delete()
session.commit()
Надеюсь, этот гайд будет полезен для вас! Если у вас есть вопросы или предложения, пишите в комментариях. Удачи в кодинге!
❤🔥13🔥9👍8❤2