# FikoCAD — Canlı Lisans Sunucusu (Docker)

İstemci (fikocad.exe) her açılışta bu sunucuya bağlanır ve **sürekli bağlı kalır**
(otomatik yeniden bağlanma dahil). Sen (satıcı) `fiko_lisans.exe` ile imzaladığın
bir "engelle/izin" kararını bu sunucuya POST edersin; sunucu kararı o an bağlı
olan ilgili müşteri(ler)e **anında** iletir.

**Önemli:** Özel anahtar bu sunucuda YOKTUR ve olmamalıdır. Sunucu yalnız zaten
imzalanmış bir mesajı "röle" eder. İmza doğrulaması istemcide (fikocad içine
gömülü açık anahtarla) yapılır — sunucu ele geçirilse bile sahte engelleme/izin
kararı üretilemez, olsa olsa mesajı iletmemiş olur (DoS, sahtecilik değil).

## 1) Kur ve çalıştır

```bash
cd sunucu/lisans-canli
cp .env.example .env
# .env içine uzun/rastgele bir ADMIN_TOKEN yaz
docker compose up -d --build
```

Sunucu `:9000` portunda dinler, Socket.IO yolu `/isans.socket.io`, namespace `/isans`.

**TLS uyarısı:** fikocad varsayılan olarak `https://fikoyt.com:9000/isans.socket.io/`
adresine bağlanır (yani TLS/HTTPS ister). Bu container düz HTTP sunar — önüne bir
ters proxy (Caddy/nginx/Traefik) koyup `fikoyt.com:9000` için TLS sonlandırması
yapman gerekir. Test/geliştirme için istemci tarafında `lisans_canli_url` ayarını
`http://<ip>:9000/isans.socket.io/` yapıp `u.https=false` yolunu deneyebilirsin.

## 2) Bağlı istemcileri gör

```bash
curl -H "Authorization: Bearer $ADMIN_TOKEN" https://fikoyt.com:9000/admin/clients
```

## 3) Bir seriyi ENGELLE (uzaktan iptal)

```bash
# 1) Kararı imzala (özel anahtar YALNIZ senin makinende):
fiko_lisans canli-imzala FKC-2026-0001 1 "Odeme gecikmesi" ozel.key karar.json

# 2) Sunucuya gönder:
curl -X POST https://fikoyt.com:9000/admin/karar \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  --data @karar.json
```

Yanıt `{"ok":true,"iletildi":1,"suAnBagliMi":true}` ise müşteri o an bağlıydı ve
karar anında uygulandı (uygulama kilitlendi). `suAnBagliMi:false` ise müşteri o an
çevrimdışıydı — sorun değil: karar sunucuda saklanır (`lastDecision`), müşteri bir
sonraki bağlantısında ("merhaba" mesajıyla) kararı hemen alır.

## 4) Serbest bırak (izin ver)

```bash
fiko_lisans canli-imzala FKC-2026-0001 0 "" ozel.key karar.json
curl -X POST https://fikoyt.com:9000/admin/karar \
  -H "Authorization: Bearer $ADMIN_TOKEN" -H "Content-Type: application/json" \
  --data @karar.json
```

## 5) "Bağlantı sağlanmazsa kendini korumaya alsın" (istemci ayarı)

fikocad tarafında **Araçlar ▸ Komut Denetim ▸ Uzaktan lisans kontrolü** altında:

- **"Bağlantı ZORUNLU (yoksa uygulama kilitlenir)"** kutusunu işaretle.
- **Gecikme (sn)**: kanal bu süreden uzun süredir BAĞLI değilse (varsayılan 120
  saniye) uygulama otomatik olarak görüntüleyici kipine (tam kilit) düşer — lisans
  geçerli olsa bile. Sunucuya yeniden ulaşılınca otomatik açılır.

Bu, "sunucuyla iletişim kopunca program kendini korumaya alsın" isteğinin tam
karşılığıdır: sunucu çökerse/erişilemezse (ör. barındırma sorunu, güvenlik duvarı,
DDoS) müşteri tarafında ayarı açık olan her kurulum kendiliğinden kilitlenir.

⚠️ **Dikkat:** Bu ayar açıkken senin sunucun her an ayakta ve erişilebilir olmalı —
aksi hâlde MEŞRU müşteriler de kilitlenir. Docker Compose'daki `restart:
unless-stopped` bunun için var; ayrıca gerçek bir sağlık izleme (uptime monitor)
kurmanı öneririz.

## Uçlar özeti

| Uç | Yetki | Açıklama |
|---|---|---|
| `GET /health` | açık | `{ok, bagliIstemciSayisi}` |
| `GET /admin/clients` | Bearer token | O an bağlı tüm istemciler |
| `POST /admin/karar` | Bearer token | İmzalı karar JSON'unu ilgili seriye ilet |
| `DELETE /admin/karar/:seri` | Bearer token | O seri için önbellekteki bekleyen kararı sil |
