
Un backend entièrement basé sur l'asynchronisation pour le chat courageux. Il s'agit d'un serveur multimodel qui est entièrement fonctionnel et prend en charge toutes les capacités d'application de messagerie habituelles, telles que la messagerie individuelle (privée) et la messagerie. Il permet aux utilisateurs d'envoyer des messages texte et multimédias (par exemple, des images). En outre, les utilisateurs peuvent créer librement, rejoindre et laisser des salles de chat où tout le monde peut se envoyer un message.
Ce projet prend en charge les fonctionnalités suivantes:

Ce projet utilise une base de données relationnelle multimodelle pour stocker des informations sur les utilisateurs. Chaque enregistrement dans chaque table de données peut être considéré comme un enregistrement de série chronologique, en particulier le tableau messages étant donné le taux d'accès à lecture et en écriture, compte tenu d'une date de création et d'une date de mise à jour pour chaque enregistrement.
De plus, une recherche de texte de base est en cours d'implémentation pour remplir la vue de la liste de discussion et la vue de la liste des chambres. La vue de la liste de contacts prend en charge la recherche en texte intégral sur le prénom, le nom et l'adresse e-mail d'un utilisateur.
Vous pouvez vous référer à la documentation officielle pour plus d'informations sur la base de données et l'architecture.
❯ 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 meilleure façon de configurer, d'installer les principales dépendances et d'exécuter le projet est d'utiliser make . Assurez-vous donc que vous avez make et configuré sur votre machine. Si ce n'est pas le cas, rendez-vous sur ce fil sur StackOverflow pour l'installer sur Windows, ou ce fil pour l'installer sur Mac OS.
Ayant make et configuré sur votre machine, vous pouvez désormais exécuter make sous le répertoire racine de ce projet pour explorer différentes commandes disponibles à exécuter:
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 Remarque : Cette commande générera automatiquement un fichier .env à partir de .env.example , désinstallez l'ancienne version de la poésie sur votre machine, puis installez la dernière version 1.2.2 et installez les principales dépendances requises.
Vous pouvez vous référer à ce tutoriel pour créer un compte Singlestore et une base de données chat MySQL.
Remplissez les variables d'environnement suivantes dans votre fichier .env en conséquence:
# Database
SINGLESTORE_USERNAME=admin
SINGLESTORE_PASSWORD=<database password>
SINGLESTORE_HOST=<database name>
SINGLESTORE_PORT=3306
SINGLESTORE_DATABASE=<database name>Créez un compte gratuit sur Redis Cloud.
Définissez les variables d'environnement suivantes dans votre fichier .env en fonction des informations d'identification de votre compte:
# 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 et profile-images , à cette collection pour stocker des images de profil et des images envoyées dans une conversation. Définissez la variable d'environnement suivante dans votre fichier .env en fonction de votre valeur de clé de données:
# Deta
DETA_PROJECT_KEY=Générez une clé secrète à l'aide d'OpenSSL et mettez à jour son Env Var dans le fichier .env.
openssl rand -hex 128
afa1639545d53ecf83c9f8acf4704abe1382f9a9dbf76d2fd229d4795a4748712dbfe7cf1f0a812f1c0fad2d47c8343cd1017b22fc3bf43d052307137f6ba68cd2cb69748b561df846873a6257e3569d6307a7e022b82b79cb3d6e0fee00553d80913c1dcf946e2e91e1dfcbba1ed9f34c9250597c1f70f572744e91c68cbe76 # App config:
JWT_SECRET_KEY=afa1639545d53ecf83c9f8acf4704abe1382f9a9dbf76d2fd229d4795a4748712dbfe7cf1f0a812f1c0fad2d47c8343cd1017b22fc3bf43d052307137f6ba68cd2cb69748b561df846873a6257e3569d6307a7e022b82b79cb3d6e0fee00553d80913c1dcf946e2e91e1dfcbba1ed9f34c9250597c1f70f572744e91c68cbe76make runRemarque : vous devez définir Debug = info pour accéder aux documents.
Tout d'abord, pour exécuter la plate-forme entière, vous devez cloner le sous-module brave-chat en utilisant la commande suivante:
git submodule update --init --recursiveUne fois cela fait, assurez-vous que vous composez V2 installé et configuré sur votre machine, et exécutez la commande suivante pour créer les services Docker prédéfinis (assurez-vous d'avoir un fichier .env au préalable):
Utilisation de la marque
make buildou simplement courir:
docker compose build
Une fois cela fait, vous pouvez tourner les conteneurs:
Utilisation de la marque
make upou courir:
docker compose up
Attendez que le service client soit disponible:
brave-chat-server-client-1 | Starting the development server...
Vous pouvez arrêter les conteneurs en cours d'exécution mais émettre la commande suivante sur une session de terminal distincte:
make down
http: // localhost: 8000 / docs
http: // localhost: 8000 / redocs
http: // localhost: 8000 / métriques
http: // localhost: 3001
http: // localhost: 3000
Vous devrez créer un compte DETA pour utiliser la version DETA des API.
Assurez-vous que Deta CLI soit installée sur votre machine. Si ce n'est pas le cas, exécutez simplement la commande suivante (sur une distribution Linux ou Mac):
curl -fsSL https://get.deta.dev/space-cli.sh | sh Ajouter manuellement /home/<user_name>/.detaspace/bin à votre chemin:
export PATH= " /home/<user_name>/.detaspace/bin: $PATH "Vous pouvez exécuter la commande suivante pour configurer un nouvel environnement d'espace DETA:
make create-detaGénérez un nouveau jeton d'accès et collez-le dans votre terminal:
Vous devez ajouter run: uvicorn main:app à la fin de votre fichier Spacefile :
sed -i ' $ a run: uvicorn main:app ' SpacefileMaintenant, vous pouvez le déployer sur l'espace DETA:
make deploy-detaVous pouvez ensuite utiliser l'interface utilisateur DETA pour vérifier les journaux et l'URL sur laquelle l'API est hébergée.
Notes :
Assurez-vous que votre fichier .env est fourni avec des valeurs Env Vars valides en conséquence.
Le fichier main.py est utilisé comme point d'entrée pour DETA. Il en va de même pour requirements.txt .
Ce bouton ne déploiera que le serveur.
Notez que cette approche n'est pas parfaite car dans le monde Docker, vous ne devez avoir qu'un seul service pour chaque conteneur, et vous devez utiliser Docker-Compose pour créer et exécuter plus de deux conteneurs (par exemple pour le serveur et l'autre pour le client). Cependant, Heroku ne prend pas en charge Docker-Compose avec plusieurs services (à l'exception des bases de données et autres.). Par conséquent, exécuter les deux services dans un seul conteneur.
Pour ce faire, assurez-vous que vous avez déjà installé et configuré la CLI Heroku sur votre machine. Si ce n'est pas le cas, vous pouvez l'installer sur Ubuntu en utilisant la commande suivante:
sudo wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | shMaintenant, vous devez installer le plugin de registre des conteneurs Heroku:
heroku plugins:install heroku-container-registryUne fois cela terminé, connectez-vous à votre registre:
heroku container:loginMaintenant, créez une application Heroku:
heroku create < a unique app name >Vous pouvez répertorier toutes vos applications pour vérifier que votre application récente a été créée:
heroku apps Définissez vos variables Env dans le fichier .env .
Construisez votre image de conteneur:
docker compose -f heroku-compose.yml buildDéployer à Heroku:
heroku container:push web --app < your heroku app name > ; heroku logs --tailUne fois la construction et la poussée terminées, vous pouvez exécuter la commande suivante dans un shell séparé pour interagir avec l'application:
heroku open --app= < your app name >Vous pouvez vous référer à Heroku Dev Center pour plus d'informations. Happy Heroking!
Ce projet utilise des lignes WebSockets, qui ne sont malheureusement pas prises en charge par les fonctions sans serveur de Vercel.
Malheureusement, ce projet utilise WebSockets, qui n'est pas pris en charge par les fonctions sans serveur de Netlify.
De plus, l'exécution d'une application FastAPI n'est pas possible sur NetLify car l'application se compose d'un rendu côté serveur. Seul le rendu côté client est actuellement autorisé sur Netlify, ce qui signifie que vous ne pouvez déployer que des sites Web générés par statistique comme les documents. J'ai essayé de pirater mon chemin en créant une fonction sans serveur qui exécute uvicorn main:app --reload en arrière-plan. Cependant, la fonction sans serveur est déployée dans un environnement différent.
Les packages suivants sont les principales dépendances utilisées pour construire ce projet:
pythonfastapiuvicornpydanticSQLAlchemyPyJWTpasslibaiomysqlaioredispython-multipartdeta-pythonprometheus-fastapi-instrumentator Ce projet est ouvert à quiconque peut contribuer:
Ce projet et les documents qui l'accompagnent sont mis à disposition dans les termes et conditions de la MIT LICENSE .