News:

SMF - Just Installed!

Main Menu

1.1.43

Started by hitsumo, Sep 30, 2026, 12:17 PM

Previous topic - Next topic

hitsumo

# Anime Tracker 1.1.43

**Yayın tarihi:** 2026-09-19

Şema değişikliği yok. Tek iş: **kurulum sayacı** — projenin, dünyada kaç
Anime Tracker kurulumu olduğunu kabaca görebilmesi. Kurulum başına **tek
bir** istek; kimlik yok, kişisel veri yok, tek satırla kapatılabilir.

## 1. Kurulum sayacı

### Neden

Proje açık kaynak ve self-host. Bu zamana kadar bir kurulumun merkezle
konuşmak zorunda olduğu **hiçbir otomatik nokta yoktu**: kişisel kurulum
merkez kataloğu çekmeyebilir, güncelleme kontrolü yalnızca düğmesine
basılınca çalışır. Yani GitHub'dan indirilip kurulan bir kopyanın var
olduğu hiçbir zaman bilinmiyordu. "Ne kadar büyüdük?" sorusunun cevabı
yoktu.

### Ne yapar

Kurulum, **yalnızca bir kez** — ana sayfanın ilk açılışından sonra —
projenin sayacına tek bir küçük istek gönderir. İçinde üç şey vardır:

| Alan | Ne  | Nereden |
| --- | --- | --- |
| `id` | Rastgele 32 karakterlik kurulum kimliği | Gönderim anında `random_bytes` ile üretilir, `settings.install_id`'ye yazılır. Adresten, veritabanından, kişiden türetilmez. |
| `v` | Kurulu sürüm | `version.txt` |
| `m` | `single` (kişisel) / `multi` (çok kullanıcılı) | `MULTI_USER_MODE` |

**Gönderilmeyenler:** site adresi, üye sayısı, anime, izleme verisi,
notlar, sunucu adı. Sayaç **IP adresini saklamaz**. Kimlik yalnızca bir
tekrarın (yeniden deneme, geri yüklenen yedek) yeni kurulum sayılmaması
içindir; `settings` tablosundaki `install_id` ve `install_ping_done`
satırlarını silen kurulum sayaçta yeni bir kurulum olur.

**Neden günlük değil, bir kez:** ilk taslak günlük "yaşıyorum" pingiydi
(toplamın yanında "son 30 günde aktif" sayısını da verirdi). Karar: en
küçük iz — kurulumda bir kez, "gerekirse genişletiriz". Kapı öyle kuruldu
ki günlüğe dönmek tek satırlık iş.

### Nasıl çalışır

- **Sayfa beklemez.** `index.php` yalnızca "ping başardı mı, bugün denendi
  mi?" diye bakar (`settings.install_ping_done` / `last_install_ping`).
  Gerekiyorsa sayfanın sonuna tek satırlık bir `fetch('install_ping.php')`
  basar; dışarı giden isteği o uç yapar, 3 saniye zaman aşımıyla. Sayaç
  sunucusu yavaş ya da kapalı olsa bile kullanıcının baktığı sayfa
  etkilenmez.
- **Başarana kadar günde en fazla bir deneme, sonra bir daha asla.** Uç,
  göndermeden **önce** günü işaretler; HTTP 200 gelince `install_ping_done`
  yazılır ve kapı kalıcı kapanır. Kurulum anında sayaç sunucusu kapalıysa
  o kurulum kaybolmaz — ertesi gün sayılır; arada hiçbir sayfa yüklemesi
  dışarı istek atmaz.
- **POST + CSRF.** Öteki durum değiştiren uçlarla aynı kalıp. İkinci istek
  (iki sekme, sayfanın JS'ini çalıştıran bir tarayıcı botu) 204 döner, hiçbir
  şey yapmaz.
- **Kapatma:** `config.php`'de `define('INSTALL_PING', false);`. Sabit yoksa
  açık sayılır (eski `config.php` dosyaları için `MULTI_USER_MODE` ile aynı
  gelenek). Yeni kurulumlarda `setup.php` ve Docker giriş betiği satırı
  `true` olarak yazar ki anahtar gözle görülsün.

### Sayılar nerede görünür

- **Yönetici paneli → "Kurulum Sayacı" kartı:** toplam, kişisel / çok
  kullanıcılı dağılımı, kurulumların hangi sürümle başladığı.
  Kart sayıları tarayıcıdan çeker (sunucu tarafında çekmek admin sayfasını
  uzak sunucuya bağımlı kılardı). Bu kurulumda sayaç kapalıysa kart bunu
  ayrıca söyler.
- **Herkese açık:** `ping.php?stats=1` yalnızca toplamları döner, kimlik
  değil. Karar: sayıda korunacak bir şey yok; ileride Hakkında sayfasında
  "N kurulum" rozeti olabilir.

### Şeffaflık

Açık kaynak bir projede "sessiz" bir sayaç olmaz. Ne gittiği dört yerde
yazılı: `README.md` (TR+EN, yeni "Kurulum sayacı" bölümü), yardım
(Senkronizasyon ve Güncelleme → yeni **Kurulum Sayacı** bölümü:
ne gönderilir, ne gönderilmez, nasıl kapatılır, neden var),
`config_example.php` ve yardımcı dosyanın başındaki açıklama. Sayı kabaca
doğrudur, kanıt değildir: sayacı kapatan görünmez, kimliğini sıfırlayan iki
kez sayılır — bu da yardımda yazıyor.

## 2. Detay sayfasında "Düzenle" yalnızca düzenleyebilene

Detay sayfası "Düzenle" düğmesini herkese basıyordu; anonim ziyaretçi tıklayınca
`edit_anime.php` giriş sayfasına yönlendiriyordu (uç zaten moderatör kapılı).
Liste sayfası aynı düğmeyi öteden beri yalnız moderatöre gösteriyordu, detay
sayfası unutulmuştu. Zararı arama motorunda görüldü: Search Console 1.034
"yönlendirmeli sayfa" biriktirmişti, hepsi `edit_anime.php?id=...`. Düğme artık
detayda da yalnız moderatör ve üstüne görünür. Kişisel kurulumda sahip her
zaman yetkili olduğundan davranış değişmez.

## 3. Seri kronolojisi sayfasının başlığında "İzleme Sırası"

Search Console, "tensei shitara slime izleme sırası" aramasında seri kronolojisi
sayfasını değil filmin detay sayfasını gösteriyordu: sayfanın başlığı "Seri
Kronolojisi" idi, arayan "izleme sırası" yazıyordu. `<title>` ve meta açıklama
artık iki ifadeyi de taşıyor — *"X İzleme Sırası - Seri Kronolojisi"* /
*"X Watch Order - Series Chronology"*; açıklamaya "hangi film hangi bölümden
sonra izlenir" eklendi. Arayüzdeki sayfa adı ve yardım metinleri değişmedi.

## Dosyalar

**Yeni:**

```
files/functions/install_ping_helpers.php   mantık; INSTALL_PING_URL sabiti
files/install_ping.php                      yerel AJAX ucu (POST + CSRF)
files/migration/1.1.43/upgrade.sql          şemasız; sürüm damgası + gerekçe
catalog_server/ping.php                     MERKEZ: kayıt + ?stats=1
```

**Değişen:**

```
files/index.php                    tetikleyici (yalnız ping gerekiyorsa basılır)
files/anime_details.php            "Düzenle" düğmesi yalnız moderatöre (§2)
files/series_timeline.php          <title> ve seo_head başlığı yeni kalıptan (§3)
files/functions.php                yeni yardımcı yükleniyor
files/admin/admin.php              "Kurulum Sayacı" kartı
files/lang/admin_tr.php            +9 anahtar
files/lang/admin_en.php            +9 anahtar
files/help/help_sync.php           yeni "Kurulum Sayacı" bölümü
files/help.php                     içindekiler (+1 satır)
files/lang/tr.php                  +12 anahtar, 1 değişen (seo.series.description_fmt)
files/lang/en.php                  aynı
files/config_example.php           INSTALL_PING açıklaması
files/setup.php, setup_en.php      üretilen config.php'ye INSTALL_PING satırı
files/schema.sql                   settings anahtar listesine install_id / last_install_ping / install_ping_done
files/robots.php                   install_ping.php disallow listesinde
files/version.txt
docker-entrypoint.sh               üretilen config.php'ye INSTALL_PING satırı
catalog_server/catalog_server_README.md   ping.php bölümü + tablo SQL'i
README.md                          "Kurulum sayacı" bölümü (TR+EN)
```

Dil dosyası paritesi: 1109 = 1109, yönetici 312 = 312. Yeni CSS/JS yok.

## Dağıtım notu

- **Merkez katalog sunucusunda iki adım:** (1) `installs` tablosunu oluştur
  (SQL `catalog_server_README.md` ve `migration/1.1.43/upgrade.sql`
  içinde), (2) `catalog_server/ping.php` dosyasını yayımla. Uç,
  `private/admin_push_config.php`'nin veritabanı bilgilerini kullanır
  (yazma yetkili kullanıcı); `private/rate_limit/` klasörünü kendisi açar.
- **Sıra önemli değil.** Uygulama önce giderse ping 404 alır, günlüğe yazar,
  ertesi gün yine dener (başarana kadar günde bir); sayfalar etkilenmez.
  Merkez önce giderse tablo boş bekler.
- Uygulama tarafında migration şema değiştirmez; `install_id` ilk ping'de
  PHP tarafından üretilir. Taze kurulum replay'i etkilenmez.
- `functions/install_ping_helpers.php` ile `functions.php` **birlikte**
  gitmeli: `functions.php` yeni dosyayı `require_once` eder, dosya yoksa
  her sayfa çöker (0.6.7'den beri geçerli "functions/ klasörünün tamamı"
  kuralı).
- Yönetici kartı sayıları `INSTALL_PING_URL?stats=1` adresinden tarayıcıda
  çeker; merkez uç yayımlanana kadar kart "Sayaç sunucusuna ulaşılamadı"
  gösterir, başka bir şey bozulmaz.
- **Dağıtım sunucusunda** her zamanki iki adım: yayımlanan `version.txt`
  1.1.43'e çekilmeli ve `updates/1.1.43/anime-tracker-1.1.43.zip` paketi
  yayımlanmalı.
- Kendi kurulumlarınız (yerel XAMPP dahil) da sayılır. Sayılmasın
  istediğiniz kopyada `INSTALL_PING`'i `false` yapın.