v0.1.1 Hazır Docker imajları

Ç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.

  • Apache 2.0 lisansı
  • amd64 ve arm64 için hazır imaj
  • Gömülü SQLite veritabanı
  • 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
Yazım

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.

Çok dillilik

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-BR veya zh-Hans gibi herhangi bir BCP 47 koduyla ekleyin.
  • Almanca sürüm hâlâ incelemedeyken İngilizce sürümü yayınlayın.
  • Okuma sayfaları çevirileri hreflang ile birbirine bağlar ve varsayılan diliniz için bir x-default kaydı 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.
Çeviriler 4 dil
en English/blog/en/designing-for-readers Yayında
tr Türkçe/blog/tr/okurlar-icin-tasarlamak Yayında
de Deutsch/blog/de/fuer-leser-gestalten İnceleme bekliyor
pt-BR Português (Brasil)/blog/pt-BR/design-para-leitores Taslak
/blog/tr/okurlar-icin-tasarlamak sayfasının <head> bölümü
<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">
Yalnızca yayındaki çeviriler bağlanır. Taslaklar ve inceleme bekleyen değişiklikler gizli kalır.
Editoryal iş akışı

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.

  1. Taslak

    Yazın

    Yazarlar editörde çalışırken çalışma taslağı kendiliğinden kaydedilir.

  2. İnceleme bekliyor

    Gönderin

    Doğrudan yayınlama izni olmayan yazarlar değişikliklerini inceleme kuyruğuna gönderir.

  3. Onaylandı

    İnceleyin

    Bir yönetici ya da kurucu onaylar veya yazarın göreceği bir notla reddeder.

  4. 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.

İçerik sunumu

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ı

    /blog altı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.

REST API isteği
curl -H "Authorization: Bearer $SERVITOR_API_KEY" \
  "https://cms.example.com/api/v1/posts?lang=tr&per_page=10"
Yanıt
{
  "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 }
}
Webhook teslimatı
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"
  }
}
Güvenlik

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.

Kendi sunucunuzda

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.

  1. Compose dosyasını alın

    Depoyu klonlayın ve yapılandırmanızı örnek dosyadan oluşturun.

    Terminal
    git clone https://github.com/justhasanuknow/servitor-cms.git
    cd servitor-cms
    cp .env.example .env
  2. Gizli anahtarı ve kurucuyu ayarlayın

    ORIGIN değerini genel adresinize ayarlayın, gizli anahtarı openssl rand -hex 32 ile üretin ve kurucu hesabını doldurun. Yerelde hızlıca denemek için ORIGIN=http://localhost:3000 kullanın, ADDRESS_HEADER ve XFF_DEPTH değerlerini boş bırakın.

    .env
    SERVITOR_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>
  3. Konteyneri başlatın

    Compose, SERVITOR_VERSION ile seçilen sürümün imajını indirir ve Servitor'u başlatır; 0.1 en yeni 0.1.x sürümünü izler. /panel/login adresini açın, kurucu olarak giriş yapın ve panel istediğinde yeni bir parola belirleyin.

    Terminal
    docker compose up -d
  • Otomatik şema güncellemeleri

    Veritabanı şeması, sunucu istek kabul etmeden önce açılışta güncellenir.

  • Sağlık kontrolü

    /healthz uç 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.

Açık kaynak

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
SSS

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.