From e70690abe1e03566f10891312edc828aeccc7e84 Mon Sep 17 00:00:00 2001 From: krasi Date: Wed, 1 May 2024 20:38:22 +0300 Subject: [PATCH] Support-BOT --- README.md | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++ alembic.ini | 108 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 236 insertions(+) create mode 100644 alembic.ini diff --git a/README.md b/README.md index a71b4ea..80f5e62 100644 --- a/README.md +++ b/README.md @@ -55,3 +55,131 @@ server { } ``` server_name - ваш домен с подключенным ssl сертификатом (например, Let's Encrypt) + +Вместо /telegram/ можно написать любой путь, на который должны приниматься данные. Этот же путь нужно указать в .env файле. 4. Создать ярлык в каталоге sites-enabled + +``` +sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ +``` +5.Проверить что нет ошибок в конфигурации nginx +``` +sudo nginx -t +``` +6. Перезапустить службу nginx +```sh +sudo systemctl restart nginx +``` +7. Установить certbot - ```sudo apt install -y certbot python3-certbot-nginx``` +8. Установить https соединение, выпустив ssl сертификат с помощью certbot для вашего домена +```sh +sudo certbot --nginx +``` +9 Добавить автоматическое обновление сертификата ```sudo certbot renew --dry-run ``` + +Можно на всякий случай еще раз перезапустить nginx + +### Запуск бота +1. Создать бота через botfather (см. ниже), добавить бота в группу с сотрудниками поддержки, дать боту права администратора, узнать id группы (см. ниже) +2. Cкопировать этот гит на сервер любым удобным способом +3. Создать .env файл в корне со следующим содержанием: +```sh +TELEGRAM_TOKEN=<телеграм_токен_вашего_бота> +GROUP_ID= +WEBHOOK_DOMAIN=domain.example.com +WEBHOOK_PATH=/telegram/ +APP_HOST=0.0.0.0 +APP_PORT=7772 +DATABASE_URL=postgresql+asyncpg://:@:5432/support_bot_db +DB_HOST=<имя_контейнера_с_БД> +DB_PORT=5432 +POSTGRES_USER= +POSTGRES_PASSWORD= +START_MESSAGE=<Приветственное сообщение бота, когда клиент нажимает кнопку start> +``` +В качестве теста логин пользователя БД, пароль и название БД можно указать postgres. Только для теста, не для продакшена! +4. Запустить сборку docker-образа и его запуск из файла docker-compose. +```sh +sudo docker-compose up -d --build +``` +Ключ -d для того чтобы контейнер запустился в фоне. +5. Зайти в контейнер c базой данных, создать базу данных, выдать права на нее пользователю (в данном случае postgres) +``` +docker exec -it support-bot-db psql -U postgres +\l #убеждаемся что базы данных нет +create database support_bot_db; +grant all privileges on database support_bot_db to postgres; +\q #выходим из psql +``` +6. Применить миграции +```docker exec -it support-bot alembic upgrade head``` + +### Где что брать +1. WEBHOOK_DOMAIN - домен с подключенным ssl сертификатом + +2. WEBHOOK_PATH - URL путь после домена. + +В данном случае WEBHOOK_DOMAIN + WEBHOOK_PATH будет domain.example.com/telegram/ + +3. Token получаем при создании бота через отца ботов (https://t.me/BotFather) + +4. Свой личный id или id группы узнать можно через этого бота. + https://t.me/myidbot . Узнать свой id - написать боту в личку, узнать id + группы - добавить бота в чат группы (например группы поддержки), затем + ввести команду ```/getgroupid``` . + +5. APP_HOST - IP на котором будет работать приложение (по умолчанию на хосте +127.0.0.1, localhost или можно указать 0.0.0.0) + +6. APP_PORT - порт, который приложение будет использовать. Порт должен быть +уникальным и не дублировать порты других приложений, работающих на сервере +или в Docker. + + +## Запуск в режиме polling (на локальном компьютере) +1. Скопировать гит на локальный компьютер +2. Создать файл .env (см. выше) +3. В файле .env удалить (закомментировать) WEBHOOK_DOMAIN. Прописать свои переменные окружения. Так же прописать переменные окружения в файле docker-compose-postgres-localhost.yaml +4. Установить виртуальное окружение, активировать его, + установить зависимости из requirements.txt +```sh +python -m venv venv +pip install -r requirements.txt +``` +5. В докере запустить контейнер с базой данных из файла [docker-compose-postgres-localhost.yaml](docker-compose-postgres-localhost.yaml). +```sh +docker-compose -f docker-compose-postgres-localhost up -d +``` +6. Применить миграцию. +```sh +alembic upgrade head +``` +7. Если алембик ругается что база данных не существует, создать ее вручную и выйти из psql. Затем попытаться сделать миграцию повторно. +```sh +docker exec -it postgres psql -U postgres +#далее sql +create database support_bot_db; +grant all privileges on database support_bot_db to postgres; +``` +5. Запустить main.py ```python main.py```. По умолчанию бот должен подключиться базе данных postgres с именем пользователя postgres и паролем postgres +PS: Для запуска необходим python 3.9 или выше + +## Команды бота +В **чате поддержки** доступны следующие команды: + +```/info``` - Команда вводится через reply на вопрос пользователя и выдает информацию о нем (Имя, +фамилия, id, никнейм, а также количество сообщений от пользователя и ответов пользователю. Последие 2 - берутся из созданной базы данных. + +```/report``` - отчет по количеству клиентов за месяц, сообщений от них и количество ответов администраторов. + +```/report 01.01.2020 15.02.2021``` - отчет за выбранный период. Две любые даты через пробел, по шаблону. + +```/ban``` - Команда вводится через reply на вопрос пользователя. Банит пользователя. Сообщения от него будут игнорироваться ботом + +```/unban``` - Команда вводится через reply на вопрос пользователя. Разбанивает пользователя. + +```/banlist``` - Список забаненных пользователей. Выводит список пользователей в формате id - имя_фамилия + +```/registeradmin``` - Регистрирует нового администратора в **чате поддержки**. Также, адинистратор регистриуется автоматически, если ответит на сообщение клиента через reply. Это сделано на случай если забыли зарегистрировать администратора, а он уже отвечает на сообщения. + +```/deleteadmin``` - Удаляет права администратора у пользователя в **чате поддержки**. После удаления прав администратора нужно вручную удалить пользователя из группы телеграм. + diff --git a/alembic.ini b/alembic.ini new file mode 100644 index 0000000..baf74d7 --- /dev/null +++ b/alembic.ini @@ -0,0 +1,108 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = alembic + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python-dateutil library that can be +# installed by adding `alembic[tz]` to the pip requirements +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to alembic/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:alembic/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + +# set to 'true' to search source files recursively +# in each "version_locations" directory +# new in Alembic version 1.10 +# recursive_version_locations = false + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +sqlalchemy.url = driver://user:pass@localhost/dbname + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S \ No newline at end of file