Favicon of Funkwhale

Funkwhale

Take control of your audio library with a decentralized platform. Host your music, publish podcasts, and share playlists without ads or third-party tracking.

Take full ownership of your audio experience with a free, decentralized platform designed for music lovers, artists, and podcasters. Whether you want to access your personal music collection from anywhere or publish your own podcasts, this community-driven network gives you total independence. Enjoy your favorite tracks from a web browser or any compatible app, including Subsonic clients and standard podcatchers.

Key benefits include:

  • Decentralized and Federated: Share content across instances or restrict bad actors without being tied to a central corporation.
  • Privacy First: Built with open-source technology featuring no third-party analytics, no tracking, and no ads.
  • Seamless Sharing: Share playlists, albums, or your entire library with friends, family, or the broader network.
  • Creator Friendly: Create channels for your releases, notify followers, and use export widgets to embed content on other websites.

Directory Structure

funkwhale
data
media
music
postgres
redis
static
typesense
.env
docker-compose.yml

docker-compose.yml

services:
  postgres:
    restart: unless-stopped
    env_file: .env
    image: postgres:15
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    restart: unless-stopped
    env_file: .env
    image: redis:7
    volumes:
      - ./data/redis:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

  typesense:
    restart: unless-stopped
    env_file: .env
    image: typesense/typesense:0.24.0
    volumes:
      - ./data/typesense:/data
    healthcheck:
      test: ["CMD", "wget", "--spider", "-q", "http://localhost:8108/health"]
      interval: 10s
      timeout: 5s
      retries: 5

  api:
    restart: unless-stopped
    env_file: .env
    image: funkwhale/funkwhale:${FUNKWHALE_VERSION:-latest}
    depends_on:
      - postgres
      - redis
      - typesense
    volumes:
      - ./data/music:/music:ro
      - ./data/media:/app/data/media
      - ./data/static:/app/data/static
    ports:
      - "${FUNKWHALE_API_PORT:-5000}:5000"

  celeryworker:
    restart: unless-stopped
    env_file: .env
    image: funkwhale/funkwhale:${FUNKWHALE_VERSION:-latest}
    depends_on:
      - postgres
      - redis
    command: celery -A funkwhale_api.taskapp worker -l INFO --concurrency=${CELERYD_CONCURRENCY:-0}
    volumes:
      - ./data/music:/music:ro
      - ./data/media:/app/data/media
      - ./data/static:/app/data/static

  celerybeat:
    restart: unless-stopped
    env_file: .env
    image: funkwhale/funkwhale:${FUNKWHALE_VERSION:-latest}
    depends_on:
      - postgres
      - redis
    command: celery -A funkwhale_api.taskapp beat -l INFO
    volumes:
      - ./data/music:/music:ro
      - ./data/media:/app/data/media
      - ./data/static:/app/data/static

.env

# Funkwhale Version
FUNKWHALE_VERSION=latest

# Instance Configuration
FUNKWHALE_HOSTNAME=yourdomain.funkwhale
FUNKWHALE_PROTOCOL=http
FUNKWHALE_API_PORT=5000

# Security (CHANGE THESE)
DJANGO_SECRET_KEY=change_me_to_a_very_long_random_string
TYPESENSE_API_KEY=change_me_to_a_random_string
POSTGRES_PASSWORD=change_me_to_a_secure_password

# Database Configuration
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_USER=funkwhale
POSTGRES_DB=funkwhale

# Redis Configuration
REDIS_HOST=redis
REDIS_PORT=6379

# Typesense Configuration
TYPESENSE_HOST=typesense
TYPESENSE_PORT=8108
TYPESENSE_PROTOCOL=http

# Internal Container Paths (Do not change unless necessary)
MEDIA_ROOT=/app/data/media
STATIC_ROOT=/app/data/static

# Worker Configuration
CELERYD_CONCURRENCY=2
Categories:

Share:

Ad
Favicon

 

  
 

Similar to Funkwhale

Favicon

 

  
  
Favicon

 

  
  
Favicon