Castopod logo

Castopod

Open-source podcast hosting platform for podcasters

Alternative to: buzzsprout, spotify for podcasters, libsyn, transistor, captivate


About

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.