
Ein vollständig asynchronisiertes Backend für mutiger Chat. Es handelt sich um einen Multi-Model-Server, der voll funktionsfähig ist und alle üblichen Messaging-App-Funktionen wie eins-zu-Eins (privat) und Raumnachrichten unterstützt. Es ermöglicht Benutzern, Text- und Multimedia -Nachrichten (z. B. Bilder) zu senden. Außerdem können Benutzer Chatrooms frei erstellen, verbinden und verlassen, in denen sich jeder gegenseitig senden kann.
Dieses Projekt unterstützt die folgenden Funktionen:

In diesem Projekt wird eine relationale Multi-Model-Datenbank verwendet, um Informationen über Benutzer zu speichern. Jeder Datensatz in jeder Datentabelle kann als Zeitreihendatensatz betrachtet werden, insbesondere in der messages mit der Rate des Lese- und Schreibzugriffs bei einem Erstellungsdatum und einem Aktualisierungsdatum für jeden Datensatz.
Darüber hinaus wird eine grundlegende Textsuche implementiert, um die Chat -List -Ansicht und die Raumlisteansicht zu füllen. Die Kontaktlistenansicht unterstützt die Volltext-Suche nach Vornamen, Nachnamen und E-Mail-Adresse eines Benutzers.
Weitere Informationen zur Datenbank und der Architektur finden Sie in der offiziellen Dokumentation.
❯ 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. Der beste Weg, um die Hauptabhängigkeiten zu konfigurieren, zu installieren und das Projekt auszuführen, ist die Verwendung von make . Stellen Sie also sicher, dass Sie auf Ihrem Computer make und konfiguriert sind. Wenn es nicht der Fall ist, gehen Sie zu diesem Thread unter Stackoverflow, um ihn unter Windows zu installieren, oder in diesem Thread, um ihn unter Mac OS zu installieren.
Nachdem make auf Ihrem Computer installiert und konfiguriert werden, können Sie jetzt unter dem Stammverzeichnis dieses Projekts make werden, um verschiedene verfügbare Befehle zum Ausführen zu erkunden:
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 Hinweis : Dieser Befehl generiert automatisch eine .env -Datei von .env.example , deinstallieren Sie die alte Version der Poesie auf Ihrem Computer, installieren Sie dann die neueste Version 1.2.2 und installieren Sie die erforderlichen Hauptabhängigkeiten.
Sie können dieses Tutorial verweisen, um ein SingleStore -Konto und eine MySQL chat -Datenbank zu erstellen.
Füllen Sie die folgenden Umgebungsvariablen in Ihrer .Env -Datei entsprechend ein:
# Database
SINGLESTORE_USERNAME=admin
SINGLESTORE_PASSWORD=<database password>
SINGLESTORE_HOST=<database name>
SINGLESTORE_PORT=3306
SINGLESTORE_DATABASE=<database name>Erstellen Sie ein kostenloses Konto in Redis Cloud.
Legen Sie die folgenden Umgebungsvariablen in Ihrer .Env -Datei gemäß Ihren Kontoanmeldeinformationen fest:
# 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 und profile-images , dieser Sammlung, um Profilbilder und Bilder zu speichern, die in einer Gespräch gesendet wurden. Legen Sie die folgende Umgebungsvariable in Ihrer .env -Datei gemäß Ihrem Datenschlüsselwert fest:
# Deta
DETA_PROJECT_KEY=Generieren Sie einen geheimen Schlüssel mit OpenSSL und aktualisieren Sie seine Env var in der .env -Datei.
openssl rand -hex 128
afa1639545d53ecf83c9f8acf4704abe1382f9a9dbf76d2fd229d4795a4748712dbfe7cf1f0a812f1c0fad2d47c8343cd1017b22fc3bf43d052307137f6ba68cd2cb69748b561df846873a6257e3569d6307a7e022b82b79cb3d6e0fee00553d80913c1dcf946e2e91e1dfcbba1ed9f34c9250597c1f70f572744e91c68cbe76 # App config:
JWT_SECRET_KEY=afa1639545d53ecf83c9f8acf4704abe1382f9a9dbf76d2fd229d4795a4748712dbfe7cf1f0a812f1c0fad2d47c8343cd1017b22fc3bf43d052307137f6ba68cd2cb69748b561df846873a6257e3569d6307a7e022b82b79cb3d6e0fee00553d80913c1dcf946e2e91e1dfcbba1ed9f34c9250597c1f70f572744e91c68cbe76make runHinweis : Sie müssen Debug = Info festlegen, um auf die Dokumente zuzugreifen.
Als erstes, um die gesamte Plattform auszuführen, müssen Sie das brave-chat Submodul mit dem folgenden Befehl klonen:
git submodule update --init --recursiveSobald dies erledigt ist, stellen Sie sicher, dass Sie V2 auf Ihrem Computer installiert und konfiguriert haben, und führen Sie den folgenden Befehl aus, um die vordefinierten Docker -Dienste zu erstellen (stellen Sie sicher, dass Sie eine .env -Datei im Voraus haben):
Verwenden von Made
make buildoder einfach rennen:
docker compose build
Sobald dies erledigt ist, können Sie die Behälter aufdrehen:
Verwenden von Made
make upoder laufen:
docker compose up
Warten Sie, bis der Kundenservice verfügbar ist:
brave-chat-server-client-1 | Starting the development server...
Sie können die laufenden Container stoppen, aber den folgenden Befehl in einer separaten Terminalsitzung ausgeben:
make down
http: // localhost: 8000/docs
http: // localhost: 8000/redocs
http: // localhost: 8000/metriken
http: // localhost: 3001
http: // localhost: 3000
Sie müssen ein DETA -Konto erstellen, um die DETA -Version der APIs zu verwenden.
Stellen Sie sicher, dass DETA CLI auf Ihrem Computer installiert ist. Wenn es nicht der Fall ist, führen Sie einfach den folgenden Befehl aus (auf einer Linux -Distribution oder einem Mac):
curl -fsSL https://get.deta.dev/space-cli.sh | sh Manuell hinzugefügt /home/<user_name>/.detaspace/bin zu Ihrem Weg:
export PATH= " /home/<user_name>/.detaspace/bin: $PATH "Sie können den folgenden Befehl ausführen, um eine neue DETA Space -Umgebung einzurichten:
make create-detaGenerieren Sie ein neues Zugriffstoken und fügen Sie es in Ihr Terminal ein:
Sie müssen run: uvicorn main:app bis zum Ende Ihrer Spacefile -Datei:
sed -i ' $ a run: uvicorn main:app ' SpacefileJetzt können Sie es im Deta -Raum bereitstellen:
make deploy-detaSie können dann die DETA -UI verwenden, um die Protokolle und die URL der API zu überprüfen.
Anmerkungen :
Stellen Sie sicher, dass Ihre .env -Datei entsprechend gültige Env VARS -Werte zur Verfügung gestellt wird.
Die main.py -Datei wird als Einstiegspunkt für DETA verwendet. Gleiches gilt für requirements.txt .
Diese Schaltfläche bereitstellt nur den Server.
Beachten Sie, dass dieser Ansatz nicht perfekt ist, da Sie in der Docker-Welt nur einen Service für jeden Container haben und Docker-Compose verwenden sollten, um mehr als zwei Container zu erstellen und auszuführen (z. B. eine für den Server und den anderen für den Client). Heroku unterstützt Docker-Compose jedoch nicht mit mehreren Diensten (mit Ausnahme von Datenbanken und so.). Daher führen Sie beide Dienste in einem Container aus.
Stellen Sie dazu die Heroku CLI auf Ihrem Computer bereits installiert und konfiguriert. Wenn dies nicht der Fall ist, können Sie es mit dem folgenden Befehl auf Ubuntu installieren:
sudo wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | shJetzt müssen Sie das Heroku Container Registry Plugin installieren:
heroku plugins:install heroku-container-registrySobald dies abgeschlossen ist, melden Sie sich in Ihrer Registrierung an:
heroku container:loginErstellen Sie nun eine Heroku -App:
heroku create < a unique app name >Sie können alle Ihre Apps auflisten, um zu überprüfen, ob Ihre aktuelle App erstellt wurde:
heroku apps Stellen Sie Ihre Env -Variablen in der Datei .env ein.
Erstellen Sie Ihr Containerbild:
docker compose -f heroku-compose.yml buildEinsatz nach Heroku:
heroku container:push web --app < your heroku app name > ; heroku logs --tailSobald der Build und der Druck abgeschlossen sind, können Sie den folgenden Befehl in einer separaten Shell ausführen, um mit der App zu interagieren:
heroku open --app= < your app name >Sie können sich auf das Heroku Dev Center beziehen, um weitere Informationen zu erhalten. Happy Heroking!
In diesem Projekt werden Websockets verwendet, die leider nicht von den serverlosen Funktionen von Vercel unterstützt werden.
Leider verwendet dieses Projekt WebSockets, das nicht von den serverlosen Funktionen von Netlify unterstützt wird.
Darüber hinaus ist das Ausführen einer Fastapi-App bei Netlify nicht möglich, da die App aus der Server-Seite-Rendering besteht. Derzeit ist nur eine clientseitige Renderung bei Netlify zulässig, dh Sie können nur staatlich generierte Websites wie DOCS bereitstellen. Ich habe versucht, mich um sie herum zu hacken, indem ich eine serverlose Funktion erstellt habe, die uvicorn main:app --reload im Hintergrund ausführt. Die serverlose Funktion wird jedoch in einer anderen Umgebung bereitgestellt.
Die folgenden Pakete sind die Hauptabhängigkeiten, die zum Erstellen dieses Projekts verwendet werden:
pythonfastapiuvicornpydanticSQLAlchemyPyJWTpasslibaiomysqlaioredispython-multipartdeta-pythonprometheus-fastapi-instrumentator Dieses Projekt ist offen, damit jeder einen Beitrag leisten kann:
Dieses Projekt und die dazugehörigen Materialien werden unter den Bedingungen der MIT LICENSE zur Verfügung gestellt.