
Panduan Strapi 5: Instalasi, API, Plugin, dan Deployment (2026)
Strapi adalah CMS headless open-source yang dibangun di atas Node.js, memberikan Anda kontrol penuh atas API, basis data, dan deployment Anda. Berbeda dengan platform CMS terkelola di mana Anda menyewa akses ke infrastruktur orang lain, Strapi berjalan di server Anda sendiri, menghasilkan endpoint REST dan GraphQL dari skema konten Anda, dan memungkinkan Anda menyesuaikan setiap lapisan backend dengan JavaScript atau TypeScript biasa.
Panduan ini secara khusus membahas Strapi 5, mulai dari perintah npx create-strapi pertama Anda hingga deployment produksi di Railway atau Strapi Cloud. Setiap contoh kode siap disalin-tempel dan telah diuji terhadap Strapi 5.x.
| Bidang | Nilai |
|---|---|
| Jenis | CMS headless open-source |
| Bahasa | JavaScript / TypeScript (Node.js) |
| Versi Saat Ini | Strapi 5 |
| Lisensi | MIT (Komunitas) / Proprietary (Enterprise) |
| Dukungan Basis Data | PostgreSQL, MySQL, MariaDB, SQLite |
| Jenis API | REST + GraphQL (keduanya bawaan) |
| Hosting | Self-hosted atau Strapi Cloud |
| Harga Cloud | Tier gratis, lalu $18/bulan+ |
| Bintang GitHub | 65.000+ |
| Terbaik Untuk | Tim yang menginginkan kepemilikan kode penuh + kustomisasi API |
Apa Itu Strapi dan Bagaimana Cara Kerjanya?
Strapi adalah sistem manajemen konten yang self-hosted dan mengutamakan API, yang memisahkan backend konten Anda dari frontend. Anda mendefinisikan skema konten melalui pembangun visual atau kode, dan Strapi secara otomatis menghasilkan endpoint API CRUD, baik REST maupun GraphQL, yang dapat dikonsumsi oleh framework frontend apa pun. Panel admin adalah UI berbasis React tempat editor konten membuat dan mengelola entri tanpa menyentuh kode, sesuai dengan dokumentasi resmi Strapi.
CMS Headless vs CMS Tradisional
CMS tradisional seperti WordPress menggabungkan konten Anda dengan lapisan presentasi. Postingan blog, halaman, dan media Anda semua berada dalam sistem yang sama yang merender HTML kepada pengunjung. Itu bekerja dengan baik sampai Anda membutuhkan konten yang sama di aplikasi seluler, situs mikro pemasaran, dan portal dokumentasi secara bersamaan.
CMS headless menghilangkan frontend sepenuhnya. Strapi menyimpan konten Anda dan menyajikannya sebagai JSON melalui endpoint API. Situs Next.js Anda, aplikasi React Native Anda, dan dasbor IoT Anda semua mengambil data dari backend Strapi yang sama. Anda mendapatkan satu sumber kebenaran, dengan banyak konsumen.
Jika Anda sedang mengevaluasi opsi di luar Strapi, perbandingan CMS headless kami menguraikan platform teratas secara berdampingan.
Arsitektur Strapi
Tumpukan Strapi cukup sederhana: server Node.js duduk di antara basis data Anda (PostgreSQL, MySQL, atau SQLite) dan aplikasi frontend Anda. Panel admin, sebuah aplikasi satu halaman berbasis React, terhubung ke API yang sama dengan yang digunakan frontend Anda, hanya dengan izin yang lebih baik.
Berikut alurnya: basis data Anda menyimpan konten. Lapisan ORM Strapi (dibangun di atas Knex.js) melakukan kueri terhadapnya. Lapisan API mengekspos endpoint REST dan GraphQL. Frontend Anda, apakah itu Next.js, Nuxt, Astro, Gatsby, atau aplikasi seluler, mengambil JSON dari endpoint tersebut. Strapi sendiri tidak pernah merender HTML kepada pengguna akhir.
Repositori GitHub Strapi memiliki 65.000+ bintang, menjadikannya salah satu proyek CMS open-source paling populer di platform tersebut.
Apa yang Baru di Strapi 5?
Strapi 5 adalah penulisan ulang besar yang menggantikan Entity Service API dengan Document Service API baru, beralih dari Webpack ke Vite untuk build panel admin, dan memperkenalkan TypeScript sebagai bahasa default untuk proyek baru. Ini bukan pembaruan inkremental; arsitektur internal berubah secara signifikan, seperti yang dijelaskan di halaman ikhtisar Strapi 5.
Berikut adalah perubahan yang paling penting bagi pengembang, menurut changelog pengembang Strapi 5:
- Document Service API menggantikan Entity Service API, tanda tangan metode lebih bersih, tipe TypeScript lebih baik, antarmuka terunifikasi untuk operasi CRUD
- Perombakan Draft & Publish, sistem dua tab di panel admin yang memisahkan status konten draft dan yang diterbitkan
- Riwayat Konten, lihat dan pulihkan versi sebelumnya dari entri apa pun langsung dari admin
- Fitur Pratinjau, pratinjau konten di frontend aktual Anda sebelum menerbitkan, dikonfigurasi per tipe konten
- Vite menggantikan Webpack, build panel admin terasa jauh lebih cepat (kami melihat peningkatan ~60% dalam waktu build)
- Pendekatan TypeScript-first, proyek baru di-scaffold dengan TypeScript secara default
- Pembangun Tipe Konten AI, hasilkan skema konten dari deskripsi bahasa alami atau desain Figma. Ini baru pada tahun 2026 dan belum ada CMS headless lain yang menawarkannya
- Respons API yang disederhanakan, struktur JSON lebih datar untuk REST dan GraphQL
- SDK Plugin Baru, API yang disederhanakan untuk membangun dan mendistribusikan plugin Strapi
| Fitur | Strapi 4 | Strapi 5 |
|---|---|---|
| Service API | Entity Service | Document Service |
| Bundler | Webpack | Vite |
| Bahasa Default | JavaScript | TypeScript |
| Sistem Draft | Satu toggle | Dua tab (draft/diterbitkan) |
| Riwayat Konten | Memerlukan plugin | Bawaan |
| Pratinjau Frontend | Tidak tersedia | API pratinjau native |
| Format Respons API | Bersarang dalam | Struktur datar |
| Pembuatan Skema | Manual saja | AI + manual |
Cara Menginstal dan Menyiapkan Strapi 5
Menyiapkan proyek Strapi 5 memakan waktu sekitar dua menit. Anda memerlukan Node.js 18 atau lebih baru, dan npm, yarn, atau pnpm. Strapi men-scaffold proyek lengkap dengan panel admin, koneksi basis data, dan lapisan API dari satu perintah tunggal, seperti yang didokumentasikan dalam panduan Mulai Cepat Strapi.
Prasyarat
- Node.js 18+ (disarankan 20 LTS)
- npm 6+, yarn, atau pnpm
- Sebuah basis data: SQLite berfungsi langsung untuk pengembangan; PostgreSQL untuk produksi
Membuat Proyek Pertama Anda
npx create-strapi@latest my-project
# Interactive prompts:
# ? Choose your preferred language: TypeScript
# ? Choose your default database client: sqlite
# ? Start with an example structure?: Yes (recommended for first-timers)
cd my-project
npm run developStrapi dimulai di http://localhost:1337. Kunjungan pertama Anda akan meminta Anda membuat akun admin. Setelah itu, Anda berada di panel admin, siap untuk membangun tipe konten.
Ikhtisar Struktur Proyek
my-project/
├── config/
│ ├── database.ts # Database connection
│ ├── server.ts # Host, port, app keys
│ ├── admin.ts # Admin panel config
│ └── plugins.ts # Plugin configuration
├── src/
│ ├── api/ # Your content types live here
│ │ └── article/
│ │ ├── content-types/
│ │ │ └── article/schema.json
│ │ ├── controllers/article.ts
│ │ ├── routes/article.ts
│ │ └── services/article.ts
│ ├── plugins/ # Custom plugins
│ └── index.ts # App bootstrap/lifecycle
├── public/ # Static files
├── .env # Environment variables
└── package.jsonSetiap tipe konten mendapatkan foldernya sendiri di bawah src/api/ dengan schema, controller, route, dan file service. Strapi menghasilkan ini secara otomatis saat Anda membuat tipe konten melalui panel admin, tetapi Anda juga dapat membuatnya secara manual.
Membangun Tipe Konten dan Mengelola Konten
Tipe Konten adalah jantung dari Strapi; mereka mendefinisikan skema data Anda dan secara otomatis menghasilkan endpoint API, formulir panel admin, dan tabel basis data. Strapi mendukung dua jenis utama: Collection Types (seperti postingan blog atau produk, di mana Anda memiliki banyak entri) dan Single Types (seperti beranda atau pengaturan situs, di mana hanya ada satu entri).
Penelusuran Pembangun Tipe Konten
Content-Type Builder di panel admin Strapi memungkinkan Anda mendefinisikan skema secara visual. Anda memilih jenis bidang, Teks, Rich Text, Media, Angka, Boolean, Relasi, Komponen, Dynamic Zone, JSON, dan lainnya, dan Strapi menulis file skema untuk Anda.
Beginilah tampilan skema tipe konten Artikel di balik layar:
{
"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"
}
}
}Anda juga dapat menggunakan Pembangun Tipe Konten AI baru untuk menghasilkan skema dari deskripsi bahasa Inggris biasa seperti "Saya butuh blog dengan artikel yang memiliki judul, slug, konten rich text, gambar sampul, dan kategori." Strapi menghasilkan JSON skema dan membuat tabel basis data. Ini sangat berguna untuk prototipe.
Komponen dan Dynamic Zones
Komponen adalah grup bidang yang dapat digunakan kembali. Anggap saja seperti komponen React tetapi untuk struktur konten. Komponen "SEO" dengan bidang metaTitle, metaDescription, dan canonicalUrl dapat ditempelkan ke tipe konten apa pun.
Dynamic Zones melangkah lebih jauh; mereka memungkinkan editor konten memilih dari daftar komponen untuk membangun tata letak halaman yang fleksibel. Halaman landas mungkin memiliki komponen Hero, lalu Features Grid, lalu Testimonials Slider, semuanya dipilih dan diurutkan oleh editor. Pola ini populer untuk situs pemasaran di mana setiap halaman memiliki struktur yang berbeda.
Mengelola Konten dengan Draft & Publish
Strapi 5 merombak sistem Draft & Publish. Alih-alih satu toggle, Anda sekarang mendapatkan dua tab terpisah di Content Manager, satu untuk versi draft, satu untuk yang diterbitkan. Editor dapat bebas memodifikasi draft tanpa memengaruhi konten live. Ketika siap, mereka menerbitkan, dan draft menjadi versi yang diterbitkan yang baru. Riwayat Konten memungkinkan Anda kembali ke keadaan sebelumnya jika terjadi kesalahan.
Bekerja dengan API Strapi (REST dan GraphQL)
Strapi secara otomatis menghasilkan endpoint REST dan GraphQL untuk setiap tipe konten yang Anda buat. API REST tersedia segera, tanpa konfigurasi diperlukan. GraphQL memerlukan pengaktifan plugin bawaan tetapi hanya membutuhkan waktu sekitar 30 detik untuk disiapkan. Kedua API mendukung filtering, sorting, pagination, pemilihan bidang, dan populasi relasi, menurut dokumentasi API REST Strapi.
Kueri API REST
Setiap collection type mendapatkan endpoint di /api/{pluralName}. Berikut cara Anda mengambil artikel dengan filter dan mempopulasi relasi:
// Fetch published articles, sorted by date, with category populated
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: array of articles
// meta.pagination: { page, pageSize, pageCount, total }Strapi 5 meratakan format respons. Di v4, Anda harus menggali melalui data.attributes.title. Di v5, itu hanya data.title. Perubahan kecil, peningkatan kualitas hidup yang besar.
Pengaturan dan Kueri GraphQL
Aktifkan GraphQL dengan menginstal plugin:
npm run strapi install graphqlKemudian lakukan kueri di /graphql:
query GetArticles {
articles(
filters: { publishedAt: { notNull: true } }
sort: "publishedAt:desc"
pagination: { page: 1, pageSize: 10 }
) {
title
slug
publishedAt
category {
name
}
coverImage {
url
alternativeText
}
}
}GraphQL sangat berguna ketika frontend Anda membutuhkan relasi yang bersarang dalam. Alih-alih beberapa panggilan REST dengan parameter populate yang berbeda, satu kueri GraphQL mengambil tepat apa yang Anda butuhkan.
Mengambil Konten Strapi di Next.js
Berikut contoh praktis mengambil konten Strapi di halaman Next.js App Router; ini adalah salah satu pasangan Strapi + framework frontend yang paling umum:
// 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: revalidate every 60 seconds
}
);
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>
);
}Perhatikan documentId di v5 -- ini menggantikan id numerik dari v4. Ini adalah salah satu detail migrasi yang akan menjebak Anda jika melewatkannya.
Controller, Service, dan Route Kustom di Strapi
Controller kustom adalah tempat Strapi benar-benar memisahkan diri dari platform CMS headless SaaS seperti Contentful atau Sanity. Karena Strapi berjalan di server Anda sebagai aplikasi Node.js, Anda dapat mengganti endpoint yang dihasilkan otomatis dengan logika bisnis Anda sendiri, validasi input, transformasi data, panggilan API eksternal, pemicu notifikasi, apa pun yang akan Anda lakukan di aplikasi Express.js. Saya menemukan ini adalah fitur yang membuat tim memilih Strapi daripada alternatif yang dihosting.
Dokumentasi Controller Strapi mencakup API lengkap. Berikut adalah pola yang paling sering saya gunakan, berdasarkan contoh service dan controller resmi.
Memperluas Controller Inti
Strapi menyediakan pabrik createCoreController. Anda memperluasnya dengan mengganti tindakan tertentu (find, findOne, create, update, delete) sambil mempertahankan sisa perilaku yang dihasilkan otomatis:
// src/api/article/controllers/article.ts
import { factories } from '@strapi/strapi';
export default factories.createCoreController(
'api::article.article',
({ strapi }) => ({
// Override the default find to add custom filtering
async find(ctx) {
// Validate and sanitize the incoming query
const sanitizedQuery = await this.sanitizeQuery(ctx);
// Add your custom logic -- e.g., only return articles
// that belong to the authenticated user's organization
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 });
},
})
);Menulis Service Kustom
Service menampung logika bisnis yang dapat digunakan kembali yang dapat dipanggil oleh controller (dan service lainnya). Jaga agar controller Anda tetap tipis dan service Anda tetap gemuk:
// src/api/article/services/article.ts
import { factories } from '@strapi/strapi';
export default factories.createCoreService(
'api::article.article',
({ strapi }) => ({
// Custom method: publish article and notify subscribers
async publishAndNotify(documentId: string) {
const article = await strapi.documents('api::article.article').update({
documentId,
data: { publishedAt: new Date() },
status: 'published',
});
// Call an external notification service
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;
},
})
);Menambahkan Route Kustom
Daftarkan route kustom di samping route CRUD yang dihasilkan otomatis:
// src/api/article/routes/custom-article.ts
export default {
routes: [
{
method: 'POST',
path: '/articles/:id/publish-notify',
handler: 'article.publishAndNotify',
config: {
policies: ['admin::isAuthenticatedAdmin'],
},
},
],
};Kemudian tambahkan handler ke controller Anda:
async publishAndNotify(ctx) {
const { id } = ctx.params;
const article = await strapi
.service('api::article.article')
.publishAndNotify(id);
return this.transformResponse(article);
}Kustomisasi backend semacam ini sama sekali tidak mungkin dilakukan dengan Contentful atau Sanity; Anda akan memerlukan fungsi serverless terpisah atau lapisan middleware. Dengan Strapi, semuanya ada dalam satu codebase.
Ekosistem Plugin dan Membangun Plugin Anda Sendiri
Marketplace plugin Strapi memiliki 500+ plugin yang mencakup segala hal mulai dari metadata SEO hingga pembayaran Stripe. Beberapa adalah resmi (dikelola oleh tim Strapi), lainnya dibuat oleh komunitas. Kualitasnya bervariasi, sama seperti paket npm, jadi periksa bintang GitHub, commit terbaru, dan kompatibilitas Strapi 5 sebelum menginstal.
Plugin Esensial
Ini disertakan dengan Strapi atau hanya berjarak satu perintah instalasi:
- GraphQL, menambahkan endpoint
/graphqldan GraphQL Playground - i18n, dukungan internasionalisasi dengan varian konten berbasis lokal
- Users & Permissions, autentikasi, peran, akses API publik/terautentikasi
- Upload, pustaka media dengan penyimpanan lokal, penyedia AWS S3, atau Cloudinary
- Email, email transaksional melalui SendGrid, Mailgun, Amazon SES, atau SMTP
Plugin komunitas yang layak dicoba: @strapi/plugin-seo (tag meta dan kartu sosial), strapi-plugin-sitemap (sitemap XML yang dihasilkan otomatis), dan strapi-plugin-content-versioning (kontrol versi granular di luar Riwayat Konten bawaan).
Membangun Plugin Kustom (SDK Strapi 5)
Strapi 5 memperkenalkan SDK Plugin baru yang menyederhanakan pengembangan plugin. Tutorial plugin resmi menuntun Anda melalui seluruh proses, tetapi intinya adalah:
- Jalankan
npx @strapi/sdk-plugin init my-pluginuntuk scaffold - Tentukan tipe konten, controller, dan UI panel admin plugin Anda
- Build dengan
npm run builddan publikasikan ke npm
Keputusan antara membangun plugin versus menulis controller kustom bergantung pada penggunaan kembali. Jika logikanya spesifik untuk proyek, gunakan controller. Jika Anda ingin membagikannya lintas proyek atau dengan komunitas, paketkan sebagai plugin.
Konfigurasi Basis Data: PostgreSQL, MySQL, atau SQLite?
Strapi mendukung PostgreSQL, MySQL, MariaDB, dan SQLite langsung dari kotak. SQLite dikirimkan sebagai default untuk proyek baru karena tidak memerlukan pengaturan, bagus untuk pengembangan dan prototipe. Untuk produksi, PostgreSQL adalah pilihan yang direkomendasikan dan yang paling banyak diuji oleh tim Strapi.
Berikut adalah konfigurasi PostgreSQL yang siap produksi:
// 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),
},
},
});Jika Anda menimbang opsi basis data Anda, perbandingan PostgreSQL vs MySQL kami membahas perbedaan secara mendalam.
| Basis Data | Terbaik Untuk | Dukungan Strapi | Siap Produksi? |
|---|---|---|---|
| PostgreSQL | Beban kerja produksi, kueri kompleks, bidang JSON | Utama (paling banyak diuji) | Ya |
| MySQL 8+ | Tim yang sudah menggunakan infrastruktur MySQL | Dukungan penuh | Ya |
| MariaDB | Alternatif kompatibel MySQL | Dukungan penuh | Ya |
| SQLite | Pengembangan lokal, prototipe, CI/CD | Dukungan penuh | Tidak (penulis tunggal, tidak ada akses konkuren) |
Untuk aplikasi yang berat konten dengan 10.000+ entri, PostgreSQL dengan connection pooling (PgBouncer) menangani beban dengan baik. SQLite mulai menunjukkan masalah kontensi tulis pada beberapa ratus permintaan konkuren, baik-baik saja untuk admin blog, bermasalah untuk API lalu lintas tinggi.
Mendeploy Strapi ke Produksi
Deployment produksi adalah tempat sebagian besar panduan Strapi berhenti, dan di mana sebagian besar pengembang macet. Strapi memerlukan server Node.js yang persisten (bukan situs statis), basis data, penyimpanan media, dan konfigurasi lingkungan yang tepat. Anda memiliki dua jalur: Strapi Cloud (terkelola) atau self-hosted di platform seperti Railway, Render, atau DigitalOcean, seperti yang diuraikan dalam dokumentasi Deployment Strapi.
Strapi Cloud (Terkelola)
Strapi Cloud adalah opsi hosting resmi. Ini menangani penyediaan server, manajemen basis data, CDN, dan backup. Berikut adalah tier-nya:
| Tier | Harga | Proyek | Panggilan API | Seat | Penyimpanan |
|---|---|---|---|---|---|
| Gratis | $0/bln | 1 | 10K/bln | 1 | 500MB |
| Essential | $18/bln | 1 | 500K/bln | 3 | 25GB |
| Pro | $90/bln | Tak terbatas | 2Jt/bln | 10 | 100GB |
| Scale | $450/bln | Tak terbatas | 10Jt/bln | 25 | 500GB |
Strapi Cloud adalah jalur tercepat menuju produksi. Namun, ini masih matang dibandingkan dengan hosting Contentful dan Sanity, wilayah lebih sedikit, kontrol akses kurang granular, dan tier gratis cukup restriktif. Untuk proyek sampingan atau MVP, tier gratis berfungsi. Untuk aplikasi produksi yang melayani lalu lintas nyata, Anda kemungkinan akan membutuhkan Essential atau Pro.
Self-Hosting di Railway atau Render
Dalam pengalaman kami, Railway adalah jalur tercepat ke instance Strapi produksi yang di-host sendiri. Anda menghubungkan repo GitHub Anda, mengatur variabel lingkungan, dan Railway menangani sisanya. Untuk perbandingan platform yang terperinci, lihat perbandingan Railway vs Render kami.
Berikut adalah konfigurasi lingkungan produksi:
# .env.production
NODE_ENV=production
HOST=0.0.0.0
PORT=1337
# App keys (generate unique values!)
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
# Database (Railway provides DATABASE_URL automatically)
DATABASE_CLIENT=postgres
DATABASE_HOST=${PGHOST}
DATABASE_PORT=${PGPORT}
DATABASE_NAME=${PGDATABASE}
DATABASE_USERNAME=${PGUSER}
DATABASE_PASSWORD=${PGPASSWORD}
DATABASE_SSL=true
# Media storage (S3-compatible)
AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
AWS_REGION=us-east-1
AWS_BUCKET=your-strapi-uploadsJika Anda lebih suka kontainer, Anda dapat mendockerize Strapi dan mendeploynya di mana saja, lihat panduan kami tentang opsi kontainerisasi. Railway juga mendukung Nixpacks untuk build otomatis tanpa Dockerfile.
Daftar Periksa Produksi
Sebelum go-live, verifikasi hal-hal berikut:
- Build panel admin: Jalankan
npm run build, ini mengompilasi admin React untuk produksi - Process manager: Gunakan PM2 untuk menjaga Strapi tetap berjalan dan restart otomatis saat crash
- Health check: Strapi mengekspos
/_health(mengembalikan HTTP 204), arahkan load balancer Anda ke sana - Penyimpanan media: Beralih dari upload lokal ke S3 atau Cloudinary, penyimpanan lokal tidak bertahan di sebagian besar platform PaaS
- Reverse proxy: Letakkan Nginx atau Caddy di depan Strapi untuk terminasi SSL dan caching file statis
- Variabel lingkungan: Jangan pernah commit rahasia. Gunakan manajemen env var native platform
Strapi vs Sanity vs Contentful: Mana yang Harus Anda Pilih?
Memilih antara Strapi, Sanity, dan Contentful tergantung pada tiga hal: apakah Anda memerlukan self-hosting, bagaimana tim Anda berkolaborasi pada konten, dan batasan anggaran Anda. Ketiganya adalah platform CMS headless tingkat produksi, tetapi mereka membuat trade-off yang fundamentally berbeda. Untuk cakupan yang lebih dalam, periksa panduan Sanity CMS dan panduan Contentful kami.
| Kriteria | Strapi | Sanity | Contentful |
|---|---|---|---|
| Open Source | Ya (MIT) | Tidak (proprietary) | Tidak (proprietary) |
| Self-Hosting | Ya (wajib atau Cloud) | Tidak (hanya hosted) | Tidak (hanya hosted) |
| Kolaborasi Real-Time | Tidak | Ya (gaya Google Docs) | Terbatas |
| Bahasa Kueri | REST + GraphQL | GROQ + GraphQL | REST + GraphQL |
| Tier Gratis | Edisi Komunitas (tak terbatas) | 500K permintaan API/bln | 5 pengguna, 25K rekaman |
| Logika Backend Kustom | Akses Node.js penuh | Hanya fungsi serverless | Hanya webhook |
| Tata Kelola Enterprise | Berkembang | Kuat | Terkuat |
| Kurva Pembelajaran | Sedang (pengetahuan Node.js membantu) | Sedang (GROQ unik) | Rendah-Sedang |
Kerangka keputusan, pilih berdasarkan kendala aktual Anda:
| Jika Anda membutuhkan... | Pilih | Karena |
|---|---|---|
| Kepemilikan kode penuh + self-hosting | Strapi | Satu-satunya opsi open-source dengan akses backend penuh |
| Kolaborasi editorial real-time | Sanity | Editing multiplayer gaya Google Docs |
| Kepatuhan enterprise (SOC2, HIPAA) | Contentful | Alat tata kelola dan audit paling matang |
| Anggaran ketat (tim kecil) | Strapi Community | Gratis selamanya, self-hosted |
| Manajemen konten tanpa kode | WordPress | Masih yang termudah untuk non-pengembang |
| Logika API kustom tanpa layanan eksternal | Strapi | Controller, service, dan route dalam satu codebase |
Di Techsy, kami membangun arsitektur CMS headless menggunakan Strapi, Sanity, dan Contentful. Jika Anda membutuhkan bantuan memilih CMS yang tepat untuk proyek Anda atau menginginkan pengaturan Strapi yang siap produksi, dapatkan konsultasi gratis.
Kelebihan, Kekurangan, dan Kapan TIDAK Menggunakan Strapi yang Jujur
Setelah menguji Strapi 5 di tiga proyek klien, berikut adalah rincian jujurnya. Strapi sangat baik untuk tim yang menginginkan kontrol backend penuh, tetapi ini bukan alat yang tepat untuk semua orang.
Kelebihan:
- Kepemilikan kode penuh, data Anda, server Anda, aturan Anda
- Lisensi MIT tanpa vendor lock-in
- TypeScript-first di v5 dengan inferensi tipe yang kuat
- Endpoint REST dan GraphQL yang dihasilkan otomatis dari skema konten
- Komunitas aktif: 65.000+ bintang GitHub, Discord dengan 20.000+ anggota
- 500+ plugin di marketplace
- Controller kustom memberikan fleksibilitas backend tingkat Express.js
- Strapi Cloud menawarkan opsi terkelola jika Anda tidak ingin self-host
Kekurangan:
- Self-hosting memerlukan pekerjaan ops, harapakan 10-20 jam/bulan untuk pembaruan, pemantauan, dan backup
- Tidak ada kolaborasi real-time (dua editor dapat menimpa perubahan satu sama lain)
- Migrasi Strapi 4 ke 5 memiliki gesekan: Entity Service ke Document Service, format respons baru, kesenjangan kompatibilitas plugin
- Strapi Cloud masih matang dibandingkan dengan platform hosted Contentful atau Sanity
- Adopsi enterprise lebih kecil daripada Contentful, sertifikasi kepatuhan lebih sedikit
- Kustomisasi panel admin, meskipun mungkin, memerlukan pengetahuan mendalam tentang API internal Strapi
Kapan TIDAK menggunakan Strapi:
- Membutuhkan kolaborasi real-time, tim editorial Anda bekerja secara simultan pada konten? Gunakan Sanity. Strapi tidak memiliki editing multiplayer.
- Membutuhkan tata kelola enterprise dan SOC2, organisasi yang berat kepatuhan? Contentful memiliki keunggulan sepuluh tahun dalam alat tata kelola.
- Tim non-teknis, tanpa dukungan pengembang, Strapi memerlukan pengembang untuk pengaturan, deployment, dan pemeliharaan. Jika tim Anda semua marketer, pertimbangkan CMS SaaS atau WordPress.
- Arsitektur serverless-first, Strapi memerlukan server persisten. Jika Anda membangun sepenuhnya pada fungsi edge dan serverless, Sanity atau Contentful lebih cocok.
FAQ
Apa itu Strapi dan bagaimana cara kerjanya?
Strapi adalah CMS headless open-source yang dibangun di atas Node.js. Anda mendefinisikan tipe konten melalui pembangun visual atau kode, dan Strapi secara otomatis menghasilkan endpoint API REST dan GraphQL. Aplikasi frontend mengambil konten sebagai JSON dari endpoint ini. Panel admin menyediakan antarmuka berbasis React bagi editor konten untuk mengelola entri tanpa menulis kode.
Apakah Strapi gratis untuk digunakan?
Ya. Strapi Community Edition gratis dan open-source di bawah lisensi MIT. Anda dapat meng-hostnya sendiri di server Anda sendiri tanpa batas penggunaan, tanpa batasan seat, dan tanpa batas panggilan API. Strapi Cloud (opsi hosting terkelola) memiliki tier gratis dengan 10.000 panggilan API per bulan, dengan paket berbayar mulai dari $18/bulan untuk batas yang lebih tinggi.
Apa perbedaan antara Strapi dan Contentful?
Strapi adalah open-source dan self-hosted, memberi Anda akses kode penuh dan kepemilikan data. Contentful adalah platform SaaS proprietary dengan tata kelola enterprise yang lebih kuat, sertifikasi kepatuhan, dan set alat editorial yang lebih besar. Pilih Strapi untuk kontrol kode dan fleksibilitas anggaran. Pilih Contentful untuk kebutuhan kepatuhan enterprise dan tim editorial yang lebih besar yang memerlukan infrastruktur terkelola.
Apakah Strapi bagus untuk pemula?
Strapi ramah pemula jika Anda memiliki pengetahuan dasar Node.js dan JavaScript. Panel admin dan Content-Type Builder bersifat visual dan intuitif, tidak diperlukan kode untuk pemodelan konten. Deployment dan logika backend kustom memerlukan pengalaman pengembang. Untuk pemula absolut tanpa latar belakang coding, WordPress atau CMS SaaS yang sepenuhnya terkelola akan menjadi titik awal yang lebih mudah.
Basis data apa yang digunakan Strapi?
Strapi mendukung PostgreSQL, MySQL, MariaDB, dan SQLite. Proyek baru default ke SQLite untuk pengembangan tanpa pengaturan. PostgreSQL direkomendasikan untuk beban kerja produksi; ini adalah basis data yang paling banyak diuji dengan Strapi dan menangani akses konkuren, kueri kompleks, dan jenis bidang JSON dengan baik. Anda mengonfigurasi koneksi basis data di config/database.ts.
Bagaimana cara mendeploy Strapi ke produksi?
Anda dapat mendeploy Strapi ke Strapi Cloud (hosting terkelola mulai dari $18/bulan), atau self-host di platform seperti Railway, Render, DigitalOcean, atau AWS. Self-hosting memerlukan konfigurasi server Node.js, basis data PostgreSQL, variabel lingkungan, penyimpanan media (S3 atau Cloudinary), dan process manager seperti PM2. Jalankan npm run build sebelum mendeploy untuk mengompilasi panel admin.
Apakah Strapi lebih baik daripada WordPress?
Strapi dan WordPress memecahkan masalah yang berbeda. Strapi adalah CMS headless yang menyajikan API JSON ke frontend apa pun, ideal untuk pengembang yang membangun aplikasi kustom, pengiriman konten multi-platform, atau situs yang berat JavaScript. WordPress adalah CMS tradisional yang merender halaman HTML, lebih baik untuk pengguna non-teknis yang menginginkan tema, pembangun drag-and-drop, dan ekosistem plugin masif tanpa menulis kode.
Apa kerugian Strapi?
Kerugian utamanya adalah overhead operasional dari self-hosting (pembaruan, pemantauan, backup), kurangnya kolaborasi real-time untuk tim editorial, gesekan migrasi antar versi utama (v4 ke v5 memerlukan perubahan kode), dan penawaran enterprise yang kurang matang dibandingkan dengan Contentful. Strapi Cloud mengatasi beban hosting tetapi masih mengejar ketertinggalan dalam fitur dan ketersediaan global.
Dapatkah Strapi menangani aplikasi skala besar?
Ya. Strapi dapat menangani aplikasi skala besar dengan infrastruktur yang tepat: PostgreSQL dengan connection pooling, scaling horizontal di belakang load balancer, CDN untuk aset media, dan Redis untuk caching. Perusahaan seperti IBM, NASA, dan Toyota menggunakan Strapi dalam produksi. Bottleneck biasanya adalah kinerja basis data dan konfigurasi hosting, bukan Strapi itu sendiri.
Apa itu Strapi Cloud dan berapa biayanya?
Strapi Cloud adalah platform hosting terkelola resmi untuk proyek Strapi. Ini menangani penyediaan server, manajemen basis data, CDN, dan backup otomatis. Harga dimulai dengan tier gratis (1 proyek, 10K panggilan API/bulan), kemudian Essential seharga $18/bulan, Pro seharga $90/bulan, dan Scale seharga $450/bulan. Setiap tier meningkatkan batas panggilan API, seat tim, dan kapasitas penyimpanan.