Skip to main content
Version: Stable 3.x

LibreTime 3.0.0 alpha 13

This version was released the 2022-07-15.


Please report new issues and/or feature requests in the issue tracker.

For general discussion or if you need help, you can join the discourse forum or chat on

The full tarball for the 3.0.0-alpha.13 release of LibreTime is available here.

πŸ’– Contributors​

The LibreTime project wants to thank the following contributors for authoring PRs to this release:

  • @jooola
  • @paddatrapper
  • rinka
  • Maxime Leroy
  • Mykola

πŸš€ Features​

  • remove unused python3-venv package (#1728)
  • api: split api into multiple apps (#1626)
  • improve apache configuration (#1784)
  • api: replace uwsgi with gunicorn (#1785)
  • replace exploded base_* with public_url
  • shared: compress logs with gz (#1827)
  • shared: remove unused abstract app (#1828)
  • replace click envar with auto_envvar_prefix (#1829)
  • shared: allow to disable log rotate/retention
  • legacy: change logrotate config deploy path
  • rotate logs using libretime user
  • legacy: improve rabbitmq check (#1839)
  • worker: don't run with a dedicated user
  • playout: remove unused (#1854)
  • legacy: check services using systemctl (#1856)
  • change config file format to yaml
  • change config filename to config.yml
  • change config dir path to /etc/libretime
  • installer: rewrite install script
  • replace php migration with django migration
  • drop cc_locale table
  • api: create set_icecast_passwords command
  • installer: post install setup instructions
  • add systemd
  • move allowed cors url to configuration file
  • remove php web installer
  • move storage path setting to configuration file
  • installer: rename shared files path to /usr/share/libretime
  • shared: add config trailing slash sanitizer (#1870)
  • rename default stream mount point to main
  • api: rename user model fields (#1902)
  • remove unused cc_sess table (#1907)
  • remove unused cc_perms table (#1909)
  • api: rename podcasts models fields (#1910)
  • analyzer: move compute_md5 to shared library
  • api: create bulk_import command
  • legacy: compute md5 during early upload
  • api: rename track type to library
  • legacy: add Ukrainian language
  • legacy: don't guess cors url from server
  • installer: load .env file to persistent install config
  • use dedicated 'libretime' user
  • replace apache2 with nginx + php-fpm
  • api: listen on unix socket with gunicorn
  • api: use uvicorn as asgi server with gunicorn
  • set default locale to en_US
  • remove unused cc_country table

πŸ› Bug fixes​

  • add gettext for legacy locale generation (#1720)
  • installer: install software-properties-common when required
  • installer: always install fresh packages
  • api: prevent timing attacke on api key (#1771)
  • legacy: load vendors during config init
  • legacy: bypass config validation during django migration
  • legacy: the ini config parser requires a .conf ext
  • playout: disable playout-notify log rotation
  • don't set log folder permissions recursively
  • shared: allow list settings (#1837)
  • legacy: station url always has a trailing slash (#1838)
  • legacy: check if libretime-api is running (#1841)
  • don't add track types only on migration
  • correct cc_file.artwork column size
  • legacy: remove not null constraint when using default
  • api: missing build-essential to build psycopg2
  • drop unused sequences
  • api: allow updating default_icecast_password (#1872)
  • deps: update dependency @cmfcmf/docusaurus-search-local to ^0.11.0 (#1873)
  • legacy: remove file directory metadata (#1887)
  • api: update model fields in set_icecast_passwords (#1903)
  • api: cascade when dropping table (#1908)
  • legacy: station-metadata api endpoint
  • legacy: don't log 'could not obtain lock' exception (#1943)
  • legacy: check empty before iteration on files
  • use constrained foreign key for files track_type
  • deps: update dependency mermaid to v9.1.2 [security] (#1948)
  • installer: update version file unless tarball (#1950)
  • prevent data loose on track_types_id migration (#1949)
  • use track_type_id in smartblock criteria
  • legacy: no invalid track type in smartblock criteria

πŸ”₯ Deprecation and removal​

Allowed CORS origins configuration location​

The allowed CORS origins configuration moved from the database to the configuration file. The field in the general preference form is deprecated and will be removed in the next release. Be sure to move your allowed CORS origins configuration to the configuration file.

⬆️ Before upgrading​


Please run this before the upgrade procedure.

Repair broken track types​

The database files track type field was previously not constrained and this might have lead to files referencing a now renamed or missing track type. To preserve as much data as possible during the database migration process, you need to check whether some files have broken or missing track type references and fix them accordingly. To list broken track type references, you can run the following command:

sudo -u www-data libretime-api dbshell --command="
SELECT, f.track_type, f.track_title, f.artist_name, f.filepath
FROM cc_files f
SELECT FROM cc_track_types tt
WHERE tt.code = f.track_type
AND f.track_type IS NOT NULL
AND f.track_type <> '';"

If the above command outputs the following, no file needs fixing.

 id | track_type | track_title | artist_name | filepath
(0 rows)

In addition, the database smart block criteria value was previously referencing track types using codes, and should now reference track types using ids. You need to check whether some smart block have broken track type references and fix them accordingly. To list broken track type references, you can run the following command:

sudo -u www-data libretime-api dbshell --command="
SELECT, c.criteria, c.modifier, c.value
FROM cc_blockcriteria c, cc_block b
WHERE c.block_id =
SELECT FROM cc_track_types tt
WHERE tt.code = c.value
AND criteria = 'track_type';"

If the above command outputs the following, no smart block needs fixing.

 name | criteria | modifier | value
(0 rows)

New configuration file​

The configuration file name changed from airtime.conf to config.yml. Please rename your configuration file using the following command:

sudo mv /etc/airtime/airtime.conf /etc/airtime/config.yml

The configuration directory changed from /etc/airtime to /etc/libretime. Please rename your configuration directory using the following command:

sudo mv /etc/airtime /etc/libretime

The configuration file format changed to yml and the configuration schema changed. Please rewrite your configuration file using the yaml format. An example configuration file installer/config.yml is present in the sources.

The general section has been changed:

  • theΒ general.protocol, general.base_url, general.base_port, general.base_dir and general.force_ssl entries were replaced with a single general.public_url entry, be sure to use a valid url with the new configuration entry.

A new storage section has been added:

  • the storage.path entry was added to move the storage configuration from the database to the configuration file, be sure to edit your configuration with the path to your storage. The default storage path value is /srv/libretime.

Nginx, Apache and PHP​

The apache2 web server has been replaced with nginx and php-fpm, be sure to uninstall apache2 and clean related configuration files:

sudo rm -f /etc/apache2/sites-*/{airtime,libretime}*
sudo rm -f /etc/php/*/apache2/conf.d/{airtime,libretime}*

sudo apt purge 'apache2' 'libapache2-mod-php*'

sudo find /var/lib/php/sessions -name 'sess_*' -delete

Shared files path​

The shared files path changed from /usr/share/airtime to /usr/share/libretime. The directory must be renamed:

sudo mv /usr/share/airtime /usr/share/libretime

Systemd services path​

The systemd services path changed from /etc/systemd/system/libretime* to /usr/lib/systemd/system/libretime*. The services must be moved:

sudo mv /etc/systemd/system/libretime* /usr/lib/systemd/system/
sudo systemctl daemon-reload

Replaced uWSGI with Gunicorn​

uWSGI was replaced by Gunicorn, the packages and configuration file should be removed from the system:

# Remove the configuration file
sudo rm -f /etc/{airtime,libretime}/libretime-api.ini

# Remove the packages
sudo apt purge \
uwsgi \

Logrotate config filepath​

The legacy logrotate config filepath was changed from /etc/logrotate.d/airtime-php to /etc/logrotate.d/libretime-legacy. The old configuration file must be removed:

# Remove the configuration file
sudo rm -f /etc/logrotate.d/airtime-php

Worker user​

The worker service no longer uses a dedicated celery user to run. The old celery user can be removed from the system:

# Remove the celery user
sudo deluser celery

⬆️ Upgrading​

New installer​


Please be careful when running this new installer, it might not be bug free.

The bash installer has been rewritten, the flags and options changed, please run ./install --help to get more details.

LibreTime user​

The LibreTime services now run using a dedicated libretime user instead of the default www-data user. Be sure to change the ownership of the LibreTime files:

# Configuration directory
sudo chown -R libretime:libretime /etc/libretime
# Logs directory
sudo chown -R libretime:libretime /var/log/libretime
# Runtime directory
sudo chown -R libretime:libretime /var/lib/libretime
# Storage directory
sudo chown -R libretime:libretime /srv/libretime