Çok dilli bloglar için kendi sunucunuzda çalışan CMS
Gönderilerinizi yapılandırılmış bir editörde yazın, doğrudan ya da incelemeden geçirerek yayınlayın ve her çeviriyi yerleşik okuma sayfaları, REST API veya webhook'larla sunun. Açık kaynak, tek konteyner, başka servis yok.
- Her BCP 47 kodu içerik dilleriniz için
- 6 panel dili İngilizce, Türkçe, Fransızca, Almanca, Japonca ve Basitleştirilmiş Çince
- OWASP ASVS 5.0 seviye 1 ve 2'ye göre incelendi
- Tek konteyner gömülü SQLite veritabanıyla
Güvenlik ağı olan, odaklı bir editör
Ham HTML yerine yapılandırılmış içerik: siz yazarken kaydedilir ve her zaman geri dönebileceğiniz bir geçmişte saklanır.
-
Blok editörü
Başlıklar, iç içe listeler ve görev listeleri, alıntılar, tablolar, renklendirilmiş kod, matematik, medya kütüphanesinden görseller ve YouTube ya da Vimeo videoları.
-
Otomatik kaydetme ve revizyonlar
Çalışma taslağı, yazmayı bıraktıktan birkaç saniye sonra kendiliğinden kaydedilir. Her kayıt, geri yükleyebileceğiniz revizyon geçmişine eklenir.
-
Gizli önizlemeler
Yayınlanmamış sürümleri ve inceleme bekleyen gönderimleri, herkese açmadan okurların göreceği şekilde görüntüleyin.
-
Medya kütüphanesi
Yüklenen görseller birkaç boyutta WebP'ye dönüştürülür, meta verileri silinir ve her görsel her dil için ayrı bir alternatif metin taşır.
-
Kategoriler ve etiketler
Kategorilerin her dilde kendi adı ve kısaltması vardır; etiketler her çeviri için ayrı girilir.
-
Arama ve paylaşım alanları
Her çevirinin kendi meta başlığı, meta açıklaması ve paylaşım görseli vardır; okuma süresi kayıt sırasında hesaplanır.
Her çeviri tam teşekküllü bir sayfadır
Bir gönderi, her içerik dili için bir çeviri barındırır. Her çevirinin kendi adresi, alanları ve yayın durumu vardır; böylece her dil kendi hızında ilerleyebilir.
- İçerik dillerini panelden
de,pt-BRveyazh-Hansgibi herhangi bir BCP 47 koduyla ekleyin. - Almanca sürüm hâlâ incelemedeyken İngilizce sürümü yayınlayın.
- Okuma sayfaları çevirileri
hreflangile birbirine bağlar ve varsayılan diliniz için birx-defaultkaydı ekler. - Bir çeviri eksik olduğunda API istemcileri varsayılan dile geri dönebilir.
- Panel, içerik dilleriniz ne olursa olsun İngilizce, Türkçe, Fransızca, Almanca, Japonca ve Basitleştirilmiş Çince konuşur.
<link rel="canonical" href="https://cms.example.com/blog/tr/okurlar-icin-tasarlamak">
<link rel="alternate" hreflang="en" href="https://cms.example.com/blog/en/designing-for-readers">
<link rel="alternate" hreflang="tr" href="https://cms.example.com/blog/tr/okurlar-icin-tasarlamak">
<link rel="alternate" hreflang="x-default" href="https://cms.example.com/blog/en/designing-for-readers">
Doğrudan yayınlayın ya da incelemeden geçirin
Kimin yayınlayabileceğini roller belirler. Diğer herkes çalışmasını incelemeye gönderir; bir değişiklik onaylanana kadar okurların gördüğü içerik değişmez.
-
Taslak
Yazın
Yazarlar editörde çalışırken çalışma taslağı kendiliğinden kaydedilir.
-
İnceleme bekliyor
Gönderin
Doğrudan yayınlama izni olmayan yazarlar değişikliklerini inceleme kuyruğuna gönderir.
-
Onaylandı
İnceleyin
Bir yönetici ya da kurucu onaylar veya yazarın göreceği bir notla reddeder.
-
Yayında
Yayınlayın
Çeviri hemen ya da zamanlanan saatte yayına girer ve webhook'lar tetiklenir.
Kurucu, yöneticiler ve doğrudan yayınlama izni olan yazarlar kuyruğu atlar; hemen yayınlar ya da zamanlar.
-
Kurucu
Her kurulumda tam olarak bir tane bulunur. Yöneticinin yapabildiği her şeyin yanı sıra sistem ayarlarını, yöneticileri ve rol değişikliklerini yönetir.
-
Yönetici
Yazarları yönetir, gönderimlerini inceler, gönderileri modere eder; dilleri, kategorileri, API anahtarlarını, webhook'ları ve CORS'u düzenler.
-
Yazar
Kendi gönderilerini yazar ve kendi görsellerini yönetir. Doğrudan yayınlama izni yoksa yayın için onay gerekir.
Kurucu dahil hiç kimse başkasının gönderisini düzenleyemez. Yetkililer bir gönderiyi, sahibinin göreceği bir gerekçeyle gizleyebilir; yalnızca ekleme yapılabilen denetim günlüğü de oturum açmaları, hesap değişikliklerini, yayınları, moderasyonu ve yapılandırmayı kaydeder.
Yerleşik blogu kullanın ya da headless çalışın
Okurlar gönderilere doğrudan Servitor üzerinden ulaşabilir, kendi arayüzünüz onları API ile çekebilir ya da ikisi birden. Headless çalışmak için okuma sayfalarını kapatmanız yeterli.
-
Okuma sayfaları
/blogaltında JavaScript içermeyen, sunucuda oluşturulan sayfalar: canonical ve hreflang bağlantıları, Open Graph, JSON-LD, RSS akışları ve site haritaları. -
REST API
Dillere ve kategorilere göre sınırlandırılabilen API anahtarları, tam metin arama, anahtar başına istek sınırı, ETag ve OpenAPI 3.1 açıklamasıyla salt okunur JSON.
-
Webhook'lar
HMAC-SHA256 ile imzalanır ve yeniden denemeli kalıcı bir kuyruktan gönderilir; böylece statik bir site, yayındaki içerik her değiştiğinde yeniden derlenebilir.
curl -H "Authorization: Bearer $SERVITOR_API_KEY" \
"https://cms.example.com/api/v1/posts?lang=tr&per_page=10"
{
"data": [
{
"id": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
"published_at": "2026-09-24T09:00:00.000Z",
"translations": [
{
"language": "tr",
"slug": "okurlar-icin-tasarlamak",
"title": "Okurlar için tasarlamak",
"reading_time_minutes": 4,
"content_html": "<p>…</p>"
}
]
}
],
"meta": { "page": 1, "per_page": 10, "total": 42, "total_pages": 5 }
}
POST /hooks/servitor HTTP/1.1
Host: build.example.com
Content-Type: application/json
User-Agent: Servitor-Webhooks/1.0
X-Servitor-Event: post.published
X-Servitor-Delivery: 0f6c9a55-7a4e-4f21-9f8d-2d0f6f3b9b1a
X-Servitor-Signature: t=1790251200,v1=5d2a9c…
{
"event": "post.published",
"delivery_id": "0f6c9a55-7a4e-4f21-9f8d-2d0f6f3b9b1a",
"timestamp": "2026-09-24T12:00:00.000Z",
"post_id": "8b1d1c52-5d0e-4e0f-9c1b-3f7a2b6e4d10",
"languages": ["en", "tr"],
"slugs": {
"en": "designing-for-readers",
"tr": "okurlar-icin-tasarlamak"
}
}
Varsayılan olarak güvenli, şeffaf biçimde incelenmiş
Servitor, OWASP ASVS 5.0'ın seviye 1 ve 2 gereksinimlerinin tamamına göre denetlendi; aşağıdaki korumalar ilk açılıştan itibaren etkindir.
-
Herkese açık kayıt yok
Hesaplar yalnızca ilk açılışta oluşturulan kurucu hesabından ve davetlerden gelir; giriş yanıtları bir hesabın var olup olmadığını asla ele vermez.
-
İki adımlı doğrulama
Tek kullanımlık yedek kodlarla TOTP ve bunu kurucu ile yöneticiler için zorunlu kılan bir ayar.
-
Özenli parola işleme
12 ile 128 karakter arası parolalar, yaygın parola listelerine karşı denetlenir ve scrypt ile hash'lenir.
-
Tek yetki modülü
Her sayfa, eylem ve uç nokta sunucuda denetlenir; bir test, yetki matrisinin her hücresini kapsar.
-
Temizlenmiş içerik
Editör JSON'u bir izin listesine göre doğrulanır ve kaydedilmeden önce sunucuda temizlenmiş HTML'e dönüştürülür.
-
Sıkı tarayıcı politikaları
Her yanıtta nonce tabanlı bir Content Security Policy; okuma sayfaları ise hiç betik içermez.
-
Sınırlı ve hash'lenmiş API anahtarları
Yalnızca SHA-256 hash'i olarak saklanır, dillere ve kategorilere göre sınırlandırılır ve sorgu dizesinde gönderildiğinde reddedilir.
-
SSRF'ye karşı korumalı webhook'lar
Hedefler her teslimattan önce çözümlenip denetlenir; böylece webhook'lar iç ağınıza erişemez.
-
Sağlamlaştırılmış konteyner
Ayrıcalıksız kullanıcı, salt okunur kök dosya sistemi ve sıfır Linux yetkisi. Her imaj bir yazılım malzeme listesi (SBOM) ve imzalı bir derleme kanıtı taşır.
Docker Compose ile ayağa kaldırın
Tek ihtiyacınız Docker ve Docker Compose yüklü bir sunucu. Her sürüm, GitHub Container Registry'de amd64 ve arm64 için imzalı ve hazır bir imaj olarak yayınlanır.
-
Compose dosyasını alın
Depoyu klonlayın ve yapılandırmanızı örnek dosyadan oluşturun.
Terminalgit clone https://github.com/justhasanuknow/servitor-cms.git cd servitor-cms cp .env.example .env -
Gizli anahtarı ve kurucuyu ayarlayın
ORIGINdeğerini genel adresinize ayarlayın, gizli anahtarıopenssl rand -hex 32ile üretin ve kurucu hesabını doldurun. Yerelde hızlıca denemek içinORIGIN=http://localhost:3000kullanın,ADDRESS_HEADERveXFF_DEPTHdeğerlerini boş bırakın..envSERVITOR_VERSION=0.1 ORIGIN=https://cms.example.com BETTER_AUTH_SECRET=<openssl rand -hex 32 çıktısı> FOUNDER_EMAIL=siz@example.com FOUNDER_NAME=Adınız Soyadınız FOUNDER_PASSWORD=<12 ile 128 karakter> -
Konteyneri başlatın
Compose,
SERVITOR_VERSIONile seçilen sürümün imajını indirir ve Servitor'u başlatır;0.1en yeni 0.1.x sürümünü izler./panel/loginadresini açın, kurucu olarak giriş yapın ve panel istediğinde yeni bir parola belirleyin.Terminaldocker compose up -d
-
Otomatik şema güncellemeleri
Veritabanı şeması, sunucu istek kabul etmeden önce açılışta güncellenir.
-
Sağlık kontrolü
/healthzuç noktası, veritabanına erişilip erişilemediğini Docker'a ve izleme sisteminize bildirir. -
Yedekleme ve geri yükleme
Tek bir komut veritabanının ve yüklemelerin tutarlı bir anlık görüntüsünü alır; geri yükleme, bir şeyi değiştirmeden önce arşivi denetler.
-
Reverse proxy arkasında
Caddy, Nginx ve Coolify için belgelenmiş kurulumlar; TLS ve istek sınırlaması için gerçek istemci adresleri dahil.
Servitor tek bir örnek olarak çalışır: istek sınırları, yayın zamanlayıcısı ve webhook işçisi uygulama sürecinin içindedir. Bu yüzden aynı veri üzerinde asla birden fazla konteyner başlatmayın.
Apache 2.0 lisanslı, kanıtlanmış araçlarla geliştirildi
Kodu okuyun, kendi altyapınızda çalıştırın ve ihtiyaçlarınıza göre uyarlayın. Hata bildirimlerine, düzeltmelere ve panel çevirilerine kapımız açık.
- SvelteKit
- Svelte 5
- TypeScript
- Tailwind CSS
- shadcn-svelte
- Tiptap
- Better Auth
- Drizzle ORM
- SQLite
- Paraglide
- sharp
- Vitest
- Playwright
- Node.js 24
Sıkça sorulan sorular
Servitor CMS ücretsiz mi?
Evet. Servitor CMS, Apache Lisansı 2.0 ile açık kaynaktır. Türev çalışmalar lisansı ve NOTICE dosyasını koruduğu sürece ticari olarak kullanabilir, değiştirebilir ve kendi sunucularınızda çalıştırabilirsiniz.
Çalıştırmak için neye ihtiyacım var?
Docker ve Docker Compose yüklü bir sunucuya. Servitor, gömülü SQLite veritabanıyla tek bir konteyner olarak çalışır ve başka hiçbir servise ihtiyaç duymaz. Canlı ortamda TLS için Caddy, Nginx veya Coolify gibi bir reverse proxy arkasına koyun.
Servitor'u headless CMS olarak kullanabilir miyim?
Evet. Ayarlardan herkese açık okuma sitesini kapatın; salt okunur REST API'yi ve webhook'ları statik site üreticisi ya da mobil uygulama gibi herhangi bir arayüzle kullanın.
Hangi dillerde yazabilirim?
en, de, pt-BR veya zh-Hans gibi bir BCP 47 koduyla tanımlanabilen her dilde. Her gönderinin her içerik dili için bir çevirisi olabilir. Panelin kendisi İngilizce, Türkçe, Fransızca, Almanca, Japonca ve Basitleştirilmiş Çince olarak kullanılabilir.
Yük dengeleyici arkasında birden fazla örnek çalıştırabilir miyim?
Hayır. İstek sınırları, yayın zamanlayıcısı ve webhook işçisi uygulama sürecinin içinde çalışır; bu yüzden her veri dizini için tam olarak bir konteyner çalışır.
Yedekleme nasıl çalışır?
Konteyner içinde çalışan bir komut, tutarlı bir veritabanı anlık görüntüsünü ve tüm yüklemeleri içeren zaman damgalı bir arşiv yazar. Geri yükleme, herhangi bir şeyi değiştirmeden önce arşivi denetler ve önceki verileri kenara ayırır.
Servitor'u nasıl güncellerim?
Yedek alın, docker-compose.yml ve .env.example dosyalarının yeni sürümle eşleşmesi için yeni sürümün etiketine geçin, SERVITOR_VERSION değerini ayarlayın ve docker compose pull ile docker compose up -d komutlarını çalıştırın. Şema güncellemeleri açılışta otomatik çalışır; 0.1 gibi bir ara sürüm hattında yalnızca docker compose pull en yeni yama sürümünü getirir.
Docker imajını doğrulayabilir miyim?
Evet. Yayınlanan her imaj, derlendiği iş akışını ve commit'i gösteren imzalı bir kanıt (attestation) taşır. GitHub CLI bunu gh attestation verify oci://ghcr.io/justhasanuknow/servitor-cms:0.1 --owner justhasanuknow komutuyla denetler.
Servitor canlı kullanıma hazır mı?
Güncel sürüm 0.1.1'dir. Servitor anlamsal sürümlemeyi izler: 1.0.0'dan önce bir ara sürüm yapılandırmayı, API'yi veya verileri uyumsuz biçimde değiştirebilir ve sürüm notları bunu açıkça belirtir.
Dokümantasyon nerede?
Dokümantasyon, deponun docs klasöründe İngilizce olarak bulunur ve her kurulum onu /docs adresinde sunar. Panel, Yardım menüsündeki Dokümantasyon bağlantısıyla ona yönlendirir.
Okurlarınızın konuştuğu dillerde yayınlamaya başlayın
Servitor CMS'i Docker Compose ile kurun, ekibinizi davet edin ve ilk çevirinizi yayınlayın.