Develop using Docker
Funkwhale can be run in Docker containers for local development. You can work on any part of the Funkwhale codebase and run the container setup to test your changes. To work with Docker:
Clone the Funkwhale repository to your system. The
develop
branch is checked out by defaultgit clone git@dev.funkwhale.audio/funkwhale/funkwhale.git cd funkwhale
git clone https://dev.funkwhale.audio/funkwhale/funkwhale.git cd funkwhale
Set up your Docker environment
Note
Funkwhale provides a dev.yml
file that contains the required docker compose setup. You need to pass the -f dev.yml
flag you run docker compose commands to ensure it uses this file. If you don’t want to add this each time, you can export it as a COMPOSE_FILE
variable:
export COMPOSE_FILE=dev.yml
To set up your Docker environment:
Create a
.env
file to enable customization of your setup.touch .env
Add the following variables to load images and enable access to Django admin pages:
MEDIA_URL=http://localhost:8000/media/ STATIC_URL=http://localhost:8000/staticfiles/
Create a network for federation support
sudo docker network create federation
Once you’ve set everything up, you need to build the containers. Run this command any time there are upstream changes or dependency changes to ensure you’re up-to-date.
sudo docker compose -f dev.yml build
Set up the database
Funkwhale relies on a postgresql database to store information. To set this up, you need to run the funkwhale-manage migrate
command:
sudo docker compose -f dev.yml run --rm api funkwhale-manage migrate
This command creates all the required tables. You need to run this whenever there are changes to the API schema. You can run this at any time without causing issues.
Set up local data
You need to create some local data to mimic a production environment.
Create a superuser so you can log in to your local app:
sudo docker compose -f dev.yml run --rm api funkwhale-manage fw users create --superuser
Add some fake data to populate the database. The following command creates 25 artists with random albums, tracks, and metadata.
artists=25 # Adds 25 fake artists command="from funkwhale_api.music import fake_data; fake_data.create_data($artists)" echo $command | sudo docker compose -f dev.yml run --rm -T api funkwhale-manage shell -i python
Manage services
Once you have set up your containers, launch all services to start working on them:
sudo docker compose -f dev.yml up front api nginx celeryworker
This gives you access to the following:
The Funkwhale webapp on
http://localhost:8000
The Funkwhale API on
http://localhost:8000/api/v1
The Django admin interface on
http://localhost:8000/api/admin
Once you’re done with the containers, you can stop them all:
sudo docker compose -f dev.yml stop
If you want to destroy your containers, run the following:
sudo docker compose -f dev.yml down -v
Set up federation support
Working on federation features requires some additional setup. You need to do the following:
Update your DNS resolver to resolve all your .dev hostnames locally
Set up a reverse proxy (such as traefik) to catch .dev requests with a TLS certificate
Set up two or more local instances
To resolve hostnames locally, run the following:
echo "address=/test/172.17.0.1" | sudo tee /etc/dnsmasq.d/test.conf
sudo systemctl restart dnsmasq
echo "address=/test/172.17.0.1" | sudo tee /etc/NetworkManager/dnsmasq.d/test.conf
sudo systemctl restart NetworkManager
To add a wildcard certificate, copy the test certificate from the docker/ssl
folder. This certificate is a wildcard for *.funkwhale.test
sudo cp docker/ssl/test.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
To run a reverse proxy for your app:
Add the following configuration to your
.env
file:# Remove any port binding so you can specify this per-instance VUE_PORT_BINDING= # Disable certificate validation EXTERNAL_REQUESTS_VERIFY_SSL=false # Ensure all links use https FUNKWHALE_PROTOCOL=https # Disable host ports binding for the nginx container so that traefik handles everything NGINX_PORTS_MAPPING=80
Launch traefik using the bundled configuration:
sudo docker compose -f docker/traefik.yml up -d
Set up as many different projects as you need. Make sure the
COMPOSE_PROJECT_NAME
andVUE_PORT
variables are unique per instanceexport COMPOSE_PROJECT_NAME=node2 export VUE_PORT=1234 # this has to be unique for each instance sudo docker compose -f dev.yml run --rm api funkwhale-manage migrate sudo docker compose -f dev.yml run --rm api funkwhale-manage fw users create --superuser sudo docker compose -f dev.yml up nginx api front nginx api celeryworker
You can access your project at https://{COMPOSE_PROJECT_NAME}.funkwhale.test
.