RealTime-Chat, Node.js, Express.js, Socket.io, MongoDB, Redis ve RabbitMQ teknolojileriyle geliştirilmiş, gerçek zamanlı mesajlaşma ve otomatik mesaj servisleri sunan, ölçeklenebilir ve güvenli bir sohbet uygulamasıdır.
- ⚡ Kurulum
- 🛠️ Kullanılan Teknolojiler
- 🏗️ Proje Mimarisi
- 👨💻 Çalıştırma ve Geliştirme
- 🔌 API ve Gerçek Zamanlı Özellikler
- 🤖 Otomatik Mesaj Sistemi
- 🛡️ Rate Limit ve Güvenlik
- 📑 Loglama
- 🟢 Çevrim İçi Kullanıcı Yönetimi
- ⚙️ Çevre Değişkenleri
-
Depoyu Klonla:
git clone https://github.com/GorkemKurtkaya/RealTime-Chat.git cd RealTime-Chat -
Bağımlılıkları Kur:
npm install
-
Çevre Değişkenlerini Ayarla:
.envdosyası oluşturup aşağıdaki değişkenleri ekleyin:PORT=3000 DB_URI=mongodb://localhost:27017 JWT_SECRET=....(Şifreniz) REDIS_URL=redis://localhost:6379 RABBITMQ_URL=amqp://localhost
-
Docker Servislerini Başlat :
docker-compose up -d
⚠️ Redis ve RabbitMQ servislerini başlatmak zorunlu!!! -
Uygulamayı Başlat:
npm start
| Teknoloji | Açıklama |
|---|---|
| Node.js & Express | REST API ve sunucu işlemleri |
| Socket.io | Gerçek zamanlı mesajlaşma |
| MongoDB & Mongoose | NoSQL veritabanı ve modelleme |
| Redis | Online kullanıcı yönetimi |
| RabbitMQ | Kuyruk tabanlı otomatik mesaj |
| Winston | Loglama |
| express-rate-limit | Rate limit/güvenlik |
| dotenv | Çevre değişkenleri yönetimi |
| bcryptjs | Şifreleme |
| cookie-parser | Cookie işlemleri |
/controllers → API iş mantığı (auth, user, message, conversation)
/routes → API endpoint tanımları
/services → Servis katmanı (iş mantığı, otomatik mesaj, kullanıcı, mesaj)
/models → Mongoose modelleri (User, Message, Conversation, AutoMessage)
/middleware → JWT auth, rate limit, socket auth
/utils → Socket handler, logger, redis, rabbitmq entegrasyonları
/cron → Otomatik mesaj için zamanlanmış görevler
db.js → MongoDB bağlantısı
app.js → Uygulama ana dosyası
docker-compose.yaml → Redis ve RabbitMQ servisleri
- Geliştirme için:
npm start(nodemon ile otomatik yeniden başlatma) - Loglar:
logs/klasöründe günlük olarak tutulur.
POST /auth/register→ Kullanıcı kaydıPOST /auth/login→ Giriş (JWT token ve refresh token cookie olarak döner)POST /auth/refresh→ Token yenilemePOST /auth/logout→ ÇıkışGET /auth/me→ Profil bilgisi
GET /user/list→ Kullanıcı listesiPUT /user/update→ Ad ve e-posta güncellemeGET /user/online/count→ Online kullanıcı sayısıGET /user/online/ids→ Online kullanıcı idleriGET /user/online/:userid→ Belirli kullanıcının online durumu
POST /messages→ Mesaj göndermeGET /messages/:conversationId→ Mesajları getirmePOST /conservations→ Konuşma (sohbet odası) oluşturmaGET /conservations/:userId→ Kullanıcıya ait konuşmaları getirme
POST /conservations/→ Oda oluşturmaPUT /conservations/:conversationId→ Oda bilgisi güncelleme (isim, açıklama)POST /conservations/:conversationId/add-user→ Odaya kullanıcı eklePOST /conservations/:conversationId/remove-user→ Odayan kullanıcı çıkarGET /conservations/info/:conversationId→ Oda bilgisi getirGET /conservations/:conversationId/users→ Oda üyelerini getirGET /conservations/:conversationId/admins→ Oda adminlerini getirPOST /conservations/:conversationId/add-admin→ Odaya admin eklePOST /conservations/:conversationId/remove-admin→ Oda adminliğinden çıkar
🔒 Tüm bu endpointler için JWT ile kimlik doğrulama zorunludur.
- Oda katılma/ayrılma (
join_room,leave_room) - Mesaj gönderme/alma (
send_message,message_received) - Yazıyor bildirimi (
typing,stop_typing) - Okundu bildirimi (
message_read) - Online/Offline kullanıcı bildirimi (
user_online,user_offline)
🔒 Not: Socket.io bağlantısı sırasında JWT token ile kimlik doğrulama zorunludur.
- Her gece 02:00'da cron ile online kullanıcılar eşleştirilir ve rastgele mesajlar otomatik olarak gönderilir.
- Otomatik mesajlar önce MongoDB'ye kaydedilir, sonra RabbitMQ kuyruğuna eklenir ve oradan ilgili kullanıcıya iletilir.
- Otomatik mesajlar gerçek zamanlı olarak ilgili sohbet odasına düşer.
| Endpoint | Limit |
|---|---|
| /auth | 5 dakikada 7 istek |
| /messages | Dakikada 40 istek |
| /conservations | Dakikada 20 istek |
| /user | Dakikada 50 istek |
- JWT tabanlı auth ve admin guard
- Winston ve winston-daily-rotate-file ile günlük loglar
logs/klasöründe tutulur. - Hatalar, uyarılar ve önemli işlemler detaylı şekilde loglanır.
- Redis ile online kullanıcılar ve durumları yönetilir.
- Oda bazlı online kullanıcı listesi ve genel online kullanıcı sayısı API ve socket ile alınabilir.
Gerçek zamanlı özellikleri test etmek ve kullanmak için Socket.io ile bağlantı kurmanız gerekir. Aşağıda, Postman veya benzeri araçlarla nasıl bağlantı kuracağınızı ve eventleri nasıl dinleyeceğinizi adım adım bulabilirsiniz.
- Sunucu adresi genellikle:
ws://localhost:3000veyawss://sunucu-adresi - Bağlantı sırasında JWT token ile kimlik doğrulama zorunludur.
- Yeni WebSocket Request oluşturun.
- URL kısmına:
ws://localhost:3000yazın. - Query Params sekmesine gelin, aşağıdaki gibi parametre ekleyin:
- Key:
auth.token - Value:
<JWT_TOKENINIZ>
JWT token'ı
/auth/loginendpointinden alabilirsiniz. - Key:
- Connect butonuna tıklayın.
- Bağlantı kurulduktan sonra, dinlemek istediğiniz eventleri ekleyin.
- Örneğin, aşağıdaki eventleri dinleyebilirsiniz:
message_receivedsend_messagejoin_roomonline_usersmessage_readtypingstop_typingmessage_readnotification
- Postman'da Listen for an event kısmına event adını yazıp dinlemeye başlayabilirsiniz.
- Bir odaya katılmak için aşağıdaki şekilde bir event gönderin:
- Event:
join_room - Data: Oda ID'si (ör:
{"roomId": "<CONVERSATION_ID>"}veya sadece oda id)
- Event:
- Odaya mesaj göndermek için:
- Event:
send_message - Data:
{ "roomId": "<CONVERSATION_ID>", "content": "Merhaba!" }
- Event:
- Yazmaya başladığınızda:
- Event:
typing - Data: Oda ID'si
- Event:
- Yazmayı bıraktığınızda:
- Event:
stop_typing - Data: Oda ID'si
- Event:
- Event:
leave_room - Data: Oda ID'si
- WebSocket bağlantısını kapatmak için Postman'da Disconnect butonunu kullanabilirsiniz.
Aşağıda uygulamada kullanılan tüm Socket.io eventlerinin açıklamaları ve payload örnekleri yer almaktadır.
- URL:
ws://localhost:3000 - Auth: Query param ile
auth.token=<JWT_TOKEN>
| Event Adı | Açıklama | Payload/Parametre Örneği |
|---|---|---|
join_room |
Odaya katılma | "<roomId>" veya { "roomId": "..." } |
send_message |
Odaya mesaj gönderme | { "roomId": "...", "content": "Merhaba!" } |
typing |
Yazıyor bildirimi başlatma | "<roomId>" |
stop_typing |
Yazıyor bildirimi bitirme | "<roomId>" |
message_read |
Mesajı okundu olarak işaretleme | { "roomId": "...", "messageId": "..." } |
leave_room |
Odadan ayrılma | "<roomId>" |
| Event Adı | Açıklama | Payload Örneği |
|---|---|---|
online_users |
Oda içindeki online kullanıcılar | { "roomId": "...", "users": ["..."] } |
message_received |
Odaya yeni mesaj geldi | { "message": "...", "senderId": "...", "timestamp": "..." } |
notification |
Yeni mesaj bildirimi | { "type": "new_message", "message": "Yeni mesajınız var!", "roomId": "...", "senderId": "..." } |
typing |
Bir kullanıcı yazıyor | { "userId": "...", "roomId": "..." } |
stop_typing |
Bir kullanıcı yazmayı bıraktı | { "userId": "...", "roomId": "..." } |
message_read |
Mesaj okundu bildirimi | { "messageId": "...", "userId": "..." } |
error |
Hata mesajı | { "message": "..." } |
- Client → Server:
// join_room "6876717eb556b1ecc6993c78"
- Server → Client:
// online_users { "roomId": "6876717eb556b1ecc6993c78", "users": ["...", "..."] }
- Client → Server:
// send_message { "roomId": "6876717eb556b1ecc6993c78", "content": "Merhaba!" }
- Server → Client:
// message_received { "message": "Merhaba!", "senderId": "...", "timestamp": "..." } // notification { "type": "new_message", "message": "Yeni mesajınız var!", "roomId": "...", "senderId": "..." }
- Client → Server:
// typing "6876717eb556b1ecc6993c78"
- Server → Client:
// typing { "userId": "...", "roomId": "..." } // stop_typing { "userId": "...", "roomId": "..." }
- Client → Server:
// message_read { "roomId": "6876717eb556b1ecc6993c78", "messageId": "..." }
- Server → Client:
// message_read { "messageId": "...", "userId": "..." }
- Client → Server:
// leave_room "6876717eb556b1ecc6993c78"
- Server → Client:
// user_offline { "userId": "..." }
- Winston ve winston-daily-rotate-file ile günlük loglar
logs/klasöründe tutulur. - Hatalar, uyarılar ve önemli işlemler detaylı şekilde loglanır.
- Redis ile online kullanıcılar ve durumları yönetilir.
- Oda bazlı online kullanıcı listesi ve genel online kullanıcı sayısı API ve socket ile alınabilir.
Aşağıdaki değişkenler .env dosyasında tanımlanmalıdır:
PORT=3000
DB_URI=mongodb://localhost:27017
JWT_SECRET=....(Şifreniz)
REDIS_URL=redis://localhost:6379
RABBITMQ_URL=amqp://localhost📫 Daha fazla bilgi ve katkı için: GitHub Proje Sayfası