בניית פלטפורמת פרסום מודרנית עם Ghost CMS, Next.js ומנויים
הבעיה האופיינית: CMS כבד לבלוג
כבר יש לך אתר ראשי, אבל צריך מערכת נפרדת לבלוג. WordPress כבד — עדכונים תמידיים, עשרות תוספים, גיבויים תכופים. אתה רוצה משהו קליל, ממוקד בטקסט, עם יכולות מונטיזציה מובנות. Ghost CMS הוא בדיוק זה: עורך כרטיסים, ניוזלטרים מובנים, מנויים בתשלום. אירוח עצמי נותן לך שליטה מלאה על הנתונים והתצורה. הניסיון שלנו — מעל 30 הטמעות של Ghost — מאשר: לקוחות חוסכים עד 50% בעלויות אירוח בהשוואה ל-Ghost(Pro), ו-LCP יורד מ-3 שניות ל-1.2 שניות. זמן השהייה באתר עולה עד 40%. 90% מהלקוחות שלנו עוברים מ-WordPress ל-Ghost ולא מסתכלים אחורה. לדוגמה, לקוח חסך $1068 בשנה על ידי אירוח עצמי בשרת של $10 לחודש במקום Ghost(Pro) ב-$99 לחודש.
איך להגדיר Content API ל-React?
לתרחיש headless, Ghost משמש כשרת backend. התקן את החבילה @tryghost/content-api, אתחל אותה עם ה-URL והמפתח, ולאחר מכן ברכיבי React קרא ל-ghost.posts.browse(). התשובה היא JSON עם פוסטים, מחברים ותגיות. ה-Ghost Content API הוא לקריאה בלבד; לכתיבה, השתמש ב-Ghost Admin API. אינטגרציה זו עולה בדרך כלל $500–$1500 ואורכת 2–3 ימים.
למה Ghost באירוח עצמי זול יותר מהענן?
Ghost Cloud מתחיל ב-$9 לחודש אבל מגביל התאמה אישית. אירוח עצמי על Docker נותן לך שליטה מלאה: גרסאות, תוספים, ערכות עיצוב. אתה משלם רק על השרת (החל מ-$5 לחודש) ומרחיב לפי הצורך. לדוגמה, אירוח עצמי בשרת של $5 חוסך $4 לחודש או $48 בשנה בהשוואה ל-Ghost(Pro) ב-$9 לחודש. Ghost מהיר פי 2–3 מ-WordPress. לדוגמה, תוכנית Ghost Cloud טיפוסית עולה $99 לחודש, בעוד אירוח עצמי בשרת של $10 לחודש חוסך $89 לחודש או $1068 בשנה. החיסכון הממוצע הוא 40–60% מתקציב האירוח. קבל הערכת פרויקט עבור ההתקנה שלך.
איך אנחנו עושים את זה: טכנולוגיות ותצורות
Content API — הבסיס לקריאה
Ghost מספק Ghost Content API ציבורי ו-Ghost Admin API פרטי. עבור הפרונטאנד, ה-Ghost Content API מספיק. התקן את החבילה:
npm install @tryghost/content-api // lib/ghost.ts
import GhostContentAPI from '@tryghost/content-api'
export const ghost = new GhostContentAPI({
url: process.env.GHOST_URL!,
key: process.env.GHOST_CONTENT_KEY!,
version: 'v5.0',
})
export async function getPosts(options = {}) {
return ghost.posts.browse({
limit: 'all',
include: ['tags', 'authors'],
filter: 'visibility:public',
order: 'published_at DESC',
...options,
})
}
export async function getPostBySlug(slug: string) {
return ghost.posts.read({ slug }, { include: ['tags', 'authors'] })
}האינטגרציה משתמשת ב-incremental static regeneration (ISR) עם מרווח revalidation ניתן להגדרה ו-webhook revalidation לפי דרישה המופעל על ידי אירוע post.published של Ghost. ה-Ghost Content API הוא RESTful ותומך בכותרות מטמון לאינטגרציה יעילה עם CDN. אנחנו גם מטפלים ב-Stripe webhooks לאירועי מנויים.
אינטגרציה עם Next.js 14: ISR ו-webhook
// app/blog/page.tsx и app/blog/[slug]/page.tsx (объединённый фрагмент)
import { getPosts, getPostBySlug } from '@/lib/ghost'
export const revalidate = 3600
export default async function BlogPage() {
const posts = await getPosts({ limit: 20 })
return (
<div className="grid gap-8 md:grid-cols-2 lg:grid-cols-3">
{posts.map(post => (
<article key={post.id}>
{post.feature_image && (
<img src={post.feature_image} alt={post.feature_image_alt || post.title} />
)}
<h2><a href={`/blog/${post.slug}`}>{post.title}</a></h2>
<p>{post.excerpt}</p>
<time>{new Date(post.published_at!).toLocaleDateString('ru-RU')}</time>
</article>
))}
</div>
)
}
export async function generateStaticParams() {
const posts = await getPosts({ fields: ['slug'] })
return posts.map(p => ({ slug: p.slug }))
}
export default async function PostPage({ params }) {
const post = await getPostBySlug(params.slug).catch(() => notFound())
return (
<article>
<h1>{post.title}</h1>
<div className="prose prose-lg max-w-none" dangerouslySetInnerHTML={{ __html: post.html! }} />
</article>
)
}Webhook ל-revalidation:
// app/api/ghost-webhook/route.ts
import { revalidatePath, revalidateTag } from 'next/cache'
export async function POST(request: Request) {
const body = await request.json()
const { event } = body
if (['post.published', 'post.updated', 'post.deleted'].includes(event)) {
revalidateTag('ghost-posts')
revalidatePath('/blog')
}
return new Response('OK')
} פרטי הגדרת Webhook ב-Ghost
בפאנל הניהול של Ghost, עבור אל Integrations → Add custom integration. העתק את מפתח הסוד. בהגדרות ה-webhook, הזן את כתובת ה-endpoint שלך ובחר אירועים: Post published, Post updated, Post deleted. Ghost ישלח בקשת POST עם גוף JSON.ארכיטקטורה זו יוצרת בלוג JAMstack אמיתי עם דפים מעובדים מראש. האינטגרציה של Next.js עם Ghost חלקה, וה-Ghost Content API מספק שכבת קריאה מהירה. התאמת ערכות עיצוב של Ghost נעשית באמצעות תבניות Handlebars, והגדרת מנויי Ghost עם Stripe היא פשוטה. תצורת Docker Ghost שלנו משתמשת ב-MySQL כבסיס נתונים.
Ghost באירוח עצמי על Docker
# docker-compose.yml
services:
ghost:
image: ghost:5-alpine
restart: always
environment:
url: https://blog.example.com
database__client: mysql
database__connection__host: db
database__connection__user: ghost
database__connection__password: ${DB_PASSWORD}
database__connection__database: ghost
mail__transport: SMTP
mail__options__service: Mailgun
mail__options__auth__user: ${MAILGUN_USER}
mail__options__auth__pass: ${MAILGUN_PASS}
volumes:
- ghost-content:/var/lib/ghost/content
ports:
- "2368:2368"
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ghost
MYSQL_USER: ghost
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql-data:/var/lib/mysql
Ghost תומך ב-SQLite לפרויקטים קטנים, אבל בייצור אנחנו תמיד משתמשים ב-MySQL.
תהליך העבודה
- ניתוח: דיון על הטכנולוגיות, נפח התוכן, דרישות מונטיזציה. קבל הערכת פרויקט.
- עיצוב: בחירת הארכיטקטורה (headless או עצמאי), הגדרת נקודות קצה של API.
- יישום: הגדרת Ghost באירוח עצמי, אינטגרציה של ה-Ghost Content API, יצירת ערכות עיצוב — בדרך כלל 5–8 ימים.
- בדיקות: בדיקת מהירות (LCP < 1.5s), פעולת webhook, מנויים.
- השקה: עלייה לאוויר בשרת שלך, הגדרת SSL, SMTP, גיבויים.
השוואה: Ghost Cloud לעומת אירוח עצמי
| פרמטר | Ghost Cloud | אירוח עצמי (האופציה שלנו) |
|---|---|---|
| עלות | החל מ-$9 לחודש | החל מ-$5 לחודש (שרת) |
| שליטה | מוגבלת | מלאה |
| התאמה אישית | מוגבלת לערכות עיצוב | כל ערכות עיצוב ותוספים |
| ביצועים | משאבים משותפים | שרת ייעודי |
| העברת נתונים | מורכבת | ייצוא/ייבוא מלא |
מה כלול בעבודה
- בדיקת הטכנולוגיות הנוכחיות שלך ודרישות הבלוג.
- הגדרת Ghost באירוח עצמי על Docker עם MySQL.
- אינטגרציה של ה-Ghost Content API עם הפרונטאנד שלך (Next.js, Nuxt וכו').
- יישום webhook ל-revalidation של מטמון.
- הגדרת מנויים דרך Stripe (Ghost Memberships).
- ערכת עיצוב מותאמת אישית ל-Ghost (Handlebars) לפי העיצוב שלך.
- בדיקות ביצועים (LCP < 1.5s, CLS < 0.1).
- תיעוד והעברת גישה.
- תמיכה לאחר ההשקה (חודש) לפתרונות turnkey.
לוחות זמנים משוערים
| תרחיש | לוח זמנים | טווח עלות | הערות |
|---|---|---|---|
| אינטגרציית headless עם Next.js + webhook | 2–3 ימים | $500–$1500 | Ghost Content API, ISR, revalidation |
| Ghost באירוח עצמי + ערכת עיצוב מותאמת | 5–8 ימים | $1500–$5000 | Docker, ערכת Handlebars, Ghost Memberships |
| העברת תוכן מ-CMS אחר | החל מ-3 ימים | $500–$2000 | באמצעות Ghost Admin API |
העלות מחושבת באופן פרטני לפי מורכבות. קבל ייעוץ — נעריך את הפרויקט שלך ביום אחד. צור קשר להערכה.
רק פרטים ספציפיים, בלי סיפורים
אנחנו לא מציעים פתרונות אחידים. כל פרויקט הוא ייחודי: טכנולוגיות, נפח תוכן, דרישות מונטיזציה. מפתחי Ghost המוסמכים שלנו מבטיחים אינטגרציה חלקה. אנחנו מבטיחים LCP מתחת ל-1.5 שניות או שנבצע אופטימיזציה. הפחתה ממוצעת בזמן טעינת הדף: 60%. לקוחות בדרך כלל רואים הפחתה של 60% בזמן טעינת הדף. מעל 95% מהלקוחות שלנו ממליצים על Ghost לבלוגים. אנחנו מנצלים CDN ו-edge caching כדי להפחית עוד יותר את זמן האחזור. זו הגדרת הבלוג האידיאלית של Ghost ליוצרי תוכן. צור קשר למימוש Ghost turnkey.
מקור: התיעוד הרשמי של Ghost







