مجله ایرانیکاسرورآموزش سرور، هاست، وردپرس و شبکه
سرور مجازی

ساخت پلتفرم Podcast شخصی با Castopod روی VPS

ساخت پلتفرم Podcast شخصی با Castopod؛ میزبانی اپیزود، RSS و انتشار پادکست روی VPS برای انتشار Podcast الزاماً نباید فایل‌های صوتی، RSS Feed و آمار شنوندگان را به یک سرویس خارجی بسپارید. می‌توانید روی…

ساخت پلتفرم Podcast شخصی با Castopod روی VPS
خلاصه سریع این آموزش

ساخت پلتفرم Podcast شخصی با Castopod؛ میزبانی اپیزود، RSS و انتشار پادکست روی VPS برای انتشار Podcast الزاماً نباید فایل‌های صوتی، RSS Feed و آمار شنوندگان را به یک سرویس…

۱۱ دقیقه مطالعه ۰ دیدگاه ۱۰ مهر ۱۴۰۵ آخرین به‌روزرسانی

فهرست مطالب

ساخت پلتفرم Podcast شخصی با Castopod؛ میزبانی اپیزود، RSS و انتشار پادکست روی VPS

برای انتشار Podcast الزاماً نباید فایل‌های صوتی، RSS Feed و آمار شنوندگان را به یک سرویس خارجی بسپارید. می‌توانید روی VPS خودتان یک پلتفرم Podcast شخصی راه‌اندازی کنید، اپیزودها را روی سرور خودتان نگه دارید و RSS اختصاصی داشته باشید.

در این آموزش از Castopod 1.15.5 استفاده می‌کنیم؛ یک پلتفرم متن‌باز و Self-hosted برای میزبانی Podcast که RSS Feed، Player، Episode Management، Analytics، Transcript، Chapter، انتشار زمان‌بندی‌شده و امکانات Podcasting 2.0 را یکجا در اختیار شما می‌گذارد.

📌 در پایان چه چیزی خواهیم داشت؟

🔹 سایت اختصاصی پادکست

🔹 RSS Feed استاندارد

🔹 Upload و مدیریت اپیزود

🔹 انتشار زمان‌بندی‌شده

🔹 Player قابل Embed

🔹 Analytics داخلی

🔹 Transcript و Chapter

🔹 Import پادکست قدیمی از RSS

🔹 امکان چند Podcast روی یک سرور

🔹 اتصال Media به S3-Compatible Storage در معماری بزرگ‌تر

Castopod چیست؟

Castopod نرم‌افزار مدیریت و میزبانی Podcast است. تمرکز آن فقط روی قرار دادن فایل MP3 روی وب نیست؛ Metadata، RSS Feed، Episode Page، Podcast Artwork، Analytics، Social Features و استانداردهای جدید Podcast نیز مدیریت می‌شوند.

نسخه Stable فعلی در زمان نگارش این مقاله Castopod 1.15.5 است که در ۲۴ فوریه ۲۰۲۶ منتشر شده است.

چرا برای Podcast یک پلتفرم اختصاصی بسازیم؟

می‌توان Podcast را با WordPress هم منتشر کرد، اما Castopod از ابتدا برای Podcast طراحی شده است.

قابلیت Castopod
RSS Podcast داخلی و خودکار
Analytics داخلی
Podcasting 2.0 پشتیبانی از قابلیت‌های متعدد
Transcript قابل اضافه شدن به اپیزود
Chapter پشتیبانی می‌شود
Fediverse / ActivityPub داخلی

پلتفرم Podcast شخصی چگونه کار می‌کند؟

Audio Episode
     |
     v
  Castopod
     |
     +----> Podcast Website
     |
     +----> RSS Feed
     |
     +----> Web Player
     |
     +----> Podcast Apps
     |
     +----> Analytics

نکته مهم این است که اپلیکیشن‌های Podcast معمولاً فایل‌های شما را از طریق RSS Feed کشف می‌کنند. Feed شامل عنوان، توضیحات، Artwork و آدرس Media هر Episode است.

مزیت Self-host کردن Podcast چیست؟

مهم‌ترین مزیت، کنترل مستقیم روی فایل‌ها، Domain و Feed است.

اگر آدرس Podcast شما روی Domain خودتان باشد، مهاجرت آینده نیز ساده‌تر خواهد شد. همچنین Analytics و Media Library تحت کنترل زیرساخت خودتان قرار می‌گیرند.

برای Castopod چه VPSای نیاز داریم؟

مصرف Application خیلی سنگین نیست؛ فضای Storage و Traffic فایل‌های صوتی معمولاً مهم‌تر هستند.

سناریو پیشنهاد شروع
یک Podcast سبک ۲ vCPU و ۲GB RAM
چند Podcast ۲ تا ۴ vCPU و ۴GB RAM
آرشیو بزرگ Storage و Traffic بیشتر یا Object Storage

میزبانی Podcast روی سرور مجازی ایران

اگر مخاطبان اصلی Podcast داخل ایران هستند، می‌توانید Castopod و فایل‌های صوتی را روی VPS ایران قرار دهید. برای آرشیو بزرگ، حجم Disk و ترافیک ماهانه را متناسب با تعداد دانلود اپیزودها انتخاب کنید.

📌 تماس با پشتیبانی:
021-91302460
| ایرانیکاسرور

مرحله اول: نصب Docker روی Ubuntu

برای اینکه Dependencyهای PHP، Database و Cache راحت‌تر مدیریت شوند، Castopod را با Docker اجرا می‌کنیم.

Docker Engine و Compose Plugin را از Repository رسمی Docker نصب کنید. بعد از نصب:

docker --version
docker compose version

مرحله دوم: ساخت پوشه پروژه

sudo mkdir -p /opt/castopod
cd /opt/castopod

مرحله سوم: ساخت Passwordهای تصادفی

برای MariaDB، Redis و Analytics Salt از مقادیر تصادفی استفاده کنید:

openssl rand -hex 32
openssl rand -hex 32
openssl rand -hex 32
openssl rand -hex 32

مرحله چهارم: Docker Compose برای Castopod 1.15.5

برای Production بهتر است Version مشخص را Pin کنید و از latest استفاده نکنید.

services:

  castopod:
    image: castopod/castopod:1.15.5
    container_name: castopod

    volumes:
      - castopod-media:/var/www/castopod/public/media

    environment:
      MYSQL_DATABASE: castopod
      MYSQL_USER: castopod
      MYSQL_PASSWORD: CHANGE_DB_PASSWORD

      CP_BASEURL: "https://podcast.example.com"

      CP_ANALYTICS_SALT: CHANGE_ANALYTICS_SALT

      CP_CACHE_HANDLER: redis
      CP_REDIS_HOST: redis
      CP_REDIS_PASSWORD: CHANGE_REDIS_PASSWORD

    ports:
      - "127.0.0.1:8000:8000"

    networks:
      - castopod-app
      - castopod-db

    depends_on:
      - mariadb
      - redis

    restart: unless-stopped


  mariadb:
    image: mariadb:11.4
    container_name: castopod-mariadb

    environment:
      MYSQL_ROOT_PASSWORD: CHANGE_ROOT_PASSWORD
      MYSQL_DATABASE: castopod
      MYSQL_USER: castopod
      MYSQL_PASSWORD: CHANGE_DB_PASSWORD

    volumes:
      - castopod-db:/var/lib/mysql

    networks:
      - castopod-db

    restart: unless-stopped


  redis:
    image: redis:7.4-alpine
    container_name: castopod-redis

    command:
      - redis-server
      - --requirepass
      - CHANGE_REDIS_PASSWORD

    volumes:
      - castopod-cache:/data

    networks:
      - castopod-app

    restart: unless-stopped


volumes:
  castopod-media:
  castopod-db:
  castopod-cache:


networks:
  castopod-app:

  castopod-db:
    internal: true

مقادیر CHANGE را با Passwordهای واقعی جایگزین کنید. Password Database در سرویس Castopod و MariaDB باید دقیقاً یکسان باشد.

⚠️ نکته نسخه: Castopod 1.15.5 نسخه Stable فعلی است. مستندات شاخه توسعه در حال آماده‌سازی نسل بعدی هستند؛ برای Production از Image نسخه مشخص 1.15.5 استفاده می‌کنیم.

مرحله پنجم: اجرای Castopod

sudo docker compose up -d

وضعیت Containerها:

sudo docker compose ps

مشاهده Log:

sudo docker compose logs -f castopod

مرحله ششم: قرار دادن Nginx جلوی Castopod

یک Domain مثل podcast.example.com را به VPS متصل کنید و Nginx را به Port داخلی Castopod Reverse Proxy کنید.

server {
    listen 80;
    server_name podcast.example.com;

    client_max_body_size 512m;

    location / {
        proxy_pass http://127.0.0.1:8000;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_read_timeout 300s;
    }
}

مرحله هفتم: فعال کردن HTTPS

HTTPS فقط برای Passwordها مهم نیست؛ قابلیت‌های Federation و ActivityPub Castopod نیز به TLS نیاز دارند.

با Certbot می‌توانید Certificate دریافت کنید:

sudo certbot --nginx \
-d podcast.example.com

مرحله هشتم: تکمیل نصب از مرورگر

بعد از بالا آمدن سرویس وارد آدرس زیر شوید:

https://podcast.example.com/cp-install

Install Wizard تنظیمات اولیه را تکمیل می‌کند و حساب Administrator را می‌سازید.

مرحله نهم: ساخت اولین Podcast

در Dashboard گزینه افزودن Podcast را انتخاب کنید.

اطلاعات اصلی شامل موارد زیر است:

🔹 عنوان Podcast

🔹 توضیحات

🔹 زبان

🔹 Category

🔹 Podcast Type

🔹 Cover Artwork

🔹 Handle

ابعاد تصویر کاور Podcast

مستندات Castopod برای Cover اصلی Podcast تصویر JPG یا PNG مربع با حداقل ۱۴۰۰×۱۴۰۰ و حداکثر ۳۰۰۰×۳۰۰۰ پیکسل را مشخص می‌کنند.

بهتر است Artwork ساده، خوانا و مناسب نمایش در اندازه کوچک طراحی شود؛ چون در بسیاری از Podcast Appها تصویر به شکل Thumbnail دیده می‌شود.

مرحله دهم: انتشار اولین Episode

از Podcast Dashboard گزینه Add an Episode را بزنید.

Castopod برای Episode فایل صوتی MP3 یا M4A را می‌پذیرد و طبق مستندات نسخه فعلی، سقف پیش‌فرض Upload برای Episode تا ۵۱۲MB است.

اطلاعات مهم Episode:

🔹 عنوان

🔹 توضیحات

🔹 فایل صوتی

🔹 Cover اختیاری

🔹 شماره Season و Episode

🔹 Transcript

🔹 Chapters

انتشار زمان‌بندی‌شده اپیزود

لازم نیست دقیقاً در زمان انتشار وارد پنل شوید. Episode را Draft کنید و Publication Date را روی روز و ساعت مورد نظر قرار دهید.

بعد از Publish، RSS Feed به‌صورت خودکار با Episode جدید به‌روزرسانی می‌شود.

RSS Feed پادکست چیست؟

RSS قلب توزیع Podcast است.

فایل Feed اطلاعات Podcast و Episodeها را در اختیار Podcast Directoryها و Playerها قرار می‌دهد.

Your Castopod
      |
      v
   RSS Feed
      |
      +----> Apple Podcasts
      +----> Podcast Apps
      +----> Aggregators
      +----> RSS Readers

مزیت مهم Self-hosting این است که آدرس Feed زیر Domain خودتان قرار می‌گیرد.

آیا Castopod اپیزود را خودش به Spotify و Apple Podcasts می‌فرستد؟

در معماری Podcast معمولاً RSS Feed شما به Directoryها معرفی می‌شود. بعد از ثبت Feed، انتشار Episode جدید از طریق تغییر RSS تشخیص داده می‌شود.

بنابراین فایل را جداگانه برای هر Podcast Player آپلود نمی‌کنید؛ Castopod Feed مرجع شما است.

Transcript چرا برای Podcast مهم است؟

Transcript فقط برای Accessibility نیست. متن اپیزود باعث می‌شود محتوای صوتی شما به شکل قابل جست‌وجو نیز در دسترس باشد.

Castopod می‌تواند Transcript را همراه Episode نگه دارد و برخی Podcast Appهای جدید نیز آن را نمایش می‌دهند.

برای SEO بهتر است علاوه بر Transcript، یک خلاصه طبیعی و اختصاصی برای هر Episode نیز داشته باشید.

Chapter در Podcast چیست؟

اگر اپیزود یک ساعت طول دارد، Chapter به کاربر اجازه می‌دهد مستقیماً به بخش مشخصی برود.

مثلاً:

00:00 Introduction
04:35 Main Topic
22:10 Interview
48:00 Questions
56:30 Conclusion

قرار دادن Podcast Player در سایت دیگر

Castopod Player قابل Embed دارد. بنابراین اگر وب‌سایت اصلی شما WordPress، Laravel یا هر سیستم دیگری است، لازم نیست فایل Audio را دوباره روی همان سایت Upload کنید.

Episode روی Castopod باقی می‌ماند و Player را داخل سایت اصلی Embed می‌کنید.

آمار Podcast چگونه ثبت می‌شود؟

چون فایل Audio از زیرساخت شما Download می‌شود، Castopod می‌تواند Statistics مربوط به Listenها و Episodeها را جمع‌آوری کند.

این یکی از مزیت‌های اصلی Self-hosting است؛ برای اطلاعات پایه Podcast وابسته کامل به Analytics یک سرویس خارجی نیستید.

مهاجرت Podcast موجود به Castopod

اگر قبلاً Podcast دارید لازم نیست Episodeها را یکی‌یکی دوباره بسازید.

Castopod امکان Import از RSS Feed را دارد. Feed فعلی را وارد می‌کنید و Import در Queue قرار می‌گیرد.

قبل از مهاجرت نهایی حتماً Ownership، Redirect Feed قبلی و تمام Media URLها را بررسی کنید تا Subscriberها از دست نروند.

Background Taskها را فراموش نکنید

در نصب‌های Manual، Castopod برای برخی قابلیت‌ها به Task Runner نیاز دارد؛ از جمله Import Podcast، WebSub و برخی پردازش‌های جانبی.

در معماری Docker رسمی، Container باید براساس نسخه و مستندات همان Release تنظیم شود؛ اگر نصب Manual انجام می‌دهید، Cron رسمی Castopod را حتماً اضافه کنید.

اگر آرشیو Podcast خیلی بزرگ شد چه کنیم؟

فایل‌های صوتی بخش اصلی Storage را مصرف می‌کنند. اگر صدها یا هزاران Episode دارید، نگه‌داشتن همه Media روی Disk همان VPS ممکن است مناسب نباشد.

Castopod متغیرهای مربوط به S3-Compatible Media Storage دارد و در معماری بزرگ‌تر می‌توانید Application و Database را روی VPS نگه دارید ولی فایل‌های Media را به Object Storage منتقل کنید.

آیا برای Podcast به CDN نیاز داریم؟

برای Podcast کوچک خیر. اما وقتی یک Episode چند صد مگابایتی هم‌زمان توسط هزاران Listener Download شود، CDN می‌تواند بار Origin را کاهش دهد.

در این حالت معماری می‌تواند به شکل زیر باشد:

Castopod
   |
   v
Media Storage
   |
   v
CDN
   |
   +----> Listener 1
   +----> Listener 2
   +----> Listener 3

برای این معماری می‌توانید از مقاله ساخت CDN شخصی با Nginx هم استفاده کنید.

ترکیب رادیوی اینترنتی و Podcast

موضوع ۶۰۱ و ۶۰۲ مکمل هم هستند.

مثلاً یک برنامه ساعت ۲۰ به‌صورت Live روی AzuraCast اجرا می‌شود، Broadcast ضبط می‌شود و پس از ویرایش می‌توانید فایل نهایی را به‌عنوان Episode روی Castopod منتشر کنید.

Live Radio
   |
   v
Recording
   |
   v
Audio Edit
   |
   v
Castopod Episode
   |
   v
RSS Podcast

Backup پلتفرم Podcast

سه بخش اصلی را Backup کنید:

🔹 MariaDB

🔹 Volume فایل‌های Media

🔹 Docker Compose و Secretهای Environment

Backup باید خارج از همان VPS نیز نگه‌داری شود. Snapshot همان سرور جای Backup مستقل را نمی‌گیرد.

امنیت Castopod

✅ Containerها را با نسخه مشخص اجرا کنید.

✅ Passwordهای Database و Redis را طولانی انتخاب کنید.

✅ Port Database را روی اینترنت Publish نکنید.

✅ HTTPS را اجباری کنید.

✅ Docker و Castopod را به‌روز نگه دارید.

✅ از Media و Database Backup بگیرید.

✅ دسترسی SSH را محدود کنید.

✅ در صورت امکان احراز هویت دومرحله‌ای را فعال کنید.

خطاهای رایج Castopod

صفحه cp-install باز نمی‌شود

وضعیت Container، Nginx Proxy و Log Castopod را بررسی کنید.

sudo docker compose ps
sudo docker compose logs -f castopod

Database Connection Error

MYSQL_DATABASE، MYSQL_USER و MYSQL_PASSWORD را در سرویس Castopod و MariaDB مقایسه کنید.

Upload فایل Podcast خطای 413 می‌دهد

client_max_body_size در Nginx و محدودیت Upload داخل Container/PHP را بررسی کنید.

RSS بعد از انتشار Episode تغییر نکرده

وضعیت انتشار Episode، Cache و Background Taskها را بررسی کنید.

برای نصب Castopod یا انتخاب Storage مناسب مشکل دارید؟

اگر در نصب Docker، MariaDB، Redis، Nginx، SSL یا انتخاب فضای مناسب برای آرشیو Podcast مشکل دارید، می‌توانید درخواست بررسی و کانفیگ سرور ثبت کنید.

📌 تماس با پشتیبانی:
021-91302460
| ایرانیکاسرور

سؤالات متداول

Castopod چیست؟

Castopod یک پلتفرم متن‌باز برای Self-host کردن Podcast، مدیریت Episode، RSS Feed، Analytics و Player است.

آخرین نسخه Castopod چیست؟

در زمان نگارش این مقاله نسخه Stable فعلی Castopod 1.15.5 است که در ۲۴ فوریه ۲۰۲۶ منتشر شده است.

آیا می‌توان چند Podcast روی یک Castopod ساخت؟

بله. Castopod از چند Podcast و چند کاربر پشتیبانی می‌کند.

آیا Castopod RSS Feed می‌سازد؟

بله. Feed به‌صورت خودکار براساس Podcast و Episodeهای منتشرشده تولید و به‌روزرسانی می‌شود.

آیا Podcast قدیمی را می‌توان وارد Castopod کرد؟

بله. امکان Import Podcast از RSS Feed وجود دارد.

آیا Castopod روی VPS نصب می‌شود؟

بله. می‌توانید Castopod را روی VPS لینوکس با Docker اجرا کنید و فایل‌های Media را روی همان سرور یا Storage خارجی نگه دارید.

جمع‌بندی

اگر می‌خواهید Podcast شما روی Domain و زیرساخت خودتان قرار داشته باشد، Castopod بخش زیادی از پیچیدگی ساخت RSS، Player، Episode Management و Analytics را آماده در اختیارتان قرار می‌دهد.

برای Podcast کوچک، یک VPS با منابع متوسط کافی است. وقتی آرشیو و تعداد Listenerها رشد کرد، Media را می‌توان به Object Storage منتقل کرد و CDN را جلوی فایل‌های صوتی قرار داد.

این معماری در کنار AzuraCast یک زیرساخت صوتی کامل می‌سازد: برنامه زنده را روی رادیوی اینترنتی پخش کنید و نسخه ضبط‌شده را بعداً به‌عنوان Podcast منتشر کنید.

منابع رسمی

دانلود و نصب Castopod

مستندات رسمی Castopod

راهنمای ساخت Podcast

راهنمای انتشار Episode

📌 تماس با پشتیبانی:
021-91302460
| ایرانیکاسرور

اشتراک‌گذاری مقاله
گفت‌وگو درباره آموزش

دیدگاه‌ها (۰)

هنوز دیدگاهی ثبت نشده است.

دیدگاه یا سؤال خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *