
แบ็กเอนด์ที่ใช้ Async อย่างเต็มที่สำหรับการแชทที่กล้าหาญ มันเป็นเซิร์ฟเวอร์หลายรุ่นที่ใช้งานได้อย่างสมบูรณ์และรองรับความสามารถของแอพการส่งข้อความตามปกติทั้งหมดเช่นแบบตัวต่อตัว (ส่วนตัว) และการส่งข้อความห้องพัก ช่วยให้ผู้ใช้สามารถส่งข้อความและข้อความมัลติมีเดีย (เช่นรูปภาพ) นอกจากนี้ผู้ใช้สามารถสร้างเข้าร่วมและออกจากห้องแชทได้อย่างอิสระซึ่งทุกคนสามารถส่งข้อความถึงกันได้
โครงการนี้รองรับคุณสมบัติต่อไปนี้:

โครงการนี้ใช้ฐานข้อมูลเชิงสัมพันธ์แบบหลายรูปแบบเพื่อจัดเก็บข้อมูลเกี่ยวกับผู้ใช้ แต่ละระเบียนในทุกตารางข้อมูลสามารถพิจารณาบันทึกอนุกรมเวลาโดยเฉพาะตาราง 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 OS
ด้วย 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 = ข้อมูล เพื่อเข้าถึงเอกสาร
สิ่งแรกก่อนที่จะเรียกใช้แพลตฟอร์มทั้งหมดคุณต้องโคลน submodule brave-chat โดยใช้คำสั่งต่อไปนี้:
git submodule update --init --recursiveเมื่อเสร็จแล้วตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งและกำหนดค่า V2 บนเครื่องของคุณและเรียกใช้คำสั่งต่อไปนี้เพื่อสร้างบริการ Docker ที่กำหนดไว้ล่วงหน้า (ตรวจสอบให้แน่ใจว่าคุณมีไฟล์. ENV ล่วงหน้า):
ใช้ Make
make buildหรือเพียงแค่วิ่ง:
docker compose build
เมื่อเสร็จแล้วคุณสามารถหมุนคอนเทนเนอร์:
ใช้ Make
make upหรือวิ่ง:
docker compose up
รอจนกว่าบริการลูกค้าจะพร้อมใช้งาน:
brave-chat-server-client-1 | Starting the development server...
คุณสามารถหยุดคอนเทนเนอร์ที่ทำงาน แต่ออกคำสั่งต่อไปนี้ในเซสชันเทอร์มินัลแยกต่างหาก:
make down
http: // localhost: 8000/เอกสาร
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 ไปยังเส้นทางของคุณ:
export PATH= " /home/<user_name>/.detaspace/bin: $PATH "คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อตั้งค่าสภาพแวดล้อม Deta Space ใหม่:
make create-detaสร้างโทเค็นการเข้าถึงใหม่และวางลงในเทอร์มินัลของคุณ:
คุณต้องต่อท้าย run: uvicorn main:app ไปยังจุดสิ้นสุดของไฟล์ Spacefile ของคุณ:
sed -i ' $ a run: uvicorn main:app ' Spacefileตอนนี้คุณสามารถปรับใช้ในพื้นที่ Deta:
make deploy-detaจากนั้นคุณสามารถใช้ Deta UI เพื่อตรวจสอบบันทึกและ URL ที่ API โฮสต์
หมายเหตุ :
ตรวจสอบให้แน่ใจว่าไฟล์ .env ของคุณได้รับการจัดเตรียมค่า Vars Env ที่ถูกต้องตามนั้น
ไฟล์ main.py ใช้เป็นจุดเข้าใช้สำหรับ Deta เช่นเดียวกันสำหรับ requirements.txt . txt
ปุ่มนี้จะปรับใช้เซิร์ฟเวอร์เท่านั้น
โปรดทราบว่าวิธีการนี้ไม่สมบูรณ์แบบเพราะในโลก Docker คุณควรมีบริการเดียวสำหรับแต่ละคอนเทนเนอร์และคุณควรใช้ Docker-compose เพื่อสร้างและเรียกใช้มากกว่าสองคอนเทนเนอร์ (เช่นหนึ่งสำหรับเซิร์ฟเวอร์และอีกอันสำหรับไคลเอนต์) อย่างไรก็ตาม Heroku ไม่สนับสนุนนักเทียบท่าที่มีหลายบริการ (ยกเว้นฐานข้อมูลและอื่น ๆ ) ดังนั้นการใช้บริการทั้งสองในคอนเทนเนอร์เดียว
ในการทำเช่นนั้นตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งและกำหนดค่า Heroku CLI บนเครื่องของคุณแล้ว หากไม่ใช่กรณีคุณสามารถติดตั้งบน 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 Center สำหรับข้อมูลเพิ่มเติม มีความสุขมาก!
โครงการนี้ใช้ WebSockets ซึ่งไม่ได้รับการสนับสนุนจากฟังก์ชั่น Serverless ของ Vercel
น่าเสียดายที่โครงการนี้ใช้ WebSockets ซึ่งไม่ได้รับการสนับสนุนโดยฟังก์ชั่นไร้เซิร์ฟเวอร์ของ NetLify
นอกจากนี้การรันแอพ Fastapi นั้นเป็นไปไม่ได้ที่ NetLify เนื่องจากแอปประกอบด้วยการแสดงผลฝั่งเซิร์ฟเวอร์ ขณะนี้อนุญาตให้ทำการเรนเดอร์ฝั่งไคลเอ็นต์เฉพาะใน NetLify ซึ่งหมายความว่าคุณสามารถปรับใช้เว็บไซต์ที่สร้างขึ้นแบบคงที่เช่นเอกสารเท่านั้น ฉันพยายามแฮ็ควิธีการของฉันโดยการสร้างฟังก์ชั่นไร้เซิร์ฟเวอร์ที่เรียกใช้งาน uvicorn main:app --reload ในพื้นหลัง อย่างไรก็ตามฟังก์ชั่น Serverless กำลังถูกปรับใช้ในสภาพแวดล้อมที่แตกต่างกัน
แพ็คเกจต่อไปนี้เป็นอุปกรณ์พึ่งพาหลักที่ใช้ในการสร้างโครงการนี้:
pythonfastapiuvicornpydanticSQLAlchemyPyJWTpasslibaiomysqlaioredispython-multipartdeta-pythonprometheus-fastapi-instrumentator โครงการนี้เปิดให้ทุกคนมีส่วนร่วม:
โครงการนี้และวัสดุประกอบมีให้ภายใต้ข้อกำหนดและเงื่อนไขของ MIT LICENSE