From bb58434ab3c5768f843ac647e023ac5216353c55 Mon Sep 17 00:00:00 2001 From: devdamo <77869423+devdamo@users.noreply.github.com> Date: Fri, 5 Sep 2025 09:45:59 +0100 Subject: [PATCH] Azuracast (#335) * Add AzuraCast template * Refactor AzuraCast blueprint and update metadata Simplifies the docker-compose.yml by consolidating services, reducing exposed ports to 8080, and updating volume names. The template.toml is updated to match the new service name and environment variables. The meta.json description and logo are improved, and additional relevant tags are added. * Update AzuraCast logo file extension Changed the AzuraCast logo reference in meta.json from SVG to PNG to reflect the correct file format. * Add MariaDB service to AzuraCast blueprint Introduces a dedicated MariaDB service in the docker-compose file for AzuraCast, including necessary environment variables and volume configuration. Updates the template to generate MySQL credentials and propagate them to the environment, improving database management and security. * Add environment variables to AzuraCast template Introduces several new environment variables to the AzuraCast blueprint template, including Let's Encrypt, virtual host, port assignments, NGINX radio ports, release build preference, Composer plugin mode, and media sync worker count. These additions enhance configuration flexibility and deployment options. * Update docker-compose.yml * Change AzuraCast service port from 8080 to 80 Updated both docker-compose.yml and template.toml to expose AzuraCast on port 80 instead of 8080, aligning the configuration for standard HTTP access. --------- Co-authored-by: randomperson12344 <4dennisk@gmail.com> --- blueprints/azuracast/azuracast.png | Bin 0 -> 8370 bytes blueprints/azuracast/docker-compose.yml | 39 ++++++++++++++++++++++++ blueprints/azuracast/template.toml | 31 +++++++++++++++++++ meta.json | 20 ++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 blueprints/azuracast/azuracast.png create mode 100644 blueprints/azuracast/docker-compose.yml create mode 100644 blueprints/azuracast/template.toml diff --git a/blueprints/azuracast/azuracast.png b/blueprints/azuracast/azuracast.png new file mode 100644 index 0000000000000000000000000000000000000000..9b8dd04ef1047948e97061994005fbe19002f877 GIT binary patch literal 8370 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 n6DghgSEv#)X0x{sf2p}anHQ7pOv*7;$GdTL` literal 0 HcmV?d00001 diff --git a/blueprints/azuracast/docker-compose.yml b/blueprints/azuracast/docker-compose.yml new file mode 100644 index 00000000..53680200 --- /dev/null +++ b/blueprints/azuracast/docker-compose.yml @@ -0,0 +1,39 @@ +services: + azuracast: + image: ghcr.io/azuracast/azuracast:latest + restart: unless-stopped + ports: + - 80 + volumes: + - azuracast-station-data:/var/azuracast/stations + - azuracast-data:/var/azuracast/www_tmp + - azuracast-uploads:/var/azuracast/uploads + - azuracast-backups:/var/azuracast/backups + environment: + - LANG=en_US.UTF-8 + - AZURACAST_DC_REVISION=1 + - MYSQL_HOST=mariadb + - MYSQL_PORT=3306 + - MYSQL_USER=azuracast + - MYSQL_PASSWORD=${MYSQL_PASSWORD} + - MYSQL_DATABASE=azuracast + depends_on: + - mariadb + + mariadb: + image: mariadb:11.4 + restart: unless-stopped + volumes: + - mariadb-data:/var/lib/mysql + environment: + - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} + - MYSQL_DATABASE=azuracast + - MYSQL_USER=azuracast + - MYSQL_PASSWORD=${MYSQL_PASSWORD} + +volumes: + azuracast-station-data: {} + azuracast-data: {} + azuracast-uploads: {} + azuracast-backups: {} + mariadb-data: {} \ No newline at end of file diff --git a/blueprints/azuracast/template.toml b/blueprints/azuracast/template.toml new file mode 100644 index 00000000..cee2f393 --- /dev/null +++ b/blueprints/azuracast/template.toml @@ -0,0 +1,31 @@ +[variables] +main_domain = "${domain}" +mysql_root_password = "${password:32}" +mysql_password = "${password:16}" + +[config] +[[config.domains]] +serviceName = "azuracast" +port = 80 +host = "${main_domain}" + +[config.env] +LANG = "en_US.UTF-8" +AZURACAST_DC_REVISION = "1" +MYSQL_HOST = "mariadb" +MYSQL_PORT = "3306" +MYSQL_USER = "azuracast" +MYSQL_PASSWORD = "${mysql_password}" +MYSQL_DATABASE = "azuracast" +MYSQL_ROOT_PASSWORD = "${mysql_root_password}" +LETSENCRYPT_HOST = "${main_domain}" +VIRTUAL_HOST = "${main_domain}" +DISABLE_LETSENCRYPT = "true" +AUTO_ASSIGN_PORT_HTTP = "80" +AUTO_ASSIGN_PORT_HTTPS = "443" +NGINX_RADIO_PORTS = "8000,8010,8020,8030,8040,8050" +PREFER_RELEASE_BUILDS = "true" +COMPOSER_PLUGIN_MODE = "false" +ADDITIONAL_MEDIA_SYNC_WORKER_COUNT = "0" + +[[config.mounts]] \ No newline at end of file diff --git a/meta.json b/meta.json index 435a7e07..f80d64a3 100644 --- a/meta.json +++ b/meta.json @@ -470,6 +470,26 @@ "integration" ] }, + { + "id": "azuracast", + "name": "AzuraCast", + "version": "latest", + "description": "AzuraCast is a self-hosted, all-in-one web radio management suite. Easily manage your online radio stations with a powerful web interface.", + "logo": "azuracast.png", + "links": { + "github": "https://github.com/AzuraCast/AzuraCast", + "website": "https://www.azuracast.com/", + "docs": "https://docs.azuracast.com/" + }, + "tags": [ + "radio", + "streaming", + "media", + "broadcasting", + "music", + "entertainment" + ] + }, { "id": "babybuddy", "name": "BabyBuddy",