| Crates.io | soketi-rs |
| lib.rs | soketi-rs |
| version | 1.0.2 |
| created_at | 2026-01-25 17:52:35.456042+00 |
| updated_at | 2026-01-25 19:33:31.56344+00 |
| description | High-performance, Pusher-compatible WebSocket server written in Rust with support for public, private, and presence channels |
| homepage | https://github.com/ferdiunal/soketi.rs |
| repository | https://github.com/ferdiunal/soketi.rs |
| max_upload_size | |
| id | 2069179 |
| size | 802,152 |

Rust ile yazılmış, yüksek performanslı, Pusher uyumlu WebSocket sunucusu. Soketi.rs, public, private ve presence kanalları desteğiyle gerçek zamanlı mesajlaşma yetenekleri sağlar.
# Docker Hub'dan en son imajı çekin ve çalıştırın
docker pull funal/soketi-rs:latest
docker run -d \
--name soketi \
-p 6001:6001 \
-p 9601:9601 \
funal/soketi-rs:latest
# Repository'yi klonlayın
git clone https://github.com/ferdiunal/soketi.rs.git
cd soketi-rs
# Tüm servisleri başlatın
docker-compose up -d
# Logları görüntüleyin
docker-compose logs -f soketi
# Demo'ya erişin
open http://localhost:3000
# Rust'ı yükleyin (henüz yüklü değilse)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Derleyin ve çalıştırın
cargo build --release
./target/release/soketi-rs --config-file config.json
Not: Yapılandırma dosyasını belirtmek için
--config-fileparametresini kullanın.
# Repository'yi klonlayın
git clone https://github.com/ferdiunal/soketi.rs.git
cd soketi-rs
# Release binary'sini derleyin
cargo build --release
# Testleri çalıştırın
cargo test
# Binary'yi yükleyin
cargo install --path .
# İmajı çekin
docker pull funal/soketi-rs:latest
# Konteyneri çalıştırın
docker run -d \
-p 6001:6001 \
-p 9601:9601 \
-v $(pwd)/config.json:/app/config.json \
funal/soketi-rs:latest
Bir config.json dosyası oluşturun:
{
"host": "0.0.0.0",
"port": 6001,
"debug": false,
"app_manager": {
"driver": "Array",
"array": {
"apps": [
{
"id": "app-id",
"key": "app-key",
"secret": "app-secret",
"enabled": true,
"enable_client_messages": true,
"max_connections": 10000
}
]
}
}
}
# Sunucu yapılandırması
SOKETI_HOST=0.0.0.0
SOKETI_PORT=6001
SOKETI_DEBUG=false
# Uygulama yapılandırması
APP_ID=your-app-id
APP_KEY=your-app-key
APP_SECRET=your-app-secret
# Redis (kümeleme için)
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_DB=0
# Metrikler
METRICS_ENABLED=true
METRICS_PORT=9601
Detaylı yapılandırma seçenekleri için [Yapılandırma Kılavuzu]wiki/Yapilandirma) dosyasına bakın:
// Pusher istemcisini başlat
const pusher = new Pusher('app-key', {
wsHost: 'localhost',
wsPort: 6001,
forceTLS: false,
encrypted: false
});
// Public kanala abone ol
const channel = pusher.subscribe('chat-room');
// Mesajları dinle
channel.bind('new-message', (data) => {
console.log('Yeni mesaj:', data.message);
displayMessage(data);
});
// Mesaj gönder (istemci olayları etkinleştirilmiş olmalı)
channel.trigger('client-new-message', {
user: 'Ahmet',
message: 'Herkese merhaba!'
});
// Private kanala abone ol
const privateChannel = pusher.subscribe('private-user-123');
// Sunucu tarafı kimlik doğrulama endpoint'i
app.post('/pusher/auth', (req, res) => {
const socketId = req.body.socket_id;
const channel = req.body.channel_name;
// Kullanıcının bu kanala erişimi olup olmadığını doğrula
if (userCanAccessChannel(req.user, channel)) {
const auth = pusher.authenticate(socketId, channel);
res.send(auth);
} else {
res.status(403).send('Yasak');
}
});
// Presence kanalına abone ol
const presenceChannel = pusher.subscribe('presence-team');
// Üye eklendi
presenceChannel.bind('pusher:member_added', (member) => {
console.log('Kullanıcı katıldı:', member.info.name);
updateUserList();
});
// Üye çıkarıldı
presenceChannel.bind('pusher:member_removed', (member) => {
console.log('Kullanıcı ayrıldı:', member.info.name);
updateUserList();
});
// Mevcut üyeleri al
presenceChannel.bind('pusher:subscription_succeeded', (members) => {
members.each((member) => {
console.log('Çevrimiçi:', member.info.name);
});
});
// Node.js Pusher kütüphanesini kullanarak
const Pusher = require('pusher');
const pusher = new Pusher({
appId: 'app-id',
key: 'app-key',
secret: 'app-secret',
host: 'localhost',
port: 6001,
useTLS: false
});
// Bir olay tetikle
pusher.trigger('my-channel', 'my-event', {
message: 'Sunucudan merhaba!'
});
// Birden fazla kanala tetikle
pusher.trigger(['channel-1', 'channel-2'], 'my-event', {
message: 'Yayın mesajı'
});
Daha fazla örnek için:
Tüm deployment dosyaları deployment/ dizininde organize edilmiştir:
deployment/
├── docker/ # Standart Docker deployment
├── nginx/ # Nginx reverse proxy ile
└── caddy/ # Caddy reverse proxy ile (otomatik HTTPS)
cd deployment/docker
# Servisleri başlat
docker-compose up -d
# Logları görüntüle
docker-compose logs -f
# Servisleri durdur
docker-compose down
cd deployment/nginx
# SSL sertifikalarını yapılandır
cp .env.nginx.example .env
# .env dosyasını düzenle
# Servisleri başlat
docker-compose -f docker-compose.nginx.yml up -d
cd deployment/caddy
# Domain yapılandır
cp .env.caddy.example .env
# .env dosyasını düzenle
# Servisleri başlat (otomatik SSL!)
docker-compose -f docker-compose.caddy.yml up -d
# Soketi instance'larını ölçeklendirin
docker-compose up -d --scale soketi=3
# Servis durumunu görüntüleyin
docker-compose ps
# Prometheus ve Grafana ile başlatın
docker-compose --profile monitoring up -d
# Grafana'ya erişin
open http://localhost:3001
# Varsayılan kimlik bilgileri: admin/admin
Kümeleme için Redis kullanın:
{
"adapter": {
"driver": "Redis",
"redis": {
"host": "redis",
"port": 6379
}
}
}
Metrikleri etkinleştirin:
{
"metrics": {
"enabled": true,
"driver": "Prometheus",
"port": 9601
}
}
Kaynak limitlerini yapılandırın docker-compose.yml dosyasında
Otomatik kurtarma için health check'leri kullanın
Log toplama ayarlayın (ELK, Loki, vb.)
Kapsamlı dokümantasyon birden fazla dilde mevcuttur:
// Pusher.js kullanarak
const pusher = new Pusher('app-key', {
wsHost: 'localhost',
wsPort: 6001,
forceTLS: false,
encrypted: false
});
// Kanala abone olun
const channel = pusher.subscribe('my-channel');
// Olayları dinleyin
channel.bind('my-event', (data) => {
console.log('Alındı:', data);
});
POST /apps/{app_id}/events
Content-Type: application/json
{
"name": "my-event",
"channel": "my-channel",
"data": "{\"message\":\"Merhaba Dünya\"}"
}
GET /apps/{app_id}/channels
GET /apps/{app_id}/channels/{channel_name}
Tam API dokümantasyonu için [API Referansı]wiki/API-Referansi) dosyasına bakın.
Soketi.rs tüm Pusher istemci kütüphaneleriyle uyumludur:
┌─────────────────┐
│ İstemci Uyg. │
│ (Web/Mobil) │
└────────┬────────┘
│ WebSocket
▼
┌─────────────────┐
│ Soketi Sunucu │
│ (Rust) │
└────────┬────────┘
│
┌────┴────┬────────┬─────────┐
▼ ▼ ▼ ▼
┌───────┐ ┌───────┐ ┌──────┐ ┌────────┐
│ Redis │ │ VT │ │Metrik│ │Webhook │
└───────┘ └───────┘ └──────┘ └────────┘
# Tüm testleri çalıştır
cargo test
# Belirli bir testi çalıştır
cargo test test_name
# Loglama ile çalıştır
RUST_LOG=debug cargo test
# Benchmark'ları çalıştır
cargo bench
Katkılar memnuniyetle karşılanır! Detaylar için CONTRIBUTING.md dosyasını okuyun.
# Repository'yi klonlayın
git clone https://github.com/ferdiunal/soketi.rs.git
cd soketi-rs
# Bağımlılıkları yükleyin
cargo build
# Testleri çalıştırın
cargo test
# Demo'yu çalıştırın
cargo run -- --config-file test-config.json
Bu proje GPL-3.0 Lisansı altında lisanslanmıştır - detaylar için LICENSE dosyasına bakın.
Ferdi ÜNAL tarafından ❤️ ile yapıldı