Çoklu modelli profesyonel hava tahmini, kişisel uyarı kuralları, radar haritası ve şimdi tahmin (nowcast).
Son 200 bildirim. Çoklu modelin uyumlu olduğu uyarılar gönderilir.
Yakınındaki en güneşli noktayı bul. Mesafe ve zaman dilimi filtresi ile ideal hava koşullarını keşfet.
Tüm arayüzü etkiler. Tercih tarayıcıda saklanır.
Hava durumu verisi ne sıklıkla otomatik güncellensin? 0 = sadece sayfa açıldığında.
Uygulama açıldığında hangi konum gösterilsin?
Bildirimleri hangi kanal(lar)dan almak istediğinizi seçin. Pushover için
pushover.net'ten user key + bir uygulama oluşturarak app token alın.
Telegram için @BotFather'dan bot oluşturup token alın, sonra botunuza mesaj atıp chat id'nizi @userinfobot ile öğrenin.
Misafir kullanıcıların seçebileceği yenileme aralıkları ve uyarı türlerini buradan belirleyin.
Virgülle ayır. 0 = manuel. Örn: 0,5,10,15,30,60
PWA dışı kanallar (Pushover/Telegram) misafir için yapılandırma alanı gerektirir; varsayılan kapalıdır.
Misafir kullanıcılara hangi sekmelerin, widget'ların ve servislerin sunulacağını belirleyin. Değişiklikler, sayfa yenilendikten sonra misafir kullanıcılara yansır.
Sadece burada aktif edilen modeller kullanıcı/misafir listelerinde görünür. Her model satırındaki i ile detay modalı açılır.
Yeni yer eklerken önerilen başlangıç modeli/model listesi. Sürükle-bırak ile sıra belirleyin.
Misafir ve kullanıcılar için Karşılaştırma ve Grafik sekmeleri ilk açılışta bu listeyi kullanır. Sürükle-bırak sırası korunur.
Tüm bildirim kanalları ve cihazlar tek panelde: tarayıcı / PWA Web Push abonelikleri ve Android uygulaması (Capacitor · com.isademir.weather) üzerinden gelen Firebase Cloud Messaging (FCM) cihazları. — — VAPID: …
fcm_tokens tablosu). Sunucu Firebase Admin SDK üzerinden gönderir.POST /api/push/fcm/subscribe (Bearer + X-WX-Client: android-capacitor). Açıldıkça POST /api/push/fcm/heartbeat son aktiflik, konum, batarya, ağ ve uygulama sürümünü günceller. Çıkışta DELETE.Tümünü Seç butonu, aktif sekmede filtreye uyan tüm kullanıcı/misafirleri seçer.last_app_login_at dolu) ama fcm_tokens'da kayıt yok — Google Play Services / bildirim izni / ağ kontrolü gerek.Rainbow.ai veya Tomorrow.io üzerinden canlı radar karoları sunulur. API anahtarları yalnızca sunucuda saklanır, tarayıcıya gönderilmez.
Tomorrow.io API anahtarı girili olduğunda aktifleştirilebilir.
Rainbow API anahtarı girili olduğunda aktifleştirilebilir. Dakika bazlı 4 saatlik yağış verisi (5.000 istek/ay).
Her API türü ve kullanıcı rolü için önbellek süresi (dakika) belirleyin. Kısa süre = daha taze veri; uzun süre = daha az API isteği / kota tasarrufu. Misafir değerleri API kotasını korumak için uzun tutulmalıdır.
| API / Önbellek |
👑 Admin
En taze veri
|
👤 Kullanıcı
Dengeli
|
🌍 Misafir
Kota tasarrufu
|
|---|---|---|---|
|
🌈 Rainbow Radar Karoları
Tahmin karoları için. Geçmiş karolar daima önbellekte kalır (değişmez).
📊 Limit: 30.000/ay · güvenli cap: 900/gün
💡 Önerilen: Admin 3 · User 5 · Guest 10
|
dk | dk | dk |
|
☂ Rainbow Nowcast
Dakika bazlı 4 saatlik yağış tahmini (harita + nowcast widget).
📊 Limit: 5.000/ay · ~167/gün. Her konum tıklaması = 1 istek (önbelleksiz).
💡 Önerilen: Admin 5 · User 10 · Guest 15
|
dk | dk | dk |
|
🌀 Tomorrow.io Saatlik Tahmin
Widget + Grafikler sekmesi verileri. Lokasyon başına önbelleğe alınır.
📊 Limit: 25 req/saat · 500 req/gün. Kota kritik; misafir için uzun TTL gerekli.
💡 Önerilen: Admin 15 · User 30 · Guest 60
|
dk | dk | dk |
|
🌤 Open-Meteo Hava Verisi
Ana hava durumu verileri (sıcaklık, rüzgar, yağış, vb.). Veritabanı önbelleği.
📊 Limit: Ücretsiz, API key yok. Yüksek yük ile fair-use politikası devreye girer.
💡 Önerilen: Admin 10 · User 20 · Guest 30
|
dk | dk | dk |
Bildirim istatistikleri, kanal dağılımı, önbellek durumu.
Yükleniyor…
Her saat başı mevcut tahminlerin anlık görüntüsü kaydedilir. 24 saat sonra tüm aktif modellerin ortalamasıyla karşılaştırılarak MAE (ortalama mutlak hata) hesaplanır. Referans olarak model ortalaması kullanılır — bu sayede hiçbir modelin kendine karşı ölçülmesinden doğan yapay avantaj ortadan kalkar. Lokasyon kartına tıklayarak o konuma özel sıralamayı görebilirsiniz.
Yükleniyor…
Kayıtlı kullanıcı ve misafir için temel iş akışları, kurulum komutları, bakım rutinleri.
/apk adresi Android cihazda indirme butonu, masaüstünde QR kodlu yönlendirme sayfası gösterir. Dağıtım için imzalı debug APK kullanılır (assembleDebug); unsigned release APK cihazda kurulmaz.suppressed_dnd durumuyla kaydedilir. Mod bitince özet bildirimi gönder ayarı açıksa, bekleyen bildirimler tek mesajla özetlenir.Siteye ilk girişte varsayılan olarak misafir modunda açılır — oturum açmadan hava durumuna bakılabilir. Giriş yapmak için üst çubukta Giriş Yap bağlantısına tıklayın ya da /?login=1 adresine gidin. Oturumunuzu kapattıktan sonra site yeniden misafir moduna döner. Tüm konum ve ayarlar tarayıcı localStorage'da tutulur.
localStorage'a yazılır; yeni konumlar için varsayılan devre dışı gelir.localStorage'da kuyruğa alınır. Mod bitince özet bildirimi gönder ayarı açıksa, bastırılan bildirimler tek özet mesajla iletilir.# 1) Veritabanı sudo -u postgres psql -c "CREATE USER wx WITH PASSWORD 'wx_secure_password_2024';" sudo -u postgres psql -c "CREATE DATABASE wx_db OWNER wx;" psql -h 127.0.0.1 -U wx -d wx_db -f backend/db/schema.sql node backend/db/migrate-v14.js # forecast_snapshots + model_accuracy tabloları # 2) Redis (zaten kuruluysa atla) sudo apt install -y redis-server sudo systemctl enable --now redis-server # 3) Backend cd backend && npm install pm2 start ../ecosystem.config.js pm2 save sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u isa --hp /home/isa # 4) Testler npm test # 23/23 geçmeli # 5) Nginx + SSL sudo ln -s /etc/nginx/sites-available/wx.idx.cx /etc/nginx/sites-enabled/ sudo certbot --nginx -d wx.idx.cx sudo systemctl reload nginx # 6) .env gereksinimleri PORT=3001 REDIS_URL=redis://127.0.0.1:6379 DATABASE_URL=postgres://wx:[email protected]:5432/wx_db JWT_SECRET=... VAPID_PUBLIC_KEY=... VAPID_PRIVATE_KEY=... VAPID_SUBJECT=mailto:[email protected]
pm2 reload wx-api --update-env
Backend'i sıfır kesintiyle yeniden yükle (yeni env değişkenleri dahil).
pm2 logs wx-api --nostream --lines 50 --err
Son hata satırlarını yazdır (akıştan değil).
node backend/db/migrate-vN.js
Şema güncelleme dosyalarını sırayla çalıştır.
sed -i 's/?v=NN/?v=MM/g' index.html
sw.js'deki wx-static-vNN ile birlikte arttır.
cd wx-app && rm -f www/apk/*.apk && npx cap sync android && cd android && ./gradlew clean assembleDebug
Debug APK imzalıdır ve doğrudan kurulabilir. app-release-unsigned.apk kurulmaz.
pg_dump -h 127.0.0.1 -U wx wx_db | gzip > wx_$(date +%F).sql.gz
Tek dosyalık kuru veritabanı yedeği.
curl -X POST -H "Authorization: Bearer $T" /api/alerts/check-now
Cron beklemeden uyarı kurallarını anında işlet.
Motor her 30 dakikada çalışır; aynı tür bildirim son 24 saat içinde gönderildiyse yalnızca koşul belirgin şekilde kötüleştiğinde tekrar gönderilir. Eşikler: yağış +%40 veya +5 mm · rüzgar/hamle +%30 veya +15 km/sa · düşük sıcaklık/don 3°C daha soğuk · yüksek sıcaklık/sıcak dalga 3°C daha sıcak · şemsiye olasılığı +20 puan · CAPE +%50 · UV +2 birim · fırtına/yol buzlanma +3 saat. Nowcast ve Tomorrow.io bildirimleri kendi sabit pencereleriyle ayrıca deduplicate edilir (NC: 30 dk · TM: 6 saat). Her bildirim notification_log.trigger_value alanına tetikleyen değeri kaydeder.
Aynı uyarı birden fazla kanala gönderildiyse (örn. pushover + pwa + Android app) artık tek satırda gruplandırılır; her kanal için ayrı rozet gösterilir (pushover ✓, pwa ✓, Android App ✓). Hatalı gönderimde rozete tıklanarak hata detayı görülür. Eski kayıtlar ayrı satır olarak kalmaya devam edebilir.
Ayarlar ▶ Bildirim Kanalları altında ana anahtar açık mı? Tarayıcı / PWA için web push izni verildi mi? Android uygulama için Android uygulama bildirimi kanalı açık mı ve cihaz giriş yaptıktan sonra FCM token oluştu mu? Pushover/Telegram/Android app için Test butonlarıyla kanal sağlığını doğrulayın. notification_log tablosunda status sütunu hatayı yazar.
Not: Proje güncellemesi tek başına tarayıcı bildirim iznini normalde silmez. Ancak tarayıcı verisi temizlenirse, origin (alan adı/protokol) değişirse veya PWA kaldırılıp tekrar kurulursa izin/subscription yeniden istenebilir.
Çözüldü (2026-05-11): Bu durum iki katmanlı bir sorundan kaynaklanabiliyordu: bazı cihazlarda native token alma sonrası sync isteği aynı zincirde takılıyordu ve backend tarafında belirli NULL koordinat kombinasyonlarında PostgreSQL tip çıkarım hatası token kaydını engelliyordu.
fcm_tokens yazımındaki CASE WHEN parametreleri numeric cast ile sabitlendi.Hâlâ test başarısızsa admin tarafta pm2 logs wx-api --lines 50 --nostream ile [push:fcm:subscribe] satırını kontrol edin; bu satır tokenın DB'ye yazıldığını gösterir.
Güncel davranış (2026-05-11): Misafirde konum/saat değiştiğinde sunucu senkronu artık sadece test butonuna bağlı değildir. Konum ekle-düzenle-sil sonrası native FCM subscribe üzerinden konum snapshot'ı da gönderilir ve backend guests.loc_coords alanını günceller.
summary kanalına gider. Cihaz ayarlarında bu kanal sessize alınmışsa bildirim görünmeyebilir.Kontrol: Admin tarafta pm2 logs wx-api --lines 160 --nostream içinde şu satırları arayın: guest snapshot synced, guestSummary:stats, pub/fcm/client-log. no_tokens: 0 ve doğru saat/konum görünüyorsa akış sağlıklıdır.
Yönetimde görünürlük: Push Manager misafir detayında Konum Uyarı Ayarları bölümünde her konumun sabah/akşam özeti (açık-kapalı + saat) gösterilir. Aynı yapı kullanıcı kartlarında da Konum Alarm Detayları olarak görünür; kullanıcıların kayıtlı cihazları hangi konuma bağlıysa o konumun alarm kuralları da listelenir.
Bu hata genelde app-release-unsigned.apk dağıtıldığında oluşur. Kurulabilir paket için assembleDebug ile üretilen app-debug.apk kullanılmalı; dağıtım öncesi wx-app/www/apk/*.apk temizlenip sonra npx cap sync android çalıştırılmalıdır.
Kök neden (2026-05-12): Frontend tarafında aynı bileşenlerin bazıları yanlışlıkla iki kez eklendi (duplicate HTML/script) ve bir noktada settings.js dosyasının en üstüne düz HTML satırı girdi. Bu durum JS parse/çalışma akışını bozup sekme event'lerini kilitledi.
app.js include, duplicate SW cache sabiti.settings.js başındaki hatalı HTML satırı kaldırıldı (JS parse normale döndü).APP_BUILD ve SW cache sürümü artırıldı; yeni dosyalar zorla alınır.İstemci doğrulaması: sayfada app.js?v=203 ve SW tarafında wx-static-v252 görmelisiniz. Hâlâ eski sürüm görünüyorsa Hard Reload yapın.
Üst çubukta sağda (her ekranda sabit) güneş/ay/oto simgesinden tema seçin; auto sistem tercihini izler. v89 ile açık temada metin/ikon kontrastı ve toast bildirim okunabilirliği güçlendirildi. Hala eski görünüm varsa tarayıcı önbelleğini temizleyin veya PWA'da uygulamayı kapat-aç yapın (asset sürümü ile birlikte yenilenir).
Evet. Web ve PWA iki katmanlı offline önbellek kullanır:
wx-api-v1 önbelleğinde tutulur. Çevrimdışıyken SW bu yanıtı döndürür; uygulama offline: true işaretli veriyle çalışmaya devam eder.wx_wc_<id> (auth) / wx_gwc_<lat>_<lng>_<model> (misafir) anahtarıyla saklanır. Network hatası durumunda önbellekten yüklenir; hava panelinde 📵 Çevrimdışı · önbellekten rozeti gösterilir.Misafir modunda da aynı offline davranış geçerlidir. Android uygulaması ek olarak widget önbelleğini (widget_weather) native katmanda tutar.
Varsayılan açılış misafir modudur. Giriş yapmanın iki yolu:
https://wx.idx.cx/?login=1 adresine gidin.Oturumu kapattıktan sonra Giriş Yap özellikle tıklanana kadar site misafir modunda kalır. Oturum açık kalırken sekmeyi yenilediğinizde token kontrol edilerek otomatik giriş yapılır.
Açık model + sunucu cache (30 dk) + istemci yenileme (10 dk). Hava panelindeki Yenile butonu ?force=1 göndererek cache'i atlar. Visibility-change ile sekme tekrar açıldığında 5 dk üstü staleyse otomatik yenilenir.
Varsayılan görünüm yoğunluğu azaltmak için 7 gündür. Hava sekmesindeki günlük tahmin kartında 7 gün / 16 gün, Karşılaştırma sekmesinde 4 / 7 / 16 gün, Grafikler sekmesinde ise 3 / 7 / 16 gün anahtarı vardır. Open-Meteo verisi 16 güne kadar çekilir; ancak çoklu model görünümünde ekran, en az iki seçili modelin taşıdığı ortak ufka kadar uzar.
Özellikle ICON-EU gibi kısa ufuklu modeller birkaç günden sonra saatlik veri sağlamayabilir. Bu durumda tablo artık sahte 0°, ❔ veya 0 yazmaz; hücre gerçekten boş bırakılır. Daha uzun ufuklu modeller aynı satırlarda veri göstermeye devam eder.
Rainbow.ai'ın iki ayrı servisi ve bağımsız kotası vardır:
Admin ▶ Yönetim ▶ API & Önbellek'de her iki kota ayrı satırda gösterilir. Kotalar sıfırlanana kadar beklemeniz yeterlidir (UTC gece yarısı sıfırlanır). Tomorrow.io'nun kota limiti aşılırsa radar katmanı otomatik olarak düşük öncelikli duruma geçer.
Konum ekleme haritasında katman seçici vardır ve Şehir etiketleri varsayılan açık gelir. Voyager / Karanlık / Uydu arasında geçiş yapabilirsiniz. Masaüstünde modal ve harita alanı genişletildi; daha rahat seçim için Mevcut konumu kullan butonu da eklidir.
Her çubuk bir saati temsil eder. Renk riski gösterir: gri yok, sarı düşük, turuncu orta, kırmızı yüksek. Çubuğun altındaki ince mavi şerit CAPE (atmosfer enerjisi) yoğunluğunu gösterir — şerit ne kadar koyu olursa potansiyel o kadar yüksek. Üstteki günlük kartlar (Bugün / Yarın / Öbür gün) o günün en kötü riskini özetler. Tepe nokta kırmızı parıltıyla işaretlenir ve alt bilgi satırında tarih/saat olarak yazılır.
Backend açılışında [blitzortung] connected log'u olmalı. Aksi halde DNS/firewall kontrol edin: ws1/ws2/ws3.blitzortung.org arası otomatik fail-over yapılır. Canlı Sistem sekmesinde anlık durum görünür.
Tarayıcı bildirimi izni verilmiş olmalı. Bildirim, seçili konumda 50 km yarıçapında 30 km'den yakın vuruş olduğunda tetiklenir (son 15 dk). Sayfa açılışından 3 sn sonra ilk kontrol yapılır; sonrası 5 dk aralıklı. Aynı konuma 10 dk içinde tekrar bildirim gönderilmez. Mobil/PWA'da bildirimler Service Worker üzerinden iletilir — arka planda da çalışır.
Tarayıcı izinleri ▶ Site izinleri ▶ Bildirimler: İzin ver. Bazı tarayıcılarda HTTPS şart; HTTP kullanıyorsanız Safari/Firefox abonelik vermez.
Bu kısıt kaldırıldı. wx.idx.cx artık tablet ve telefonda dikey ya da yatay fark etmeksizin çalışır. Kurulu PWA eski manifest/CSS cache'i ile açılıyorsa uygulamayı tamamen kapatıp yeniden açın; gerekirse bir kez kaldırıp yeniden kurun. Güncel manifest yön kilidi kullanmaz (orientation: any).
Kök neden (çözüldü v112): Telefon eski SW cache'inden manifest linki olmayan bir index.html sunuyordu. Tablet aynı tarayıcıyla çalışıyordu ama telefonda DOM'da manifest görünmüyordu — 📊 Canlı Sistem ▶ 🧪 Tarayıcı Tanı modalındaki yeni "Manifest fetch" satırı fetch OK / DOM hayır olarak ayırt etti.
Kalıcı düzeltmeler:
<head>'e inline manifest-inject guard eklendi: eski cache'li HTML yüklense bile JS anında <link rel="manifest"> DOM'a ekler.controllerchange olayında location.reload() — yeni SW aktive olunca sayfa network-first taze HTML ile yenilenir.index.html nginx'ten Cache-Control: no-store ile geliyor.t.idx.cx, labs.idx.cx ve scp.idx.cx projelerine de aynı mantıkla taşındı.wx.idx.cx site verisini temizle, tarayıcıyı kapat-aç, 10-15 sn bekle.
Sağ üstte sabit: masaüstünde üst çubukta, mobilde ise ekranın sağ üst köşesinde bağımsız yüzer buton olarak görünür. Menü açıkken geçici olarak gizlenir.
Motor her çalıştığında Open-Meteo'nun saatlik zaman dizisinde İstanbul saatiyle şimdiki saati bulur (nowHourIdx()) ve tüm pencereler buradan başlar. "24 saatte toplam X mm" = şu andan itibaren 24 saat; geçmiş saatler dahil edilmez. Uyarı gece çalıştıysa tepe saati sabah olabilir — bu normal, gelecekte beklenen değeri gösterir.
Ayarlar ▶ Web Push Yönetimi butonu yeni V2 panelini açar. 👤 Kullanıcılar, 🌍 Misafirler ve 📲 Uygulamalar sekmeleri vardır; her satır açılır kart şeklindedir. Kart başlığında cihaz tipi emoji + tarayıcı/OS + idle rozeti (Bugün / 5g önce / 💤 60g) gösterilir. Açılınca:
Toolbar: arama (kullanıcı/IP/token/konum), filtre çipleri (Tümü / 📲 Push'lı / 🚫 Push'suz / ⏱ Son 7 gün), 📣 Mesaj Gönder, ↻ Yenile.
Çoklu seçim & Broadcast: kullanıcı/misafir/cihaz checkbox'ları. Seçim varken üst bar açılır; 📣 Mesaj butonuyla başlık+body+url özel push gönderilir. POST /api/push/admin/broadcast endpoint'i hedefi {all:true} ya da {user_ids,guest_tokens,sub_ids} olarak alır. Tüm broadcast'ler notification_log'a alert_type='admin_broadcast' olarak kaydedilir.
Android APK Misafir Tespiti (v165): Misafir kartında ; wv) User-Agent bayrağı veya FCM token kaydı varsa 📲 Android App (APK) mavi rozeti görünür. FCM token kayıtlıysa 🔔 FCM (n) yeşil rozeti + açılır kartta 🔔 FCM Cihazları · Android APK bölümü eklenir (token kısa gösterimi, cihaz adı/OS/uygulama sürümü, son aktiflik). ⚠ Aboneliği eşleşmedi uyarısı artık yalnızca hem Web Push hem FCM kaydı yokken çıkar — APK misafirler için false positive önlendi. FCM cihazları boşsa misafir muhtemelen eski APK kullanıyor (v164 ≤ bozuk native bridge); v165 APK'yı yeniden kurması gerekir.
Yönetim ▶ 📊 Bildirim Akışı sekmesi notification_log tablosunu detaylı analiz eder. Periyot seçici (24 saat / 3-7-14-30 gün) üzerinden tüm grafikler tek tıkla yenilenir.
success = sent + sent_fcm_fallback, failed = error:%), user_id, guest_token (* = tüm misafir), mesaj içinde arama, tarih aralığı; sayfalı tablo (default 50/sayfa).Backend endpoints: GET /api/push/admin/notification-stats?days=N · GET /api/push/admin/notification-log?... · POST /api/push/admin/fcm/test/:tokenId · GET /api/push/admin/fcm/tokens?owner=user|guest|all.
Misafir kullanıcı artık üst menüden 🔔 Uyarı geçmişi sekmesine erişebilir. Geçmiş, misafirin guest_token'ı üzerinden filtrelenir; backend uç noktası GET /api/pub/alerts/log?token=&limit=&page=. Misafirde toplu sil / seç gibi işlemler gizlenir; "Şimdi kontrol et" butonu da misafirde görünmez (kontrolü cron yürütür).
Önceden misafire "Android uygulama bildirimi" görünüyordu fakat altta Web Push çalışıyordu — bu mobilde güvenilmez. v164 ile misafir gerçek FCM token kaydeder:
fcm_tokens.guest_token sütunu + check constraint user_id IS NOT NULL OR guest_token IS NOT NULL.POST /api/pub/fcm/subscribe · POST /api/pub/fcm/heartbeat · DELETE /api/pub/fcm/subscribe · POST /api/pub/fcm/test. Hepsi guest_token body'de.native-bridge.js → subscribeFcmToken() auth token yoksa localStorage.guest_token ile public endpoint'e POST eder; localStorage.wx_fcm_last_mode = 'guest' | 'user' takip için./fcm/subscribe ON CONFLICT artık guest_token = NULL set ederek temizlik yapar.notifyGuest() artık çoklu-kanal: app_settings.guest_channels (default ["fcm","pwa"]) ile fcm_tokens/push_subscriptions kesişimi hesaplanıp her kanal ayrı log satırına yazılır.v165 Düzeltme: v164 APK'da native-bridge.js script tag'i kaybolmuştu → window.WXNative undefined → FCM register hiç tetiklenmedi. v165 ile tag geri eklendi. v164 APK yüklü cihazların v165 APK'yı yeniden kurması gerekir — aksi hâlde fcm_tokens boş kalır, bildirim gönderilemez, Cihaz Yönetimi'nde FCM bölümü boş görünür.
v165 Admin Görünürlüğü: Cihaz Yönetimi ▶ Misafirler'de APK kullanan misafirler artık 📲 Android App (APK) + 🔔 FCM (n) rozetleriyle işaretlenir. Açılır kartta 🔔 FCM Cihazları · Android APK bölümü token, cihaz adı/OS/uygulama sürümü ve son aktiflik bilgisini gösterir.
/api/pub/fcm/subscribe Postgres'te guest_token bind cast hatası nedeniyle 500 dönüyordu; explicit ::uuid cast eklendi. APK misafirleri artık ilk açılışta token kaydeder. navigator.sendBeacon yerine fetch(..., keepalive:true) ve credentials:'omit' kullanıldı (cookie taşması önlendi).POST /api/pub/fcm/test çağırır → backend fcm.sendToGuest() ile gerçek round-trip yapar. Önceden sadece local notification gösteriyordu.checkAllGuestSummaries('morning'|'evening') her dakika çalışır; guests.loc_coords[].alert_rules içindeki morning_summary.time / evening_summary.time değerlerini İstanbul saatine göre eşler. POST /api/pub/guest/ping artık loc_coords içinde per-konum alert_rules kabul eder (toplam JSON 8 KB ile sınırlı). Kullanıcı tarafındaki günlük özet UI'ı misafire de uygulanır; tercihler localStorage'da tutulur, ping ile sunucuya iletilir.{ids?, user_ids?, guest_tokens?} hedef alır. Web Push aboneliği olmayan ama FCM token'ı olan misafirler için doğrudan fcm.sendToGuest() çağrılır. Yanıt: {ok, total_targets, web_push:{results,sent}, fcm:{results,sent}}. Broadcast'te FCM gönderimleri notification_log'a channel='fcm' ile kaydedilir.notifyUser() kullanıcı için notification_channels içindeki her kanala paralel gönderir: pushover, telegram, pwa (web push), fcm (native). FCM seçili ama hiç APK kurulmadıysa fcm|no_tokens; PWA seçili değilse otomatik sent_fcm_fallback ile web push'a düşer (PWA zaten seçiliyse fallback gerekmez). DND aktifken log girdisi artık seçili ilk kanalı yansıtır (önceden hep pwa görünüyordu).DELETE /api/pub/alerts-log/:id + DELETE /api/pub/alerts-log/all).pm-stat-pill metni ve push modal kapatma butonu beyaz metin sorunu giderildi. Tüm bileşenler koyu ve açık temada doğru kontrasta sahip.#111c2e sabitlendi; açık tema için tam override seti eklendi. Konum altına "🗺 Google Maps'te Aç" bağlantısı eklendi. "Tıkla → merkez" toggle (varsayılan kapalı) ile haritaya tıklamanın merkezi değiştirip değiştirmeyeceği kontrol ediliyor. APK v179..ssc-container üzerindeki 900px kısıtı kaldırıldı, diğer sayfalarla aynı hizaya geldi. Gün seçme pilleri "+2/+3/+4" yerine gerçek gün adı (Sal) ve tarih (13 May) gösteriyor; mobilde tarih satırı gizleniyor.wind_gusts_10m) eklendi. Özet stat kartına günlük maksimum ani rüzgar değeri eklendi./api/pub/sunny-scout?mode=wind parametresiyle çalışır.☰ Katmanlar butonuna tıklanınca açılır.👁 Kapalı butonuna tıklanınca açılır.active CSS sınıfı ve metin) doğru yansıtır.Push'lı butonu kaldırıldı.app.js include kaldırıldı (tek sürüm bırakıldı).settings.js dosyası başına yanlışlıkla eklenen HTML satırı temizlendi; Ayarlar/Yönetim sekmeleri tekrar çalışır hâle geldi.MapModule.pauseRadarForWeatherLayers() ve resumeRadarAfterWeatherLayers() ile yönetilir.👁 Katman Aç/Kapa butonuna bağlandı.👁 Açık olduğunda radar durur; 👁 Kapalı olduğunda radar geri başlar.Doğrulama komutları:
curl -X POST /api/pub/fcm/test -H 'Content-Type: application/json' -d '{"guest_token":"..."}'
curl -X POST /api/push/admin/test -H 'Authorization: Bearer ...' -d '{"guest_tokens":["..."]}'
curl -X POST /api/push/admin/broadcast -d '{"title":"...","body":"...","target":{"guest_tokens":["..."]}}'
Not: Bir auth kullanıcı için FCM kanalı no_tokens dönüyorsa, kullanıcı APK'yı oturum açıkken hiç başlatmamış demektir — APK'ı açıp giriş yaptığında fcm_tokens.user_id kaydedilir.
ECMWF AIFS — AI tabanlı, ekstrem hava olaylarını erken yakalıyor; normal günlerde klasik IFS ile karşılaştırmak için idealdir. GEM — Kanada modeli, orta vadeli tahminlerde ECMWF/GFS ile iyi tamamlanım sağlar. JMA — Japonya modeli, Orta Doğu/Doğu Avrupa geçişlerinde alternatif referans olarak faydalıdır. Tüm modeller Karşılaştırma sekmesinde yan yana görüntülenebilir.
Admin ▶ Push ▶ Misafirler listesi guests tablosundan gelir. Misafir, siteyi ziyaret ettiğinde localStorage'dan üretilen rastgele UUID token ile POST /api/pub/guest/ping çağrısı yapılır; bu kayıt DB'ye yazılır. Olası neden: (1) Yeni misafir henüz sayfayı açmadı — sayfa açıldığında otomatik kaydolur. (2) Eski önbellekten sunulan JS, güncelleme öncesi sürümü çalıştırdı — misafirin tarayıcı SW cache'ini yenilemesi beklenir. (3) Token uzunluğu veya format kontrolünden geçmedi — pm2 logs wx-api --err ile hata satırı kontrol edilebilir.
Admin Misafir Mod Özellik Kontrolü'nde kayıt edilen guest_default_models (Hava / Karşılaştırma / Grafikler), misafir sayfayı yüklediğinde /api/pub/config'ten çekilir ve Guest._applyAdminDefaults() ile uygulanır. Misafirin localStorage'ındaki model tercihleri önceliklidir — konum bazlı preferred_models veya Ayarlar sekmesindeki model seçici kaydedilmişse admin varsayılanı geçersiz kalır. Konum düzenleme modalından model tercihlerini sıfırlamak önceliği tekrar admin varsayılanına devreder.
Stack, sunucu/IP, cron rejimi, cache politikaları, şifre yerleşimi, tablo şeması ve uç noktalar.
--fs-* ölçeğiwx_db · kullanıcı wx · JSONB cache + model_accuracy127.0.0.1:6379 · graceful fallbacknpm test · backend/tests/127.0.0.1:3001wx-api (id 0)127.0.0.1:5432/home/isa/sites/wx.idx.cx/frontend/home/isa/sites/wx.idx.cx/backendbackup/nginx/sites-available/wx.idx.cx.confnginx, postgresql| Çizelge | İş | Açıklama |
|---|---|---|
*/30 * * * * | checkAllAlerts | Kullanıcı kurallarını çoklu modele karşı tara — 24h dedup + değer bazlı mükerrer önleme |
5,35 * * * * | checkAllGuestAlerts | Misafir Web Push/FCM uyarı taraması (ana taramadan 5 dk ofset) |
* * * * * | Sabah özeti (auth) | Her dakika kontrol; konum başına özelleştirilebilen saatte gönderilir (varsayılan 07:00 İstanbul) |
* * * * * | Akşam özeti (auth) | Her dakika kontrol; konum başına özelleştirilebilen saatte gönderilir (varsayılan 19:00 İstanbul) |
* * * * * | checkAllGuestSummaries (morning) | v172 — Misafirin loc_coords[].alert_rules.morning_summary.time ile dakika eşleşince FCM/PWA üzerinden sabah özeti |
* * * * * | checkAllGuestSummaries (evening) | v172 — Misafir akşam özeti, aynı mantıkla |
0 * * * * | Cache temizleme + Model snapshot | weather_cache süresi geçmiş girdiler silinir · forecast_snapshots: aktif lokasyonlar için tahmin anlık görüntüsü alınır |
1 * * * * | DND Özeti | Rahatsız etme modu biten kullanıcılara bastırılmış bildirimlerin özet mesajı gönderilir |
25 * * * * | Model doğruluk hesaplama | 24 saat geçen snapshot'lar gerçekleşen değerle karşılaştırılır; MAE model_accuracy tablosuna yazılır |
| sürekli | Blitzortung WS | ws1/ws2 yedeklemeli, kopuşta otomatik reconnect |
Günlük sabah ve akşam özetleri varsayılan olarak 07:00 ve 19:00 (İstanbul saati, UTC+3) saatlerinde gönderilir. Ancak her konum için bu saatleri ayrı ayrı özelleştirebilirsiniz.
localStorage'da tutulur; çalışma sırasında önbellekte tutulur ve backend dakikalık kontrol ile kesin eşleştirme sağlar.wx:weather:lat:lng:model · TTL 30 dk · Redis kapalıysa L2'ye graceful fallbackweather_cache · key=lat,lng,model · TTL 30 dk · Redis miss'te Redis'e de yazar · past_days=2 ile geçmiş 48 saat dahil (model doğruluk referansı)weather_cache model=__aq__ · TTL 60 dkwx-static-v252 (versiyonla geçersiz) · wx-api-v1 (offline fallback) · wx-ext-v1 (Leaflet/Chart/Inter) · her asset ayrı try/catchwx_wc_<id> (auth) · wx_gwc_<lat>_<lng>_<model> (misafir) — network hatası olduğunda otomatik yüklenir · Çevrimdışı Ön Yükleme ayarıyla bağlantı gelince tüm konumlar otomatik güncellenirpostgres://wx:[email protected]:5432/wx_dbbackend/.env ▶ JWT_SECRET (rastgele 64+ karakter)VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY · subject mailto:users tablosunda saklı| Tablo | Amaç | Notlar |
|---|---|---|
users | Auth + bildirim kanalı | role: admin/user; Pushover/Telegram alanları; alert_rules JSONB |
locations | Kullanıcı yerleri | preferred_models TEXT[] |
notification_log | Gönderim kaydı | status VARCHAR(64); trigger_value NUMERIC; 24h pencere + değer bazlı mükerrer önleme; deliveries JSON ile gruplu görünüm |
app_settings | Genel ayar | key/jsonb; misafir varsayılanları |
push_subscriptions | PWA Web Push | endpoint + p256dh + auth + device_info JSONB + last_ip, vendor, device_model; index'ler: user_id (partial), guest_token (partial), last_used DESC |
guests | Misafir kayıtları | token (UUID) + UA + browser/OS/device_type/screen/tz/lang + last_ip + vendor + device_model + loc_names/loc_coords (JSONB) + note |
weather_cache | Open-Meteo + Hava Kalitesi önbelleği | 30 dk TTL (hava) · 60 dk TTL (AQ, model=__aq__) · saatlik temizleme |
forecast_snapshots | Tahmin anlık görüntüleri | Saatlik cron; lat/lng/model/target_time · doğruluk hesaplamasının kaynağı |
model_accuracy | Model MAE istatistikleri | temp/precip/wind MAE · forecast_hour · Admin ▶ Model Doğruluğu sekmesinde gösterilir |
CORS_ORIGINS env'de listelenen origin'ler (varsayılan: https://wx.idx.cx). Same-origin (nginx arkası) etkilenmez./api/auth/login: 5/dk + 30/saat IP başı. Public endpoint'lerde 5–30/dk yol bazlı. middleware/rateLimit.js in-memory.JWT_SECRET env. Yenileme yok; süre dolunca yeniden login.express.json({limit:'256kb'}).adminOnly middleware req.user.role === 'admin' kontrolü./api/pub/config — misafir ayarları + aktif modeller + enabled flag/api/pub/models — yalnızca aktif modeller/api/pub/weather — misafir hava verisi (?lat=&lng=&model=)/api/pub/lightning — son N dk yıldırım (?lat=&lng=&radius_km=&minutes=)/api/pub/geocode — Nominatim proxy (?q=)/api/pub/alerts/defaults — varsayılan uyarı kuralları (misafir modal için)/api/pub/guest/ping — misafir oturum kaydı/güncelleme (analitik)/api/pub/push/subscribe — misafir PWA push aboneliği/api/pub/push/subscribe — misafir abonelik iptali/api/auth/login/api/auth/me/api/locations/api/locations/api/locations/:id/api/locations/:id/api/weather/models — aktif modeller/api/weather/models/all — tüm modeller (admin)/api/weather/:locationId — hava verisi (?model=)/api/weather/:locationId/compare — çoklu model karşılaştırması/api/airquality?lat=&lng= — hava kalitesi (CAMS AQI, PM2.5/10, NO₂, O₃, SO₂)/api/radar/tile/:provider/:z/:x/:y — PNG radar tile proxy/api/radar/forecast — Tomorrow.io saatlik tahmin/api/radar/nowcast — Rainbow Nowcast 4 saatlik dakika bazlı/api/lightning/:locationId — konum çevresindeki vuruşlar/api/alerts/log — bildirim geçmişi (gruplu)/api/alerts/types — uyarı türleri meta/api/alerts/defaults — varsayılan kurallar/api/alerts/test — test bildirimi gönder/api/alerts/check-now — anlık kural kontrolü/api/alerts/log/:id — tek bildirim sil/api/alerts/log/delete-bulk — toplu silme/api/alerts/log — tüm log sil/api/accuracy/global?days=14 — tüm lokasyonlar model MAE sıralaması/api/accuracy?lat=&lng=&days=14 — belirli konum için MAE/api/analytics/overview?days=30 — bildirim trendi, kanal dağılımı, cache durumu (admin)/api/analytics/locations?days=30 — konum bazlı uyarı sayıları (admin)/api/users — kullanıcı listesi/api/users — yeni kullanıcı/api/users/:id/api/users/me/settings — kişisel ayarlar/api/users/me/password/api/users/admin/settings — uygulama ayarları/api/users/admin/settings/api/users/admin/system — OS/process/DB/lightning istatistikleri/api/push/vapid-key — VAPID public key/api/push/subscribe — kullanıcı push aboneliği/api/push/subscribe — abonelik iptali/api/radar/status — kota/cache istatistikleri/api/push/admin/users — kullanıcılar + cihazlar + konumlar + bildirim istatistikleri/api/push/admin/guests — misafirler (UA, yaş, idle gün, push abonelik tarihi dahil)/api/push/admin/apps — uygulama kullanıcıları + FCM cihaz/token özetleri/api/push/admin/notifications?user_id=X&limit=20/api/push/admin/broadcast — hedefli/toplu özel push (target: all|user_ids|guest_tokens|sub_ids)/api/push/admin/test — seçili abonelik(ler)e test bildirimi/api/push/admin/subscriptions/:id/api/push/admin/fcm-tokens/:id — tek FCM cihaz kaydını sil/api/push/admin/cleanup — seçili cihaz/misafir toplu temizleme (transaction)/api/push/admin/ipinfo/:ip — ipinfo.io proxy (özel IP'lerde local ipucu)/api/push/fcm/subscribe — Android uygulama FCM token kaydı/api/push/fcm/subscribe — Android FCM token iptaliSunucu kaynakları, veritabanı boyutu, son 24 saatteki bildirim aktivitesi ve Blitzortung yıldırım WebSocket sağlığı.
Üretildi: —
Konumlarını yönetmek için 📍 Yerlerim, hava durumunu görmek için 🌤 Hava Durumu sekmelerini kullan. Bu sekmede sadece bildirim ve yenileme tercihleri vardır.
Uygulama veya tarayıcı üzerinden bildirim alabilirsiniz.
💡 Uyarı kuralları (eşikler, türler) her konum için ayrı ayrı ayarlanır — 📍 Yerlerim sekmesinde konum kartındaki 🔔 Uyarılar butonuna tıkla.
Belirlenen saatler arasında bildirimler gönderilmez. İstersen mod bitiminde özet tek bildirim olarak iletilir.
Tüm arayüzü etkiler. Tercih tarayıcıda saklanır.
Hava durumu verisi otomatik yenilensin mi? 0 = sadece sayfa açıldığında.
Uygulama açıldığında hangi konum gösterilsin?
Bütün konumlar için tek bir model seçilir. Değişiklik anında uygulanır.
İşaretlenen modeller her iki sekme açılışında otomatik seçili gelir. Her model satırında ⓘ butonuna tıklayarak model hakkında bilgi alabilirsiniz.