# Yapılandırma Referansı

## Yapılandırma Dosyası

Konum: `/etc/whost/agent.conf` (YAML formatı)

Dosya izinleri: `600`, sahibi `root` (yalnızca root tarafından okunabilir). Agent her açılışta izni `600`'e geri çeker.

---

Kurulum aracı, makul varsayılanlarla çalışan bir yapılandırma yazar — çoğu sistem yöneticisinin dosyayı doğrudan düzenlemesi gerekmez: aşağıdaki anahtarların çoğu panelden değiştirilir; panel bu dosyayı yazar ve değişikliği ilgili servise uygular. Aşağıdaki bölümler, ayarlanması gerektiğinde nereye bakacağınızı bilmeniz için her bloğun neyi yönettiğini açıklar.

**Dosya nasıl yazılır.** İlk sürümü kurucu, ihtiyaç duyduğu bloklarla yazar. Bundan sonra agent, bellekte tuttuğu ayarlardan dosyanın tamamını yeniden yazar: ilk açılışında (aşağıdaki her bloğu varsayılan değerleriyle ekler) ve panelden kaydedilen her değişiklikte. Elle eklenen yorumlar, anahtar sırası ve biçim korunmaz; agent'ın tanımadığı bir anahtar (yanlış yazılmış olanı da) uyarı verilmeden yok sayılır ve bir sonraki yazımda düşer. Bozuk YAML ya da yanlış tipte bir değer (sayı veya `true`/`false` beklenen yerde metin) agent'ın açılmasını durdurur; nedeni `/var/log/whost/agent.log` dosyasına eklenir.

**Sırlar.** Parolalar ve sırlar bu dosyada düz metin olarak durur (yönetici parolası bcrypt özeti olarak). Agent çalışırken bunları bellekteki bir kasaya taşır; diskte tek korumaları dosyanın `600 root` iznidir — dosyanın her kopyasını ve yedeğini aynı sıkılıkta koruyun.

**Başka yerde tutulan ayarlar.** Güncelleme tercihleri (`/etc/whost/update_settings.json`, son bölüme bakın), Ayarlar › Bildirimler'in kanalları ve aktarıcısı (`/etc/whost/notification_prefs.json`), uzak yedek hedefleri (`/etc/whost/remote_backup.json`), API anahtarları (`/var/lib/whost/api_keys.json`), eklenti durumu (`/etc/whost/plugins.json`) ve sunucu saat dilimi (bir sistem ayarı) bu dosyada değildir.

**Tabloları okuma.** *Varsayılan*, anahtar yoksa agent'ın kullandığı değerdir; kurucu farklı bir değer yazıyorsa o da belirtilir. *Değiştirildiği yer* panel sayfasını adlandırır. **dosya** — yalnız bu dosya düzenlenerek (sondaki Değişiklikleri Uygulama bölümüne bakın). **agent** — kurucu ya da agent yazar: düzenlemeyin, elle yazılan değer onu kullanan servisi bozar. **—** — anahtarın bu sürümde etkisi yoktur.

---

## Bölüm Detayları

### server

Sunucunun kimliği ve agent'ın kendi dinleyicisi.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `hostname` | kurucu: host adı (`--hostname`) | Ayarlar › Genel › Hostname | Panelin host adı (FQDN). Panelden kayıt ayrıca `hostnamectl` çalıştırır, `/etc/hosts` dosyasını yeniden yazar, `mail.hostname` değerini ayarlar, Postfix ve Dovecot'u reload eder ve panelin nginx vhost'unu yeniden yazar. Bildirim e-postaları `https://<hostname>` adresine bağlantı verir; parola sıfırlama bağlantısının da yedek kaynağıdır (`frontend.public_url`'e bakın). |
| `server_ip` | kurucu: sunucunun birincil IPv4 adresi | Ayarlar › Genel › Sunucu IP Adresi | Birincil genel IPv4 adresi: başka adres atanmadıkça hesap bu adresi alır, hesabın DNS bölgesi buna işaret eder ve panel vhost'u bu adreste yanıt verir. Panelden kayıt, eski adresi taşıyan DNS A kayıtlarını yeniden yazar. |
| `force_ssl` | `true` | Ayarlar › Genel › HTTPS Yönlendirmesini Zorla | Panelin HTTP isteklerini HTTPS'e yönlendirir; bir proxy ya da CDN'in `X-Forwarded-Proto: https` ile ilettiği istek yönlendirilmeden sunulur. Kayıt panel vhost'unu yeniden yazar ve nginx'i reload eder. |
| `host`, `port` | `0.0.0.0`, `2000` (kurucu: `127.0.0.1`, `2000`) | dosya | Dinleyiciyi taşımazlar: agent, servis biriminin belirlediği `127.0.0.1:2000` adresinde dinler (`--host`, `--port`; birim 2001'in altındaki portları root'a ayırır — `net.ipv4.ip_unprivileged_port_start = 2001`, `/etc/sysctl.d/60-whost-agent-port.conf` dosyasında kalıcı — böylece hiçbir hesabın süreci agent'ın portunu, agent yeniden başlarken bile, dinleyemez; root olmayan süreçler 1024–2000 arasındaki portları dinleyemez); panelin nginx proxy'si ve güncelleme hattı bu adresi kullanır. `port` yine de agent'ı kiracı süreçlerinden uzak tutan güvenlik duvarı kuralı ve Saldırı Altında Modu'nun hiç düşürmediği port listesi tarafından okunur — `2000` bırakın. |
| `ssl_cert`, `ssl_key` | `/etc/whost/ssl/cert.pem`, `/etc/whost/ssl/key.pem` | — | Okunmaz; aşağıdaki sertifika notuna bakın. |
| `workers` | `1` | — | Her zaman `1`: başka bir değer loglanır ve `1` ile değiştirilir. |

**Panel sertifikası.** `/etc/whost/ssl/cert.pem` ve `/etc/whost/ssl/key.pem` çifti kurulumda host adı için self-signed olarak üretilir. Aynı çift panelin 443 portundaki nginx vhost'una, Postfix ve Dovecot TLS'ine, siteleri LiteSpeed sunuyorsa OpenLiteSpeed dinleyicisine ve agent'ın loopback dinleyicisine hizmet eder. Güvenilir bir sertifika sunmak için iki dosyayı değiştirin (`cert.pem` içinde sertifika ve zinciri), `nginx -t` ile kontrol edin, ardından nginx, Postfix ve Dovecot'u reload edin.

### auth

API isteklerinin HMAC-SHA256 kimlik doğrulaması (makineden makineye; paneller oturum çerezi kullanır).

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `api_key`, `api_secret` | kurucu üretir | agent | Kurucunun ürettiği API anahtar çifti (`/etc/whost/api_key` ve `/etc/whost/api_secret` dosyalarında da saklanır). Agent ilk açılışında onu API anahtar listesine **Default API Key** adıyla kopyalar (Ayarlar › API Erişimi); orada diğer anahtarlar gibi yönetilir — emekliye ayırmak için orada iptal edin ya da silin. Silinen kurucu anahtarı emekli kalır: bu kopya üzerinden yanıt vermez ve sonraki açılışta listeye geri kopyalanmaz. Kurucunun sonraki bir koşumunun yazdığı çift, aynı biçimde yönetilene kadar yanıt verir. |
| `allowed_ips` | `[]` | dosya | Agent anahtarı listeye eklerken bu anahtarın IP izin listesine kopyalanır; sonrasında izin listesi Ayarlar › API Erişimi'nden düzenlenir ve bu liste artık anahtara uygulanmaz. |
| `api_key_encryption_secret` | ilk açılışta üretilir | agent | Saklanan API anahtar sırlarını ve uzak yedek hedeflerinin kimlik bilgilerini şifreler. Asla değiştirmeyin ya da silmeyin: saklanan sırlar artık çözülemez. |

### webserver

Siteleri hangi web sunucu yığınının sunduğu ve genel bağlantı ayarları. `type` şunlardan birini alır:

- **nginx:** Tüm HTTP trafiğini doğrudan Nginx yönetir
- **apache:** Tüm HTTP trafiğini doğrudan Apache yönetir
- **nginx_apache:** Reverse proxy olarak Nginx (port 80/443) + Apache backend (`apache_port`, 8080)
- **openlitespeed**, **litespeed:** OpenLiteSpeed ya da LiteSpeed Enterprise; ilgili eklenti Eklentiler sayfasında etkinleştirildiğinde ayarlanır; PHP bu durumda LSAPI üzerinden çalışır

Installer `nginx_apache` ya da `nginx` yazar; diğer değerleri reddeder (bkz. [Kurulum](installation.md#komut-sat-r-se-enekleri)).

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `type` | `nginx_apache` (kurucu: `--webserver`) | Ayarlar › Genel › Varsayılan Web Sunucu (`nginx`, `nginx_apache`; `apache` yalnız tek başına Apache ile kurulmuş sunucuda sunulur ve kabul edilir) | Agent'ın her site yapılandırmasını, sertifika yenileme kancasını ve WAF kurulumunu yazdığı yığın. Genel ayarlardaki kayıt yalnız bu değeri değiştirir — web sunucu kurmaz, başlatmaz, yeniden yapılandırmaz — bu yüzden ancak sunucunun yığını buna uyacak şekilde değiştirildikten sonra değiştirin. OpenLiteSpeed ya da LiteSpeed ile alan salt okunurdur (eklentiye aittir). Agent açılışta 443 portunu dinleyen süreç uyuşmuyorsa `WEBSERVER_BINDING_DRIFT` loglar. |
| `max_clients`, `keepalive_timeout` | `256`, `65` | Ayarlar › Genel › Maks İstemci (1–10000), Keep-Alive Zaman Aşımı (0–300 sn) | Panelden kaydedildiğinde web sunucuya yazılır: Nginx'te `nginx.conf` içindeki `worker_connections` ve `keepalive_timeout` (yalnız bu satırlar varsa; `nginx -t`, ardından reload), Apache'de yalnız `KeepAliveTimeout` (`apachectl configtest`, ardından reload), OpenLiteSpeed/LiteSpeed'de `maxConnections` ve `keepAliveTimeout` (sunucu yeniden başlar). Başarısız test önceki dosyayı geri yükler. Sayfa çalışan sunucunun değil, yapılandırılmış değerleri gösterir. |
| `apache_port` | `8080` | dosya | `nginx_apache` site yapılandırmalarında nginx'in proxy yaptığı Apache portu. Apache'nin kendi `Listen` portunu kurucu ayarlar; bu anahtarı izlemez. |
| `php_handler` | `fpm` | agent | `fpm` (PHP-FPM havuzları) ya da `lsapi`; `type` OpenLiteSpeed ya da LiteSpeed olduğunda `lsapi` yapılır. |
| `ols_admin_port`, `ols_admin_user`, `ols_admin_password` | `7080`, `admin`, boş | agent | OpenLiteSpeed/LiteSpeed WebAdmin konsolu. LiteSpeed Enterprise eklentisi sunucuyu kurarken parolayı üretir (burada zaten bir değer varsa yeniden kurulumda o kullanılır); konsola ihtiyaç duyduğunuzda buradan okuyun. |
| `lscache_enabled` | `true` | dosya | OpenLiteSpeed/LiteSpeed site yapılandırmalarına LSCache ekler. |
| `litespeed_serial` | — | agent | Eklentinin etkinleştirildiği LiteSpeed Enterprise seri anahtarı. |
| `nginx_port` | `80` | — | Okunmaz. |

### php

Birden fazla PHP sürümü aynı anda kurulabilir ve her hosting hesabı farklı bir sürüm kullanabilir.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `default_version` | `8.4` (kurucu: `--php-default`) | Ayarlar › Genel › Varsayılan PHP Sürümü; PHP › Varsayılan PHP Ayarları | Yeni hesapların PHP sürümü; `installed_versions` içinden biri olmalıdır. |
| `installed_versions` | `7.4`, `8.0`–`8.5` (kurucu: kurduğu sürümler, `--php-versions`) | PHP sayfası, sürüm anahtarları | Hesaplara sunulan sürümler. Bir sürüm ancak paketleri kuruluysa açılabilir; varsayılan sürüm ve bir domainin hâlâ kullandığı sürüm kapatılamaz. |
| `default_upload_max_filesize`, `default_post_max_size` | `64M` | PHP › Varsayılan PHP Ayarları | İsteğe bağlı `K`/`M`/`G` ile bir boyut; `-1` reddedilir. |
| `default_memory_limit` | `256M` | PHP › Varsayılan PHP Ayarları | Bir boyut ya da sınırsız için `-1`. |
| `default_max_execution_time` | `300` | PHP › Varsayılan PHP Ayarları | Saniye, 0–86400. |
| `default_max_input_time` | `300` | PHP › Varsayılan PHP Ayarları | Saniye, -1–86400. |
| `default_max_input_vars` | `1000` | PHP › Varsayılan PHP Ayarları | 1–1000000. |
| `default_display_errors` | `false` | PHP › Varsayılan PHP Ayarları | `true` ya da `false`. |

Yedi `default_*` değeri, hesap kendi değerlerini kaydedene kadar hesabın havuzunun üretildiği ini değerleridir; hesabın kaydettiği değerler meta verisinde tutulur ve sürüm, işlemci ya da paket değişiminden sağ çıkar. Bir varsayılanı değiştirmek mevcut havuzları yeniden yazmaz: kendi değeri olmayan bir hesap yeni varsayılanı, havuzu bir sonraki üretilişinde alır.

### python

Python uygulama barındırma (**Python Hosting** eklentisi). Eklentinin açık/kapalı durumu bu bloğun anahtarı değil, `client_features.python_apps`'tir.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `installed_versions` | `3.10`, `3.11`, `3.12`, `3.13` | dosya | Uygulamalara sunulan Python sürümleri; yalnız yorumlayıcısı sunucuda kurulu olanlar listelenir. |
| `default_timeout`, `default_max_requests` | `120`, `1000` | dosya | Kendi değerini ayarlamamış bir uygulamanın Gunicorn `timeout` ve `max_requests` değerleri. |
| `allowed_manage_commands` | `migrate`, `collectstatic`, `createsuperuser`, `showmigrations`, `check`, `shell` | dosya | Panelin bir uygulama için çalıştırabileceği Django `manage.py` komutları; başka komut reddedilir. |
| `socket_dir`, `venv_base_dir` | `/run/whost`, `venvs` | agent | Uygulama soketlerinin ve (hesabın ev dizini altında) sanal ortamların oluşturulduğu yer. |
| `enabled`, `default_version`, `default_app_server`, `default_workers`, `default_worker_class`, `max_workers_per_app` | — | — | Okunmaz. |

### node

Node.js uygulama barındırma (**Node.js Hosting** eklentisi). Eklentinin açık/kapalı durumu bu bloğun anahtarı değil, `client_features.node_apps`'tir.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `installed_versions` | `18`, `20`, `22` | dosya | Uygulamalara sunulan Node.js sürümleri; yalnız çalışma zamanı sunucuda kurulu olanlar listelenir. |
| `allowed_npm_scripts` | `start`, `build`, `test`, `lint`, `migrate`, `seed` | dosya | Panelin bir uygulama için çalıştırabileceği `npm run` betikleri; başka betik reddedilir. |
| `socket_dir`, `wrappers_dir` | `/run/whost`, `/etc/whost/wrappers` | agent | Uygulama soketlerinin ve uygulama başına başlatma sarmalayıcılarının oluşturulduğu yer. |
| `enabled`, `default_version`, `default_app_type`, `default_package_manager`, `default_instances`, `max_instances_per_app`, `default_max_memory_mb`, `runtime_base_dir` | — | — | Okunmaz. |

### mysql

Agent'ın MariaDB bağlantısı ve sizin yerinize uyguladığı MariaDB ayarları.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `host`, `port` | `localhost`, `3306` | agent | Agent'ın MariaDB bağlantısı. |
| `root_password` | kurucu ayarlar | agent | MariaDB `root` parolası (`/etc/whost/mysql_root_password` dosyasında da). |
| `max_connections` | `151` | Ayarlar › Genel (1–10000) | `max_connections`. |
| `buffer_pool_size` | `256` (MB) | Ayarlar › Genel (16–65536) | `innodb_buffer_pool_size`. |
| `connect_timeout`, `wait_timeout`, `interactive_timeout` | `300` (saniye) | Ayarlar › Genel (1–86400) | Aynı adlı MariaDB değişkenleri. |
| `sort_buffer_size`, `read_buffer_size`, `max_allowed_packet` | `4M`, `4M`, `64M` | Ayarlar › Genel | Sıfırdan büyük bir `K`/`M`/`G` boyutu (`4M`, `256K`, `1G`). |

Ayarlar › Genel'den bir veritabanı değerini değiştiren kayıt, `/etc/mysql/mariadb.conf.d/99-whost-tuning.cnf` (RHEL'de `/etc/my.cnf.d/`) drop-in dosyasını agent'ın şablonundan sekiz değerin tamamıyla yeniden yazar ve her birini `SET GLOBAL` ile canlı uygular; bu yüzden yeniden başlatma gerekmez. Drop-in ayrıca MariaDB'nin bir sonraki yeniden başlatmada okuduğu `local_infile = 0` ve `secure_file_priv = /var/lib/mysql-files` satırlarını taşır. Kurucu bu dosyanın sunucunun RAM'ine göre boyutlandırılmış kendi sürümünü yazar (InnoDB buffer pool RAM'in %37,5'i, en az 256 MB; `max_connections = 300`; InnoDB log ve flush ayarları); panelden yapılan ilk veritabanı kaydı onu sayfanın gösterdiği sekiz değerle değiştirir. Bu anahtarları dosyada düzenlemek MariaDB'yi değiştirmez.

### dns

HTTP API üzerinden PowerDNS entegrasyonu.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `enabled` | `true` (kurucu: `--no-dns` ile `false`) | dosya | PowerDNS'in kurulu olup olmadığı. `false` iken hesaplar DNS bölgesi olmadan oluşturulur; hesabın adres değişikliği ya da nameserver değişikliği bölgelere yansıtılmaz. |
| `nameservers` | `ns1.example.com`, `ns2.example.com` (kurucu: `--nameservers`, varsayılan `ns1.<hostname>`, `ns2.<hostname>`) | Ayarlar › Genel › İsim Sunucuları (en çok dört, sırayla doldurulur) | Agent'ın oluşturduğu her bölgenin NS kayıtları; ilk kayıt SOA birincilidir. Panelden kayıt ayrıca mevcut her bölgenin NS kayıtlarını ve SOA birincilini yeniden yazar; elle düzenleme yalnız yeniden başlatmadan sonra oluşturulan bölgelere ulaşır. Bunları, kayıt kuruluşundaki delegasyonun adlandırdığı gerçek nameserver hostname'lerinize ayarlayın. |
| `api_url`, `api_key` | `http://127.0.0.1:8081`, kurucu ayarlar | agent | PowerDNS HTTP API'si ve anahtarı (`/etc/whost/pdns_api_key` dosyasında da). |
| `default_ttl` | `3600` | dosya | Agent'ın oluşturduğu kayıtların TTL'i. |
| `soa_content` | `ns1.example.com hostmaster.example.com 0 10800 3600 604800 3600` | dosya | Yalnız son dört sayısı — refresh, retry, expire ve negatif önbellek TTL'i — kullanılır; SOA birincili ilk nameserver'dır, iletişim adresi `hostmaster.<zone>`'dur. |
| `type` | `powerdns` | — | Okunmaz; tek DNS sunucusu PowerDNS'tir. |

### mail

Postfix (SMTP) + Dovecot (IMAP/POP3) + OpenDKIM. Posta sistemi sanal posta kutusu yönetimi için bir MariaDB veritabanı kullanır.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `enabled` | `true` (kurucu: `--no-mail` ile `false`) | dosya | Posta yığınının kurulu olup olmadığı. `false` iken agent, saatlik gönderim limitlerini uygulayan WHost Mail Policy servisini (`whost-policyd`) kurmaz ve yenilemez. |
| `hostname` | `mail.example.com` (kurucu: `--mail-hostname`, varsayılan `mail.<hostname>`) | dosya | Kurulumda kaydedilen posta host adı; Ayarlar › Genel'deki host adı değişikliği bunu yeni sunucu host adıyla değiştirir. |
| `default_hourly_limit` | `500` | Ayarlar › Genel › Varsayılan Saatlik E-posta Limiti (0–100000) | Paketi kendi limitini belirlemeyen bir hesabın saatte gönderebileceği ileti sayısı; `0` = sınırsız. Panelden kayıt `whost-policyd`'yi yeniden üretir ve yeniden başlatır; elle düzenleme bir sonraki agent açılışında ulaşır. |
| `max_email_size` | `25` (MB) | Ayarlar › Genel › Maksimum E-posta Boyutu (1–100 MB) | Panelden kaydedildiğinde Postfix `message_size_limit` değerine yazılır (Postfix reload edilir); elle düzenleme Postfix'i değiştirmez. |
| `dkim_selector`, `dkim_key_dir` | `default`, `/etc/opendkim/keys` | agent | Agent'ın oluşturduğu DKIM anahtarlarının selector'ı ve anahtar dizini (`<selector>._domainkey.<domain>` kayıtları). |
| `maildir_base`, `vmail_uid`, `vmail_gid` | `/var/vmail`, `5000`, `5000` | agent | Kurulduğu hâliyle posta kutusu deposu ve sahibi. |
| `mysql_host`, `mysql_port`, `mysql_user`, `mysql_password`, `mysql_database` | `localhost`, `3306`, `vmail`, kurucu ayarlar, `vmail` | agent | Sanal posta kutusu veritabanı (parola `/etc/whost/mail_db_password` dosyasında da). |
| `dovecot_master_user`, `dovecot_master_password` | `whost_master`, webmail ile ayarlanır | agent | Webmail tek oturum açma için kullanılan Dovecot master girişi. |

### ssl

certbot üzerinden Let's Encrypt entegrasyonu. Siparişler HTTP üzerinden domainin kendi document root'undan doğrulanır, domainin adını alır ve vhost'un gösterdiği dosyaları tazeleyip web sunucuyu reload eden bir yenileme kancası kurar; yenilemeler certbot'un kendi takviminde çalışır (systemd zamanlayıcısı ya da zamanlayıcı yoksa kurucunun eklediği günlük cron satırı). Bir sertifikayı silmek lineage'ı da kaldırır.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `email` | boş (kurucu: `--ssl-email`) | Ayarlar › Genel › Let's Encrypt E-postası | Siparişlerin hesap e-postası, zorunludur: boşken sipariş `400 SSL_EMAIL_REQUIRED` ile reddedilir. |
| `staging` | `false` | dosya | `true`, siparişleri sertifikalarına tarayıcıların güvenmediği Let's Encrypt staging ortamına gönderir — hız sınırlarına takılmadan test için. Değiştirdikten sonra agent'ı yeniden başlatın. |
| `auto_renew` | `true` | Ayarlar › Genel › Yeni Domainler İçin Otomatik SSL | Bu sürümde yalnız saklanır: hesap ve ek domain formları kendi Otomatik SSL seçimlerini taşır. |
| `provider`, `webroot_path`, `renew_days_before` | `certbot`, `/var/www/letsencrypt`, `30` | — | Okunmaz. |

### ftp

MariaDB kimlik doğrulamalı Pure-FTPd. Her hosting hesabı birden fazla FTP alt hesabına sahip olabilir.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `enabled` | `true` (kurucu: `--no-ftp` ile `false`) | dosya | Pure-FTPd'nin kurulu olup olmadığı. |
| `passive_ports` | `30000:30100` | Ayarlar › Genel › Pasif Port Aralığı | `START:END`, 1024–65535, START END'den küçük. Panelden kaydedildiğinde Pure-FTPd'nin `PassivePortRange` değerine yazılır. Kurucu güvenlik duvarında `30000:30100` aralığını açar; yeni bir aralığı Güvenlik Duvarı sayfasında `START:END` port kuralı olarak açın. |
| `max_clients` | `50` | Ayarlar › Genel › Maks İstemci (1–1000) | `MaxClientsNumber`. |
| `max_per_ip` | `10` | Ayarlar › Genel › IP Başına Maks Bağlantı (1–100) | `MaxClientsPerIP`. |
| `passive_mode`, `bandwidth_limit` | `true`, `0` (KB/sn) | yalnız API (form bunları göstermez) | Yalnız saklanır: kayıt bunları tutar ve geri döndürür, ama Pure-FTPd direktifi yazılmaz. |
| `mysql_host`, `mysql_port`, `mysql_user`, `mysql_password`, `mysql_database` | `localhost`, `3306`, `pureftpd`, kurucu ayarlar, `pureftpd` | agent | Pure-FTPd kimlik doğrulama veritabanı (parola `/etc/whost/ftp_db_password` dosyasında da). |

`passive_ports`, `max_clients` ya da `max_per_ip` değerini değiştiren kayıt üç direktifi yazar (Debian/Ubuntu'da `/etc/pure-ftpd/conf/`, RHEL'de `/etc/pure-ftpd/pure-ftpd.conf`) ve Pure-FTPd'yi yeniden başlatır; elle düzenleme Pure-FTPd'yi değiştirmez.

### backup

Yerel yedek deposu ve saklama süresi.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `enabled` | `true` | Yedekler › Ayarlar › Yedekleme Sistemi | `false` iken yedek oluşturma, geri yükleme ve zamanlama reddedilir (`403 BACKUP_DISABLED`) ve zamanlanmış çalıştırmalar atlanır. |
| `local_path` | `/var/whost/backups` | dosya | Yerel arşivlerin tutulduğu yer, hesap başına bir dizin. |
| `retention_days` | `7` (kurucu: `30`) | Yedekler › Ayarlar › Saklama Süresi (1–365) | Günde bir kez, zamanlayıcının 04:00 UTC'de ya da sonrasındaki ilk çalışmasında, bundan eski her hesap yedeği silinir; bu dosyada `0` budamayı kapatır. |
| `schedule.enabled` | `true` | Yedekler › Ayarlar › Zamanlama Sistemi | Yedek zamanlamalarını ve saklama budamasını çalıştıran yerleşik zamanlayıcıyı başlatır. |
| `schedule.max_per_account` | `3` | Yedekler › Ayarlar › Hesap Başına Maks. Zamanlama (1–20) | Bunu aşan zamanlama reddedilir (`403 BACKUP_SCHEDULE_LIMIT`). |
| `schedule.check_interval` | `300` (saniye) | dosya | Zamanlayıcı çalıştırmaları arasındaki süre. |
| `remote` | `enabled: false`, `type: s3` | — | Ayrıştırılır ama kullanılmaz; aşağıya bakın. |

Zamanlayıcı agent ile birlikte yalnız `enabled` ve `schedule.enabled` ikisi de `true` iken başlar ve `schedule.check_interval` o anda okunur: `schedule.enabled` değişikliği — panelden kaydedilse de — bir sonraki agent açılışında etkili olur; açılışta kapalı olan `enabled`'ı yeniden açmak da öyle. Zamanlayıcı çalışmıyorken ne zamanlanmış yedekler ne de saklama budaması çalışır.

Uzak hedefler bu dosyada yapılandırılmaz: panelden yönetilir (Yedekler › Uzak Depolama) ve `/etc/whost/remote_backup.json` dosyasında şifreli saklanır (hesaba ait olanlar `/etc/whost/accounts/<user>/remote_backup.json` altında).

### logging

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `level` | `info` | dosya | `debug`, `info`, `warning`, `error` ya da `critical` (bilinmeyen ad `info` sayılır). Üretim ortamında `info` önerilir; `debug` yalnızca sorun giderme için kullanılmalıdır. |
| `file` | `/var/log/whost/agent.log` | dosya | Varsayılanı koruyun: servis birimi süreç çıktısını bu yola ekler, fail2ban `whost-agent` jail'i bu dosyayı izler ve güncelleme sonrası kontrol buraya yazar. Dosya `640` izninde tutulur. |
| `max_size`, `keep` | `100M`, `10` | dosya | Agent dosyayı `max_size`'a ulaşınca kendisi döndürür (isteğe bağlı `K`, `M` ya da `G` ile bir sayı; başka bir son ek agent'ın açılmasını durdurur) ve `keep` kadar eski kopya tutar. Onu kapsayan bir logrotate kuralı yoktur. |

### license

`license.state_file`, kalıcı lisans durumu dosyasını seçer; varsayılan değer
`/etc/whost/license.state` yoludur. HMAC dosyası bu yola `.hmac` eklenerek bulunur.
Durum yükleme, kaydetme ve bağımsız endpoint, servis, startup ve çalışma zamanı
kontrolleri seçilen dosyayı kullanır. Varsayılan konumdaki eski dosya,
yapılandırılmış konumda bulunmayan dosyanın yerine kullanılmaz.

İki dosyanın sahibi root, izinleri `0600` olmalıdır. Startup izinleri `0600`
olarak düzeltir. Ayarı değiştirdikten sonra agent'ı yeniden başlatın; lisans
doğrulama kotasını tüketen art arda yeniden başlatmalardan kaçının. Kurulumun
boot token'ı `/etc/whost/.boot_token` konumunda kalır; seçilen veya varsayılan
durum dosyasındaki önceki aktivasyon kanıtı, eksik ya da bozuk token'ın sessizce
yeniden üretilmesini engeller.

Lisans grace süresi ve önbellekteki token'ın geçerliliği, lisans sunucusunun
doğrulanmış UTC zamanının geçen kernel açılış süresiyle ilerletilmesiyle
hesaplanır. Sistem saatini geri almak grace süresi eklemez. Durum HMAC'i saat
çapasını da korur; böylece aynı işletim sistemi açılışı içindeki bir agent
yeniden başlatması geçen süreyi korur. İşletim sistemi yeniden başlatıldıktan
sonra ya da bu çapayı taşımayan bir önbellek yükseltilirken, önbellekteki grace
kullanılmadan önce agent çevrimiçi lisans doğrulaması ister. NTP'yi açık tutun:
TLS sertifika doğrulaması ve diğer sistem servisleri hâlâ sistem saatine bağlıdır.

Önbellekteki aktivasyon ve grace durumu, lisans sunucusunun özgün RSA imzalı
yanıtını ve bu yanıtın geçerlilik süresini gerektirir. Yerel HMAC'in geçerli
olması tek başına önbellekten erişim sağlamaz. İmza alanları veya imzalı süre
eksikse, yanıt değiştirilmişse ya da token süresi dolmuşsa önbellek atılır ve
çevrimiçi doğrulama gerekir. Aktivasyon ve periyodik doğrulama, imzalı yanıtı
birlikte kaydeder. Durum dosyasını geri yüklerken token alanlarını değiştirmeyin
veya kaldırmayın.

Bu bloğun diğer anahtarlarını agent yönetir — düzenlemeyin. `key` ve lisans sırları, lisans **Lisans** sayfasında etkinleştirildiğinde yazılır; etkinleştirilen anahtardan farklı, elle düzenlenmiş bir `key` bir sonraki açılışta etkinleştirilen anahtarla değiştirilir.

### rate_limit

İstemci adresi başına API hız sınırlama (agent'ın panelin nginx'i arkasında çözdüğü ziyaretçi adresi), slowapi ile. Sınırını aşan istek `Retry-After` başlığıyla `429 RATE_LIMIT` yanıtı alır. Değerler `{count}/{period}` formatını takip eder (örn. `120/minute`, `5/minute`).

```yaml
rate_limit:
  default: "60/minute"
  read: "120/minute"
  write: "30/minute"
  delete: "20/minute"
  heavy: "5/minute"
  auth: "5/minute"
```

Altı değerin altısı da agent açılışında bu dosyadan okunur ve uygulanır.

| Alan | Açıklama |
|-------|-------------|
| `default` | Kendi sınıfı olmayan az sayıdaki rotaya sınırlayıcı ara katmanı tarafından uygulanır (dağıtım olay akışları, güncelleme durum akışı, SSO endpoint'leri, ön yüz hata ayıklama işareti). `/health`, panelin kök dosyaları (`/config.json`, favicon, logo), `/` ve sayfa geri dönüşü muaftır |
| `read` | GET (okuma) endpoint'leri için sınır; giriş sayfasının kullandığı herkese açık `GET /api/v1/auth/ip-check` izin listesi yoklaması dahil |
| `write` | POST, PUT, PATCH (yazma) endpoint'leri için sınır |
| `delete` | DELETE endpoint'leri için sınır |
| `heavy` | Kaynak yoğun işlemler için sınır: yedekler ve geri yüklemeler, dosya yükleme, sıkıştırma ve açma, Let's Encrypt siparişleri, eklenti kurulumları, lisans aktivasyonu, parola ve ikinci faktör değişiklikleri, parola sıfırlama istekleri |
| `auth` | Kimlik doğrulama endpoint'leri (yönetici ve müşteri girişi, 2FA) için sınır |

### fail2ban

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `enabled` | `true` | — | Okunmaz: panel, `fail2ban-client` yanıt verdiği sürece fail2ban'ı yönetir. |
| `bantime`, `findtime`, `maxretry` | `3600`, `600`, `5` | — | Okunmaz: kurucu `jail.local` dosyasını kendi değerleriyle yazar, Fail2Ban sayfasındaki jail başına değişiklikler `/etc/fail2ban/jail.d/<jail>.local` dosyasına gider. |
| `ignoreip` | `127.0.0.1/8`, `::1` | dosya | Yalnız hiçbir jail yanıt vermediğinde beyaz liste olarak gösterilir; canlı beyaz liste jail'lerin `ignoreip` kümesidir, Fail2Ban sayfasında düzenlenir ve `jail.local` içinde kalıcılaşır. |

### modsecurity

WHost ModSecurity'yi nginx katmanında uygular (`nginx` ve `nginx_apache`); başka bir web sunucuyla ayarlar kaydedilir ama trafiğe uygulanmaz. `/etc/modsecurity/modsecurity.conf` bu bloktan, WAF sayfası bir ayarı ya da kuralı değiştirdiğinde — web sunucu yapılandırma testinden sonra — üretilir; bu yüzden elle düzenleme ona ancak bir sonraki böyle değişiklikte ulaşır.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `enabled`, `default_account_waf` | `true`, `true` | dosya | Kendi WAF durumunu seçmemiş bir hesap, site yapılandırmasında `modsecurity on`'u yalnız ikisi de `true` iken alır (yapılandırma bir sonraki üretilişinde alınır). `enabled: false` ayrıca WAF sayfasının WAF'ı pasif göstermesine yol açar. |
| `engine_mode` | `detection_only` | WAF sayfası | `on` (engelle), `detection_only` (yalnız logla) ya da `off`; `SecRuleEngine` olarak üretilir. Yeni kurulum `detection_only` ile başlar; mevcut kurulum kendi modunu korur. |
| `crs_paranoia_level` | `1` | WAF sayfası | OWASP CRS paranoya seviyesi, 1–4. |
| `audit_log` | `true` | WAF sayfası | `SecAuditEngine RelevantOnly` (5xx ve 404 dışındaki 4xx yanıtları) ya da `Off`. |
| `audit_log_path` | `/var/log/modsecurity/audit.log` | dosya | WAF sayfasının okuduğu seri denetim logu; kurucunun logrotate kuralı (günlük, 30 kopya, `copytruncate`) varsayılan yolu adlandırır. |
| `owasp_crs` | `true` | dosya | OWASP Core Rule Set'i `<rules_path>/crs` altından yükler. |
| `rules_path`, `custom_rules_path` | `/etc/modsecurity`, `/etc/modsecurity/custom` | dosya | Kural setinin temel dizini ve özel kurallar dizini (yalnız içinde bir `.conf` varken dahil edilir). |
| `per_account_overrides` | `true` | dosya | `/etc/modsecurity/accounts/` altındaki hesap başına WAF durumu ve kural istisnaları; `false` iken hesap kapsamındaki WAF yazmaları `409 FEATURE_DISABLED` ile yanıtlanır. |

### security

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `admin_allowed_ips` | boş | Ayarlar › Güvenlik › Admin Panel IP Beyaz Listesi | Satır başına bir IP/CIDR (bir YAML blok metni); boş liste her adrese izin verir. Başka bir adresten gelen `/admin` sayfalarına nginx `404` ile yanıt verir, agent da o adresten yönetici girişini ve yönetici oturumlarını reddeder (`403 IP_NOT_ALLOWED`). Panelden kayıt `/etc/nginx/conf.d/whost-admin-geo.conf` ve `/etc/nginx/snippets/whost-admin-ip-whitelist.conf` dosyalarını (`nginx -t` sonrasında) yeniden yazar; değişen, boş olmayan bir liste her yönetici ve müşteri oturumunu kapatır; kendi adresinizi dışarıda bırakan liste siz onaylamadıkça reddedilir. Elle düzenleme yalnız agent'ın kontrolünü değiştirir. |
| `two_factor_enforcement`, `two_factor_enforcement_method` | `false`, `both` | Ayarlar › Güvenlik › İki Faktörlü Doğrulama Zorunluluğu | Anahtar ve istediği yöntem (`totp`, `email` ya da `both` = ikisinden biri). Açıkken giriş ve oturum endpoint'leri henüz ikinci faktörü olmayan bir kimlik için `requires_2fa_setup: true` (`required_2fa_method` ile) döndürür ve paneller o kimliği kayıt yapana kadar kayıt sayfasında tutar (yönetici Ayarlar › Profil, müşteri Ayarlar › Güvenlik). |
| `ssh_port`, `ssh_root_login`, `ssh_password_auth`, `ssh_key_auth`, `ssh_allowed_ips` | `22`, `true`, `true`, `true`, boş | Ayarlar › Güvenlik › SSH Erişim Kısıtlamaları | Panelden kaydedildiğinde `/etc/ssh/sshd_config.d/00-whost.conf` dosyasına yazılır (`sshd -t` sonrasında; port değişikliği sshd'yi yeniden başlatır ve güvenlik duvarı ile fail2ban'ı günceller, diğer değişiklikler reload eder). Parola ve anahtar kimlik doğrulamasından en az biri açık kalır; başka bir servisin tuttuğu port reddedilir (`PORT_IN_USE`). `ssh_allowed_ips` (satır başına bir IP/CIDR) diğer tüm adreslerden SSH girişini reddeder. `ssh_port` aynı zamanda güvenlik duvarının ve Saldırı Altında Modu'nun koruduğu SSH portudur. Elle düzenleme sshd'yi değiştirmez. |
| `auto_configure_dkim`, `auto_configure_spf`, `auto_configure_dmarc`, `dmarc_policy` | `true`, `true`, `true`, `none` | Ayarlar › Güvenlik › DKIM / SPF / DMARC | Agent'ın bir hesabın posta DNS'ini oluştururken eklediği posta kayıtları: DKIM anahtar kaydı, SPF (`v=spf1 a mx ip4:<server_ip> ~all`) ve DMARC (`v=DMARC1; p=<policy>; rua=mailto:postmaster@<domain>`, politika `none`, `quarantine` ya da `reject`). Mevcut bölgeler yeniden yazılmaz. |
| `trusted_origins` | boş | dosya | `Origin` değeri gönderildiği host'tan farklı olan, çerezle kimliği doğrulanmış yazmaları (POST, PUT, PATCH, DELETE) gönderebilecek ek origin'ler; `host[:port]` biçiminde, boşlukla ayrılır. Panelin, açıldığı ad ne olursa olsun kendi API'sini çağırması her zaman geçer ve HMAC imzalı çağrılar kontrol edilmez; panel oturum çerezi taşıyan diğer tüm çapraz origin yazmaları `403 CROSS_ORIGIN_DENIED` ile reddedilir. |
| `spam_reject_threshold`, `spam_add_header_threshold`, `spam_greylist_threshold` | `15`, `6`, `4` | — | Okunmaz: spam puanları Spam Filtresi sayfasında ayarlanır. |

### admin

Yerleşik yönetici, iki panelin giriş koruması ve oturum süreleri.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `enabled` | `true` | dosya | `false` iken iki panelde de çerezle giriş kapanır: yönetici girişi `404` döndürür, yönetici ve müşteri oturum çerezleri artık kabul edilmez ve yalnız HMAC imzalı API çağrılarına hizmet verilir. |
| `username` | `admin` | dosya | Yönetici bu adla ya da `email` ile giriş yapar. |
| `email` | boş | Ayarlar › Profil | Yöneticinin kurtarma adresi ve ikinci giriş adı; yönetici bildirim e-postaları ve e-posta giriş kodları bu adrese gider. |
| `password` | kurucu ayarlar | Ayarlar › Profil (parola değişikliği) | Bir bcrypt özeti; düz metin değer girişte asla kabul edilmez. Değişiklik diğer tüm yönetici ve müşteri oturumlarını kapatır. |
| `language` | `auto` | Ayarlar › Profil | Yöneticinin panel dili (`auto`, girişte seçilen dili korur). |
| `session_timeout` | `3600` (saniye; kurucu: `3600`) | Ayarlar › Güvenlik › Oturum Zaman Aşımı (5–1440 dakika) | Bir yönetici ya da müşteri oturumunun ömrü; kullanımdaki oturum, ömrünün yarısı geçtikten sonra yenilenir. |
| `remember_me_timeout` | `2592000` (30 gün) | dosya | İki panelde de "beni hatırla" oturumunun ömrü. |
| `session_max_lifetime` | `604800` (7 gün) | dosya | İki panelde de etkinlik ne olursa olsun girişten itibaren sayılan kesin sınır. |
| `allow_concurrent_sessions` | `false` | dosya | Kapalıyken bir giriş aynı kimliğin (yönetici ya da o müşteri hesabı) önceki oturumlarını kapatır, bir çıkış hepsini kapatır. Açıkken önceki oturumlar zaman aşımına kadar çalışır, çıkış yalnız yapıldığı tarayıcıyı kapatır ve `session_max_lifetime` kimliğin son giriş ya da çıkışından sayılır; parola değişikliği yine herkesi çıkarır. |
| `session_secret` | kurucu ayarlar | agent | Yönetici ve müşteri oturum çerezlerini imzalar. Agent bunu yönetici parolası değiştiğinde ve yönetici IP beyaz listesi boş olmayan bir listeye değiştirildiğinde yeniler; her değişiklik herkesin oturumunu kapatır. |
| `two_factor.enabled`, `two_factor.method` | `false`, `totp` | Ayarlar › Profil | Yöneticinin kendi ikinci faktörü (`totp` ya da `email`). |
| `two_factor.email` | boş | Ayarlar › Profil | Yöneticinin e-posta giriş kodlarının gittiği adres; burada başka bir adrese ayarlanmadıkça `email`'i izler. |
| `two_factor.trusted_ip_days` | `0` | dosya | Yöneticinin ikinci faktörünü geçmiş bir adresin onu ne kadar süre atlayacağı: `0` = girişler o adresten geldikçe süresiz, `-1` = kod her zaman sorulur, `N` = N gün. |
| `two_factor.smtp_host`, `two_factor.smtp_port`, `two_factor.smtp_user`, `two_factor.smtp_password`, `two_factor.smtp_tls` | `localhost`, `587`, boş, boş, `true` | dosya | İki panelin giriş kodu e-postalarının ve müşteri parola sıfırlama e-postasının aktarıcısı — Ayarlar › Bildirimler'in aktarıcısı değil. Varsayılanlarla yerel Postfix 25 portunda kullanılır. Bu sürümde bu iletiler `smtp_user` ve `smtp_password` ayarlı olsa bile SMTP kimlik doğrulaması olmadan gönderilir; bu yüzden `smtp_host` bu sunucuyu girişsiz kabul eden bir aktarıcıyı adlandırmalıdır. |
| `recaptcha.enabled`, `recaptcha.provider`, `recaptcha.min_score` | `false`, `recaptcha`, `0.5` | Ayarlar › Güvenlik › CAPTCHA Koruması | İki panelin giriş captcha'sı; sağlayıcı `recaptcha`, `hcaptcha` ya da `turnstile`; `min_score` (0.0–1.0) reCAPTCHA v3 eşiğidir. Açmak için seçili sağlayıcının site anahtarı ve gizli anahtarı gerekir. Herkese açık `GET /api/v1/auth/captcha-config` yalnız açık/kapalı bilgisini, sağlayıcıyı ve site anahtarını yayımlar. |
| `recaptcha.<provider>_site_key`, `recaptcha.<provider>_secret_key` | boş | Ayarlar › Güvenlik › CAPTCHA Koruması | Her sağlayıcının anahtar çifti; sayfa gizli anahtarları maskeli gösterir. |
| `notification_smtp_password` | boş | Ayarlar › Bildirimler | Bildirim aktarıcısının parolası. O SMTP bloğunun geri kalanı (sunucu, port, kullanıcı adı, şifreleme ve gönderen) `/etc/whost/notification_prefs.json` dosyasında durur; burada yalnız parola tutulur. Bildirim e-postaları o bloğu kullanır, sonra `two_factor.smtp_*` anahtarlarına, sonra yerel aktarıcıya düşer. |
| `two_factor.totp_secret`, `backup_codes`, `pending_*`, `totp_last_step`, `avatar_url`, `last_login` | — | agent | Profil sayfası ve giriş akışı tarafından yönetilir (TOTP sırrı, özetlenmiş yedek kodlar, süren bir kayıt, avatar). |

### frontend

nginx'in sunduğu statik panel paketi.

| Anahtar | Varsayılan | Değiştirildiği yer | Ne yapar |
|---|---|---|---|
| `public_url` | boş | dosya | Panele dışarıdan ulaşılan adres (`https://panel.example.com`): panelin e-postayla gönderdiği parola sıfırlama bağlantısının kaynağı. Boşsa bağlantı `https://<server.hostname>` ile, ancak host adı da yoksa çıplak `https://<server_ip>` ile kurulur — ad, panelin sunduğu sertifikayla eşleşir; adres eşleşmez. Bildirim e-postaları bu anahtar ne olursa olsun `https://<server.hostname>` adresine bağlantı verir. |
| `default_language` | `auto` | Ayarlar › Genel › Dil Ayarları | `auto` ya da panelin locale kodlarından biri: dil seçmemiş bir tarayıcının dili. Kaydedildiğinde ve her agent açılışında panelin `config.json` dosyasına yazılır. |
| `debug_log` | `false` | dosya | Tarayıcı debug beacon rotasını açar (`POST /api/v1/debug-log`); dosyası `/var/log/whost/frontend-debug.log` installer'ın `/etc/logrotate.d/whost` kuralıyla günlük döndürülür (yedi kopya saklanır). |
| `enabled`, `path` | `true`, `/opt/whost/frontend/out` | agent | Agent'ın panel dosyaları kopyası; nginx, kurucunun bundan kopyaladığı `/var/www/whost/panel` dizinini sunar. |

### client_features

Varsayılanı hepsi `true` olan ve Ayarlar › Genel'den düzenlenen on bir anahtar (`file_manager`, `dns`, `backups`, `cron`, `ssl`, `php`, `email`, `ftp`, `databases`, `python_apps`, `node_apps`). Kapalı bir anahtar, o yüzeyin her müşteri rotasında API'de uygulanır (`409 FEATURE_DISABLED`, istek yoluna göre — `email` için `/client/emails` ve `/client/spam`, `file_manager` için `/client/files`, `php` için domain başına `/client/domains/{domain}/php/*` rotaları); müşteri profili anahtarları `features` olarak taşır ve müşteri paneli kapalı bir yüzeyin kenar çubuğu girdisini ve dashboard kutucuklarını gizler. Kapalı bir anahtar yedek zamanlayıcısını durdurmaz: `backups` kapalıyken yalnız müşterinin yedek rotaları reddedilir, hesabın mevcut zamanlamaları çalışmaya devam eder.

`python_apps` ve `node_apps` aynı zamanda **Python Hosting** ve **Node.js Hosting** eklentilerinin açık/kapalı durumudur: eklentiyi Eklentiler sayfasında etkinleştirmek ya da devre dışı bırakmak bunları ayarlar (uygulamalar dağıtılmışken devre dışı bırakma reddedilir); biri kapalıyken her Python ya da Node.js uygulama rotası — yöneticininkiler dahil — `503 PLUGIN_DISABLED` döndürür.

### whitelabel

`enabled`, `company_name`, dört logo adresi (`logo_light`, `logo_dark`, `favicon`, `favicon_dark`), her panel için giriş sayfası videosu ve kapağı (`login_video_admin`, `login_poster_admin`, `login_video_client`, `login_poster_client`; boş = varsayılan video), altı HSL rengi (`primary_color`, `secondary_color`, `nav_color` ve `_dark` ikizleri; H 0–360, S ve L 0–100 aralığında `"H S% L%"`) ve `hide_login_branding` (varsayılan `true`). **Whitelabel** sayfasından (sağ üstteki hesap menüsü) düzenlenir; her değişiklik bir `settings_updated` denetim satırı yazar ve panel ağaçlarındaki `config.json` dosyasını yeniden yazar. `whitelabel` lisans eklentisi etkin değilken sayfanın kayıtları, logo ve giriş videosu yüklemeleri ve kaldırmaları ve sıfırlaması `403 LICENSE_ADDON_REQUIRED` ile reddedilir; bu blokta zaten bulunan değerler kalır ve herkese açık marka okuması eklenti etkinleşene kadar `active: false` döndürür. Eklentiyi veren ya da geri alan bir lisans denetimi `config.json`'u hemen yeniden yazar, panel yeniden başlatma olmadan izler. Elle düzenleme, eklenti etkinken bir sonraki agent açılışında yayımlanır.

Bir logo alanı, agent'ın `/var/lib/whost/branding/` altında sakladığı bir dosyanın adresini tutar — `/branding/<alan>.<özet>.<png|jpg|webp|svg>`; dosyayı panelin nginx'i (`/etc/nginx/snippets/whost-panel-locations.conf` içinde `location ^~ /branding/`) bir yıllık değişmez önbellek ve korumalı alan (sandbox) içerik politikasıyla sunar; ad içerikle birlikte değişir, değiştirilen ya da kaldırılan logonun dosyası silinir. Yalnız böyle bir adres (ya da aşağıdaki satır içi `data:image/` URL'i) yayımlanır; elle yazılmış başka bir değer yayımlanmaz. Yüklemeler (dosya başına 2 MB) saklanmadan önce biçimlendirilir: raster logo 512 × 160 px (genişlik × yükseklik) kutusuna, favicon şeffaf dolgulu en fazla 256 px'lik kare bir PNG'ye; 25 megapikselden büyük görsel (`400 IMAGE_DIMENSIONS_TOO_LARGE`) ve türü olarak çözülemeyen dosya (`400 INVALID_IMAGE`) reddedilir; SVG temizlenip korunur. Giriş videosu alanı `/branding/login_video_<admin|client>.<özet>.mp4` adresini tutar — video izi H.264 olan, en fazla 5 MB'lık bir MP4, yüklendiği gibi saklanır (panel daha büyük bir videoyu yüklemeden önce tarayıcıda küçültür) — kapağı ise `/branding/login_poster_<admin|client>.<özet>.<jpg|png|webp>`, 1920 × 1080 kutusuna (dik görselde 1080 × 1920) sığdırılır; her alan yalnız kendisi için yazılmış bir dosyayı yayımlar. Önceki bir sürümün satır içi `data:` URL'i olarak sakladığı logolar, panel nginx'inin `/branding/` sunduğunu gören ilk agent açılışında dosyalara taşınır: özgün değerler önce `/var/lib/whost/branding-legacy-<zaman>.yaml` dosyasına (mod 0600) kopyalanır, logolar yüklemeler gibi biçimlendirilir ve blok bir kez kaydedilir; çözülemeyen bir değer olduğu gibi kalır. `/var/lib/whost/branding/` klasörünü sunucu yedeklerine dahil edin.

### güncelleme tercihleri (`agent.conf` bloğu değildir)

`agent.conf`'ta `update:` bloğu yoktur; eski bir kurulumdan kalan `update:` bloğu hiçbir kod tarafından okunmaz ve agent dosyayı bir sonraki yazışında düşer. Güncelleme tercihleri `/etc/whost/update_settings.json` (root, `0600`) dosyasında durur: `channel` (`stable` | `beta`), `auto_update`, `auto_update_type` (`all` | `security` | `patch` | `minor`), `backup_before_update`, `notify_available`, `notify_installed`, `os_packages_check_enabled`, `os_packages_notify_security`, `allow_vendor_critical_override`. `auto_update_type` neyin kendiliğinden kurulacağını belirler: `security` yalnız satıcının kritik işaretlediği sürümleri (ve yalnız `allow_vendor_critical_override` açıkken), `patch` bir patch adımını, `minor` bir minor ya da patch adımını, `all` her sürümü; satıcının kritik işaretlediği bir sürüm, `allow_vendor_critical_override` açıkken diğer tiplerde de kurulur. Kurucu dosyayı yeni bir sunucuda bir kez, kurduğu sürümün kanalıyla yazar (`-beta.N` bir sürümde `beta`, aksi hâlde `stable`) ve var olan dosyaya dokunmaz; sonrasında dosyayı Güncellemeler sayfası yazar (Ayarlar sekmesi, `PUT /system/update/settings`), kurulum hattı ve zamanlayıcı okur; dosya yoksa varsayılanlar geçerlidir (satıcının kritik işaretlediği sürümlerin otomatik kurulumu açık), ayrıştırılamayan bir dosya loglanır ve onarılana kadar `auto_update: false` sayılır. Kontrol kadansı sabittir: her agent açılışından beş dakika sonra, ardından 24 saatte bir (en çok 30 dakika jitter).

---

## Ortam Değişkenleri

Agent ayarlarını yalnızca bu YAML dosyasından okur; bu dosyanın hiçbir anahtarı ortam değişkeniyle verilemez. Servis birimi (`/etc/systemd/system/whost-agent.service`) agent'ın çalıştığı ortamı — aralarında bu dosyanın yolu olan `WHOST_CONFIG_PATH=/etc/whost/agent.conf` — sertleştirme anahtarlarıyla birlikte ayarlar. Birimi kurulduğu gibi bırakın: kurucu ve agent'ın açılıştaki izin kontrolü `/etc/whost/agent.conf` üzerinde çalışır.

---

## Değişiklikleri Uygulama

Panelden kaydedilen ayarlar hemen etkili olur: agent bu dosyayı kendisi yazar ve değişikliği, tabloların anlattığı gibi ilgili servise uygular. Panelin sunmadığı bir anahtarı (tablolarda **dosya**) değiştirmek için:

1. Bir kopya alın, örneğin `cp -p /etc/whost/agent.conf /root/agent.conf.bak` — kopya aynı sırları taşır, `600` izninde tutun.
2. Dosyayı düzenleyin, ardından panelde bir şey kaydetmeden önce agent'ı yeniden başlatın; yeniden başlatmaya kadar panelden yapılan bir sonraki kayıt, agent'ın bellekteki ayarlarını düzenlemenin üzerine yazar.
3. Agent'ın geri geldiğini kontrol edin: açılış bittiğinde (birkaç saniye) `curl -sk https://127.0.0.1:2000/health` `{"status":"ok",...}` yanıtı verir. Vermiyorsa `/var/log/whost/agent.log` dosyasının sonunu okuyun.

```bash
systemctl restart whost-agent
curl -sk https://127.0.0.1:2000/health
```

Elle düzenleme agent'ın okuduğunu değiştirir; panel kaydının yazdığı servis yapılandırmalarını (web sunucu ayarları, MariaDB, Pure-FTPd, Postfix ileti boyutu, sshd, nginx yönetici beyaz listesi, DNS bölgeleri, panel vhost'u) yeniden yazmaz. Bu anahtarları panelden değiştirin. Her agent açılışı lisansı lisans sunucusuyla doğrular; art arda yeniden başlatmalardan kaçının.

---

**Geliştirici: [WISECP LLC.](https://wisecp.com)**
**İletişim:** hello@wisecp.com
