
Cisco veya Avaya gibi tescilli IP santral altyapılarından açık kaynağa geçiş, son 18 ayda **maliyetin** yanı sıra **özelleştirme** ihtiyaçları nedeniyle hızlandı. WhatsApp Business, video çağrı, AI temelli IVR gibi modern senaryolar; tescilli platformlarda ya yok ya çok pahalı.

## Bileşenleri ayır

Tek bir yazılıma her işi yüklemek (her şeyi Asterisk'te yapmak) ölçeklenmez. Mimariyi 3 katmana ayırıyoruz:

1. **Edge / SBC** - Kamailio. SIP trunk + WebRTC sticky load balancing.
2. **PBX / dialplan** - Asterisk. Agent yönlendirme, IVR, queue yönetimi.
3. **Media gateway** - FreeSWITCH. Konferans, müzik, transcoding, kayıt.

Bu ayrımın faydası: her bileşen bağımsız ölçeklenir; bir hata diğerini sürüklemez.

## Kamailio dispatcher

Kamailio, gelen SIP/WebRTC trafiğini Asterisk havuzuna yönlendirir; aktif-pasif failover sağlar:

```ini
loadmodule "dispatcher.so"

modparam("dispatcher", "list_file", "/etc/kamailio/dispatcher.list")
modparam("dispatcher", "flags", 2)  # ping ile dead detection
modparam("dispatcher", "ds_ping_method", "OPTIONS")
modparam("dispatcher", "ds_ping_interval", 8)

route[DISPATCH] {
  if (!ds_select_dst("1", "4")) {  # 1: setid, 4: round-robin with ping
    sl_send_reply("503","All Asterisk nodes down");
    exit;
  }
  t_on_failure("DISPATCH_FAILOVER");
  route(RELAY);
}
```

`dispatcher.list`:

```
1 sip:asterisk-01.internal:5060 0
1 sip:asterisk-02.internal:5060 0
```

8 saniyede bir OPTIONS pinglenir; cevap gelmeyen node havuzdan çıkarılır.

## Asterisk dialplan

Asterisk 20'de `chan_pjsip` standartlaştı. Queue örneği:

```ini
[from-internal]
exten => 100,1,Answer()
 same => n,Queue(support_queue,t,,,300)
 same => n,Voicemail(default@support)
 same => n,Hangup()
```

Queue agent'ları AOR olarak `chan_pjsip` üzerinden bağlanır:

```ini
[agent-tpl](!)
type=endpoint
context=from-internal
disallow=all
allow=opus,g722,ulaw
webrtc=yes
dtls_auto_generate_cert=yes
media_use_received_transport=yes
ice_support=yes

[agent-101](agent-tpl)
auth=auth-101
aors=agent-101
```

WebRTC için `webrtc=yes` + `dtls_auto_generate_cert=yes` ile self-signed sertifika; üretimde **proper CA** ile değiştirilir.

## FreeSWITCH konferans

Konferans/IVR için FreeSWITCH'in `mod_conference` modülü; Asterisk'in `MeetMe`'sine göre **çok daha az kaynak** kullanır:

```xml
<conference name="kampanya-1234" rate="48000" channels="2"/>
```

Asterisk'ten FreeSWITCH'e SIP `Dial(SIP/freeswitch/...)` ile yönlendirme.

## WebRTC client

`sip.js` veya `JsSIP` ile tarayıcıdan Kamailio'ya WSS bağlantısı:

```javascript
const ua = new SIP.UA({
  uri: 'sip:agent-101@mono.local',
  transportOptions: { wsServers: ['wss://sip.mono.local:8089/ws'] },
  authorizationUser: 'agent-101',
  password: process.env.SIP_PASS,
  sessionDescriptionHandlerFactoryOptions: {
    constraints: { audio: true, video: false },
  },
});
ua.start();
```

## Kayıt + kalite

- **Kayıt** Asterisk `MixMonitor` veya FreeSWITCH `record` ile; S3 uyumlu Garage'a otomatik upload.
- **Kalite** OpenSIPs RTPproxy istatistikleri + Grafana MOS dashboard.
- **CDR** PostgreSQL Patroni cluster'da; KVKK retention.

## Mono'nun pratiği

Üretim kurulumlarımızda:

- **1200 agent** eşzamanlı bağlantıyı 2 Asterisk + 2 FreeSWITCH + 2 Kamailio node ile karşılıyoruz.
- **Medyan WebRTC latency** 80-100 ms (Türkiye içi).
- **Recording** ortalama 4 dk gecikmeyle Garage S3'te.
- **MOS skoru** ortalama 4.2 (üretim trafiği).

## Yaygın hatalar

- **Asterisk'i her şey için kullanma çabası.** Konferansı FreeSWITCH'e ver.
- **NAT traversal eksikliği.** WebRTC için `ice_support=yes` ve TURN sunucu (coturn) şart.
- **Tek node deployment.** Aktif-pasif minimum; aktif-aktif daha iyi.
- **Codec savaşı.** Opus tercih; ulaw fallback. G.729 lisans gerektirir.

## Sıradaki adımlar

Çağrı merkezi modernizasyonu düşünüyorsanız, [Çağrı Merkezi Çözümleri](/cozumler/cagri-merkezi-cozumleri/) sayfamıza bakabilir; ya da [Mono Asterisk vaka çalışması](/referanslar/saha-ip-santral-modernizasyonu/) örneğini inceleyebilirsiniz.
