diff --git a/api/config/settings/common.py b/api/config/settings/common.py
index ebfd21dd606b236eff89e5b47b7b067b01dadce8..a972ec7effc9e5696f94833c19c52096ff307f14 100644
--- a/api/config/settings/common.py
+++ b/api/config/settings/common.py
@@ -13,6 +13,8 @@ from __future__ import absolute_import, unicode_literals
 from urllib.parse import urlsplit
 import os
 import environ
+from celery.schedules import crontab
+
 from funkwhale_api import __version__
 
 ROOT_DIR = environ.Path(__file__) - 3  # (/a/b/myfile.py - 3 = /)
@@ -334,6 +336,16 @@ CELERY_BROKER_URL = env(
 # Your common stuff: Below this line define 3rd party library settings
 CELERY_TASK_DEFAULT_RATE_LIMIT = 1
 CELERY_TASK_TIME_LIMIT = 300
+CELERYBEAT_SCHEDULE = {
+    'federation.clean_music_cache': {
+        'task': 'funkwhale_api.federation.tasks.clean_music_cache',
+        'schedule': crontab(hour='*/2'),
+        'options': {
+            'expires': 60 * 2,
+        },
+    }
+}
+
 import datetime
 JWT_AUTH = {
     'JWT_ALLOW_REFRESH': True,
diff --git a/deploy/funkwhale-beat.service b/deploy/funkwhale-beat.service
new file mode 100644
index 0000000000000000000000000000000000000000..209896dd4272ca0f7ab3b683fa95a514b67f5290
--- /dev/null
+++ b/deploy/funkwhale-beat.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=Funkwhale celery beat process
+After=redis.service postgresql.service
+PartOf=funkwhale.target
+
+[Service]
+User=funkwhale
+# adapt this depending on the path of your funkwhale installation
+WorkingDirectory=/srv/funkwhale/api
+EnvironmentFile=/srv/funkwhale/config/.env
+ExecStart=/srv/funkwhale/virtualenv/bin/celery -A funkwhale_api.taskapp beat -l INFO
+
+[Install]
+WantedBy=multi-user.target
diff --git a/deploy/funkwhale.target b/deploy/funkwhale.target
index a920c7e34c67d31c8bb295c254d9cddc899da2a2..a09e381c4f6553dd482b2f4edd30fcfc3e851f74 100644
--- a/deploy/funkwhale.target
+++ b/deploy/funkwhale.target
@@ -1,3 +1,3 @@
 [Unit]
 Description=Funkwhale
-Wants=funkwhale-server.service funkwhale-worker.service
+Wants=funkwhale-server.service funkwhale-worker.service funkwhale-beat.service
diff --git a/docs/installation/systemd.rst b/docs/installation/systemd.rst
index 67af98432641dc837c8313ca1578cc3974dee70f..27781c447291cfcbc0ab9279bf3eb801336ff704 100644
--- a/docs/installation/systemd.rst
+++ b/docs/installation/systemd.rst
@@ -13,11 +13,13 @@ First, download the sample unitfiles:
     curl -L -o "/etc/systemd/system/funkwhale.target" "https://code.eliotberriot.com/funkwhale/funkwhale/raw/|version|/deploy/funkwhale.target"
     curl -L -o "/etc/systemd/system/funkwhale-server.service" "https://code.eliotberriot.com/funkwhale/funkwhale/raw/|version|/deploy/funkwhale-server.service"
     curl -L -o "/etc/systemd/system/funkwhale-worker.service" "https://code.eliotberriot.com/funkwhale/funkwhale/raw/|version|/deploy/funkwhale-worker.service"
+    curl -L -o "/etc/systemd/system/funkwhale-beat.service" "https://code.eliotberriot.com/funkwhale/funkwhale/raw/|version|/deploy/funkwhale-beat.service"
 
 This will download three unitfiles:
 
 - ``funkwhale-server.service`` to launch the funkwhale web server
 - ``funkwhale-worker.service`` to launch the funkwhale task worker
+- ``funkwhale-beat.service`` to launch the funkwhale task beat (this is for recurring tasks)
 - ``funkwhale.target`` to easily stop and start all of the services at once
 
 You can of course review and edit them to suit your deployment scenario