commit 5187c259b81e8d527bb2f3aed14bc0be2870f7f2 Author: Your Name Date: Mon Jul 13 23:06:37 2026 +0000 initial commit diff --git a/.env b/.env new file mode 100644 index 0000000..aefbce6 --- /dev/null +++ b/.env @@ -0,0 +1,11 @@ +LIBRETIME_VERSION=4.5.0 +# Postgres +POSTGRES_PASSWORD=1da2251d58b55dc5de72c49eb17452be + +# RabbitMQ +RABBITMQ_DEFAULT_PASS=90e551858dee99d283e128561f6e40fb + +# Icecast +ICECAST_SOURCE_PASSWORD=bc485fd6592beb1e4dca829d6a4c0833 +ICECAST_ADMIN_PASSWORD=a673e1c94d864f957b376c414f75ed28 +ICECAST_RELAY_PASSWORD=cf402425adf05057668454054d9d9f3d diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..30c2a5f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +libretime_storage/ +.claude/ \ No newline at end of file diff --git a/config.template.yml b/config.template.yml new file mode 100644 index 0000000..0551fc6 --- /dev/null +++ b/config.template.yml @@ -0,0 +1,333 @@ +# See https://libretime.org/docs/admin-manual/setup/configuration/ + +general: + # The public url. + # > this field is REQUIRED + public_url: + # The internal API authentication key. + # > this field is REQUIRED + api_key: + # The Django API secret key. + # > this field is REQUIRED + secret_key: + + # List of origins allowed to access resources on the server, the public url + # origin is automatically included. + # > default is [] + allowed_cors_origins: [] + + # The server timezone, should be a lookup key in the IANA time zone database, + # for example Europe/Berlin. + # > default is UTC + timezone: UTC + + # How many hours ahead Playout should cache scheduled media files. + # > default is 1 + cache_ahead_hours: 1 + + # Authentication adaptor to use for the legacy service, specify a class like + # LibreTime_Auth_Adaptor_FreeIpa to replace the built-in adaptor. + # > default is local + auth: local + +storage: + # Path of the storage directory. Make sure to update the Nginx configuration after + # updating the storage path. + # > default is /srv/libretime + path: /srv/libretime + +database: + # The hostname of the PostgreSQL server. + # > default is localhost + host: postgres + # The port of the PostgreSQL server. + # > default is 5432 + port: 5432 + # The name of the PostgreSQL database. + # > default is libretime + name: libretime + # The username of the PostgreSQL user. + # > default is libretime + user: libretime + # The password of the PostgreSQL user. + # > default is libretime + password: ${POSTGRES_PASSWORD} + +rabbitmq: + # The hostname of the RabbitMQ server. + # > default is localhost + host: rabbitmq + # The port of the RabbitMQ server. + # > default is 5672 + port: 5672 + # The virtual host of RabbitMQ server. + # > default is /libretime + vhost: /libretime + # The username of the RabbitMQ user. + # > default is libretime + user: libretime + # The password of the RabbitMQ user. + # > default is libretime + password: ${RABBITMQ_DEFAULT_PASS} + +email: + # Sender email address to use when sending emails. + # > default is no-reply@libretime.org + from_address: no-reply@libretime.org + + # The hostname of the SMTP server. + # > default is localhost + host: localhost + # The port of the SMTP server. + # > default is 25 + port: 25 + # Whether to use an insecure connection, an SSL/TLS (implicit) connection (generally + # on port 465) or a STARTTLS (explicit) connection (generally on port 587) when + # talking to the SMTP server. + # > must be one of (ssl/tls, starttls) + encryption: + # The username to use for the SMTP server. + # > default is "" + user: "" + # The password to use for the SMTP server. + # > default is "" + password: "" + # Timeout in seconds for blocking operations like the connection attempt. + timeout: + # The path to a PEM-formatted certificate chain file to use for the connection. + cert_file: + # The path to a PEM-formatted private key file to use for the connection. + key_file: + +playout: + # Liquidsoap connection host. + # > default is localhost + liquidsoap_host: liquidsoap + # Liquidsoap connection port. + # > default is 1234 + liquidsoap_port: 1234 + + # The format for recordings. + # > must be one of (ogg, mp3) + # > default is ogg + record_file_format: ogg + # The bitrate for recordings. + # > default is 256 + record_bitrate: 256 + # The samplerate for recordings. + # > default is 44100 + record_samplerate: 44100 + # The number of channels for recordings. + # > default is 2 + record_channels: 2 + # The sample size for recordings. + # > default is 16 + record_sample_size: 16 + +liquidsoap: + # Liquidsoap server listen address. + # > default is 127.0.0.1 + server_listen_address: 0.0.0.0 + # Liquidsoap server listen port. + # > default is 1234 + server_listen_port: 1234 + + # Input harbor listen address. + # > default is ["0.0.0.0"] + harbor_listen_address: ["0.0.0.0"] + + # Input harbor tls certificate path. + harbor_ssl_certificate: + # Input harbor tls certificate private key path. + harbor_ssl_private_key: + # Input harbor tls certificate password. + harbor_ssl_password: + +stream: + # Inputs sources. + inputs: + # Main harbor input. + main: + # Harbor input public url. If not defined, the value will be generated from + # the [general.public_url] hostname, the input port and mount. + public_url: + # Mount point for the main harbor input. + # > default is main + mount: main + # Listen port for the main harbor input. + # > default is 8001 + port: 8001 + # Whether the input harbor is secured with the tls certificate. + # > default is false + secure: false + + # Show harbor input. + show: + # Harbor input public url. If not defined, the value will be generated from + # the [general.public_url] hostname, the input port and mount. + public_url: + # Mount point for the show harbor input. + # > default is show + mount: show + # Listen port for the show harbor input. + # > default is 8002 + port: 8002 + # Whether the input harbor is secured with the tls certificate. + # > default is false + secure: false + + # Output streams. + outputs: + # Default icecast output + # This can be reused to define multiple outputs without duplicating data + .default_icecast_output: &default_icecast_output + host: icecast + port: 8000 + source_password: ${ICECAST_SOURCE_PASSWORD} + admin_password: ${ICECAST_ADMIN_PASSWORD} + name: LibreTime! + description: LibreTime Radio! + website: https://libretime.org + genre: various + + # Icecast output streams. + # > max items is 3 + icecast: + # The default Icecast output stream + - <<: *default_icecast_output + enabled: true + public_url: + mount: main + audio: + format: ogg + bitrate: 256 + + # You can define extra outputs by reusing the default output using a yaml anchor + - <<: *default_icecast_output + enabled: false + mount: main-low + audio: + format: ogg + bitrate: 128 + + - # Whether the output is enabled. + # > default is false + enabled: false + # Output public url, If not defined, the value will be generated from + # the [general.public_url] hostname, the output port and mount. + public_url: + # Icecast server host. + # > default is localhost + host: localhost + # Icecast server port. + # > default is 8000 + port: 8000 + # Icecast server mount point. + # > this field is REQUIRED + mount: main + # Icecast source user. + # > default is source + source_user: source + # Icecast source password. + # > this field is REQUIRED + source_password: hackme + # Icecast admin user. + # > default is admin + admin_user: admin + # Icecast admin password. If not defined, statistics will not be collected. + admin_password: hackme + + # Icecast output audio. + audio: + # Icecast output audio format. + # > must be one of (aac, mp3, ogg, opus) + # > this field is REQUIRED + format: ogg + # Icecast output audio bitrate. + # > must be one of (32, 48, 64, 96, 128, 160, 192, 224, 256, 320) + # > this field is REQUIRED + bitrate: 256 + + # format=ogg only field: Embed metadata (track title, artist, and show name) + # in the output stream. Some bugged players will disconnect from the stream + # after every songs when playing ogg streams that have metadata information + # enabled. + # > default is false + enable_metadata: false + + # Icecast stream name. + name: LibreTime! + # Icecast stream description. + description: LibreTime Radio! + # Icecast stream website. + website: https://libretime.org + # Icecast stream genre. + genre: various + + # Whether the stream should be used for mobile devices. + # > default is false + mobile: false + + # Shoutcast output streams. + # > max items is 1 + shoutcast: + - # Whether the output is enabled. + # > default is false + enabled: false + # Output public url. If not defined, the value will be generated from + # the [general.public_url] hostname and the output port. + public_url: + # Shoutcast server host. + # > default is localhost + host: localhost + # Shoutcast server port. + # > default is 8000 + port: 8000 + # Shoutcast source user. + # > default is source + source_user: source + # Shoutcast source password. + # > this field is REQUIRED + source_password: hackme + # Shoutcast admin user. + # > default is admin + admin_user: admin + # Shoutcast admin password. If not defined, statistics will not be collected. + admin_password: hackme + + # Shoutcast output audio. + audio: + # Shoutcast output audio format. + # > must be one of (aac, mp3) + # > this field is REQUIRED + format: mp3 + # Shoutcast output audio bitrate. + # > must be one of (32, 48, 64, 96, 128, 160, 192, 224, 256, 320) + # > this field is REQUIRED + bitrate: 256 + + # Shoutcast stream name. + name: LibreTime! + # Shoutcast stream website. + website: https://libretime.org + # Shoutcast stream genre. + genre: various + + # Whether the stream should be used for mobile devices. + # > default is false + mobile: false + + # System outputs. + # > max items is 1 + system: + - # Whether the output is enabled. + # > default is false + enabled: false + # System output kind. + # > must be one of (alsa, ao, oss, portaudio, pulseaudio) + # > default is pulseaudio + kind: pulseaudio + + # System output device. + # > only available for kind=(alsa, pulseaudio) + device: diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..638e095 --- /dev/null +++ b/config.yml @@ -0,0 +1,333 @@ +# See https://libretime.org/docs/admin-manual/setup/configuration/ + +general: + # The public url. + # > this field is REQUIRED + public_url: https://libretime.westerntechnologies.duckdns.org + # The internal API authentication key. + # > this field is REQUIRED + api_key: "123" + # The Django API secret key. + # > this field is REQUIRED + secret_key: "123" + + # List of origins allowed to access resources on the server, the public url + # origin is automatically included. + # > default is [] + allowed_cors_origins: [] + + # The server timezone, should be a lookup key in the IANA time zone database, + # for example Europe/Berlin. + # > default is UTC + timezone: UTC + + # How many hours ahead Playout should cache scheduled media files. + # > default is 1 + cache_ahead_hours: 1 + + # Authentication adaptor to use for the legacy service, specify a class like + # LibreTime_Auth_Adaptor_FreeIpa to replace the built-in adaptor. + # > default is local + auth: local + +storage: + # Path of the storage directory. Make sure to update the Nginx configuration after + # updating the storage path. + # > default is /srv/libretime + path: /srv/libretime + +database: + # The hostname of the PostgreSQL server. + # > default is localhost + host: postgres + # The port of the PostgreSQL server. + # > default is 5432 + port: 5432 + # The name of the PostgreSQL database. + # > default is libretime + name: libretime + # The username of the PostgreSQL user. + # > default is libretime + user: libretime + # The password of the PostgreSQL user. + # > default is libretime + password: 1da2251d58b55dc5de72c49eb17452be + +rabbitmq: + # The hostname of the RabbitMQ server. + # > default is localhost + host: rabbitmq + # The port of the RabbitMQ server. + # > default is 5672 + port: 5672 + # The virtual host of RabbitMQ server. + # > default is /libretime + vhost: /libretime + # The username of the RabbitMQ user. + # > default is libretime + user: libretime + # The password of the RabbitMQ user. + # > default is libretime + password: 90e551858dee99d283e128561f6e40fb + +email: + # Sender email address to use when sending emails. + # > default is no-reply@libretime.org + from_address: no-reply@libretime.org + + # The hostname of the SMTP server. + # > default is localhost + host: localhost + # The port of the SMTP server. + # > default is 25 + port: 25 + # Whether to use an insecure connection, an SSL/TLS (implicit) connection (generally + # on port 465) or a STARTTLS (explicit) connection (generally on port 587) when + # talking to the SMTP server. + # > must be one of (ssl/tls, starttls) + encryption: + # The username to use for the SMTP server. + # > default is "" + user: "" + # The password to use for the SMTP server. + # > default is "" + password: "" + # Timeout in seconds for blocking operations like the connection attempt. + timeout: + # The path to a PEM-formatted certificate chain file to use for the connection. + cert_file: + # The path to a PEM-formatted private key file to use for the connection. + key_file: + +playout: + # Liquidsoap connection host. + # > default is localhost + liquidsoap_host: liquidsoap + # Liquidsoap connection port. + # > default is 1234 + liquidsoap_port: 1234 + + # The format for recordings. + # > must be one of (ogg, mp3) + # > default is ogg + record_file_format: ogg + # The bitrate for recordings. + # > default is 256 + record_bitrate: 256 + # The samplerate for recordings. + # > default is 44100 + record_samplerate: 44100 + # The number of channels for recordings. + # > default is 2 + record_channels: 2 + # The sample size for recordings. + # > default is 16 + record_sample_size: 16 + +liquidsoap: + # Liquidsoap server listen address. + # > default is 127.0.0.1 + server_listen_address: 0.0.0.0 + # Liquidsoap server listen port. + # > default is 1234 + server_listen_port: 1234 + + # Input harbor listen address. + # > default is ["0.0.0.0"] + harbor_listen_address: ["0.0.0.0"] + + # Input harbor tls certificate path. + harbor_ssl_certificate: + # Input harbor tls certificate private key path. + harbor_ssl_private_key: + # Input harbor tls certificate password. + harbor_ssl_password: + +stream: + # Inputs sources. + inputs: + # Main harbor input. + main: + # Harbor input public url. If not defined, the value will be generated from + # the [general.public_url] hostname, the input port and mount. + public_url: + # Mount point for the main harbor input. + # > default is main + mount: main + # Listen port for the main harbor input. + # > default is 8001 + port: 8001 + # Whether the input harbor is secured with the tls certificate. + # > default is false + secure: false + + # Show harbor input. + show: + # Harbor input public url. If not defined, the value will be generated from + # the [general.public_url] hostname, the input port and mount. + public_url: + # Mount point for the show harbor input. + # > default is show + mount: show + # Listen port for the show harbor input. + # > default is 8002 + port: 8002 + # Whether the input harbor is secured with the tls certificate. + # > default is false + secure: false + + # Output streams. + outputs: + # Default icecast output + # This can be reused to define multiple outputs without duplicating data + .default_icecast_output: &default_icecast_output + host: icecast + port: 8000 + source_password: bc485fd6592beb1e4dca829d6a4c0833 + admin_password: a673e1c94d864f957b376c414f75ed28 + name: LibreTime! + description: LibreTime Radio! + website: https://libretime.org + genre: various + + # Icecast output streams. + # > max items is 3 + icecast: + # The default Icecast output stream + - <<: *default_icecast_output + enabled: true + public_url: + mount: main + audio: + format: ogg + bitrate: 256 + + # You can define extra outputs by reusing the default output using a yaml anchor + - <<: *default_icecast_output + enabled: false + mount: main-low + audio: + format: ogg + bitrate: 128 + + - # Whether the output is enabled. + # > default is false + enabled: false + # Output public url, If not defined, the value will be generated from + # the [general.public_url] hostname, the output port and mount. + public_url: + # Icecast server host. + # > default is localhost + host: localhost + # Icecast server port. + # > default is 8000 + port: 8000 + # Icecast server mount point. + # > this field is REQUIRED + mount: main + # Icecast source user. + # > default is source + source_user: source + # Icecast source password. + # > this field is REQUIRED + source_password: hackme + # Icecast admin user. + # > default is admin + admin_user: admin + # Icecast admin password. If not defined, statistics will not be collected. + admin_password: hackme + + # Icecast output audio. + audio: + # Icecast output audio format. + # > must be one of (aac, mp3, ogg, opus) + # > this field is REQUIRED + format: ogg + # Icecast output audio bitrate. + # > must be one of (32, 48, 64, 96, 128, 160, 192, 224, 256, 320) + # > this field is REQUIRED + bitrate: 256 + + # format=ogg only field: Embed metadata (track title, artist, and show name) + # in the output stream. Some bugged players will disconnect from the stream + # after every songs when playing ogg streams that have metadata information + # enabled. + # > default is false + enable_metadata: false + + # Icecast stream name. + name: LibreTime! + # Icecast stream description. + description: LibreTime Radio! + # Icecast stream website. + website: https://libretime.org + # Icecast stream genre. + genre: various + + # Whether the stream should be used for mobile devices. + # > default is false + mobile: false + + # Shoutcast output streams. + # > max items is 1 + shoutcast: + - # Whether the output is enabled. + # > default is false + enabled: false + # Output public url. If not defined, the value will be generated from + # the [general.public_url] hostname and the output port. + public_url: + # Shoutcast server host. + # > default is localhost + host: localhost + # Shoutcast server port. + # > default is 8000 + port: 8000 + # Shoutcast source user. + # > default is source + source_user: source + # Shoutcast source password. + # > this field is REQUIRED + source_password: hackme + # Shoutcast admin user. + # > default is admin + admin_user: admin + # Shoutcast admin password. If not defined, statistics will not be collected. + admin_password: hackme + + # Shoutcast output audio. + audio: + # Shoutcast output audio format. + # > must be one of (aac, mp3) + # > this field is REQUIRED + format: mp3 + # Shoutcast output audio bitrate. + # > must be one of (32, 48, 64, 96, 128, 160, 192, 224, 256, 320) + # > this field is REQUIRED + bitrate: 256 + + # Shoutcast stream name. + name: LibreTime! + # Shoutcast stream website. + website: https://libretime.org + # Shoutcast stream genre. + genre: various + + # Whether the stream should be used for mobile devices. + # > default is false + mobile: false + + # System outputs. + # > max items is 1 + system: + - # Whether the output is enabled. + # > default is false + enabled: false + # System output kind. + # > must be one of (alsa, ao, oss, portaudio, pulseaudio) + # > default is pulseaudio + kind: pulseaudio + + # System output device. + # > only available for kind=(alsa, pulseaudio) + device: diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..84bfe04 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,120 @@ +services: + postgres: + image: postgres:15 + volumes: + - postgres_data:/var/lib/postgresql/data + environment: + POSTGRES_USER: ${POSTGRES_USER:-libretime} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-libretime} # Change me ! + healthcheck: + test: pg_isready -U libretime + + rabbitmq: + image: rabbitmq:3.13-alpine + environment: + RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_DEFAULT_VHOST:-/libretime} + RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER:-libretime} + RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS:-libretime} # Change me ! + healthcheck: + test: nc -z 127.0.0.1 5672 + + playout: + image: ghcr.io/libretime/libretime-playout:${LIBRETIME_VERSION:-latest} + init: true + ulimits: + nofile: 1024 + depends_on: + - rabbitmq + volumes: + - ${LIBRETIME_CONFIG_FILEPATH:-./config.yml}:/etc/libretime/config.yml:ro + - libretime_playout:/app + environment: + LIBRETIME_GENERAL_PUBLIC_URL: http://nginx:8080 + + liquidsoap: + image: ghcr.io/libretime/libretime-playout:${LIBRETIME_VERSION:-latest} + command: /usr/local/bin/libretime-liquidsoap + init: true + ulimits: + nofile: 1024 + ports: + - 8001:8001 + - 8002:8002 + depends_on: + - rabbitmq + volumes: + - ${LIBRETIME_CONFIG_FILEPATH:-./config.yml}:/etc/libretime/config.yml:ro + - libretime_playout:/app + environment: + LIBRETIME_GENERAL_PUBLIC_URL: http://nginx:8080 + + analyzer: + image: ghcr.io/libretime/libretime-analyzer:${LIBRETIME_VERSION:-latest} + init: true + ulimits: + nofile: 1024 + depends_on: + - rabbitmq + volumes: + - ${LIBRETIME_CONFIG_FILEPATH:-./config.yml}:/etc/libretime/config.yml:ro + - ./libretime_storage:/srv/libretime + environment: + LIBRETIME_GENERAL_PUBLIC_URL: http://nginx:8080 + + worker: + image: ghcr.io/libretime/libretime-worker:${LIBRETIME_VERSION:-latest} + init: true + ulimits: + nofile: 1024 + depends_on: + - rabbitmq + volumes: + - ${LIBRETIME_CONFIG_FILEPATH:-./config.yml}:/etc/libretime/config.yml:ro + environment: + LIBRETIME_GENERAL_PUBLIC_URL: http://nginx:8080 + + api: + image: ghcr.io/libretime/libretime-api:${LIBRETIME_VERSION:-latest} + init: true + ulimits: + nofile: 1024 + depends_on: + - postgres + - rabbitmq + volumes: + - ${LIBRETIME_CONFIG_FILEPATH:-./config.yml}:/etc/libretime/config.yml:ro + - ./libretime_storage:/srv/libretime + + legacy: + image: ghcr.io/libretime/libretime-legacy:${LIBRETIME_VERSION:-latest} + init: true + ulimits: + nofile: 1024 + depends_on: + - postgres + - rabbitmq + volumes: + - ${LIBRETIME_CONFIG_FILEPATH:-./config.yml}:/etc/libretime/config.yml:ro + - ./libretime_storage:/srv/libretime + + nginx: + image: ghcr.io/libretime/libretime-nginx:${LIBRETIME_VERSION:-latest} + ports: + - 8080:8080 + depends_on: + - legacy + volumes: + - ./libretime_storage:/srv/libretime:ro + + icecast: + image: ghcr.io/libretime/icecast:2.4.4 + ports: + - 8000:8000 + environment: + ICECAST_SOURCE_PASSWORD: ${ICECAST_SOURCE_PASSWORD:-hackme} # Change me ! + ICECAST_ADMIN_PASSWORD: ${ICECAST_ADMIN_PASSWORD:-hackme} # Change me ! + ICECAST_RELAY_PASSWORD: ${ICECAST_RELAY_PASSWORD:-hackme} # Change me ! + +volumes: + postgres_data: {} + libretime_playout: {}