Support-BOT
This commit is contained in:
128
README.md
128
README.md
@@ -55,3 +55,131 @@ server {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
server_name - ваш домен с подключенным ssl сертификатом (например, Let's Encrypt)
|
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=<id_группы_или_супергруппы_в_телеграме>
|
||||||
|
WEBHOOK_DOMAIN=domain.example.com
|
||||||
|
WEBHOOK_PATH=/telegram/
|
||||||
|
APP_HOST=0.0.0.0
|
||||||
|
APP_PORT=7772
|
||||||
|
DATABASE_URL=postgresql+asyncpg://<postgres_user>:<postgres_password>@<postgres_container_name>:5432/support_bot_db
|
||||||
|
DB_HOST=<имя_контейнера_с_БД>
|
||||||
|
DB_PORT=5432
|
||||||
|
POSTGRES_USER=<postgres_user>
|
||||||
|
POSTGRES_PASSWORD=<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``` - Удаляет права администратора у пользователя в **чате поддержки**. После удаления прав администратора нужно вручную удалить пользователя из группы телеграм.
|
||||||
|
|
||||||
|
|||||||
108
alembic.ini
Normal file
108
alembic.ini
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user