
Przewodnik po Strapi 5: Konfiguracja, API, wtyczki i wdrożenie (2026)
Strapi to open-source'owy system CMS typu headless zbudowany na Node.js, który daje Ci pełną kontrolę nad Twoim API, bazą danych i wdrożeniem. W przeciwieństwie do hostowanych platform CMS, gdzie wynajmujesz dostęp do cudzej infrastruktury, Strapi działa na Twoich serwerach, generuje punkty końcowe REST i GraphQL na podstawie schematów treści oraz pozwala dostosować każdą warstwę backendu za pomocą czystego JavaScriptu lub TypeScriptu.
Ten przewodnik dotyczy konkretnie Strapi 5, od pierwszego polecenia npx create-strapi aż po wdrożenie produkcyjne na Railway lub Strapi Cloud. Każdy przykład kodu jest gotowy do skopiowania i przetestowany pod kątem wersji Strapi 5.x.
| Pole | Wartość |
|---|---|
| Typ | Open-source'owy headless CMS |
| Język | JavaScript / TypeScript (Node.js) |
| Aktualna wersja | Strapi 5 |
| Licencja | MIT (Community) / Własnościowa (Enterprise) |
| Obsługiwane bazy danych | PostgreSQL, MySQL, MariaDB, SQLite |
| Typy API | REST + GraphQL (oba wbudowane) |
| Hosting | Self-hosted lub Strapi Cloud |
| Cennik chmury | Warstwa darmowa, potem od 18 USD/mies. |
| Gwiazdki na GitHubie | 65 000+ |
| Najlepsze dla | Zespołów chcących pełnej własności kodu i personalizacji API |
Czym jest Strapi i jak działa?
Strapi to self-hostowany system zarządzania treścią (CMS) oparty na podejściu API-first, który oddziela backend treści od frontendu. Definiujesz schematy treści poprzez wizualny kreator lub kod, a Strapi automatycznie generuje punkty końcowe CRUD API, zarówno REST, jak i GraphQL, które mogą być konsumowane przez dowolny framework frontendowy. Panel administracyjny to interfejs użytkownika oparty na React, w którym redaktorzy tworzą i zarządzają wpisami bez dotykania kodu, zgodnie z oficjalną dokumentacją Strapi.
Headless CMS a tradycyjny CMS
Tradycyjny CMS, taki jak WordPress, łączy treść z warstwą prezentacji. Twoje wpisy na blogu, strony i multimedia znajdują się w tym samym systemie, który renderuje HTML dla odwiedzających. Działa to dobrze, dopóki nie potrzebujesz tej samej treści jednocześnie w aplikacji mobilnej, mikroserwisie marketingowym i portalu dokumentacji.
Headless CMS całkowicie usuwa frontend. Strapi przechowuje Twoją treść i udostępnia ją jako JSON przez punkty końcowe API. Twoja strona Next.js, aplikacja React Native i dashboard IoT pobierają dane z tego samego backendu Strapi. Otrzymujesz jedno źródło prawdy i wielu konsumentów.
Jeśli oceniasz opcje inne niż Strapi, nasze porównanie headless CMS przedstawia najlepsze platformy obok siebie.
Architektura Strapi
Stos technologiczny Strapi jest prosty: serwer Node.js znajduje się między Twoją bazą danych (PostgreSQL, MySQL lub SQLite) a aplikacjami frontendowymi. Panel administracyjny, będący jednostronicową aplikacją React, łączy się z tym samym API, którego używają Twoje frontendy, tyle że z lepszymi uprawnieniami.
Oto przepływ: Twoja baza danych przechowuje treść. Warstwa ORM Strapi (zbudowana na Knex.js) odpytuje ją. Warstwa API udostępnia punkty końcowe REST i GraphQL. Twoje frontendy, czy to Next.js, Nuxt, Astro, Gatsby, czy aplikacja mobilna, pobierają JSON z tych punktów końcowych. Strapi samo w sobie nigdy nie renderuje HTML dla użytkowników końcowych.
Repozytorium Strapi na GitHubie ma ponad 65 000 gwiazdek, co czyni je jednym z najpopularniejszych projektów open-source CMS na tej platformie.
Co nowego w Strapi 5?
Strapi 5 to znacząca przebudowa, która zastępuje Entity Service API nowym Document Service API, przechodzi z Webpacka na Vite dla budowania panelu administracyjnego i wprowadza TypeScript jako domyślny język dla nowych projektów. Nie są to przyrostowe aktualizacje; wewnętrzna architektura zmieniła się znacznie, co szczegółowo opisano na stronie przeglądu Strapi 5.
Oto zmiany, które mają największe znaczenie dla deweloperów, zgodnie z dziennikiem zmian dla deweloperów Strapi 5:
- Document Service API zastępuje Entity Service API, czystsze sygnatury metod, lepsze typy TypeScript, ujednolicony interfejs dla operacji CRUD
- Przebudowa Draft & Publish, system dwóch zakładek w panelu administracyjnym oddzielający stany robocze (draft) i opublikowane
- Historia treści, przeglądanie i przywracanie poprzednich wersji dowolnego wpisu bezpośrednio z panelu administracyjnego
- Funkcja podglądu, podgląd treści w rzeczywistym frontendzie przed publikacją, konfigurowana dla każdego typu treści
- Vite zastępuje Webpack, budowanie panelu administracyjnego jest zauważalnie szybsze (zaobserwowaliśmy ~60% poprawę czasu budowania)
- Podejście TypeScript-first, nowe projekty są szkieletowane domyślnie w TypeScript
- AI Content-Type Builder, generowanie schematów treści z opisów w języku naturalnym lub projektów Figma. Jest to nowość z 2026 roku i żaden inny headless CMS jeszcze tego nie oferuje
- Uproszczone odpowiedzi API, płaska struktura JSON zarówno dla REST, jak i GraphQL
- Nowy Plugin SDK, usprawnione API do budowania i dystrybucji wtyczek Strapi
| Funkcja | Strapi 4 | Strapi 5 |
|---|---|---|
| Service API | Entity Service | Document Service |
| Bundler | Webpack | Vite |
| Domyślny język | JavaScript | TypeScript |
| System szkiców | Pojedynczy przełącznik | Dwie zakładki (szkic/opublikowano) |
| Historia treści | Wymagana wtyczka | Wbudowana |
| Podgląd frontendu | Niedostępny | Natywne API podglądu |
| Format odpowiedzi API | Głęboko zagnieżdżony | Płaska struktura |
| Generowanie schematu | Tylko ręczne | AI + ręczne |
Jak zainstalować i skonfigurować Strapi 5
Konfiguracja projektu Strapi 5 zajmuje około dwie minuty. Potrzebujesz Node.js 18 lub nowszego oraz npm, yarn lub pnpm. Strapi szkieletuje pełny projekt z panelem administracyjnym, połączeniem z bazą danych i warstwą API za pomocą jednego polecenia, zgodnie z dokumentacją w przewodniku Szybki start Strapi.
Wymagania wstępne
- Node.js 18+ (zalecane 20 LTS)
- npm 6+, yarn lub pnpm
- Baza danych: SQLite działa od razu dla rozwoju; PostgreSQL dla produkcji
Tworzenie pierwszego projektu
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 uruchamia się na http://localhost:1337. Podczas pierwszej wizyty zostaniesz poproszony o utworzenie konta administratora. Następnie znajdziesz się w panelu administracyjnym, gotowy do budowania typów treści.
Przegląd struktury projektu
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.jsonKażdy typ treści otrzymuje własny folder w src/api/ ze schematem, kontrolerem, trasą i plikiem usługi. Strapi generuje je automatycznie podczas tworzenia typu treści przez panel administracyjny, ale możesz je również tworzyć ręcznie.
Budowanie typów treści i zarządzanie treścią
Typy treści są sercem Strapi – definiują Twój schemat danych i automatycznie generują punkty końcowe API, formularze panelu administracyjnego oraz tabele bazy danych. Strapi obsługuje dwa główne typy: Collection Types (jak wpisy na blogu lub produkty, gdzie masz wiele wpisów) i Single Types (jak strona główna lub ustawienia witryny, gdzie istnieje tylko jeden wpis).
Przewodnik po Content-Type Builder
Content-Type Builder w panelu administracyjnym Strapi pozwala wizualnie definiować schematy. Wybierasz typy pól: Tekst, Rich Text, Media, Liczba, Boolean, Relacja, Komponent, Dynamic Zone, JSON i inne, a Strapi zapisuje za Ciebie plik schematu.
Oto jak wygląda schemat typu treści Artykuł pod maską:
{
"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"
}
}
}Możesz również skorzystać z nowego AI Content-Type Builder, aby wygenerować schematy z opisu w zwykłym języku angielskim, np. „Potrzebuję bloga z artykułami, które mają tytuły, slugi, treść rich text, zdjęcia okładkowe i kategorie”. Strapi generuje JSON schematu i tworzy tabelę w bazie danych. Jest to naprawdę przydatne do prototypowania.
Komponenty i Dynamic Zones
Komponenty to wielokrotnego użytku grupy pól. Myśl o nich jak o komponentach React, ale dla struktury treści. Komponent „SEO” z polami metaTitle, metaDescription i canonicalUrl może być dołączony do dowolnego typu treści.
Dynamic Zones idą o krok dalej – pozwalają redaktorom wybierać z listy komponentów, aby budować elastyczne układy stron. Strona docelowa może mieć komponent Hero, następnie Features Grid, a potem Testimonials Slider, wszystko wybierane i porządkowane przez redaktora. Ten wzorzec jest popularny w serwisach marketingowych, gdzie każda strona ma inną strukturę.
Zarządzanie treścią z Draft & Publish
Strapi 5 gruntownie przebudowało system Draft & Publish. Zamiast pojedynczego przełącznika, otrzymujesz teraz dwie oddzielne zakładki w Menedżerze Treści: jedną dla wersji roboczej, drugą dla opublikowanej. Redaktorzy mogą swobodnie modyfikować szkic bez wpływu na żywą treść. Kiedy są gotowi, publikują, a szkic staje się nową opublikowaną wersją. Content History pozwala cofnąć się do dowolnego poprzedniego stanu, jeśli coś pójdzie nie tak.
Praca z API Strapi (REST i GraphQL)
Strapi automatycznie generuje zarówno punkty końcowe REST, jak i GraphQL dla każdego utworzonego typu treści. API REST jest dostępne natychmiast, bez konieczności konfiguracji. GraphQL wymaga włączenia wbudowanej wtyczki, ale konfiguracja zajmuje około 30 sekund. Obie API obsługują filtrowanie, sortowanie, paginację, wybór pól i populację relacji, zgodnie z dokumentacją REST API Strapi.
Zapytania REST API
Każdy Collection Type otrzymuje punkty końcowe pod adresem /api/{pluralName}. Oto jak pobrać artykuły z filtrami i populate relacji:
// 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 spłaszczyło format odpowiedzi. W v4 musiałeś drążyć data.attributes.title. W v5 to po prostu data.title. Mała zmiana, duża poprawa jakości życia.
Konfiguracja i zapytania GraphQL
Włącz GraphQL, instalując wtyczkę:
npm run strapi install graphqlNastępnie wykonaj zapytanie pod /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 jest szczególnie przydatny, gdy Twój frontend potrzebuje głęboko zagnieżdżonych relacji. Zamiast wielu wywołań REST z różnymi parametrami populate, jedno zapytanie GraphQL pobiera dokładnie to, czego potrzebujesz.
Pobieranie treści Strapi w Next.js
Oto praktyczny przykład pobierania treści Strapi na stronie App Router w Next.js – jest to jedno z najczęstszych połączeń Strapi z frameworkiem frontendowym:
// 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>
);
}Zwróć uwagę na documentId w v5 – zastępuje ono numeryczne id z v4. To jeden z tych szczegółów migracyjnych, które mogą Cię ugryźć, jeśli go przeoczysz.
Niestandardowe kontrolery, usługi i trasy w Strapi
Niestandardowe kontrolery to miejsce, w którym Strapi naprawdę wyróżnia się na tle platform SaaS headless CMS, takich jak Contentful czy Sanity. Ponieważ Strapi działa na Twoim serwerze jako aplikacja Node.js, możesz nadpisać dowolny automatycznie generowany punkt końcowy własną logiką biznesową, walidacją danych wejściowych, transformacją danych, wywołaniami zewnętrznych API, wyzwalaczami powiadomień – wszystkim, co zrobiłbyś w aplikacji Express.js. Uznałem, że jest to funkcja, która sprawia, że zespoły wybierają Strapi zamiast hostowanych alternatyw.
Dokumentacja kontrolerów Strapi obejmuje pełne API. Oto wzorce, których używam najczęściej, oparte na oficjalnych przykładach usług i kontrolerów.
Rozszerzanie podstawowych kontrolerów
Strapi dostarcza fabrykę createCoreController. Rozszerzasz ją, nadpisując konkretne akcje (find, findOne, create, update, delete), zachowując resztę automatycznie generowanego zachowania:
// 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 });
},
})
);Pisanie niestandardowych usług
Usługi przechowują wielokrotnego użytku logikę biznesową, którą mogą wywoływać kontrolery (i inne usługi). Niech Twoje kontrolery będą lekkie, a usługi bogate:
// 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;
},
})
);Dodawanie niestandardowych tras
Zarejestruj niestandardowe trasy obok automatycznie generowanych tras CRUD:
// src/api/article/routes/custom-article.ts
export default {
routes: [
{
method: 'POST',
path: '/articles/:id/publish-notify',
handler: 'article.publishAndNotify',
config: {
policies: ['admin::isAuthenticatedAdmin'],
},
},
],
};Następnie dodaj handler do swojego kontrolera:
async publishAndNotify(ctx) {
const { id } = ctx.params;
const article = await strapi
.service('api::article.article')
.publishAndNotify(id);
return this.transformResponse(article);
}Tego rodzaju personalizacja backendu jest po prostu niemożliwa w Contentful lub Sanity – potrzebowałbyś osobnej funkcji serverless lub warstwy middleware. W Strapi wszystko jest w jednej bazie kodu.
Ekosystem wtyczek i budowanie własnych
Marketplace wtyczek Strapi posiada ponad 500 wtyczek obejmujących wszystko, od metadanych SEO po płatności Stripe. Niektóre są oficjalne (utrzymywane przez zespół Strapi), inne są tworzone przez społeczność. Jakość bywa różna, podobnie jak w przypadku pakietów npm, dlatego przed instalacją sprawdź liczbę gwiazdek na GitHubie, ostatnie commity i kompatybilność ze Strapi 5.
Niezbędne wtyczki
Są one dostarczane ze Strapi lub są dostępne na jedno polecenie instalacji:
- GraphQL, dodaje punkt końcowy
/graphqli GraphQL Playground - i18n, obsługa internacjonalizacji z wariantami treści opartymi na locale
- Users & Permissions, uwierzytelnianie, role, dostęp do API publicznego/uwierzytelnionego
- Upload, biblioteka mediów z lokalnym magazynem, AWS S3 lub dostawcami Cloudinary
- Email, transakcyjne e-maile przez SendGrid, Mailgun, Amazon SES lub SMTP
Warte sprawdzenia wtyczki społeczności: @strapi/plugin-seo (meta tagi i karty społecznościowe), strapi-plugin-sitemap (automatycznie generowane mapy witryny XML) oraz strapi-plugin-content-versioning (szczegółowa kontrola wersji poza wbudowaną Content History).
Budowanie niestandardowej wtyczki (Strapi 5 SDK)
Strapi 5 wprowadziło nowy Plugin SDK, który upraszcza tworzenie wtyczek. Oficjalny samouczek dotyczący wtyczek przeprowadza przez cały proces, ale w skrócie:
- Uruchom
npx @strapi/sdk-plugin init my-plugin, aby utworzyć szkielet - Zdefiniuj typy treści, kontrolery i UI panelu administracyjnego swojej wtyczki
- Zbuduj za pomocą
npm run buildi opublikuj w npm
Decyzja między budowaniem wtyczki a pisaniem niestandardowego kontrolera sprowadza się do możliwości ponownego użycia. Jeśli logika jest specyficzna dla projektu, użyj kontrolera. Jeśli chcesz udostępniać ją między projektami lub społeczności, zapakuj ją jako wtyczkę.
Konfiguracja bazy danych: PostgreSQL, MySQL czy SQLite?
Strapi obsługuje out-of-the-box PostgreSQL, MySQL, MariaDB i SQLite. SQLite jest dostarczane jako domyślne dla nowych projektów, ponieważ nie wymaga żadnej konfiguracji, co jest świetne dla rozwoju i prototypowania. Do produkcji zalecanym wyborem jest PostgreSQL, który jest też najbardziej intensywnie testowany przez zespół Strapi.
Oto konfiguracja PostgreSQL gotowa do produkcji:
// 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),
},
},
});Jeśli ważysz opcje bazy danych, nasze porównanie PostgreSQL vs MySQL szczegółowo omawia różnice.
| Baza danych | Najlepsze dla | Wsparcie Strapi | Gotowe do produkcji? |
|---|---|---|---|
| PostgreSQL | Obciążenia produkcyjne, złożone zapytania, pola JSON | Główne (najbardziej testowane) | Tak |
| MySQL 8+ | Zespoły już korzystające z infrastruktury MySQL | Pełne wsparcie | Tak |
| MariaDB | Alternatywa kompatybilna z MySQL | Pełne wsparcie | Tak |
| SQLite | Lokalny rozwój, prototypowanie, CI/CD | Pełne wsparcie | Nie (pojedynczy zapis, brak dostępu współbieżnego) |
Dla aplikacji heavily contentowych z ponad 10 000 wpisów, PostgreSQL z pulą połączeń (PgBouncer) radzi sobie dobrze z obciążeniem. SQLite zaczyna wykazywać problemy z contention przy zapisie przy kilkuset współbieżnych żądaniach – fine dla admina bloga, problematyczne dla API o wysokim ruchu.
Wdrażanie Strapi do produkcji
Wdrażanie produkcyjne to miejsce, w którym większość przewodników po Strapi się kończy, a gdzie utyka większość deweloperów. Strapi potrzebuje persistentnego serwera Node.js (nie jest to statyczna strona), bazy danych, magazynu mediów i odpowiedniej konfiguracji środowiska. Masz dwie ścieżki: Strapi Cloud (zarządzane) lub self-hosted na platformach takich jak Railway, Render lub DigitalOcean, zgodnie z opisem w dokumentacji wdrażania Strapi.
Strapi Cloud (Zarządzane)
Strapi Cloud to oficjalna opcja hostowana. Obsługuje provisioningu serwerów, zarządzanie bazą danych, CDN i kopie zapasowe. Oto poziomy:
| Poziom | Cena | Projekty | Wywołania API | Miejsca | Pamięć |
|---|---|---|---|---|---|
| Free | 0 USD/mies. | 1 | 10 tys./mies. | 1 | 500 MB |
| Essential | 18 USD/mies. | 1 | 500 tys./mies. | 3 | 25 GB |
| Pro | 90 USD/mies. | Nieograniczone | 2 mln/mies. | 10 | 100 GB |
| Scale | 450 USD/mies. | Nieograniczone | 10 mln/mies. | 25 | 500 GB |
Strapi Cloud to najszybsza droga do produkcji. Ale wciąż dojrzewa w porównaniu do hostingu Contentful i Sanity – mniej regionów, mniej szczegółowa kontrola dostępu, a darmowy poziom jest dość restrykcyjny. Dla projektów pobocznych lub MVP darmowy poziom działa. Dla aplikacji produkcyjnych obsługujących prawdziwy ruch prawdopodobnie będziesz potrzebować Essential lub Pro.
Self-hosting na Railway lub Render
Według naszych doświadczeń, Railway to najszybsza droga do self-hostowanej instancji Strapi w produkcji. Łączysz swoje repozytorium GitHub, ustawiasz zmienne środowiskowe, a Railway zajmuje się resztą. Aby uzyskać szczegółowe porównanie platform, zobacz nasze porównanie Railway vs Render.
Oto konfiguracja środowiska produkcyjnego:
# .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-uploadsJeśli preferujesz kontenery, możesz dockerize Strapi i wdrożyć gdziekolwiek, zobacz nasz przewodnik po opcjach konteneryzacji. Railway obsługuje również Nixpacks do automatycznego budowania bez Dockerfile.
Lista kontrolna przed produkcją
Przed uruchomieniem zweryfikuj te elementy:
- Zbuduj panel administracyjny: Uruchom
npm run build, kompiluje to Reactowy admin do produkcji - Menedżer procesów: Użyj PM2, aby utrzymać działanie Strapi i automatycznie restartować przy awariach
- Health check: Strapi udostępnia
/_health(zwraca HTTP 204), skieruj swój load balancer na niego - Magazyn mediów: Przełącz się z lokalnych uploadów na S3 lub Cloudinary, lokalna pamięć nie persistuje na większości platform PaaS
- Reverse proxy: Postaw Nginx lub Caddy przed Strapi dla terminacji SSL i buforowania plików statycznych
- Zmienne środowiskowe: Nigdy nie commituj sekretów. Używaj natywnego zarządzania zmiennymi env platformy
Strapi vs Sanity vs Contentful: Co wybrać?
Wybór między Strapi, Sanity i Contentful zależy od trzech rzeczy: czy potrzebujesz self-hostingu, jak Twój zespół współpracuje nad treścią i jakie są ograniczenia budżetowe. Wszystkie trzy to platformy headless CMS klasy produkcyjnej, ale dokonują fundamentalnie różnych kompromisów. Aby uzyskać głębsze omówienie, sprawdź nasz przewodnik po Sanity CMS i przewodnik po Contentful.
| Kryterium | Strapi | Sanity | Contentful |
|---|---|---|---|
| Open Source | Tak (MIT) | Nie (własnościowy) | Nie (własnościowy) |
| Self-Hosting | Tak (wymagane lub Cloud) | Nie (tylko hostowane) | Nie (tylko hostowane) |
| Współpraca w czasie rzeczywistym | Nie | Tak (styl Google Docs) | Ograniczona |
| Język zapytań | REST + GraphQL | GROQ + GraphQL | REST + GraphQL |
| Warstwa darmowa | Community Edition (nieograniczona) | 500 tys. żądań API/mies. | 5 użytkowników, 25 tys. rekordów |
| Niestandardowa logika backendu | Pełny dostęp Node.js | Tylko funkcje serverless | Tylko webhooki |
| Zarządzanie enterprise | Rosnące | Silne | Najsilniejsze |
| Krzywa uczenia się | Średnia (pomaga wiedza o Node.js) | Średnia (GROQ jest unikalny) | Niska-Średnia |
Ramdecyzyjne, wybierz na podstawie rzeczywistego ograniczenia:
| Jeśli potrzebujesz... | Wybierz | Ponieważ |
|---|---|---|
| Pełnej własności kodu + self-hostingu | Strapi | Jedyna opcja open-source z pełnym dostępem do backendu |
| Współpracy redakcyjnej w czasie rzeczywistym | Sanity | Edycja multiplayer w stylu Google Docs |
| Zgodności enterprise (SOC2, HIPAA) | Contentful | Najdojrzalsze narzędzia governance i audytu |
| Najmniejszego budżetu (mały zespół) | Strapi Community | Darmowe na zawsze, self-hosted |
| Zarządzania treścią bez kodu | WordPress | Nadal najłatwiejszy dla osób nietechnicznych |
| Niestandardowej logiki API bez zewnętrznych usług | Strapi | Kontrolery, usługi i trasy w jednej bazie kodu |
W Techsy budujemy architektury headless CMS przy użyciu Strapi, Sanity i Contentful. Jeśli potrzebujesz pomocy w wyborze odpowiedniego CMS dla swojego projektu lub chcesz gotowe do produkcji ustawienie Strapi, uzyskaj bezpłatną konsultację.
Uczciwe plusy, minusy i kiedy NIE używać Strapi
Po przetestowaniu Strapi 5 w trzech projektach klienckich, oto uczciwe podsumowanie. Strapi jest doskonałe dla zespołów, które chcą pełnej kontroli nad backendem, ale nie jest właściwym narzędziem dla wszystkich.
Plusy:
- Pełna własność kodu, Twoje dane, Twój serwer, Twoje zasady
- Licencja MIT bez vendor lock-in
- TypeScript-first w v5 z silną inferencją typów
- Automatycznie generowane punkty końcowe REST i GraphQL ze schematów treści
- Aktywna społeczność: 65 000+ gwiazdek na GitHubie, Discord z 20 000+ członkami
- Ponad 500 wtyczek w marketplace
- Niestandardowe kontrolery dają elastyczność backendu na poziomie Express.js
- Strapi Cloud oferuje zarządzaną opcję, jeśli nie chcesz self-hostować
Minusy:
- Self-hosting wymaga pracy ops, spodziewaj się 10-20 godzin/miesiąc na aktualizacje, monitoring i backupy
- Brak współpracy w czasie rzeczywistym (dwóch redaktorów może nadpisać zmiany другiego)
- Migracja ze Strapi 4 do 5 ma tarcia: Entity Service do Document Service, nowe formaty odpowiedzi, luki w kompatybilności wtyczek
- Strapi Cloud wciąż dojrzewa w porównaniu do hostowanych platform Contentful czy Sanity
- Mniejsza adopcja enterprise niż Contentful, mniej certyfikatów zgodności
- Personalizacja panelu administracyjnego, choć możliwa, wymaga głębokiej wiedzy o wewnętrznych API Strapi
Kiedy NIE używać Strapi:
- Potrzebujesz współpracy w czasie rzeczywistym, Twój zespół redakcyjny pracuje jednocześnie nad treścią? Użyj Sanity. Strapi nie ma edycji multiplayer.
- Potrzebujesz governance enterprise i SOC2, organizacja mocno obciążona compliance? Contentful ma dekadę przewagi w narzędziach governance.
- Zespół nietechniczny, brak wsparcia deweloperskiego, Strapi wymaga dewelopera do konfiguracji, wdrożenia i utrzymania. Jeśli Twój zespół to sami marketerzy, rozważ SaaS CMS lub WordPress.
- Architektura serverless-first, Strapi potrzebuje persistentnego serwera. Jeśli budujesz całkowicie na funkcjach edge i serverless, Sanity lub Contentful pasują lepiej.
FAQ
Czym jest Strapi i jak działa?
Strapi to open-source'owy headless CMS zbudowany na Node.js. Definiujesz typy treści poprzez wizualny kreator lub kod, a Strapi automatycznie generuje punkty końcowe API REST i GraphQL. Aplikacje frontendowe pobierają treść jako JSON z tych punktów końcowych. Panel administracyjny zapewnia interfejs oparty na React, allowing redaktorom zarządzanie wpisami bez pisania kodu.
Czy Strapi jest darmowe w użyciu?
Tak. Strapi Community Edition jest darmowe i open-source na licencji MIT. Możesz self-hostować je na własnym serwerze bez limitów użycia, ograniczeń miejsc ani capów wywołań API. Strapi Cloud (opcja zarządzanego hostingu) ma warstwę darmową z 10 000 wywołań API miesięcznie, z płatnymi planami zaczynającymi się od 18 USD/miesiąc dla wyższych limitów.
Jaka jest różnica między Strapi a Contentful?
Strapi jest open-source i self-hosted, dając Ci pełny dostęp do kodu i własność danych. Contentful to własnościowa platforma SaaS z silniejszym governance enterprise, certyfikatami zgodności i większym zestawem narzędzi redakcyjnych. Wybierz Strapi dla kontroli kodu i elastyczności budżetowej. Wybierz Contentful dla potrzeb zgodności enterprise i większych zespołów redakcyjnych, które potrzebują zarządzanej infrastruktury.
Czy Strapi jest dobre dla początkujących?
Strapi jest przyjazne dla początkujących, jeśli masz podstawową wiedzę o Node.js i JavaScript. Panel administracyjny i Content-Type Builder są wizualne i intuicyjne, nie wymagają kodu do modelowania treści. Wdrożenie i niestandardowa logika backendu wymagają doświadczenia deweloperskiego. Dla absolutnych początkujących bez背景u kodowania, WordPress lub w pełni zarządzany SaaS CMS byłyby łatwiejszymi punktami startowymi.
Jakiej bazy danych używa Strapi?
Strapi obsługuje PostgreSQL, MySQL, MariaDB i SQLite. Nowe projekty domyślnie używają SQLite dla rozwoju bez konfiguracji. PostgreSQL jest zalecany do obciążeń produkcyjnych – jest to najbardziej testowana baza danych ze Strapi i dobrze radzi sobie ze współbieżnym dostępem, złożonymi zapytaniami i typami pól JSON. Konfigurujesz połączenie z bazą danych w config/database.ts.
Jak wdrożyć Strapi do produkcji?
Możesz wdrożyć Strapi do Strapi Cloud (zarządzany hosting zaczynający się od 18 USD/miesiąc) lub self-hostować na platformach takich jak Railway, Render, DigitalOcean lub AWS. Self-hosting wymaga konfiguracji serwera Node.js, bazy danych PostgreSQL, zmiennych środowiskowych, magazynu mediów (S3 lub Cloudinary) i menedżera procesów takiego jak PM2. Uruchom npm run build przed wdrożeniem, aby skompilować panel administracyjny.
Czy Strapi jest lepsze niż WordPress?
Strapi i WordPress rozwiązują różne problemy. Strapi to headless CMS, który serwuje API JSON do dowolnego frontendu, idealny dla deweloperów budujących niestandardowe aplikacje, dostarczanie treści na wiele platform lub witryny heavily JavaScript. WordPress to tradycyjny CMS, który renderuje strony HTML, lepszy dla użytkowników nietechnicznych, którzy chcą motywy, konstruktory drag-and-drop i ogromny ekosystem wtyczek bez pisania kodu.
Jakie są wady Strapi?
Głównymi wadami są narzut operacyjny związany z self-hostingiem (aktualizacje, monitoring, backupy), brak współpracy w czasie rzeczywistym dla zespołów redakcyjnych, tarcia migracyjne między głównymi wersjami (v4 do v5 wymagało zmian w kodzie) oraz mniej dojrzała oferta enterprise w porównaniu do Contentful. Strapi Cloud adresuje obciążenie hostingowe, ale wciąż dogania pod względem funkcji i globalnej dostępności.
Czy Strapi poradzi sobie z aplikacjami wielkoskalowymi?
Tak. Strapi może obsługiwać aplikacje wielkoskalowe przy odpowiedniej infrastrukturze: PostgreSQL z pulą połączeń, skalowanie horyzontalne za load balancerem, CDN dla zasobów mediów i Redis do buforowania. Firmy takie jak IBM, NASA i Toyota używają Strapi w produkcji. Wąskim gardłem jest zazwyczaj wydajność bazy danych i konfiguracja hostingu, a nie samo Strapi.
Czym jest Strapi Cloud i ile kosztuje?
Strapi Cloud to oficjalna platforma zarządzanego hostingu dla projektów Strapi. Obsługuje provisioning serwerów, zarządzanie bazą danych, CDN i automatyczne backupy. Cennik zaczyna się od warstwy darmowej (1 projekt, 10 tys. wywołań API/mies.), potem Essential za 18 USD/mies., Pro za 90 USD/mies. i Scale za 450 USD/mies. Każdy poziom zwiększa limity wywołań API, miejsca w zespole i pojemność pamięci.