# İsteğe bağlı WebSocket servisi

Normal PHP hostingde oyun 800 ms HTTP senkronizasyonuyla çalışır. Bu klasördeki Node.js servisi tarayıcıya WebSocket bağlantısı sunar; doğrulanmış komutları PHP oyun motoruna iletir ve 500 ms aralıkla dünya güncellemesi gönderir. PHP/MySQL hasar, bakiye, hareket ve ödüller üzerinde otorite olmaya devam eder. Bağlantı kopunca istemci HTTP'ye döner ve yeniden bağlanmayı dener.

## Gereksinimler

- Sürekli işlem çalıştırabilen VPS/container, Node.js 22+, HTTPS oyun adresi ve TLS reverse proxy.
- Çalışan PHP kurulumu. Node servisi PHP API'sine HTTPS üzerinden ulaşabilmeli.
- Aynı rastgele gizli anahtar hem PHP özel yapılandırmasında hem Node ortamında bulunmalı.

## Kurulum

1. `config/realtime.example.php` dosyasını `config/realtime.php` olarak kopyala. Güçlü anahtar üret: `php -r 'echo bin2hex(random_bytes(32)), PHP_EOL;'`. Anahtarı paylaşma ve depoya koyma.
2. `enabled` değerini `true`, `url` değerini `wss://oyun.adresin.com/socket`, `secret` değerini ürettiğin anahtar yap.
3. Bu klasörde `npm install --omit=dev` çalıştır. Üretilen package-lock.json dosyasını sakla; sonraki kurulumlarda `npm ci --omit=dev` kullan.
4. Yalnız servis kullanıcısının okuyabildiği bir ortam dosyasında şu değişkenleri tanımla:

```dotenv
KARAYEL_RT_SECRET=PHP_ILE_AYNI_RASTGELE_ANAHTAR
KARAYEL_PHP_API=https://oyun.adresin.com/api.php
KARAYEL_ORIGIN=https://oyun.adresin.com
PORT=8787
```

5. systemd/Supervisor gibi bir süreç yöneticisiyle `node server.mjs` çalıştır. Örnek systemd bölümü:

```ini
[Service]
User=karayel
WorkingDirectory=/srv/karayel/realtime
EnvironmentFile=/etc/karayel/realtime.env
ExecStart=/usr/bin/node /srv/karayel/realtime/server.mjs
Restart=on-failure
RestartSec=3
NoNewPrivileges=true
```

6. Mevcut HTTPS Nginx sunucu bloğuna ekle:

```nginx
location = /socket {
    proxy_pass http://127.0.0.1:8787;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_read_timeout 75s;
}
```

Alan adı/origin tam eşleşmelidir. Alt klasörde kurulumda PHP API yolu değişir; `/socket` reverse proxy yolu aynı kalabilir. Servis yalnız loopback üzerinde dinler; 8787 portunu internete açma. HTTP yalnız localhost testleri için kabul edilir.

## Kontrol

- `npm test`: bilet imzası/süresi, origin reddi, komut onayı ve PHP istek imzası.
- `http://127.0.0.1:8787/health`: servis makinesinden bağlantı sayısı.
- Oyuna giriş yap: masaüstü alt çubukta `CANLI / WEBSOCKET` görünür.
- İki hesapla aynı denizde hareketi ve savaşı dene. Servisi durdur: HTTP üzerinden devam et. Tekrar başlat: otomatik bağlanır.
- Çıkış yapma ve şifre yenileme mevcut biletleri geçersizleştirir. Bilet URL'ye yazılmaz; ilk WebSocket mesajında gönderilir.

## Sınır

Bu servis binlerce oyuncuya ölçeklenmiş bağımsız harita sunucusu değildir. Aynı PHP dünya kilidi kullanılır. Varsayılan bağlantı sınırı 100, hesap başına 2'dir; bunlar doğrulanmış kapasite garantisi değildir. Çok oyunculu büyük yayın için harita başına simülasyon/kalıcılık ayrıştırması ve gerçek ağ/MySQL yük testi gerekir. Sites önizlemesi bu Node servisini barındırmaz; HTTP kullanır.
