Castopod
Open-source podcast hosting platform for podcasters
Alternative to: buzzsprout, spotify for podcasters, libsyn, transistor, captivate
Castopod is a free and open-source podcast hosting solution for podcasters who want to engage and interact with their audience. It provides show and episode management, RSS feed generation, listener analytics, and native fediverse (ActivityPub) integration so listeners can comment and interact directly from Mastodon and other fediverse apps.
Castopod Docker Compose example
Self-host Castopod on your own server, homelab, or VPS starting from this Docker Compose example.
It runs Castopod in Docker containers using the official castopod/castopod:latest, mariadb:lts, redis:alpine images, with persistent volumes and automatic restarts preconfigured.
Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.
services:
castopod:
image: castopod/castopod:latest
restart: unless-stopped
depends_on:
mariadb:
condition: service_healthy
restart: true
redis:
condition: service_started
volumes:
- media:/app/public/media
environment:
# Name of the database Castopod connects to (must match the mariadb service).
MYSQL_DATABASE: "castopod"
# Database user Castopod connects as (must match the mariadb service).
MYSQL_USER: "castopod"
# Password for the database user (must match the mariadb service).
MYSQL_PASSWORD: "changeme"
# Public URL where Castopod is served. TLS is required for the fediverse; set to https://YOUR_DOMAIN.
CP_BASEURL: "https://castopod.example.com"
# Random salt used to anonymize analytics data. Set to a long random string.
CP_ANALYTICS_SALT: "changeme"
# Cache backend to use.
CP_CACHE_HANDLER: "redis"
# Hostname of the Redis service.
CP_REDIS_HOST: "redis"
# Password for the Redis service (must match the redis command below).
CP_REDIS_PASSWORD: "castopod_redis"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
mariadb:
image: mariadb:lts
restart: unless-stopped
volumes:
- db:/var/lib/mysql
environment:
# Root password for MariaDB (internal to the compose network).
MYSQL_ROOT_PASSWORD: "castopod_root"
# Database created on first boot.
MYSQL_DATABASE: "castopod"
# Database user created on first boot.
MYSQL_USER: "castopod"
# Password for the database user (must match the castopod service).
MYSQL_PASSWORD: "changeme"
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
start_period: 10s
interval: 10s
timeout: 5s
retries: 3
redis:
image: redis:alpine
restart: unless-stopped
# Sets the Redis password (must match CP_REDIS_PASSWORD above).
command: --requirepass castopod_redis
volumes:
- cache:/data
volumes:
media:
db:
cache:
Values set to changeme are required — replace them with your own
values before starting Castopod.
Prefer a managed setup? WinterFlow installs, configures, and updates Castopod for you using this same Docker Compose configuration.