A simple chat implemented within: FastApi, Redis, Postgres, Docker and SQLAlchemy.
pip install -r requirements.txtdocker compose -f docker-compose.infra.yml up -dalembic upgrade head!! Ожидается 001_baseline (head) !! | 10.02 snapshot
alembic currentuvicorn app.main:app --reload.\scripts\start_https.bat-
Зарегистрировать инвайт-код в БД
-
Создать комнату
-
При необходимости выдать пользователю права: role -> admin
-
При проблемах с uploads - создать директорию /uploads/avatars
borofone_chat/
├── app/
│ ├── api/
│ │ ├── http.py # REST API handlers (Request processing).
│ │ └── ws.py # WebSocket and connection management logic
│ ├── infra/
│ │ ├── db.py # SQLAlchemy database configuration (Async)
│ │ └── redis.py # Redis configuration and client
│ ├── schemas/
│ │ └── *.py # Pydantic scheme for validating a specific section
│ ├── services/
│ │ └── messages.py # Logic for sending messages and CRUD operations
│ ├── __init__.py
│ ├── main.py # Entry Point: Initializing FastAPI and Routing
│ ├── models.py # SQLAlchemy models (database schema)
│ ├── settings.py # Managing settings via Pydantic Settings
├── .env.production.example
├── .env.staging.example
├── docker-compose.yml # Full environment (API + DB + Redis), not tested!
├── docker-compose.infra.yml # Local infrastructure (DB + Redis)
├── requirements.txt
└── README.md
api/ - contains the logic of interaction with the client.
ws.py implements ConnectionManager, which isolates the message sending logic from the WebSocket protocol.
infra/ - is responsible for the technical details of connecting to external resources.
This is where you configure the asynchronous database engine and connection pool settings.
services/messages.py - functions for working with data. This is where the message processing logic is implemented (for example, checking for duplicates and saving to the database).
docker-compose.infra.yml — development config that allows you to run only the PostgreSQL database and Radis cache in containers, leaving the API itself on the host machine for easy debugging.
You'll definitely find this useful, I'd think about it. :3
Check docker health:
docker compose -f docker-compose.infra.yml psUP infra:
docker compose -f docker-compose.infra.yml up -dDOWN infra:
docker compose -f docker-compose.infra.yml downEnter in psql:
docker compose -f docker-compose.infra.yml exec postgres psql -U app -d appStart api:
uvicorn app.main:app --reload --port 8000Select Rooms:
SELECT id, title FROM rooms ORDER BY id DESC LIMIT 150;Select Messages:
SELECT id, room_id, author, body, nonce, created_at FROM messages ORDER BY id DESC LIMIT 50;Clear all DB (safety):
TRUNCATE TABLE messages, rooms RESTART IDENTITY CASCADE;Current migration version:
alembic currentCreate new version migration:
alembic revision --autogenerate -m "sample_text"Upgrade to new migration version:
alembic upgrade headDowngrade to 1 step down migration version:
alembic downgrade -1View migration history:
alembic history --verboseView the following migrations to apply:
alembic heads- Logout in settings
- User was connected to room
- Голосовой чат
- ctrl+v вложения
- Кастомные уведомления
- Реакции
- Реплай
- Маркдаун в сообщениях
- Кастомные темы
- Фавикон
- Пофиксить отображение аватарок в чате
- Закругление углов у картинок
- Исправить отображение онлайн пользователей
- Исправить дизайн панель войсчата
- Статус оффлайн
- Глобальное удаление сообщений
- Нормальный шумодав для войсчата
- Нью смайлы
- Amoled тема
- Демонстрация экрана
- Лимиты на сообщения
- Исправить баг с отправлением вложений, спам много-за-раз
- Верстка для телефона
- Интеграция с гиффи для гифок, дискорд ah
- Добавить Wordle
- Отображение аватарок в войсчате
- Бинд для мута
- Пофиксить разлогин при долгой сессии на сайте
- Исправить отображение онлайн пользователей
Для работы голосового чата через Radmin VPN требуется HTTPS, так как getUserMedia() работает только в защищённом контексте.
Открой PowerShell от имени администратора:
.\scripts\generate_ssl.ps1Скрипт создаст:
ssl/voice.pfx- PFX сертификатssl/cert.pem- Сертификат в PEM форматеssl/key.pem- Приватный ключ (требуется OpenSSL)ssl/cert.crt- Публичный сертификат для друзей
# Требуется запуск от имени администратора (порт 443)
python run_https.pyИли с кастомными параметрами:
python run_https.py --host 0.0.0.0 --port 443 --cert ssl/cert.pem --key ssl/key.pemДрузьям нужно добавить сертификат в доверенные:
Windows:
- Открыть
ssl/cert.crt - Нажать "Установить сертификат"
- Выбрать "Локальный компьютер" → "Поместить в следующее хранилище"
- Выбрать "Доверенные корневые центры сертификации"
Chrome/Edge:
- На браузере:
chrome://settings/certificates - Import → выбрать
cert.crt - Выбрать "Trusted Root Certification Authorities"
Друзья заходят по адресу:
https://<RADMIN_IP>/
.env:
RADMIN_IP=твой_новый_ip
Если установлен mkcert:
mkcert -install
mkcert "yourip" localhostЭто создаст сертификаты, которые будут автоматически доверяться браузером.
maybe next time
git pull origin main docker-compose -f docker-compose.prod.yml build --no-cache api docker-compose -f docker-compose.prod.yml down docker-compose -f docker-compose.prod.yml up -d
Gitbook: https://qqracha.gitbook.io/qqracha-docs/vKWuRLooKQWdYTCfU3pv
Проект настроен под раздельные staging и production окружения:
main -> production
dev -> staging
Основные артефакты:
.github/workflows/deploy.yml- автодеплой поpushвdevиmain.env.production.exampleи.env.staging.example- шаблоны окруженийdeploy/systemd/- systemd unit-файлыdeploy/nginx/borofone.conf- reverse proxy для production и stagingscripts/setup_vps.sh- первичная подготовка VPSdocs/deployment/cicd.md- пошаговые инструкции по setup и security
Быстрый сценарий:
push dev -> GitHub Actions -> staging deploy
merge dev main -> GitHub Actions -> production deploy
Перед включением схемы:
- Добавь GitHub Secrets для
PROD_*иSTAGING_*. - Используй только
.env.production.exampleи.env.staging.example, затем скопируй их в/opt/borofone-chat-prod/.envи/opt/borofone-chat-staging/.env. - Установи
deploy/systemd/*.serviceиdeploy/nginx/borofone.confна VPS. - Включи branch protection для
main, запрети прямой push и оставь deploy только через PR.
Подробная инструкция: docs/deployment/cicd.md.