
Strapi 5 Rehberi: Kurulum, API, Eklentiler ve Deployment (2026)
Strapi, API'niz, veritabanınız ve deployment süreciniz üzerinde tam kontrol sağlayan Node.js tabanlı açık kaynaklı bir headless CMS'tir. İçerik şemalarınızı REST ve GraphQL endpoint'lerine dönüştürür; tüm backend katmanını düz JavaScript veya TypeScript ile özelleştirebilirsiniz.
Bu rehber Strapi 5'e odaklanıyor — ilk npx create-strapi komutundan Railway veya Strapi Cloud üzerindeki production deployment'a kadar. Her kod örneği Strapi 5.x'e göre test edilmiş ve yapıştırmaya hazır.
| Alan | Değer |
|---|---|
| Tür | Açık kaynaklı headless CMS |
| Dil | JavaScript / TypeScript (Node.js) |
| Güncel Sürüm | Strapi 5 |
| Lisans | MIT (Community) / Ticari (Enterprise) |
| Veritabanı Desteği | PostgreSQL, MySQL, MariaDB, SQLite |
| API Türleri | REST + GraphQL (ikisi de yerleşik) |
| Barındırma | Kendi sunucunuzda veya Strapi Cloud |
| Cloud Fiyatlandırması | Ücretsiz katman, ardından aylık $18'dan başlıyor |
| GitHub Yıldızı | 65.000+ |
| İdeal Kullanım | Tam kod sahipliği + API özelleştirmesi isteyen ekipler |
Strapi Nedir ve Nasıl Çalışır?
Strapi, içerik backend'inizi frontend'inizden ayıran, self-hosted ve API-first bir içerik yönetim sistemidir. Görsel bir oluşturucu ya da kod aracılığıyla içerik şemaları tanımlarsınız; Strapi, herhangi bir frontend çerçevesinin tüketebileceği CRUD API endpoint'lerini — hem REST hem de GraphQL — otomatik olarak oluşturur. Yönetici paneli, içerik editörlerinin kod yazmadan girişleri oluşturup yönetmesini sağlayan React tabanlı bir arayüzdür. Daha fazla ayrıntı için resmi Strapi belgelerine göz atabilirsiniz.
Headless CMS ile Geleneksel CMS Arasındaki Fark
WordPress gibi geleneksel bir CMS, içeriğinizi sunum katmanıyla birleştirir. Blog yazılarınız, sayfalarınız ve medya dosyalarınız ziyaretçilere HTML oluşturan aynı sistemde yaşar. Bu, aynı içeriği aynı anda bir mobil uygulamada, bir pazarlama mikrositesinde ve bir belgeler portalında sunmanız gerekmediği sürece işe yarar.
Headless CMS ise frontend katmanını tamamen ayırır. Strapi içeriğinizi depolar ve API endpoint'leri aracılığıyla JSON olarak sunar. Next.js siteniz, React Native uygulamanız ve IoT paneliniz hepsi aynı Strapi backend'inden veri çeker. Tek bir gerçek kaynağı, birden fazla tüketici.
Strapi'nin ötesindeki seçenekleri değerlendiriyorsanız, headless CMS karşılaştırmamız en iyi platformları yan yana ele alıyor.
Strapi'nin Mimarisi
Strapi'nin yığını basit: veritabanınız (PostgreSQL, MySQL veya SQLite) ile frontend uygulamalarınız arasında bir Node.js sunucusu yer alır. Yönetici paneli — bir React single-page app — frontendlerinizin kullandığı aynı API'ye bağlanır; yalnızca daha geniş izinlerle.
İşleyiş şu şekilde: veritabanı içeriği depolar, Strapi'nin ORM katmanı (Knex.js tabanlı) sorgular, API katmanı REST ve GraphQL endpoint'lerini dışa açar; Next.js, Nuxt, Astro, Gatsby ya da bir mobil uygulama olsun frontendleriniz bu endpoint'lerden JSON çeker. Strapi, son kullanıcılara hiçbir zaman HTML oluşturmaz.
Strapi GitHub deposu 65.000'den fazla yıldıza sahiptir; platform üzerindeki en popüler açık kaynaklı CMS projelerinden biridir.
Strapi 5'te Neler Yeni?
Strapi 5, Entity Service API'yi yeni bir Document Service API ile değiştiren, admin panel build'ları için Webpack yerine Vite kullanan ve TypeScript'i yeni projeler için varsayılan dil olarak benimseyen büyük bir yeniden yazımdır. Bu değişiklikler küçük güncellemeler değil — Strapi 5 genel bakış sayfasında ayrıntılı olarak anlatıldığı gibi iç mimari önemli ölçüde değişti.
Strapi 5 geliştirici değişiklik günlüğüne göre geliştiricileri en çok ilgilendiren değişiklikler şunlar:
- Document Service API Entity Service API'nin yerini alıyor — daha temiz metot imzaları, daha iyi TypeScript türleri, CRUD işlemleri için birleşik arayüz
- Draft & Publish yeniden tasarımı — yönetici panelinde taslak ve yayımlanan içerik durumlarını ayıran iki sekme sistemi
- Content History — herhangi bir girişin önceki sürümlerini doğrudan yönetici panelinden görüntüleyin ve geri yükleyin
- Preview özelliği — içeriği yayımlamadan önce gerçek frontend'inizde önizleyin, her content type için ayrı ayrı yapılandırılır
- Vite, Webpack'in yerini alıyor — admin panel build'ları belirgin şekilde hızlandı (build sürelerinde yaklaşık %60 iyileşme gözlemledik)
- TypeScript-first yaklaşımı — yeni projeler varsayılan olarak TypeScript ile oluşturuluyor
- AI Content-Type Builder — düz metin açıklamalarından veya Figma tasarımlarından içerik şemaları oluşturma. 2026'da tanıtıldı ve başka hiçbir headless CMS henüz bu özelliği sunmuyor
- Basitleştirilmiş API yanıtları — hem REST hem de GraphQL için daha düz JSON yapısı
- Yeni Plugin SDK — Strapi eklentileri oluşturmak ve dağıtmak için optimize edilmiş API
| Özellik | Strapi 4 | Strapi 5 |
|---|---|---|
| Servis API'si | Entity Service | Document Service |
| Bundler | Webpack | Vite |
| Varsayılan Dil | JavaScript | TypeScript |
| Taslak Sistemi | Tek geçiş | İki sekme (taslak/yayımlanan) |
| Content History | Eklenti gerektirir | Yerleşik |
| Frontend Preview | Mevcut değil | Yerel preview API |
| API Yanıt Formatı | Derin iç içe | Düz yapı |
| Şema Oluşturma | Yalnızca manuel | AI + manuel |
Strapi 5 Nasıl Kurulur ve Yapılandırılır?
Bir Strapi 5 projesi kurmak yaklaşık iki dakika alır. Node.js 18 veya üzeri ile npm, yarn veya pnpm gereklidir. Strapi, Strapi Hızlı Başlangıç kılavuzunda belgelendiği gibi tek bir komutla tam bir proje iskelet yapısı oluşturur — yönetici paneli, veritabanı bağlantısı ve API katmanıyla birlikte.
Ön Koşullar
- Node.js 18+ (20 LTS önerilir)
- npm 6+, yarn veya pnpm
- Bir veritabanı: SQLite geliştirme ortamında kutudan çıkar çıkmaz çalışır; production için PostgreSQL
İlk Projenizi Oluşturma
npx create-strapi@latest my-project
# İnteraktif sorular:
# ? Tercih ettiğiniz dili seçin: TypeScript
# ? Varsayılan veritabanı istemcisini seçin: sqlite
# ? Örnek bir yapıyla başlamak ister misiniz?: Evet (ilk kullananlar için önerilir)
cd my-project
npm run developStrapi http://localhost:1337 adresinde başlar. İlk ziyaretinizde bir yönetici hesabı oluşturmanız istenir. Ardından yönetici paneline girip content type oluşturmaya hazır olursunuz.
Proje Yapısına Genel Bakış
my-project/
├── config/
│ ├── database.ts # Veritabanı bağlantısı
│ ├── server.ts # Host, port, uygulama anahtarları
│ ├── admin.ts # Yönetici paneli yapılandırması
│ └── plugins.ts # Eklenti yapılandırması
├── src/
│ ├── api/ # Content type'larınız burada
│ │ └── article/
│ │ ├── content-types/
│ │ │ └── article/schema.json
│ │ ├── controllers/article.ts
│ │ ├── routes/article.ts
│ │ └── services/article.ts
│ ├── plugins/ # Özel eklentiler
│ └── index.ts # Uygulama bootstrap/yaşam döngüsü
├── public/ # Statik dosyalar
├── .env # Ortam değişkenleri
└── package.jsonHer content type, bir şema, controller, rota ve servis dosyasıyla birlikte src/api/ altında kendi klasörünü alır. Strapi bunları yönetici paneli üzerinden bir content type oluşturduğunuzda otomatik olarak üretir; ancak elle de oluşturabilirsiniz.
Content Type Oluşturma ve İçerik Yönetimi
Content Type'lar Strapi'nin kalbidir — veri şemanızı tanımlar ve otomatik olarak API endpoint'leri, yönetici paneli formları ve veritabanı tabloları oluşturur. Strapi iki ana türü destekler: Collection Type'lar (blog yazıları veya ürünler gibi birden fazla girdiniz olan yapılar) ve Single Type'lar (ana sayfa veya site ayarları gibi yalnızca bir girdinizin olduğu yapılar).
Content-Type Builder Adım Adım
Strapi yönetici panelindeki Content-Type Builder, şemaları görsel olarak tanımlamanızı sağlar. Text, Rich Text, Media, Number, Boolean, Relation, Component, Dynamic Zone, JSON ve daha fazlası gibi alan türlerini seçersiniz; Strapi şema dosyasını sizin için yazar.
Bir Article content type şemasının arka planda nasıl göründüğü:
{
"kind": "collectionType",
"collectionName": "articles",
"info": {
"singularName": "article",
"pluralName": "articles",
"displayName": "Article"
},
"attributes": {
"title": {
"type": "string",
"required": true
},
"slug": {
"type": "uid",
"targetField": "title"
},
"content": {
"type": "richtext"
},
"coverImage": {
"type": "media",
"allowedTypes": ["images"]
},
"category": {
"type": "relation",
"relation": "manyToOne",
"target": "api::category.category"
},
"publishedAt": {
"type": "datetime"
}
}
}Yeni AI Content-Type Builder'ı da kullanabilirsiniz: "Başlık, slug, zengin metin içerik, kapak görseli ve kategorilere sahip makalelerin bulunduğu bir blog istiyorum" gibi düz bir Türkçe açıklamadan şema oluşturabilirsiniz. Strapi şema JSON'ını üretir ve veritabanı tablosunu oluşturur. Prototipleme için gerçekten kullanışlı.
Bileşenler ve Dinamik Bölgeler
Bileşenler yeniden kullanılabilir alan gruplarıdır. React bileşenleri gibi düşünün ama içerik yapısı için. metaTitle, metaDescription ve canonicalUrl alanlarına sahip bir "SEO" bileşeni herhangi bir content type'a eklenebilir.
Dinamik Bölgeler bunu bir adım ileriye taşır — içerik editörlerinin esnek sayfa düzenleri oluşturmak için bileşenler listesinden seçim yapmasını sağlar. Bir açılış sayfasında Hero bileşeni, ardından Özellikler Izgarası, ardından Referanslar Kaydırıcısı olabilir; bunların hepsi editör tarafından seçilip sıralanır. Bu desen, her sayfanın farklı bir yapıya sahip olduğu pazarlama sitelerinde yaygın olarak kullanılır.
Draft & Publish ile İçerik Yönetimi
Strapi 5, Draft & Publish sistemini yeniden tasarladı. Tek bir geçiş yerine artık Content Manager'da iki ayrı sekme bulunuyor — biri taslak sürümünüz için, diğeri yayımlananlar için. Editörler taslağı serbestçe düzenleyebilir, yayımlanan içeriği etkilemez. Hazır olduğunda yayımlarsınız ve taslak yeni yayımlanan sürüm haline gelir. Bir şeyler ters giderse Content History ile önceki herhangi bir duruma geri dönebilirsiniz.
Strapi API ile Çalışma (REST ve GraphQL)
Strapi, oluşturduğunuz her content type için hem REST hem de GraphQL endpoint'lerini otomatik olarak üretir. REST API hemen kullanılabilir — yapılandırma gerekmez. GraphQL yerleşik eklentiyi etkinleştirmeyi gerektirir ama kurulumu yaklaşık 30 saniye alır. Strapi REST API belgelerine göre her iki API de filtreleme, sıralama, sayfalandırma, alan seçimi ve ilişki doldurmayı destekler.
REST API Sorguları
Her collection type, /api/{pluralName} adresinde endpoint'ler alır. Filtrelerle makaleleri getirip ilişkileri doldurmak için şöyle yapabilirsiniz:
// Yayımlanmış makaleleri tarihe göre sıralı getir, kategoriyi doldur
const response = await fetch(
'http://localhost:1337/api/articles?' + new URLSearchParams({
'filters[publishedAt][$notNull]': 'true',
'sort': 'publishedAt:desc',
'populate': 'category,coverImage',
'pagination[page]': '1',
'pagination[pageSize]': '10',
'fields[0]': 'title',
'fields[1]': 'slug',
'fields[2]': 'publishedAt'
}),
{
headers: {
'Authorization': `Bearer ${API_TOKEN}`
}
}
);
const { data, meta } = await response.json();
// data: makale dizisi
// meta.pagination: { page, pageSize, pageCount, total }Strapi 5, yanıt formatını düzleştirdi. v4'te data.attributes.title içinden kazımanız gerekirdi. v5'te sadece data.title. Küçük bir değişiklik, büyük bir kullanım kalitesi iyileştirmesi.
GraphQL Kurulumu ve Sorguları
Eklentiyi yükleyerek GraphQL'i etkinleştirin:
npm run strapi install graphqlArdından /graphql adresinde sorgulayın:
query GetArticles {
articles(
filters: { publishedAt: { notNull: true } }
sort: "publishedAt:desc"
pagination: { page: 1, pageSize: 10 }
) {
title
slug
publishedAt
category {
name
}
coverImage {
url
alternativeText
}
}
}GraphQL, frontend'inizin derin iç içe ilişkilere ihtiyaç duyduğu durumlarda özellikle kullanışlıdır. Farklı populate parametrelerine sahip birden fazla REST çağrısı yerine, tek bir GraphQL sorgusu tam olarak ihtiyacınız olanı alır.
Next.js'te Strapi İçeriği Çekme
Bir Next.js App Router sayfasında Strapi içeriği çeken pratik bir örnek — bu, en yaygın Strapi + frontend çerçevesi eşleştirmelerinden biridir:
// app/blog/page.tsx
async function getArticles() {
const res = await fetch(
`${process.env.STRAPI_URL}/api/articles?populate=category,coverImage&sort=publishedAt:desc`,
{
headers: {
Authorization: `Bearer ${process.env.STRAPI_TOKEN}`,
},
next: { revalidate: 60 }, // ISR: her 60 saniyede bir yenile
}
);
if (!res.ok) throw new Error('Failed to fetch articles');
const { data } = await res.json();
return data;
}
export default async function BlogPage() {
const articles = await getArticles();
return (
<main>
{articles.map((article) => (
<article key={article.documentId}>
<h2>{article.title}</h2>
<span>{article.category?.name}</span>
</article>
))}
</main>
);
}v5'teki documentId'ye dikkat edin — v4'teki sayısal id'nin yerini aldı. Gözden kaçırırsanız canınızı yakacak türden bir geçiş ayrıntısı.
Strapi'de Özel Controller'lar, Servisler ve Rotalar
Özel controller'lar, Strapi'nin Contentful veya Sanity gibi SaaS headless CMS platformlarından gerçekten ayrıştığı yerdir. Strapi, sunucunuzda bir Node.js uygulaması olarak çalıştığından, otomatik oluşturulan herhangi bir endpoint'i kendi iş mantığınızla geçersiz kılabilirsiniz — girdi doğrulama, veri dönüşümü, harici API çağrıları, bildirim tetikleyicileri, bir Express.js uygulamasında yapabileceğiniz her şey. Benim deneyimlerime göre bu özellik, ekiplerin barındırılan alternatifler yerine Strapi'yi tercih etmesini sağlayan en önemli faktör.
Strapi Controller belgeleri tam API'yi kapsar. Resmi servis ve controller örneklerine dayanarak en çok kullandığım kalıplar:
Temel Controller'ları Genişletme
Strapi bir createCoreController factory'si sunar. Belirli eylemleri (find, findOne, create, update, delete) geçersiz kılarak genişletirsiniz; geri kalanı otomatik oluşturulan davranışı korur:
// src/api/article/controllers/article.ts
import { factories } from '@strapi/strapi';
export default factories.createCoreController(
'api::article.article',
({ strapi }) => ({
// Özel filtreleme eklemek için varsayılan find'ı geçersiz kıl
async find(ctx) {
// Gelen sorguyu doğrula ve temizle
const sanitizedQuery = await this.sanitizeQuery(ctx);
// Özel mantığınızı ekleyin — örneğin yalnızca kimliği doğrulanmış
// kullanıcının kuruluşuna ait makaleleri döndür
const user = ctx.state.user;
if (user?.organization) {
sanitizedQuery.filters = {
...sanitizedQuery.filters,
organization: user.organization.id,
};
}
const { results, pagination } = await strapi
.service('api::article.article')
.find(sanitizedQuery);
const sanitizedResults = await this.sanitizeOutput(results, ctx);
return this.transformResponse(sanitizedResults, { pagination });
},
})
);Özel Servis Yazma
Servisler, controller'ların (ve diğer servislerin) çağırabileceği yeniden kullanılabilir iş mantığını barındırır. Controller'larınızı sade, servislerinizi kapsamlı tutun:
// src/api/article/services/article.ts
import { factories } from '@strapi/strapi';
export default factories.createCoreService(
'api::article.article',
({ strapi }) => ({
// Özel metot: makaleyi yayımla ve aboneleri bilgilendir
async publishAndNotify(documentId: string) {
const article = await strapi.documents('api::article.article').update({
documentId,
data: { publishedAt: new Date() },
status: 'published',
});
// Harici bir bildirim servisini çağır
const subscribers = await strapi
.service('api::subscriber.subscriber')
.find({ filters: { active: true } });
await Promise.allSettled(
subscribers.results.map((sub) =>
fetch(process.env.NOTIFICATION_WEBHOOK, {
method: 'POST',
body: JSON.stringify({
email: sub.email,
article: article.title,
}),
})
)
);
return article;
},
})
);Özel Rotalar Ekleme
Otomatik oluşturulan CRUD rotalarının yanına özel rotalar kaydedin:
// src/api/article/routes/custom-article.ts
export default {
routes: [
{
method: 'POST',
path: '/articles/:id/publish-notify',
handler: 'article.publishAndNotify',
config: {
policies: ['admin::isAuthenticatedAdmin'],
},
},
],
};Ardından controller'ınıza handler'ı ekleyin:
async publishAndNotify(ctx) {
const { id } = ctx.params;
const article = await strapi
.service('api::article.article')
.publishAndNotify(id);
return this.transformResponse(article);
}Bu tür backend özelleştirmesi Contentful veya Sanity ile mümkün değildir — ayrı bir serverless fonksiyon veya ara katman gerekir. Strapi ile her şey tek bir kod tabanında.
Eklenti Ekosistemi ve Kendi Eklentinizi Oluşturma
Strapi'nin eklenti pazarında SEO meta verilerinden Stripe ödemelerine kadar her şeyi kapsayan 500'den fazla eklenti var. Bir kısmı resmi (Strapi ekibi tarafından bakımı yapılan), diğerleri topluluk tarafından geliştirilmiş. Kalite değişkenlik gösteriyor — tıpkı npm paketleri gibi — bu nedenle yüklemeden önce GitHub yıldızlarını, son commit'leri ve Strapi 5 uyumluluğunu kontrol edin.
Temel Eklentiler
Bunlar Strapi ile birlikte gelir veya tek bir kurulum komutu uzağındadır:
- GraphQL —
/graphqlendpoint'i ve GraphQL Playground ekler - i18n — yerel ayara dayalı içerik çeşitleriyle uluslararasılaştırma desteği
- Users & Permissions — kimlik doğrulama, roller, genel/kimliği doğrulanmış API erişimi
- Upload — yerel depolama, AWS S3 veya Cloudinary sağlayıcılarıyla medya kitaplığı
- Email — SendGrid, Mailgun, Amazon SES veya SMTP üzerinden işlem e-postası
Değerlendirmeye değer topluluk eklentileri: @strapi/plugin-seo (meta etiketler ve sosyal kartlar), strapi-plugin-sitemap (otomatik oluşturulan XML site haritaları) ve strapi-plugin-content-versioning (yerleşik Content History'nin ötesinde ayrıntılı sürüm kontrolü).
Özel Eklenti Oluşturma (Strapi 5 SDK)
Strapi 5, eklenti geliştirmeyi kolaylaştıran yeni bir Plugin SDK tanıttı. Resmi eklenti eğitimi tam süreci anlatıyor ama özet şu:
- İskelet yapı oluşturmak için
npx @strapi/sdk-plugin init my-pluginçalıştırın - Eklentinizin content type'larını, controller'larını ve yönetici paneli arayüzünü tanımlayın
npm run buildile derleyin ve npm'e yayımlayın
Eklenti oluşturma ile özel controller yazma arasındaki karar, yeniden kullanılabilirliğe bağlıdır. Mantık projeye özgüyse controller kullanın. Projeler arasında veya toplulukla paylaşmak istiyorsanız eklenti olarak paketleyin.
Veritabanı Yapılandırması: PostgreSQL, MySQL veya SQLite?
Strapi kutudan çıkar çıkmaz PostgreSQL, MySQL, MariaDB ve SQLite'ı destekler. SQLite, sıfır kurulum gerektirdiği için yeni projeler için varsayılan olarak gelir — geliştirme ve prototipleme için mükemmel. Production için PostgreSQL önerilen seçenektir ve Strapi ekibinin en çok test ettiği veritabanıdır.
Production'a hazır bir PostgreSQL yapılandırması:
// config/database.ts
export default ({ env }) => ({
connection: {
client: 'postgres',
connection: {
host: env('DATABASE_HOST', 'localhost'),
port: env.int('DATABASE_PORT', 5432),
database: env('DATABASE_NAME', 'strapi'),
user: env('DATABASE_USERNAME', 'strapi'),
password: env('DATABASE_PASSWORD', ''),
ssl: env.bool('DATABASE_SSL', false) && {
rejectUnauthorized: env.bool('DATABASE_SSL_REJECT', true),
},
},
pool: {
min: env.int('DATABASE_POOL_MIN', 2),
max: env.int('DATABASE_POOL_MAX', 10),
},
},
});Veritabanı seçeneklerini değerlendiriyorsanız, PostgreSQL ve MySQL karşılaştırmamız farkları derinlemesine ele alıyor.
| Veritabanı | İdeal Kullanım | Strapi Desteği | Production'a Hazır? |
|---|---|---|---|
| PostgreSQL | Production iş yükleri, karmaşık sorgular, JSON alanları | Birincil (en çok test edilen) | Evet |
| MySQL 8+ | MySQL altyapısını kullanan ekipler | Tam destek | Evet |
| MariaDB | MySQL uyumlu alternatif | Tam destek | Evet |
| SQLite | Yerel geliştirme, prototipleme, CI/CD | Tam destek | Hayır (tek yazıcı, eşzamanlı erişim yok) |
10.000'den fazla girişe sahip içerik yoğun uygulamalarda, bağlantı havuzlamalı (PgBouncer) PostgreSQL yükü iyi kaldırır. SQLite, birkaç yüz eşzamanlı istekte yazma çakışması sorunları göstermeye başlar — bir blog yöneticisi için sorun değil ama yüksek trafikli bir API için sorunlu.
Strapi'yi Production'a Deploy Etme
Production deployment, çoğu Strapi rehberinin durduğu ve çoğu geliştiricinin takıldığı yerdir. Strapi kalıcı bir Node.js sunucusuna (statik site değil), bir veritabanına, medya depolamasına ve uygun ortam yapılandırmasına ihtiyaç duyar. Strapi Deployment belgelerinde özetlendiği gibi iki yol var: Strapi Cloud (yönetilen) veya Railway, Render veya DigitalOcean gibi platformlarda self-hosted.
Strapi Cloud (Yönetilen)
Strapi Cloud resmi barındırılan seçenektir. Sunucu sağlama, veritabanı yönetimi, CDN ve yedeklemeleri sizin için yönetir. İşte katmanlar:
| Katman | Fiyat | Proje | API Çağrısı | Kullanıcı | Depolama |
|---|---|---|---|---|---|
| Ücretsiz | $0/ay | 1 | 10B/ay | 1 | 500MB |
| Essential | $18/ay | 1 | 500B/ay | 3 | 25GB |
| Pro | $90/ay | Sınırsız | 2M/ay | 10 | 100GB |
| Scale | $450/ay | Sınırsız | 10M/ay | 25 | 500GB |
Strapi Cloud, production'a giden en hızlı yoldur. Ancak Contentful ve Sanity'nin barındırmasıyla karşılaştırıldığında hâlâ olgunlaşıyor — daha az bölge, daha az ayrıntılı erişim kontrolü ve ücretsiz katman oldukça kısıtlayıcı. Yan projeler veya MVP'ler için ücretsiz katman işe yarar. Gerçek trafik sunan production uygulamalar için muhtemelen Essential veya Pro gerekecektir.
Railway veya Render Üzerinde Self-Hosting
Deneyimlerimize göre Railway, self-hosted bir production Strapi örneğine giden en hızlı yoldur. GitHub deponuzu bağlarsınız, ortam değişkenlerini ayarlarsınız ve Railway gerisini halleder. Ayrıntılı bir platform karşılaştırması için Railway vs Render karşılaştırmamıza bakabilirsiniz.
Production ortam yapılandırması:
# .env.production
NODE_ENV=production
HOST=0.0.0.0
PORT=1337
# Uygulama anahtarları (benzersiz değerler oluşturun!)
APP_KEYS=key1,key2,key3,key4
API_TOKEN_SALT=your-api-token-salt
ADMIN_JWT_SECRET=your-admin-jwt-secret
JWT_SECRET=your-jwt-secret
TRANSFER_TOKEN_SALT=your-transfer-token-salt
# Veritabanı (Railway DATABASE_URL'yi otomatik olarak sağlar)
DATABASE_CLIENT=postgres
DATABASE_HOST=${PGHOST}
DATABASE_PORT=${PGPORT}
DATABASE_NAME=${PGDATABASE}
DATABASE_USERNAME=${PGUSER}
DATABASE_PASSWORD=${PGPASSWORD}
DATABASE_SSL=true
# Medya depolama (S3 uyumlu)
AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
AWS_REGION=us-east-1
AWS_BUCKET=your-strapi-uploadsContainer tercih ediyorsanız Strapi'yi Dockerize edip istediğiniz yere deploy edebilirsiniz — konteynerizasyon seçenekleri hakkındaki rehberimize bakın. Railway ayrıca Dockerfile olmadan otomatik build için Nixpacks'i de destekler.
Production Kontrol Listesi
Yayına almadan önce şunları doğrulayın:
- Admin panelini derleyin:
npm run buildçalıştırın — bu React yönetici panelini production için derler - Süreç yöneticisi: Strapi'yi çalışır durumda tutmak ve çökmelerde otomatik yeniden başlatmak için PM2 kullanın
- Sağlık kontrolü: Strapi
/_healthendpoint'ini açar (HTTP 204 döndürür) — yük dengeleyicinizi buraya yönlendirin - Medya depolama: Yerel yüklemelerden S3 veya Cloudinary'ye geçin — yerel depolama çoğu PaaS platformunda kalıcı değildir
- Ters proxy: SSL sonlandırma ve statik dosya önbelleklemesi için Strapi'nin önüne Nginx veya Caddy koyun
- Ortam değişkenleri: Sırları asla commit etmeyin; platform yerel ortam değişkeni yönetimini kullanın
Strapi vs Sanity vs Contentful: Hangisini Seçmelisiniz?
Strapi, Sanity ve Contentful arasındaki tercih üç şeye bağlıdır: self-hosting'e ihtiyacınız olup olmadığı, ekibinizin içerik üzerinde nasıl iş birliği yaptığı ve bütçe kısıtlamalarınız. Üçü de production kalitesinde headless CMS platformlarıdır ama temelden farklı ödünleşimler yapıyorlar. Daha derin bir inceleme için Sanity CMS rehberimize ve Contentful rehberimize göz atın.
| Kriter | Strapi | Sanity | Contentful |
|---|---|---|---|
| Açık Kaynak | Evet (MIT) | Hayır (tescilli) | Hayır (tescilli) |
| Self-Hosting | Evet (zorunlu veya Cloud) | Hayır (yalnızca hosted) | Hayır (yalnızca hosted) |
| Gerçek Zamanlı İş Birliği | Hayır | Evet (Google Docs tarzı) | Sınırlı |
| Sorgu Dili | REST + GraphQL | GROQ + GraphQL | REST + GraphQL |
| Ücretsiz Katman | Community Edition (sınırsız) | Aylık 500B API isteği | 5 kullanıcı, 25B kayıt |
| Özel Backend Mantığı | Tam Node.js erişimi | Yalnızca serverless fonksiyonlar | Yalnızca webhook'lar |
| Kurumsal Yönetişim | Gelişiyor | Güçlü | En güçlü |
| Öğrenme Eğrisi | Orta (Node.js bilgisi yardımcı olur) | Orta (GROQ kendine özgü) | Düşük-Orta |
Karar çerçevesi — gerçek kısıtlamanıza göre seçin:
| İhtiyacınız varsa... | Tercih edin | Çünkü |
|---|---|---|
| Tam kod sahipliği + self-hosting | Strapi | Tam backend erişimine sahip tek açık kaynak seçeneği |
| Gerçek zamanlı editoryal iş birliği | Sanity | Google Docs tarzı çok kullanıcılı düzenleme |
| Kurumsal uyumluluk (SOC2, HIPAA) | Contentful | Yönetişim ve denetim araçlarında on yıllık baş başı |
| En düşük bütçe (küçük ekip) | Strapi Community | Sonsuza kadar ücretsiz, self-hosted |
| Kodsuz içerik yönetimi | WordPress | Hâlâ geliştiricisi olmayan kullanıcılar için en kolay seçenek |
| Harici servisler olmadan özel API mantığı | Strapi | Controller'lar, servisler ve rotalar tek bir kod tabanında |
Techsy olarak Strapi, Sanity ve Contentful kullanan headless CMS mimarileri inşa ediyoruz. Projeniz için doğru CMS'i seçmekte yardıma ihtiyaç duyuyorsanız veya production'a hazır bir Strapi kurulumu istiyorsanız ücretsiz danışmanlık alın.
Strapi'nin Dürüst Artıları, Eksileri ve Kullanılmaması Gereken Durumlar
Üç müşteri projesinde Strapi 5'i test ettikten sonra dürüst değerlendirmem şu. Strapi, tam backend kontrolü isteyen ekipler için mükemmel; ama herkes için doğru araç değil.
Artıları:
- Tam kod sahipliği — veriniz, sunucunuz, kurallarınız
- Satıcı bağımlılığı olmayan MIT lisansı
- v5'te güçlü tip çıkarımlı TypeScript-first yaklaşım
- İçerik şemalarından otomatik oluşturulan REST ve GraphQL endpoint'leri
- Aktif topluluk: 65.000+ GitHub yıldızı, 20.000+ üyeli Discord
- Pazarda 500'den fazla eklenti
- Özel controller'lar Express.js düzeyinde backend esnekliği sağlar
- Self-host etmek istemiyorsanız Strapi Cloud yönetilen seçenek sunar
Eksileri:
- Self-hosting ops çalışması gerektirir — güncellemeler, izleme ve yedeklemeler için ayda 10-20 saat bekleyin
- Gerçek zamanlı iş birliği yok (iki editör birbirinin değişikliklerinin üzerine yazabilir)
- Strapi 4'ten 5'e geçişte sürtüşme var: Entity Service'ten Document Service'e, yeni yanıt formatları, eklenti uyumluluk boşlukları
- Strapi Cloud, Contentful veya Sanity'nin barındırılan platformlarına kıyasla hâlâ olgunlaşıyor
- Contentful'a kıyasla daha az kurumsal benimseme — daha az uyumluluk sertifikası
- Yönetici paneli özelleştirmesi mümkün olmakla birlikte Strapi'nin iç API'lerini derinden bilmeyi gerektiriyor
Strapi Kullanılmaması Gereken Durumlar:
- Gerçek zamanlı iş birliğine ihtiyaç varsa — editoryal ekibiniz aynı anda içerik üzerinde mi çalışıyor? Sanity kullanın. Strapi'nin çok oyunculu düzenleme özelliği yok.
- Kurumsal yönetişim ve SOC2 gerekiyorsa — uyumluluk ağırlıklı bir kuruluşsanız? Contentful, yönetişim araçlarında on yıllık baş başı var.
- Teknik olmayan ekip, geliştirici desteği yok — Strapi kurulum, deployment ve bakım için bir geliştirici gerektirir. Ekibinizin tamamı pazarlamacılardan oluşuyorsa SaaS CMS veya WordPress'i değerlendirin.
- Serverless-first mimari — Strapi kalıcı bir sunucuya ihtiyaç duyar. Tamamen edge fonksiyonları ve serverless üzerine kuruyorsanız Sanity veya Contentful daha iyi uyum sağlar.
Sıkça Sorulan Sorular
Strapi nedir ve nasıl çalışır?
Strapi, Node.js üzerine inşa edilmiş açık kaynaklı bir headless CMS'tir. Görsel bir oluşturucu veya kod aracılığıyla content type'lar tanımlarsınız; Strapi otomatik olarak REST ve GraphQL API endpoint'leri oluşturur. Frontend uygulamaları bu endpoint'lerden JSON olarak içerik çeker. Yönetici paneli, içerik editörlerine kod yazmadan girişleri yönetmeleri için React tabanlı bir arayüz sunar.
Strapi ücretsiz midir?
Evet. Strapi Community Edition MIT lisansı altında ücretsiz ve açık kaynaklıdır. Kendi sunucunuzda kullanım sınırı, koltuk kısıtlaması veya API çağrı sınırı olmaksızın barındırabilirsiniz. Yönetilen barındırma seçeneği olan Strapi Cloud'un aylık 10.000 API çağrısıyla ücretsiz bir katmanı vardır; daha yüksek limitler için ücretli planlar aylık $18'dan başlar.
Strapi ile Contentful arasındaki fark nedir?
Strapi açık kaynaklı ve self-hosted'dır; tam kod erişimi ve veri sahipliği sunar. Contentful, daha güçlü kurumsal yönetişim, uyumluluk sertifikaları ve daha büyük editoryal araç setiyle tescilli bir SaaS platformudur. Kod kontrolü ve bütçe esnekliği için Strapi'yi seçin. Kurumsal uyumluluk gereksinimleri ve yönetilen altyapıya ihtiyaç duyan büyük editoryal ekipler için Contentful'u tercih edin.
Strapi yeni başlayanlar için uygun mu?
Temel Node.js ve JavaScript bilginiz varsa Strapi yeni başlayanlar için uygundur. Yönetici paneli ve Content-Type Builder görsel ve sezgiseldir — içerik modelleme için kod gerekmez. Deployment ve özel backend mantığı geliştirici deneyimi gerektirir. Kodlama geçmişi olmayan mutlak yeni başlayanlar için WordPress veya tam yönetilen bir SaaS CMS daha kolay başlangıç noktaları olur.
Strapi hangi veritabanını kullanır?
Strapi PostgreSQL, MySQL, MariaDB ve SQLite'ı destekler. Yeni projeler sıfır kurulumlu geliştirme için varsayılan olarak SQLite'ı kullanır. Production iş yükleri için PostgreSQL önerilir — Strapi ile en çok test edilen veritabanıdır ve eşzamanlı erişimi, karmaşık sorguları ve JSON alan türlerini iyi yönetir. Veritabanı bağlantısını config/database.ts dosyasında yapılandırırsınız.
Strapi production'a nasıl deploy edilir?
Strapi'yi Strapi Cloud'a (aylık $18'dan başlayan yönetilen barındırma) veya Railway, Render, DigitalOcean ya da AWS gibi platformlarda self-hosted olarak deploy edebilirsiniz. Self-hosting bir Node.js sunucusu, PostgreSQL veritabanı, ortam değişkenleri, medya depolama (S3 veya Cloudinary) ve PM2 gibi bir süreç yöneticisi yapılandırmasını gerektirir. Admin panelini derlemek için deployment öncesinde npm run build çalıştırın.
Strapi WordPress'ten daha iyi midir?
Strapi ve WordPress farklı sorunları çözer. Strapi, herhangi bir frontend'e JSON API'leri sunan headless bir CMS'tir — özel uygulama geliştiren, çok platformlu içerik dağıtımı yapan veya JavaScript ağırlıklı siteler inşa eden geliştiriciler için idealdir. WordPress, HTML sayfaları oluşturan geleneksel bir CMS'tir — tema, sürükle-bırak oluşturucu ve kod yazmadan geniş eklenti ekosistemine ihtiyaç duyan teknik olmayan kullanıcılar için daha uygundur.
Strapi'nin dezavantajları nelerdir?
Başlıca dezavantajlar: self-hosting'den kaynaklanan operasyonel yük (güncellemeler, izleme, yedeklemeler), editoryal ekipler için gerçek zamanlı iş birliği eksikliği, ana sürümler arasındaki geçiş sürtüşmesi (v4'ten v5'e kod değişiklikleri gerektirdi) ve Contentful'a kıyasla daha az olgun kurumsal teklif. Strapi Cloud barındırma yükünü üstleniyor ancak özellikler ve küresel kullanılabilirlik açısından hâlâ yetişmeye çalışıyor.
Strapi büyük ölçekli uygulamaları kaldırabilir mi?
Evet. Strapi, uygun altyapıyla büyük ölçekli uygulamaları kaldırabilir: bağlantı havuzlamalı PostgreSQL, bir yük dengeleyicinin arkasında yatay ölçekleme, medya varlıkları için CDN ve önbellekleme için Redis. IBM, NASA ve Toyota gibi şirketler Strapi'yi production'da kullanıyor. Darboğaz genellikle Strapi'nin kendisi değil, veritabanı performansı ve barındırma yapılandırmasıdır.
Strapi Cloud nedir ve maliyeti ne kadardır?
Strapi Cloud, Strapi projeleri için resmi yönetilen barındırma platformudur. Sunucu sağlama, veritabanı yönetimi, CDN ve otomatik yedeklemeleri yönetir. Fiyatlandırma ücretsiz katmanla başlar (1 proje, aylık 10B API çağrısı), ardından aylık $18 Essential, aylık $90 Pro ve aylık $450 Scale gelir. Her katman API çağrı limitlerini, ekip üyesi sayısını ve depolama kapasitesini artırır.