
Un backend totalmente basado en Async para chat valiente. Es un servidor multimodelo que es completamente funcional y admite todas las capacidades habituales de la aplicación de mensajería, como mensajes individuales (privados) y de habitación. Permite a los usuarios enviar mensajes de texto y multimedia (por ejemplo, imágenes). Además, los usuarios pueden crear, unirse y dejar salas de chat libremente donde todos puedan enviar mensajes entre sí.
Este proyecto admite las siguientes características:

Este proyecto utiliza una base de datos relacional múltiple para almacenar información sobre los usuarios. Cada registro en cada tabla de datos puede considerarse un registro de series de tiempo, especialmente la tabla de messages dada la tasa de acceso de lectura y escritura, dada una fecha de creación y una fecha de actualización para cada registro.
Además, se está implementando una búsqueda básica de texto para completar la vista de la lista de chat y la vista de la lista de habitaciones. La vista de la lista de contactos admite la búsqueda de texto completo en el nombre, apellido y dirección de correo electrónico de un usuario.
Puede consultar la documentación oficial para obtener más información sobre la base de datos y la arquitectura.
❯ 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. La mejor manera de configurar, instalar dependencias principales y ejecutar el proyecto es mediante make . Por lo tanto, asegúrese de haber make y configurado en su máquina. Si no es el estuche, diríjase a este hilo en StackOverflow para instalarlo en Windows, o este hilo para instalarlo en Mac OS.
Habiendo make y configurado en su máquina, ahora puede ejecutar make en el directorio raíz de este proyecto para explorar diferentes comandos disponibles para ejecutar:
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 Nota : Este comando generará automáticamente un archivo .env desde .env.example , desinstale la versión anterior de la poesía en su máquina, luego instalará la última versión 1.2.2 e instale las dependencias principales requeridas.
Puede consultar este tutorial para crear una cuenta de Singlestore y una base de datos chat MySQL.
Complete las siguientes variables de entorno en su archivo .env en consecuencia:
# Database
SINGLESTORE_USERNAME=admin
SINGLESTORE_PASSWORD=<database password>
SINGLESTORE_HOST=<database name>
SINGLESTORE_PORT=3306
SINGLESTORE_DATABASE=<database name>Cree una cuenta gratuita en Redis Cloud.
Establezca las siguientes variables de entorno en su archivo .env de acuerdo con las credenciales de su cuenta:
# 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 y profile-images , a esta colección para almacenar imágenes e imágenes de perfil enviadas en una conversación. Establezca la siguiente variable de entorno en su archivo .env de acuerdo con su valor de clave de datos:
# Deta
DETA_PROJECT_KEY=Genere una clave secreta utilizando OpenSSL y actualice su VAR ENV en el archivo .env.
openssl rand -hex 128
afa1639545d53ecf83c9f8acf4704abe1382f9a9dbf76d2fd229d4795a4748712dbfe7cf1f0a812f1c0fad2d47c8343cd1017b22fc3bf43d052307137f6ba68cd2cb69748b561df846873a6257e3569d6307a7e022b82b79cb3d6e0fee00553d80913c1dcf946e2e91e1dfcbba1ed9f34c9250597c1f70f572744e91c68cbe76 # App config:
JWT_SECRET_KEY=afa1639545d53ecf83c9f8acf4704abe1382f9a9dbf76d2fd229d4795a4748712dbfe7cf1f0a812f1c0fad2d47c8343cd1017b22fc3bf43d052307137f6ba68cd2cb69748b561df846873a6257e3569d6307a7e022b82b79cb3d6e0fee00553d80913c1dcf946e2e91e1dfcbba1ed9f34c9250597c1f70f572744e91c68cbe76make runNota : Debe establecer debug = información para acceder a los documentos.
Lo primero es lo primero, para ejecutar toda la plataforma, debe clonar el submódulo brave-chat utilizando el siguiente comando:
git submodule update --init --recursiveUna vez hecho esto, asegúrese de haber compuesto V2 instalado y configurado en su máquina, y ejecute el siguiente comando para construir los servicios de Docker predefinidos (asegúrese de tener un archivo .env de antemano):
Usando make
make buildo simplemente ejecutar:
docker compose build
Una vez hecho esto, puede girar los contenedores:
Usando make
make upo correr:
docker compose up
Espere hasta que el servicio al cliente esté disponible:
brave-chat-server-client-1 | Starting the development server...
Puede detener los contenedores en ejecución pero emitir el siguiente comando en una sesión de terminal separada:
make down
http: // localhost: 8000/documentos
http: // localhost: 8000/redocs
http: // localhost: 8000/métricas
http: // localhost: 3001
http: // localhost: 3000
Deberá crear una cuenta de DETA para usar la versión DETA de las API.
Asegúrese de tener un CLI de Deta Instalado en su máquina. Si no es el caso, simplemente ejecute el siguiente comando (en una distribución de Linux o Mac):
curl -fsSL https://get.deta.dev/space-cli.sh | sh Agregar manualmente /home/<user_name>/.detaspace/bin a tu camino:
export PATH= " /home/<user_name>/.detaspace/bin: $PATH "Puede ejecutar el siguiente comando para configurar un nuevo entorno de Space:
make create-detaGenere un nuevo token de acceso y péguelo en su terminal:
Debe agregar run: uvicorn main:app hasta el final de su archivo de Spacefile :
sed -i ' $ a run: uvicorn main:app ' SpacefileAhora, puede implementarlo en Deta Space:
make deploy-detaLuego puede usar la interfaz de usuario de Deta para verificar los registros y la URL en la que se aloja la API.
Notas :
Asegúrese de que su archivo .env se proporcione con valores VARS válidos en consecuencia.
El archivo main.py se usa como punto de entrada para DETA. Lo mismo ocurre con requirements.txt .
Este botón solo implementará el servidor.
Tenga en cuenta que este enfoque no es perfecto porque en el mundo de Docker, solo debe tener un servicio para cada contenedor, y debe usar Docker-Compose para construir y ejecutar más de dos contenedores (por ejemplo, uno para el servidor y el otro para el cliente). Sin embargo, Heroku no admite Docker-Compose con múltiples servicios (excepto bases de datos y tal.). Por lo tanto, ejecutar ambos servicios en un contenedor.
Para hacerlo, asegúrese de haber instalado y configurado la CLI Heroku en su máquina. Si no es el caso, puede instalarlo en Ubuntu usando el siguiente comando:
sudo wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | shAhora, debe instalar el complemento de registro de contenedores de Heroku:
heroku plugins:install heroku-container-registryUna vez que se complete, inicie sesión en su registro:
heroku container:loginAhora, crea una aplicación Heroku:
heroku create < a unique app name >Puede enumerar todas sus aplicaciones para verificar que se haya creado su aplicación reciente:
heroku apps Establezca sus variables ENV en el archivo .env .
Construya la imagen de su contenedor:
docker compose -f heroku-compose.yml buildDesplegar en Heroku:
heroku container:push web --app < your heroku app name > ; heroku logs --tailUna vez que se completen la compilación y el empuje, puede ejecutar el siguiente comando en un shell separado para interactuar con la aplicación:
heroku open --app= < your app name >Puede consultar el centro de desarrollo de Heroku para obtener más información. ¡Feliz herokuing!
Este proyecto utiliza WebSockets, que desafortunadamente no son compatibles con las funciones sin servidor de Vercel.
Desafortunadamente, este proyecto utiliza WebSockets, que no es compatible con las funciones sin servidor de Netlify.
Además, ejecutar una aplicación FastAPI no es posible en Netlify porque la aplicación consta de representación del lado del servidor. Solo solo la representación del lado del cliente se permite actualmente en Netlify, lo que significa que solo puede implementar sitios web generados por está estáticos como DOC. Traté de piratearlo creando una función sin servidor que ejecuta uvicorn main:app --reload en segundo plano. Sin embargo, la función sin servidor se está implementando en un entorno diferente.
Los siguientes paquetes son las principales dependencias utilizadas para construir este proyecto:
pythonfastapiuvicornpydanticSQLAlchemyPyJWTpasslibaiomysqlaioredispython-multipartdeta-pythonprometheus-fastapi-instrumentator Este proyecto está abierto para que cualquiera contribuya:
Este proyecto y los materiales adjuntos están disponibles bajo los términos y condiciones de la MIT LICENSE .