
Полностью асинхронный бэкэнд для смелого чата. Это многомодерный сервер, который является полностью функциональным и поддерживает все обычные возможности для обмена сообщениями, такие как один на один (частный) и обмен номерами. Это позволяет пользователям отправлять текстовые и мультимедийные сообщения (например, изображения). Кроме того, пользователи могут свободно создавать, присоединяться и оставлять чаты, где каждый может сообщать друг другу.
Этот проект поддерживает следующие функции:

В этом проекте используется многомодельная реляционная база данных для хранения информации об пользователях. Каждая запись в каждой таблице данных может рассматриваться как запись временных рядов, особенно таблица messages , учитывая скорость считывания и записи, учитывая дату создания и дату обновления для каждой записи.
Кроме того, основной текстовый поиск реализуется для заполнения просмотра списка чата и просмотра списка номеров. Просмотр списка контактов поддерживает полнотекстовый поиск по имени пользователя, фамилию и адресу электронной почты.
Вы можете обратиться к официальной документации для получения дополнительной информации о базе данных и архитектуре.
❯ tree app .
├── auth # Package contains different config files for the `auth` app.
│ ├── crud.py # Module contains different CRUD operations performed on the database.
│ ├── models.py # Module contains different data models for ORM to interact with database.
│ ├── router.py # Module contains different routes for this api.
│ └── schemas.py # Module contains different schemas for this api for validation purposes.
├── chats # Package contains different config files for the `chats` app.
│ ├── crud.py # Module contains different CRUD operations performed on the database.
│ ├── models.py # Module contains different data models for ORM to interact with database.
│ ├── router.py # Module contains different routes for this api.
│ └── schemas.py # Module contains different schemas for this api for validation purposes.
├── config.py # Module contains the main configuration settings for project.
├── contacts # Package contains different config files for the `contacts` app.
│ ├── crud.py # Module contains different CRUD operations performed on the database.
│ ├── models.py # Module contains different data models for ORM to interact with the database.
│ ├── router.py # Module contains different routes for this api.
│ └── schemas.py # Module contains different schemas for this api for validation purposes.
├── __init__.py
├── main.py # Startup script. Starts uvicorn.
├── rooms # Package contains different config files for the `rooms` app.
│ ├── crud.py # Module contains different CRUD operations performed on the database.
│ ├── models.py # Module contains different models for ORMs to inteact with database..
│ ├── router.py # Module contains different routes for this api.
│ └── schemas.py # Module contains different schemas for this api for validation purposes.
├── users # Package contains different config files for the `users` app.
│ ├── crud.py # Module contains different CRUD operations performed on the database.
│ ├── models.py # Module contains different models for ORMs to inteact with database..
│ ├── router.py # Module contains different routes for this api.
│ └── schemas.py # Module contains different schemas for this api for validation purposes.
├── utils # Package contains different common utility modules for the whole project.
│ ├── constants.py
│ ├── crypt_util.py
│ ├── db_utils.py # A utility script that create, drop a test database used in the tests package.
│ ├── dependencies.py # A utility script that yield a session for each request to make the crud call work.
│ ├── engine.py # A utility script that initialize two sqlalchemy engines and set them as app state variables.
│ ├── full_text_search.py # A utility script to make sqlalchemy and singlestore compatible for implementing full text search on a given table.
│ ├── jwt_util.py # A utility script for JWT.
│ ├── mixins.py # A utility script that contains common mixins for different models.
│ └── pub_sub_handlers.py # A utility script that contains publishers and consumers handlers for the redis queue.
└── web_sockets # Package contains different config files for the `web_sockets` app.
└── router.py # Module contains different routes for the websockets. Лучший способ настроить, установить основные зависимости и запустить проект, - это использование make . Итак, убедитесь, что вы make и настроили на машине. Если это не так, зайдите в этот поток на Stackoverflow, чтобы установить его в Windows, или в этом потоке, чтобы установить его в ОС Mac.
make установленную и настроенную на вашем компьютере, теперь вы можете make в рамках корневого каталога этого проекта, чтобы исследовать различные доступные команды для запуска:
make
Please use ' make <target> ' where < target > is one of:
venv Create a virtual environment
install Install the package and all required core dependencies
run Running the app locally
create-deta Set up a new Deta Space environment
deploy-deta Deploy the app on a Deta Micro
clean Remove all build, test, coverage and Python artifacts
lint Check style with pre-commit
test Run tests quickly with pytest
test-all Run tests on every Python version with tox
coverage Check code coverage quickly with the default Python
build Build docker containers services
up Spin up the containers
down Stop all running containersmake venv source .venv/bin/activatemake install Примечание . Эта команда автоматически генерирует файл .env от .env.example , удалил старую версию поэзии на вашем компьютере, затем установите последнюю версию 1.2.2 и установите требуемые основные зависимости.
Вы можете обратиться к этому уроку, чтобы создать учетную запись SingleStore и базу данных chat MySQL.
Заполните следующие переменные среды в вашем файле .env соответственно:
# Database
SINGLESTORE_USERNAME=admin
SINGLESTORE_PASSWORD=<database password>
SINGLESTORE_HOST=<database name>
SINGLESTORE_PORT=3306
SINGLESTORE_DATABASE=<database name>Создайте бесплатную учетную запись на Redis Cloud.
Установите следующие переменные среды в вашем файле .env в соответствии с учетными данными для вашей учетной записи:
# REDIS
# USER IN REDIS CLOUD
REDIS_USERNAME=default
# DATABASE PASSWORD
REDIS_PASSWORD=<database password>
# REDIS HOST
REDIS_HOST=<redis url>
# REDIS PORT
REDIS_PORT=15065sent-images и profile-images , к этой коллекции для хранения изображений профиля и изображений, отправленных в разговоре. Установите следующую переменную среды в вашем файле .env в соответствии со значением ключа данных:
# Deta
DETA_PROJECT_KEY=Создайте секретный ключ, используя OpenSSL и обновите его env var в файле .env.
openssl rand -hex 128
afa1639545d53ecf83c9f8acf4704abe1382f9a9dbf76d2fd229d4795a4748712dbfe7cf1f0a812f1c0fad2d47c8343cd1017b22fc3bf43d052307137f6ba68cd2cb69748b561df846873a6257e3569d6307a7e022b82b79cb3d6e0fee00553d80913c1dcf946e2e91e1dfcbba1ed9f34c9250597c1f70f572744e91c68cbe76 # App config:
JWT_SECRET_KEY=afa1639545d53ecf83c9f8acf4704abe1382f9a9dbf76d2fd229d4795a4748712dbfe7cf1f0a812f1c0fad2d47c8343cd1017b22fc3bf43d052307137f6ba68cd2cb69748b561df846873a6257e3569d6307a7e022b82b79cb3d6e0fee00553d80913c1dcf946e2e91e1dfcbba1ed9f34c9250597c1f70f572744e91c68cbe76make runПримечание . Вы должны установить Debug = Info для доступа к документам.
Во-первых, чтобы запустить всю платформу, вы должны клонировать подмодуль brave-chat используя следующую команду:
git submodule update --init --recursiveКак только это будет сделано, убедитесь, что вы установили и настроили V2 на вашем компьютере, и запустите следующую команду для создания предопределенных сервисов Docker (убедитесь, что у вас есть файл .env заранее):
Используя марку
make buildили просто бег:
docker compose build
Как только это будет сделано, вы можете раскрутить контейнеры:
Используя марку
make upили бег:
docker compose up
Подождите, пока обслуживание клиентов не станет доступной:
brave-chat-server-client-1 | Starting the development server...
Вы можете остановить работающие контейнеры, но выпустить следующую команду на отдельном сеансе терминала:
make down
http: // localhost: 8000/docs
http: // localhost: 8000/redocs
http: // localhost: 8000/метрики
http: // localhost: 3001
http: // localhost: 3000
Вам нужно будет создать учетную запись Deta, чтобы использовать версию API Deta.
Убедитесь, что на вашем компьютере установлено Deta CLI. Если это не так, просто запустите следующую команду (на Linux Distro или Mac):
curl -fsSL https://get.deta.dev/space-cli.sh | sh Вручную добавить /home/<user_name>/.detaspace/bin <ser_name>/.detaspace/bin на ваш путь:
export PATH= " /home/<user_name>/.detaspace/bin: $PATH "Вы можете запустить следующую команду, чтобы настроить новую космическую среду Deta:
make create-detaСоздайте новый токен доступа и вставьте его в свой терминал:
Вам нужно добавить run: uvicorn main:app до конца вашего файла Spacefile :
sed -i ' $ a run: uvicorn main:app ' SpacefileТеперь вы можете развернуть его в Deta Space:
make deploy-detaЗатем вы можете использовать пользовательский интерфейс DETA для проверки журналов и URL, на котором находится API.
Примечания :
Убедитесь, что ваш файл .env соответственно предоставляется действительные значения env vars.
Файл main.py используется в качестве точки входа для Deta. То же самое касается requirements.txt .
Эта кнопка только развернет сервер.
Обратите внимание, что этот подход не идеален, потому что в мире докеров у вас должен быть только один сервис для каждого контейнера, и вы должны использовать Docker-Compose для создания и запуска более двух контейнеров (например, один для сервера, а другой для клиента). Тем не менее, Heroku не поддерживает Docker-Compose с несколькими службами (кроме баз данных и тому подобного). Следовательно, запустив обе службы в одном контейнере.
Для этого убедитесь, что вы уже установили и настроили CLI Heroku на своей машине. Если это не так, вы можете установить его на Ubuntu, используя следующую команду:
sudo wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | shТеперь вам нужно установить плагин реестра контейнеров Heroku:
heroku plugins:install heroku-container-registryКак только это будет завершено, войдите в свой реестр:
heroku container:loginТеперь создайте приложение Heroku:
heroku create < a unique app name >Вы можете перечислить все свои приложения, чтобы убедиться, что ваше недавнее приложение было создано:
heroku apps Установите свои переменные ENV в файл .env .
Создайте изображение контейнера:
docker compose -f heroku-compose.yml buildРазвернуть в Heroku:
heroku container:push web --app < your heroku app name > ; heroku logs --tailПосле завершения сборки и толчка вы можете запустить следующую команду в отдельной оболочке для взаимодействия с приложением:
heroku open --app= < your app name >Вы можете обратиться к центру Heroku Dev для получения дополнительной информации. Счастливого херока!
В этом проекте используются веб -питания, которые, к сожалению, не поддерживаются функциями без сервера Vercel.
К сожалению, в этом проекте используются веб -токеты, которые не поддерживаются функциями без серверов NetLify.
Кроме того, запуск приложения FASTAPI невозможно в NetLify, поскольку приложение состоит из рендеринга на стороне сервера. В настоящее время разрешено только рендеринг на стороне клиента, что означает, что вы можете развернуть только статически сгенерированные веб-сайты, такие как DOCS. Я попытался взломать его, создав без серверную функцию, которая выполняет uvicorn main:app --reload в фоновом режиме. Тем не менее, функция без сервера развертывается в другой среде.
Следующие пакеты являются основными зависимостями, используемыми для создания этого проекта:
pythonfastapiuvicornpydanticSQLAlchemyPyJWTpasslibaiomysqlaioredispython-multipartdeta-pythonprometheus-fastapi-instrumentator Этот проект открыт для всех, чтобы внести свой вклад:
Этот проект и сопровождающие материалы предоставляются в соответствии с условиями MIT LICENSE .