commit 90ad8bd7301583a880603023ffa6a6f35f2f24bd Author: martin Date: Fri May 17 09:16:11 2024 +0000 Init diff --git a/.docker.sh.swp b/.docker.sh.swp new file mode 100644 index 0000000..e69de29 diff --git a/.env b/.env new file mode 100644 index 0000000..7aae943 --- /dev/null +++ b/.env @@ -0,0 +1,59 @@ +# This file was automatically generated by AzuraCast. +# You can modify it as necessary. To apply changes, restart the Docker containers. +# Remove the leading "#" symbol from lines to uncomment them. + +# (Docker Compose) All Docker containers are prefixed by this name. Do not change this after installation. +# Default: azuracast +COMPOSE_PROJECT_NAME=azuracast + +# (Docker Compose) The amount of time to wait before a Docker Compose operation fails. Increase this on lower performance computers. +# Default: 300 +COMPOSE_HTTP_TIMEOUT=300 + +# Release Channel +# Valid options: latest, stable +# Default: latest +AZURACAST_VERSION=stable + +# HTTP Port +# The main port AzuraCast listens to for insecure HTTP connections. +# Default: 80 +AZURACAST_HTTP_PORT=8600 + +# HTTPS Port +# The main port AzuraCast listens to for secure HTTPS connections. +# Default: 443 +# AZURACAST_HTTPS_PORT=443 + +# SFTP Port +# The port AzuraCast listens to for SFTP file management connections. +# Default: 2022 +# AZURACAST_SFTP_PORT=2022 + +# Station Ports +# The ports AzuraCast should listen to for station broadcasts and incoming DJ +# connections. +# Default: 8000,8005,8006,8010,8015,8016,8020,8025,8026,8030,8035,8036,8040,8045,8046,8050,8055,8056,8060,8065,8066,8070,8075,8076,8090,8095,8096,8100,8105,8106,8110,8115,8116,8120,8125,8126,8130,8135,8136,8140,8145,8146,8150,8155,8156,8160,8165,8166,8170,8175,8176,8180,8185,8186,8190,8195,8196,8200,8205,8206,8210,8215,8216,8220,8225,8226,8230,8235,8236,8240,8245,8246,8250,8255,8256,8260,8265,8266,8270,8275,8276,8280,8285,8286,8290,8295,8296,8300,8305,8306,8310,8315,8316,8320,8325,8326,8330,8335,8336,8340,8345,8346,8350,8355,8356,8360,8365,8366,8370,8375,8376,8380,8385,8386,8390,8395,8396,8400,8405,8406,8410,8415,8416,8420,8425,8426,8430,8435,8436,8440,8445,8446,8450,8455,8456,8460,8465,8466,8470,8475,8476,8480,8485,8486,8490,8495,8496 +AZURACAST_STATION_PORTS=8000,8005,8006,8010,8015,8016,8020,8025,8026,8030 + +# Docker User UID +# Set the UID of the user running inside the Docker containers. Matching this +# with your host UID can fix permission issues. +# Default: 1000 +# AZURACAST_PUID=1000 + +# Docker User GID +# Set the GID of the user running inside the Docker containers. Matching this +# with your host GID can fix permission issues. +# Default: 1000 +# AZURACAST_PGID=1000 + +# Use Podman instead of Docker. +# AZURACAST_PODMAN_MODE= + +# Advanced: Use Privileged Docker Settings +# Default: 1 +# AZURACAST_COMPOSE_PRIVILEGED=1 + +# Additional Environment Variables +NGINX_TIMEOUT=1800 \ No newline at end of file diff --git a/azuracast.env b/azuracast.env new file mode 100644 index 0000000..25ad03a --- /dev/null +++ b/azuracast.env @@ -0,0 +1,187 @@ +# This file was automatically generated by AzuraCast. +# You can modify it as necessary. To apply changes, restart the Docker containers. +# Remove the leading "#" symbol from lines to uncomment them. + +# The locale to use for CLI commands. +# Valid options: en_US, cs_CZ, nl_NL, fr_FR, de_DE, el_GR, it_IT, ja_JP, ko_KR, nb_NO, pl_PL, pt_PT, pt_BR, ru_RU, zh_CN, es_ES, sv_SE, tr_TR, uk_UA +# Default: en_US +LANG=en_US + +# The application environment. +# Valid options: Production, Testing, Development +APPLICATION_ENV=production + +# Manually modify the logging level. +# This allows you to log debug-level errors temporarily (for problem-solving) +# or reduce the volume of logs that are produced by your installation, +# without needing to modify whether your installation is a production or +# development instance. +# Valid options: debug, info, notice, warning, error, critical, alert, emergency +# LOG_LEVEL= + +# Enable Custom Code Plugins +# Enable the composer "merge" functionality to combine the main application's +# composer.json file with any plugin composer files. This can have +# performance implications, so you should only use it if you use one or more +# plugins with their own Composer dependencies. +# Valid options: 1, +# COMPOSER_PLUGIN_MODE= + +# Minimum Port for Station Port Assignment +# Modify this if your stations are listening on nonstandard ports. +# AUTO_ASSIGN_PORT_MIN= + +# Maximum Port for Station Port Assignment +# Modify this if your stations are listening on nonstandard ports. +# AUTO_ASSIGN_PORT_MAX= + +# Show Detailed Slim Application Errors +# This allows you to debug Slim Application Errors you may encounter. Please +# report any Slim Application Error logs to the development team on GitHub. +# Valid options: 1, +# SHOW_DETAILED_ERRORS= + +# MariaDB Host +# Do not modify this after installation. +# Default: localhost +MYSQL_HOST=localhost + +# MariaDB Port +# Do not modify this after installation. +# Default: 3306 +MYSQL_PORT=3306 + +# MariaDB Username +# Do not modify this after installation. +# Default: azuracast +MYSQL_USER=azuracast + +# MariaDB Password +# Do not modify this after installation. +# Default: azur4c457 +MYSQL_PASSWORD=JcwgjT66MnKg + +# MariaDB Database Name +# Do not modify this after installation. +# Default: azuracast +MYSQL_DATABASE=azuracast + +# Auto-generate Random MariaDB Root Password +# Do not modify this after installation. +# MYSQL_RANDOM_ROOT_PASSWORD= + +# MariaDB Root Password +# Do not modify this after installation. +MYSQL_ROOT_PASSWORD=XJwDwXYRy4QmFgJtdmRt + +# Enable MariaDB Slow Query Log +# Log slower queries to diagnose possible database issues. Only turn this on +# if needed. +# MYSQL_SLOW_QUERY_LOG= + +# MariaDB Maximum Connections +# Set the amount of allowed connections to the database. This value should be +# increased if you are seeing the "Too many connections" error in the logs. +# Default: 100 +# MYSQL_MAX_CONNECTIONS=100 + +# MariaDB InnoDB Buffer Pool Size +# The InnoDB buffer pool size controls how much data & indexes are kept in +# memory. Making sure that this value is as large as possible reduces the +# amount of disk IO. +# Default: 128M +# MYSQL_INNODB_BUFFER_POOL_SIZE=128M + +# MariaDB InnoDB Log File Size +# The InnoDB log file is used to achieve data durability in case of crashes +# or unexpected shutoffs and to allow the DB to better optimize IO for write +# operations. +# Default: 16M +# MYSQL_INNODB_LOG_FILE_SIZE=16M + +# Enable Redis +# Disable to use a flatfile cache instead of Redis. +# ENABLE_REDIS= + +# Redis Host +# Default: localhost +REDIS_HOST=localhost + +# Redis Port +# Default: 6379 +REDIS_PORT=6379 + +# PHP Maximum POST File Size +# Default: 25M +# PHP_MAX_FILE_SIZE=25M + +# PHP Memory Limit +# Default: 128M +# PHP_MEMORY_LIMIT=128M + +# PHP Script Maximum Execution Time (Seconds) +# Default: 30 +# PHP_MAX_EXECUTION_TIME=30 + +# Short Sync Task Execution Time (Seconds) +# The maximum execution time (and lock timeout) for the 15-second, 1-minute +# and 5-minute synchronization tasks. +# SYNC_SHORT_EXECUTION_TIME= + +# Long Sync Task Execution Time (Seconds) +# The maximum execution time (and lock timeout) for the 1-hour +# synchronization task. +# SYNC_LONG_EXECUTION_TIME= + +# Now Playing Delay Time (Seconds) +# The delay between Now Playing checks for every station. Decrease for more +# frequent checks at the expense of performance; increase for less frequent +# checks but better performance (for large installations). +# NOW_PLAYING_DELAY_TIME= + +# Now Playing Max Concurrent Processes +# The maximum number of concurrent processes for now playing updates. +# Increasing this can help reduce the latency between updates now playing +# updates on large installations. +# NOW_PLAYING_MAX_CONCURRENT_PROCESSES= + +# Maximum PHP-FPM Worker Processes +# Default: 5 +# PHP_FPM_MAX_CHILDREN=5 + +# Enable Performance Profiling Extension +# Profiling data can be viewed by visiting +# http://your-azuracast-site/?SPX_KEY=dev&SPX_UI_URI=/. +# PROFILING_EXTENSION_ENABLED= + +# Profile Performance on All Requests +# This will have a significant performance impact on your installation. +# PROFILING_EXTENSION_ALWAYS_ON= + +# Profiling Extension HTTP Key +# The value for the "SPX_KEY" parameter for viewing profiling pages. +# PROFILING_EXTENSION_HTTP_KEY= + +# Profiling Extension IP Allow List +# Valid options: 127.0.0.1, * +# Default: * +# PROFILING_EXTENSION_HTTP_IP_WHITELIST=* + +# Nginx Max Client Body Size +# This is the total size any single request body can be. AzuraCast chunks its +# uploads into smaller file sizes, so this only applies when doing custom +# uploads via the API. Sizes should be listed in a format like "100K", +# "128M", "1G" for kilobytes, megabytes, and gigabytes respectively. +# Default: 50M +# NGINX_CLIENT_MAX_BODY_SIZE=50M + +# Enable web-based Docker image updates +# Default: 1 +# ENABLE_WEB_UPDATER=1 + +# Extra Ubuntu packages to install upon startup +# Default: "Separate package names with a space. Packages will be installed during container startup." +# INSTALL_PACKAGES_ON_STARTUP="Separate package names with a space. Packages will be installed during container startup." + +# Additional Environment Variables +REDIS_DB=1 \ No newline at end of file diff --git a/azuracast.env.bak b/azuracast.env.bak new file mode 100644 index 0000000..25ad03a --- /dev/null +++ b/azuracast.env.bak @@ -0,0 +1,187 @@ +# This file was automatically generated by AzuraCast. +# You can modify it as necessary. To apply changes, restart the Docker containers. +# Remove the leading "#" symbol from lines to uncomment them. + +# The locale to use for CLI commands. +# Valid options: en_US, cs_CZ, nl_NL, fr_FR, de_DE, el_GR, it_IT, ja_JP, ko_KR, nb_NO, pl_PL, pt_PT, pt_BR, ru_RU, zh_CN, es_ES, sv_SE, tr_TR, uk_UA +# Default: en_US +LANG=en_US + +# The application environment. +# Valid options: Production, Testing, Development +APPLICATION_ENV=production + +# Manually modify the logging level. +# This allows you to log debug-level errors temporarily (for problem-solving) +# or reduce the volume of logs that are produced by your installation, +# without needing to modify whether your installation is a production or +# development instance. +# Valid options: debug, info, notice, warning, error, critical, alert, emergency +# LOG_LEVEL= + +# Enable Custom Code Plugins +# Enable the composer "merge" functionality to combine the main application's +# composer.json file with any plugin composer files. This can have +# performance implications, so you should only use it if you use one or more +# plugins with their own Composer dependencies. +# Valid options: 1, +# COMPOSER_PLUGIN_MODE= + +# Minimum Port for Station Port Assignment +# Modify this if your stations are listening on nonstandard ports. +# AUTO_ASSIGN_PORT_MIN= + +# Maximum Port for Station Port Assignment +# Modify this if your stations are listening on nonstandard ports. +# AUTO_ASSIGN_PORT_MAX= + +# Show Detailed Slim Application Errors +# This allows you to debug Slim Application Errors you may encounter. Please +# report any Slim Application Error logs to the development team on GitHub. +# Valid options: 1, +# SHOW_DETAILED_ERRORS= + +# MariaDB Host +# Do not modify this after installation. +# Default: localhost +MYSQL_HOST=localhost + +# MariaDB Port +# Do not modify this after installation. +# Default: 3306 +MYSQL_PORT=3306 + +# MariaDB Username +# Do not modify this after installation. +# Default: azuracast +MYSQL_USER=azuracast + +# MariaDB Password +# Do not modify this after installation. +# Default: azur4c457 +MYSQL_PASSWORD=JcwgjT66MnKg + +# MariaDB Database Name +# Do not modify this after installation. +# Default: azuracast +MYSQL_DATABASE=azuracast + +# Auto-generate Random MariaDB Root Password +# Do not modify this after installation. +# MYSQL_RANDOM_ROOT_PASSWORD= + +# MariaDB Root Password +# Do not modify this after installation. +MYSQL_ROOT_PASSWORD=XJwDwXYRy4QmFgJtdmRt + +# Enable MariaDB Slow Query Log +# Log slower queries to diagnose possible database issues. Only turn this on +# if needed. +# MYSQL_SLOW_QUERY_LOG= + +# MariaDB Maximum Connections +# Set the amount of allowed connections to the database. This value should be +# increased if you are seeing the "Too many connections" error in the logs. +# Default: 100 +# MYSQL_MAX_CONNECTIONS=100 + +# MariaDB InnoDB Buffer Pool Size +# The InnoDB buffer pool size controls how much data & indexes are kept in +# memory. Making sure that this value is as large as possible reduces the +# amount of disk IO. +# Default: 128M +# MYSQL_INNODB_BUFFER_POOL_SIZE=128M + +# MariaDB InnoDB Log File Size +# The InnoDB log file is used to achieve data durability in case of crashes +# or unexpected shutoffs and to allow the DB to better optimize IO for write +# operations. +# Default: 16M +# MYSQL_INNODB_LOG_FILE_SIZE=16M + +# Enable Redis +# Disable to use a flatfile cache instead of Redis. +# ENABLE_REDIS= + +# Redis Host +# Default: localhost +REDIS_HOST=localhost + +# Redis Port +# Default: 6379 +REDIS_PORT=6379 + +# PHP Maximum POST File Size +# Default: 25M +# PHP_MAX_FILE_SIZE=25M + +# PHP Memory Limit +# Default: 128M +# PHP_MEMORY_LIMIT=128M + +# PHP Script Maximum Execution Time (Seconds) +# Default: 30 +# PHP_MAX_EXECUTION_TIME=30 + +# Short Sync Task Execution Time (Seconds) +# The maximum execution time (and lock timeout) for the 15-second, 1-minute +# and 5-minute synchronization tasks. +# SYNC_SHORT_EXECUTION_TIME= + +# Long Sync Task Execution Time (Seconds) +# The maximum execution time (and lock timeout) for the 1-hour +# synchronization task. +# SYNC_LONG_EXECUTION_TIME= + +# Now Playing Delay Time (Seconds) +# The delay between Now Playing checks for every station. Decrease for more +# frequent checks at the expense of performance; increase for less frequent +# checks but better performance (for large installations). +# NOW_PLAYING_DELAY_TIME= + +# Now Playing Max Concurrent Processes +# The maximum number of concurrent processes for now playing updates. +# Increasing this can help reduce the latency between updates now playing +# updates on large installations. +# NOW_PLAYING_MAX_CONCURRENT_PROCESSES= + +# Maximum PHP-FPM Worker Processes +# Default: 5 +# PHP_FPM_MAX_CHILDREN=5 + +# Enable Performance Profiling Extension +# Profiling data can be viewed by visiting +# http://your-azuracast-site/?SPX_KEY=dev&SPX_UI_URI=/. +# PROFILING_EXTENSION_ENABLED= + +# Profile Performance on All Requests +# This will have a significant performance impact on your installation. +# PROFILING_EXTENSION_ALWAYS_ON= + +# Profiling Extension HTTP Key +# The value for the "SPX_KEY" parameter for viewing profiling pages. +# PROFILING_EXTENSION_HTTP_KEY= + +# Profiling Extension IP Allow List +# Valid options: 127.0.0.1, * +# Default: * +# PROFILING_EXTENSION_HTTP_IP_WHITELIST=* + +# Nginx Max Client Body Size +# This is the total size any single request body can be. AzuraCast chunks its +# uploads into smaller file sizes, so this only applies when doing custom +# uploads via the API. Sizes should be listed in a format like "100K", +# "128M", "1G" for kilobytes, megabytes, and gigabytes respectively. +# Default: 50M +# NGINX_CLIENT_MAX_BODY_SIZE=50M + +# Enable web-based Docker image updates +# Default: 1 +# ENABLE_WEB_UPDATER=1 + +# Extra Ubuntu packages to install upon startup +# Default: "Separate package names with a space. Packages will be installed during container startup." +# INSTALL_PACKAGES_ON_STARTUP="Separate package names with a space. Packages will be installed during container startup." + +# Additional Environment Variables +REDIS_DB=1 \ No newline at end of file diff --git a/azuracast.env_backup_20240306-091007.bak b/azuracast.env_backup_20240306-091007.bak new file mode 100644 index 0000000..68e2775 --- /dev/null +++ b/azuracast.env_backup_20240306-091007.bak @@ -0,0 +1,155 @@ +# This file was automatically generated by AzuraCast. +# You can modify it as necessary. To apply changes, restart the Docker containers. +# Remove the leading "#" symbol from lines to uncomment them. + +# The locale to use for CLI commands. +# Valid options: en_US, cs_CZ, de_DE, es_ES, fr_FR, el_GR, it_IT, hu_HU, nl_NL, pl_PL, pt_PT, pt_BR, ru_RU, sv_SE, tr_TR, zh_CN, ko_KR +# Default: en_US +LANG=en_US + +# The application environment. +# Valid options: Production, Testing, Development +APPLICATION_ENV=production + +# Manually modify the logging level. +# This allows you to log debug-level errors temporarily (for problem-solving) +# or reduce the volume of logs that are produced by your installation, +# without needing to modify whether your installation is a production or +# development instance. +# Valid options: debug, info, notice, warning, error, critical, alert, emergency +# Default: notice +# LOG_LEVEL=notice + +# Enable Custom Code Plugins +# Enable the composer "merge" functionality to combine the main application's +# composer.json file with any plugin composer files. This can have +# performance implications, so you should only use it if you use one or more +# plugins with their own Composer dependencies. +# Valid options: true, false +# COMPOSER_PLUGIN_MODE= + +# Minimum Port for Station Port Assignment +# Modify this if your stations are listening on nonstandard ports. +# Default: 8000 +# AUTO_ASSIGN_PORT_MIN=8000 + +# Maximum Port for Station Port Assignment +# Modify this if your stations are listening on nonstandard ports. +# Default: 8499 +# AUTO_ASSIGN_PORT_MAX=8499 + +# Show Detailed Slim Application Errors +# This allows you to debug Slim Application Errors you may encounter. Please +# report any Slim Application Error logs to the development team on GitHub. +# Valid options: true, false +# SHOW_DETAILED_ERRORS= + +# MariaDB Host +# Do not modify this after installation. +# Default: localhost +MYSQL_HOST=localhost + +# MariaDB Port +# Do not modify this after installation. +# Default: 3306 +MYSQL_PORT=3306 + +# MariaDB Username +# Do not modify this after installation. +# Default: azuracast +MYSQL_USER=azuracast + +# MariaDB Password +# Do not modify this after installation. +# Default: azur4c457 +MYSQL_PASSWORD=JcwgjT66MnKg + +# MariaDB Database Name +# Do not modify this after installation. +# Default: azuracast +MYSQL_DATABASE=azuracast + +# Auto-generate Random MariaDB Root Password +# Do not modify this after installation. +# MYSQL_RANDOM_ROOT_PASSWORD= + +# MariaDB Root Password +# Do not modify this after installation. +MYSQL_ROOT_PASSWORD=XJwDwXYRy4QmFgJtdmRt + +# Enable MariaDB Slow Query Log +# Log slower queries to diagnose possible database issues. Only turn this on +# if needed. +# MYSQL_SLOW_QUERY_LOG= + +# MariaDB Maximum Connections +# Set the amount of allowed connections to the database. This value should be +# increased if you are seeing the "Too many connections" error in the logs. +# Default: 100 +# MYSQL_MAX_CONNECTIONS=100 + +# Enable Redis +# Disable to use a flatfile cache instead of Redis. +# Default: true +# ENABLE_REDIS=true + +# Redis Host +# Default: localhost +REDIS_HOST=localhost + +# Redis Port +# Default: 6379 +REDIS_PORT=6379 + +# Redis Database Index +# Valid options: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +# Default: 1 +REDIS_DB=1 + +# PHP Maximum POST File Size +# Default: 25M +# PHP_MAX_FILE_SIZE=25M + +# PHP Memory Limit +# Default: 128M +# PHP_MEMORY_LIMIT=128M + +# PHP Script Maximum Execution Time +# (in seconds) +# Default: 30 +# PHP_MAX_EXECUTION_TIME=30 + +# Short Sync Task Execution Time +# The maximum execution time (and lock timeout) for the 15-second, 1-minute +# and 5-minute synchronization tasks. +# Default: 600 +# SYNC_SHORT_EXECUTION_TIME=600 + +# Long Sync Task Execution Time +# The maximum execution time (and lock timeout) for the 1-hour +# synchronization task. +# Default: 1800 +# SYNC_LONG_EXECUTION_TIME=1800 + +# Maximum PHP-FPM Worker Processes +# Default: 5 +# PHP_FPM_MAX_CHILDREN=5 + +# Enable Performance Profiling Extension +# Profiling data can be viewed by visiting +# http://your-azuracast-site/?SPX_KEY=dev&SPX_UI_URI=/. +# PROFILING_EXTENSION_ENABLED= + +# Profile Performance on All Requests +# This will have a significant performance impact on your installation. +# PROFILING_EXTENSION_ALWAYS_ON= + +# Profiling Extension HTTP Key +# The value for the "SPX_KEY" parameter for viewing profiling pages. +# Default: dev +# PROFILING_EXTENSION_HTTP_KEY=dev + +# Profiling Extension IP Allow List +# Valid options: 127.0.0.1, * +# Default: * +# PROFILING_EXTENSION_HTTP_IP_WHITELIST=* diff --git a/azuracast.env_backup_20240418-080053.bak b/azuracast.env_backup_20240418-080053.bak new file mode 100644 index 0000000..68e2775 --- /dev/null +++ b/azuracast.env_backup_20240418-080053.bak @@ -0,0 +1,155 @@ +# This file was automatically generated by AzuraCast. +# You can modify it as necessary. To apply changes, restart the Docker containers. +# Remove the leading "#" symbol from lines to uncomment them. + +# The locale to use for CLI commands. +# Valid options: en_US, cs_CZ, de_DE, es_ES, fr_FR, el_GR, it_IT, hu_HU, nl_NL, pl_PL, pt_PT, pt_BR, ru_RU, sv_SE, tr_TR, zh_CN, ko_KR +# Default: en_US +LANG=en_US + +# The application environment. +# Valid options: Production, Testing, Development +APPLICATION_ENV=production + +# Manually modify the logging level. +# This allows you to log debug-level errors temporarily (for problem-solving) +# or reduce the volume of logs that are produced by your installation, +# without needing to modify whether your installation is a production or +# development instance. +# Valid options: debug, info, notice, warning, error, critical, alert, emergency +# Default: notice +# LOG_LEVEL=notice + +# Enable Custom Code Plugins +# Enable the composer "merge" functionality to combine the main application's +# composer.json file with any plugin composer files. This can have +# performance implications, so you should only use it if you use one or more +# plugins with their own Composer dependencies. +# Valid options: true, false +# COMPOSER_PLUGIN_MODE= + +# Minimum Port for Station Port Assignment +# Modify this if your stations are listening on nonstandard ports. +# Default: 8000 +# AUTO_ASSIGN_PORT_MIN=8000 + +# Maximum Port for Station Port Assignment +# Modify this if your stations are listening on nonstandard ports. +# Default: 8499 +# AUTO_ASSIGN_PORT_MAX=8499 + +# Show Detailed Slim Application Errors +# This allows you to debug Slim Application Errors you may encounter. Please +# report any Slim Application Error logs to the development team on GitHub. +# Valid options: true, false +# SHOW_DETAILED_ERRORS= + +# MariaDB Host +# Do not modify this after installation. +# Default: localhost +MYSQL_HOST=localhost + +# MariaDB Port +# Do not modify this after installation. +# Default: 3306 +MYSQL_PORT=3306 + +# MariaDB Username +# Do not modify this after installation. +# Default: azuracast +MYSQL_USER=azuracast + +# MariaDB Password +# Do not modify this after installation. +# Default: azur4c457 +MYSQL_PASSWORD=JcwgjT66MnKg + +# MariaDB Database Name +# Do not modify this after installation. +# Default: azuracast +MYSQL_DATABASE=azuracast + +# Auto-generate Random MariaDB Root Password +# Do not modify this after installation. +# MYSQL_RANDOM_ROOT_PASSWORD= + +# MariaDB Root Password +# Do not modify this after installation. +MYSQL_ROOT_PASSWORD=XJwDwXYRy4QmFgJtdmRt + +# Enable MariaDB Slow Query Log +# Log slower queries to diagnose possible database issues. Only turn this on +# if needed. +# MYSQL_SLOW_QUERY_LOG= + +# MariaDB Maximum Connections +# Set the amount of allowed connections to the database. This value should be +# increased if you are seeing the "Too many connections" error in the logs. +# Default: 100 +# MYSQL_MAX_CONNECTIONS=100 + +# Enable Redis +# Disable to use a flatfile cache instead of Redis. +# Default: true +# ENABLE_REDIS=true + +# Redis Host +# Default: localhost +REDIS_HOST=localhost + +# Redis Port +# Default: 6379 +REDIS_PORT=6379 + +# Redis Database Index +# Valid options: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +# Default: 1 +REDIS_DB=1 + +# PHP Maximum POST File Size +# Default: 25M +# PHP_MAX_FILE_SIZE=25M + +# PHP Memory Limit +# Default: 128M +# PHP_MEMORY_LIMIT=128M + +# PHP Script Maximum Execution Time +# (in seconds) +# Default: 30 +# PHP_MAX_EXECUTION_TIME=30 + +# Short Sync Task Execution Time +# The maximum execution time (and lock timeout) for the 15-second, 1-minute +# and 5-minute synchronization tasks. +# Default: 600 +# SYNC_SHORT_EXECUTION_TIME=600 + +# Long Sync Task Execution Time +# The maximum execution time (and lock timeout) for the 1-hour +# synchronization task. +# Default: 1800 +# SYNC_LONG_EXECUTION_TIME=1800 + +# Maximum PHP-FPM Worker Processes +# Default: 5 +# PHP_FPM_MAX_CHILDREN=5 + +# Enable Performance Profiling Extension +# Profiling data can be viewed by visiting +# http://your-azuracast-site/?SPX_KEY=dev&SPX_UI_URI=/. +# PROFILING_EXTENSION_ENABLED= + +# Profile Performance on All Requests +# This will have a significant performance impact on your installation. +# PROFILING_EXTENSION_ALWAYS_ON= + +# Profiling Extension HTTP Key +# The value for the "SPX_KEY" parameter for viewing profiling pages. +# Default: dev +# PROFILING_EXTENSION_HTTP_KEY=dev + +# Profiling Extension IP Allow List +# Valid options: 127.0.0.1, * +# Default: * +# PROFILING_EXTENSION_HTTP_IP_WHITELIST=* diff --git a/docker-compose.backup.yml b/docker-compose.backup.yml new file mode 100644 index 0000000..f0b27aa --- /dev/null +++ b/docker-compose.backup.yml @@ -0,0 +1,199 @@ +services: + web: + container_name: azuracast + image: 'ghcr.io/azuracast/azuracast:${AZURACAST_VERSION:-latest}' + labels: + - com.centurylinklabs.watchtower.scope=azuracast + ports: + - '${AZURACAST_HTTP_PORT:-80}:${AZURACAST_HTTP_PORT:-80}' + - '${AZURACAST_HTTPS_PORT:-443}:${AZURACAST_HTTPS_PORT:-443}' + - '${AZURACAST_SFTP_PORT:-2022}:${AZURACAST_SFTP_PORT:-2022}' + - '8000:8000' + - '8005:8005' + - '8006:8006' + - '8010:8010' + - '8015:8015' + - '8016:8016' + - '8020:8020' + - '8025:8025' + - '8026:8026' + - '8030:8030' + - '8035:8035' + - '8036:8036' + - '8040:8040' + - '8045:8045' + - '8046:8046' + - '8050:8050' + - '8055:8055' + - '8056:8056' + - '8060:8060' + - '8065:8065' + - '8066:8066' + - '8070:8070' + - '8075:8075' + - '8076:8076' + - '8090:8090' + - '8095:8095' + - '8096:8096' + - '8100:8100' + - '8105:8105' + - '8106:8106' + - '8110:8110' + - '8115:8115' + - '8116:8116' + - '8120:8120' + - '8125:8125' + - '8126:8126' + - '8130:8130' + - '8135:8135' + - '8136:8136' + - '8140:8140' + - '8145:8145' + - '8146:8146' + - '8150:8150' + - '8155:8155' + - '8156:8156' + - '8160:8160' + - '8165:8165' + - '8166:8166' + - '8170:8170' + - '8175:8175' + - '8176:8176' + - '8180:8180' + - '8185:8185' + - '8186:8186' + - '8190:8190' + - '8195:8195' + - '8196:8196' + - '8200:8200' + - '8205:8205' + - '8206:8206' + - '8210:8210' + - '8215:8215' + - '8216:8216' + - '8220:8220' + - '8225:8225' + - '8226:8226' + - '8230:8230' + - '8235:8235' + - '8236:8236' + - '8240:8240' + - '8245:8245' + - '8246:8246' + - '8250:8250' + - '8255:8255' + - '8256:8256' + - '8260:8260' + - '8265:8265' + - '8266:8266' + - '8270:8270' + - '8275:8275' + - '8276:8276' + - '8280:8280' + - '8285:8285' + - '8286:8286' + - '8290:8290' + - '8295:8295' + - '8296:8296' + - '8300:8300' + - '8305:8305' + - '8306:8306' + - '8310:8310' + - '8315:8315' + - '8316:8316' + - '8320:8320' + - '8325:8325' + - '8326:8326' + - '8330:8330' + - '8335:8335' + - '8336:8336' + - '8340:8340' + - '8345:8345' + - '8346:8346' + - '8350:8350' + - '8355:8355' + - '8356:8356' + - '8360:8360' + - '8365:8365' + - '8366:8366' + - '8370:8370' + - '8375:8375' + - '8376:8376' + - '8380:8380' + - '8385:8385' + - '8386:8386' + - '8390:8390' + - '8395:8395' + - '8396:8396' + - '8400:8400' + - '8405:8405' + - '8406:8406' + - '8410:8410' + - '8415:8415' + - '8416:8416' + - '8420:8420' + - '8425:8425' + - '8426:8426' + - '8430:8430' + - '8435:8435' + - '8436:8436' + - '8440:8440' + - '8445:8445' + - '8446:8446' + - '8450:8450' + - '8455:8455' + - '8456:8456' + - '8460:8460' + - '8465:8465' + - '8466:8466' + - '8470:8470' + - '8475:8475' + - '8476:8476' + - '8480:8480' + - '8485:8485' + - '8486:8486' + - '8490:8490' + - '8495:8495' + - '8496:8496' + env_file: + - azuracast.env + - .env + volumes: + - 'station_data:/var/azuracast/stations' + - 'backups:/var/azuracast/backups' + - 'db_data:/var/lib/mysql' + - 'www_uploads:/var/azuracast/storage/uploads' + - 'shoutcast2_install:/var/azuracast/storage/shoutcast2' + - 'stereo_tool_install:/var/azuracast/storage/stereo_tool' + - 'geolite_install:/var/azuracast/storage/geoip' + - 'sftpgo_data:/var/azuracast/storage/sftpgo' + - 'acme:/var/azuracast/storage/acme' + - '/data/media/station_store:/var/azuracast/stations' + restart: unless-stopped + ulimits: + nofile: + soft: 65536 + hard: 65536 + logging: + options: + max-size: 1m + max-file: '5' + updater: + container_name: azuracast_updater + image: 'ghcr.io/azuracast/updater:latest' + volumes: + - '/var/run/docker.sock:/var/run/docker.sock' + logging: + options: + max-size: 1m + max-file: '5' +volumes: + db_data: { } + acme: { } + shoutcast2_install: { } + stereo_tool_install: { } + geolite_install: { } + sftpgo_data: { } + station_data: { } + www_uploads: { } + backups: { } diff --git a/docker-compose.external.yml b/docker-compose.external.yml new file mode 100644 index 0000000..5ac0d30 --- /dev/null +++ b/docker-compose.external.yml @@ -0,0 +1,263 @@ +services: + web: + container_name: azuracast_web + image: 'ghcr.io/azuracast/web:${AZURACAST_VERSION:-latest}' + ports: + - '${AZURACAST_HTTP_PORT:-80}:80' + - '${AZURACAST_HTTPS_PORT:-443}:443' + - '${AZURACAST_SFTP_PORT:-2022}:2022' + depends_on: + - mariadb + - stations + - redis + env_file: azuracast.env + environment: + LANG: '${LANG:-en_US.UTF-8}' + AZURACAST_DC_REVISION: 13 + AZURACAST_VERSION: '${AZURACAST_VERSION:-latest}' + AZURACAST_SFTP_PORT: '${AZURACAST_SFTP_PORT:-2022}' + NGINX_TIMEOUT: '${NGINX_TIMEOUT:-1800}' + LETSENCRYPT_HOST: '${LETSENCRYPT_HOST:-}' + LETSENCRYPT_EMAIL: '${LETSENCRYPT_EMAIL:-}' + PUID: '${AZURACAST_PUID:-1000}' + PGID: '${AZURACAST_PGID:-1000}' + volumes: + - 'letsencrypt:/etc/nginx/certs' + - 'letsencrypt_acme:/etc/acme.sh' + - 'www_vendor:/var/azuracast/www/vendor' + - 'www_uploads:/var/azuracast/uploads' + - 'tmp_data:/var/azuracast/www_tmp' + - 'shoutcast2_install:/var/azuracast/servers/shoutcast2' + - 'geolite_install:/var/azuracast/geoip' + - 'sftpgo_data:/var/azuracast/sftpgo/persist' + - 'backups:/var/azuracast/backups' + - '/data/media/station_store:/var/azuracast/stations' + networks: + - frontend + - backend + restart: unless-stopped + ulimits: + nofile: + soft: 65536 + hard: 65536 + logging: + options: + max-size: 1m + max-file: '5' + mariadb: + container_name: azuracast_mariadb + image: 'ghcr.io/azuracast/db:${AZURACAST_VERSION:-latest}' + volumes: + - 'db_data:/var/lib/mysql' + env_file: azuracast.env + networks: + - backend + restart: unless-stopped + logging: + options: + max-size: 1m + max-file: '5' + redis: + container_name: azuracast_redis + image: 'ghcr.io/azuracast/redis:${AZURACAST_VERSION:-latest}' + sysctls: + net.core.somaxconn: 1024 + volumes: + - 'redis_data:/data' + networks: + - backend + restart: unless-stopped + logging: + options: + max-size: 1m + max-file: '5' + stations: + container_name: azuracast_stations + image: 'ghcr.io/azuracast/radio:${AZURACAST_VERSION:-latest}' + environment: + PUID: '${AZURACAST_PUID:-1000}' + PGID: '${AZURACAST_PGID:-1000}' + ports: + - '8000:8000' + - '8005:8005' + - '8006:8006' + - '8010:8010' + - '8015:8015' + - '8016:8016' + - '8020:8020' + - '8025:8025' + - '8026:8026' + - '8030:8030' + - '8035:8035' + - '8036:8036' + - '8040:8040' + - '8045:8045' + - '8046:8046' + - '8050:8050' + - '8055:8055' + - '8056:8056' + - '8060:8060' + - '8065:8065' + - '8066:8066' + - '8070:8070' + - '8075:8075' + - '8076:8076' + - '8090:8090' + - '8095:8095' + - '8096:8096' + - '8100:8100' + - '8105:8105' + - '8106:8106' + - '8110:8110' + - '8115:8115' + - '8116:8116' + - '8120:8120' + - '8125:8125' + - '8126:8126' + - '8130:8130' + - '8135:8135' + - '8136:8136' + - '8140:8140' + - '8145:8145' + - '8146:8146' + - '8150:8150' + - '8155:8155' + - '8156:8156' + - '8160:8160' + - '8165:8165' + - '8166:8166' + - '8170:8170' + - '8175:8175' + - '8176:8176' + - '8180:8180' + - '8185:8185' + - '8186:8186' + - '8190:8190' + - '8195:8195' + - '8196:8196' + - '8200:8200' + - '8205:8205' + - '8206:8206' + - '8210:8210' + - '8215:8215' + - '8216:8216' + - '8220:8220' + - '8225:8225' + - '8226:8226' + - '8230:8230' + - '8235:8235' + - '8236:8236' + - '8240:8240' + - '8245:8245' + - '8246:8246' + - '8250:8250' + - '8255:8255' + - '8256:8256' + - '8260:8260' + - '8265:8265' + - '8266:8266' + - '8270:8270' + - '8275:8275' + - '8276:8276' + - '8280:8280' + - '8285:8285' + - '8286:8286' + - '8290:8290' + - '8295:8295' + - '8296:8296' + - '8300:8300' + - '8305:8305' + - '8306:8306' + - '8310:8310' + - '8315:8315' + - '8316:8316' + - '8320:8320' + - '8325:8325' + - '8326:8326' + - '8330:8330' + - '8335:8335' + - '8336:8336' + - '8340:8340' + - '8345:8345' + - '8346:8346' + - '8350:8350' + - '8355:8355' + - '8356:8356' + - '8360:8360' + - '8365:8365' + - '8366:8366' + - '8370:8370' + - '8375:8375' + - '8376:8376' + - '8380:8380' + - '8385:8385' + - '8386:8386' + - '8390:8390' + - '8395:8395' + - '8396:8396' + - '8400:8400' + - '8405:8405' + - '8406:8406' + - '8410:8410' + - '8415:8415' + - '8416:8416' + - '8420:8420' + - '8425:8425' + - '8426:8426' + - '8430:8430' + - '8435:8435' + - '8436:8436' + - '8440:8440' + - '8445:8445' + - '8446:8446' + - '8450:8450' + - '8455:8455' + - '8456:8456' + - '8460:8460' + - '8465:8465' + - '8466:8466' + - '8470:8470' + - '8475:8475' + - '8476:8476' + - '8480:8480' + - '8485:8485' + - '8486:8486' + - '8490:8490' + - '8495:8495' + - '8496:8496' + volumes: + - 'station_data:/var/azuracast/stations' + - 'shoutcast2_install:/var/azuracast/servers/shoutcast2' + - 'letsencrypt:/etc/nginx/certs' + - 'tmp_data:/var/azuracast/www_tmp' + networks: + - frontend + - backend + init: true + restart: unless-stopped + ulimits: + nofile: + soft: 65536 + hard: 65536 + logging: + options: + max-size: 1m + max-file: '5' +networks: + frontend: + driver: bridge + backend: + driver: bridge +volumes: + db_data: { } + letsencrypt: { } + letsencrypt_acme: { } + shoutcast2_install: { } + geolite_install: { } + sftpgo_data: { } + station_data: { } + www_vendor: { } + www_uploads: { } + tmp_data: { } + redis_data: { } + backups: { } diff --git a/docker-compose.moved.yml b/docker-compose.moved.yml new file mode 100644 index 0000000..4b2291b --- /dev/null +++ b/docker-compose.moved.yml @@ -0,0 +1,265 @@ +services: + web: + container_name: azuracast_web + image: 'ghcr.io/azuracast/web:${AZURACAST_VERSION:-latest}' + ports: + - '${AZURACAST_HTTP_PORT:-80}:80' + - '${AZURACAST_HTTPS_PORT:-443}:443' + - '${AZURACAST_SFTP_PORT:-2022}:2022' + depends_on: + - mariadb + - stations + - redis + env_file: azuracast.env + environment: + LANG: '${LANG:-en_US.UTF-8}' + AZURACAST_DC_REVISION: 13 + AZURACAST_VERSION: '${AZURACAST_VERSION:-latest}' + AZURACAST_SFTP_PORT: '${AZURACAST_SFTP_PORT:-2022}' + NGINX_TIMEOUT: '${NGINX_TIMEOUT:-1800}' + LETSENCRYPT_HOST: '${LETSENCRYPT_HOST:-}' + LETSENCRYPT_EMAIL: '${LETSENCRYPT_EMAIL:-}' + PUID: '${AZURACAST_PUID:-1000}' + PGID: '${AZURACAST_PGID:-1000}' + volumes: + - 'letsencrypt:/etc/nginx/certs' + - 'letsencrypt_acme:/etc/acme.sh' + - 'www_vendor:/var/azuracast/www/vendor' + - 'www_uploads:/var/azuracast/uploads' + - 'tmp_data:/var/azuracast/www_tmp' + - 'new_station_data:/var/azuracast/stations' + - 'shoutcast2_install:/var/azuracast/servers/shoutcast2' + - 'geolite_install:/var/azuracast/geoip' + - 'sftpgo_data:/var/azuracast/sftpgo/persist' + - 'backups:/var/azuracast/backups' + - /data/media/station_store:/var/azuracast/stations/rakh/media/ + networks: + - frontend + - backend + restart: unless-stopped + ulimits: + nofile: + soft: 65536 + hard: 65536 + logging: + options: + max-size: 1m + max-file: '5' + mariadb: + container_name: azuracast_mariadb + image: 'ghcr.io/azuracast/db:${AZURACAST_VERSION:-latest}' + volumes: + - 'db_data:/var/lib/mysql' + env_file: azuracast.env + networks: + - backend + restart: unless-stopped + logging: + options: + max-size: 1m + max-file: '5' + redis: + container_name: azuracast_redis + image: 'ghcr.io/azuracast/redis:${AZURACAST_VERSION:-latest}' + sysctls: + net.core.somaxconn: 1024 + volumes: + - 'redis_data:/data' + networks: + - backend + restart: unless-stopped + logging: + options: + max-size: 1m + max-file: '5' + stations: + container_name: azuracast_stations + image: 'ghcr.io/azuracast/radio:${AZURACAST_VERSION:-latest}' + environment: + PUID: '${AZURACAST_PUID:-1000}' + PGID: '${AZURACAST_PGID:-1000}' + ports: + - '8000:8000' + - '8005:8005' + - '8006:8006' + - '8010:8010' + - '8015:8015' + - '8016:8016' + - '8020:8020' + - '8025:8025' + - '8026:8026' + - '8030:8030' + - '8035:8035' + - '8036:8036' + - '8040:8040' + - '8045:8045' + - '8046:8046' + - '8050:8050' + - '8055:8055' + - '8056:8056' + - '8060:8060' + - '8065:8065' + - '8066:8066' + - '8070:8070' + - '8075:8075' + - '8076:8076' + - '8090:8090' + - '8095:8095' + - '8096:8096' + - '8100:8100' + - '8105:8105' + - '8106:8106' + - '8110:8110' + - '8115:8115' + - '8116:8116' + - '8120:8120' + - '8125:8125' + - '8126:8126' + - '8130:8130' + - '8135:8135' + - '8136:8136' + - '8140:8140' + - '8145:8145' + - '8146:8146' + - '8150:8150' + - '8155:8155' + - '8156:8156' + - '8160:8160' + - '8165:8165' + - '8166:8166' + - '8170:8170' + - '8175:8175' + - '8176:8176' + - '8180:8180' + - '8185:8185' + - '8186:8186' + - '8190:8190' + - '8195:8195' + - '8196:8196' + - '8200:8200' + - '8205:8205' + - '8206:8206' + - '8210:8210' + - '8215:8215' + - '8216:8216' + - '8220:8220' + - '8225:8225' + - '8226:8226' + - '8230:8230' + - '8235:8235' + - '8236:8236' + - '8240:8240' + - '8245:8245' + - '8246:8246' + - '8250:8250' + - '8255:8255' + - '8256:8256' + - '8260:8260' + - '8265:8265' + - '8266:8266' + - '8270:8270' + - '8275:8275' + - '8276:8276' + - '8280:8280' + - '8285:8285' + - '8286:8286' + - '8290:8290' + - '8295:8295' + - '8296:8296' + - '8300:8300' + - '8305:8305' + - '8306:8306' + - '8310:8310' + - '8315:8315' + - '8316:8316' + - '8320:8320' + - '8325:8325' + - '8326:8326' + - '8330:8330' + - '8335:8335' + - '8336:8336' + - '8340:8340' + - '8345:8345' + - '8346:8346' + - '8350:8350' + - '8355:8355' + - '8356:8356' + - '8360:8360' + - '8365:8365' + - '8366:8366' + - '8370:8370' + - '8375:8375' + - '8376:8376' + - '8380:8380' + - '8385:8385' + - '8386:8386' + - '8390:8390' + - '8395:8395' + - '8396:8396' + - '8400:8400' + - '8405:8405' + - '8406:8406' + - '8410:8410' + - '8415:8415' + - '8416:8416' + - '8420:8420' + - '8425:8425' + - '8426:8426' + - '8430:8430' + - '8435:8435' + - '8436:8436' + - '8440:8440' + - '8445:8445' + - '8446:8446' + - '8450:8450' + - '8455:8455' + - '8456:8456' + - '8460:8460' + - '8465:8465' + - '8466:8466' + - '8470:8470' + - '8475:8475' + - '8476:8476' + - '8480:8480' + - '8485:8485' + - '8486:8486' + - '8490:8490' + - '8495:8495' + - '8496:8496' + volumes: + - 'station_data:/var/azuracast/stations' + - 'shoutcast2_install:/var/azuracast/servers/shoutcast2' + - 'letsencrypt:/etc/nginx/certs' + - 'tmp_data:/var/azuracast/www_tmp' + networks: + - frontend + - backend + init: true + restart: unless-stopped + ulimits: + nofile: + soft: 65536 + hard: 65536 + logging: + options: + max-size: 1m + max-file: '5' +networks: + frontend: + driver: bridge + backend: + driver: bridge +volumes: + db_data: { } + letsencrypt: { } + letsencrypt_acme: { } + shoutcast2_install: { } + geolite_install: { } + sftpgo_data: { } + station_data: { } + www_vendor: { } + www_uploads: { } + tmp_data: { } + redis_data: { } + backups: { } + new_station_data: { } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..fb9e454 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,64 @@ +services: + web: + container_name: azuracast + image: 'ghcr.io/azuracast/azuracast:${AZURACAST_VERSION:-latest}' + labels: + - com.centurylinklabs.watchtower.scope=azuracast + ports: + - '${AZURACAST_HTTP_PORT:-80}:${AZURACAST_HTTP_PORT:-80}' + - '${AZURACAST_HTTPS_PORT:-443}:${AZURACAST_HTTPS_PORT:-443}' + - '${AZURACAST_SFTP_PORT:-2022}:${AZURACAST_SFTP_PORT:-2022}' + - '8000:8000' + - '8005:8005' + - '8006:8006' + - '8010:8010' + - '8015:8015' + - '8016:8016' + - '8020:8020' + - '8025:8025' + - '8026:8026' + - '8030:8030' + env_file: + - azuracast.env + - .env + volumes: + - '/data/media/station_store:/var/azuracast/stations' + - 'backups:/var/azuracast/backups' + - 'db_data:/var/lib/mysql' + - 'www_uploads:/var/azuracast/storage/uploads' + - 'shoutcast2_install:/var/azuracast/storage/shoutcast2' + - 'stereo_tool_install:/var/azuracast/storage/stereo_tool' + - 'geolite_install:/var/azuracast/storage/geoip' + - 'sftpgo_data:/var/azuracast/storage/sftpgo' + - 'acme:/var/azuracast/storage/acme' + restart: unless-stopped + ulimits: + nofile: + soft: 65536 + hard: 65536 + logging: + options: + max-size: 1m + max-file: '5' + environment: + NGINX_RADIO_PORTS: (8000|8010|8020|8030) + NGINX_WEBDJ_PORTS: (8005|8015|8025) + updater: + container_name: azuracast_updater + image: 'ghcr.io/azuracast/updater:latest' + volumes: + - '/var/run/docker.sock:/var/run/docker.sock' + logging: + options: + max-size: 1m + max-file: '5' +volumes: + db_data: { } + acme: { } + shoutcast2_install: { } + stereo_tool_install: { } + geolite_install: { } + sftpgo_data: { } + station_data: { } + www_uploads: { } + backups: { } diff --git a/docker.sh b/docker.sh new file mode 100755 index 0000000..33782fd --- /dev/null +++ b/docker.sh @@ -0,0 +1,922 @@ +#!/usr/bin/env bash +# shellcheck disable=SC2145,SC2178,SC2120,SC2162 + +PODMAN_MODE=0 + +# Docker and Docker Compose aliases +d() { + if [[ $PODMAN_MODE -ne 0 ]]; then + podman "$@" + else + docker "$@" + fi +} + +dc() { + if [[ $PODMAN_MODE -ne 0 ]]; then + podman-compose "$@" + else + if [[ $(docker compose version) ]]; then + docker compose "$@" + else + docker-compose "$@" + fi + fi +} + +# Functions to manage .env files +__dotenv= +__dotenv_file= +__dotenv_cmd=.env + +.env() { + REPLY=() + [[ $__dotenv_file || ${1-} == -* ]] || .env.--file .env || return + if declare -F -- ".env.${1-}" >/dev/null; then + .env."$@" + return + fi + return 64 +} + +.env.-f() { .env.--file "$@"; } + +.env.get() { + .env::arg "get requires a key" "$@" && + [[ "$__dotenv" =~ ^(.*(^|$'\n'))([ ]*)"$1="(.*)$ ]] && + REPLY=${BASH_REMATCH[4]%%$'\n'*} && REPLY=${REPLY%"${REPLY##*[![:space:]]}"} +} + +.env.parse() { + local line key + while IFS= read -r line; do + line=${line#"${line%%[![:space:]]*}"} # trim leading whitespace + line=${line%"${line##*[![:space:]]}"} # trim trailing whitespace + if [[ ! "$line" || "$line" == '#'* ]]; then continue; fi + if (($#)); then + for key; do + if [[ $key == "${line%%=*}" ]]; then + REPLY+=("$line") + break + fi + done + else + REPLY+=("$line") + fi + done <<<"$__dotenv" + ((${#REPLY[@]})) +} + +.env.export() { ! .env.parse "$@" || export "${REPLY[@]}"; } + +.env.set() { + .env::file load || return + local key saved=$__dotenv + while (($#)); do + key=${1#+} + key=${key%%=*} + if .env.get "$key"; then + REPLY=() + if [[ $1 == +* ]]; then + shift + continue # skip if already found + elif [[ $1 == *=* ]]; then + __dotenv=${BASH_REMATCH[1]}${BASH_REMATCH[3]}$1$'\n'${BASH_REMATCH[4]#*$'\n'} + else + __dotenv=${BASH_REMATCH[1]}${BASH_REMATCH[4]#*$'\n'} + continue # delete all occurrences + fi + elif [[ $1 == *=* ]]; then + __dotenv+="${1#+}"$'\n' + fi + shift + done + [[ $__dotenv == "$saved" ]] || .env::file save +} + +.env.puts() { echo "${1-}" >>"$__dotenv_file" && __dotenv+="$1"$'\n'; } + +.env.generate() { + .env::arg "key required for generate" "$@" || return + .env.get "$1" && return || REPLY=$("${@:2}") || return + .env::one "generate: ouptut of '${*:2}' has more than one line" "$REPLY" || return + .env.puts "$1=$REPLY" +} + +.env.--file() { + .env::arg "filename required for --file" "$@" || return + __dotenv_file=$1 + .env::file load || return + (($# < 2)) || .env "${@:2}" +} + +.env::arg() { [[ "${2-}" ]] || { + echo "$__dotenv_cmd: $1" >&2 + return 64 +}; } + +.env::one() { [[ "$2" != *$'\n'* ]] || .env::arg "$1"; } + +.env::file() { + local REPLY=$__dotenv_file + case "$1" in + load) + __dotenv= + ! [[ -f "$REPLY" ]] || __dotenv="$(<"$REPLY")"$'\n' || return + ;; + save) + if [[ -L "$REPLY" ]] && declare -F -- realpath.resolved >/dev/null; then + realpath.resolved "$REPLY" + fi + { [[ ! -f "$REPLY" ]] || cp -p "$REPLY" "$REPLY.bak"; } && + printf %s "$__dotenv" >"$REPLY.bak" && mv "$REPLY.bak" "$REPLY" + ;; + esac +} + +# Shortcut to convert semver version (x.yyy.zzz) into a comparable number. +version-number() { + echo "$@" | awk -F. '{ printf("%03d%03d%03d\n", $1,$2,$3); }' +} + +# Get the current release channel for AzuraCast +get-release-channel() { + local AZURACAST_VERSION="latest" + if [[ -f .env ]]; then + .env --file .env get AZURACAST_VERSION + AZURACAST_VERSION="${REPLY:-latest}" + fi + + echo "$AZURACAST_VERSION" +} + +get-release-branch-name() { + if [[ $(get-release-channel) == "stable" ]]; then + echo "stable" + else + echo "main" + fi +} + +# This is a general-purpose function to ask Yes/No questions in Bash, either +# with or without a default answer. It keeps repeating the question until it +# gets a valid answer. +ask() { + # https://djm.me/ask + local prompt default reply + + while true; do + + if [[ "${2:-}" == "Y" ]]; then + prompt="Y/n" + default=Y + elif [[ "${2:-}" == "N" ]]; then + prompt="y/N" + default=N + else + prompt="y/n" + default= + fi + + # Ask the question (not using "read -p" as it uses stderr not stdout) + echo -n "$1 [$prompt] " + + read reply + + # Default? + if [[ -z "$reply" ]]; then + reply=${default} + fi + + # Check if the reply is valid + case "$reply" in + Y* | y*) return 0 ;; + N* | n*) return 1 ;; + esac + + done +} + +# Generate a prompt to set an environment file value. +envfile-set() { + local VALUE INPUT + + .env --file .env + + .env get "$1" + VALUE=${REPLY:-$2} + + echo -n "$3 [$VALUE]: " + read INPUT + + VALUE=${INPUT:-$VALUE} + + .env set "${1}=${VALUE}" +} + +# +# Configure the ports used by AzuraCast. +# +setup-ports() { + envfile-set "AZURACAST_HTTP_PORT" "80" "Port to use for HTTP connections" + envfile-set "AZURACAST_HTTPS_PORT" "443" "Port to use for HTTPS connections" + envfile-set "AZURACAST_SFTP_PORT" "2022" "Port to use for SFTP connections" +} + +# +# Configure release mode settings. +# +setup-release() { + if [[ ! -f .env ]]; then + curl -fsSL https://raw.githubusercontent.com/AzuraCast/AzuraCast/main/sample.env -o .env + fi + + local OLD_RELEASE_CHANNEL + .env --file .env get AZURACAST_VERSION + OLD_RELEASE_CHANNEL="${REPLY:-latest}" + + local AZURACAST_VERSION="${OLD_RELEASE_CHANNEL}" + + if [[ $AZURACAST_VERSION == "latest" ]]; then + if ask "Your current release channel is 'Rolling Release'. Switch to 'Stable' release channel?" N; then + AZURACAST_VERSION="stable" + fi + elif [[ $AZURACAST_VERSION == "stable" ]]; then + if ask "Your current release channel is 'Stable'. Switch to 'Rolling Release' release channel?" N; then + AZURACAST_VERSION="latest" + fi + else + if ask "Your current release channel is locked to a stable release, version '${OLD_RELEASE_CHANNEL}'. Switch to the 'Stable' release channel?" N; then + AZURACAST_VERSION="stable" + fi + fi + + .env --file .env set AZURACAST_VERSION=${AZURACAST_VERSION} + + if [[ $AZURACAST_VERSION != $OLD_RELEASE_CHANNEL ]]; then + if ask "You should update the Docker Utility Script after changing release channels. Automatically update it now?" Y; then + update-self + fi + fi +} + +check-install-requirements() { + local CURRENT_OS CURRENT_ARCH REQUIRED_COMMANDS SCRIPT_DIR + + set -e + + echo "Checking installation requirements for AzuraCast..." + + CURRENT_OS=$(uname -s) + if [[ $CURRENT_OS == "Linux" ]]; then + echo -en "\e[32m[PASS]\e[0m Operating System: ${CURRENT_OS}\n" + else + echo -en "\e[41m[FAIL]\e[0m Operating System: ${CURRENT_OS}\n" + + echo " You are running an unsupported operating system." + echo " Automated AzuraCast installation is not currently supported on this" + echo " operating system." + exit 1 + fi + + CURRENT_ARCH=$(uname -m) + if [[ $CURRENT_ARCH == "x86_64" ]]; then + echo -en "\e[32m[PASS]\e[0m Architecture: ${CURRENT_ARCH}\n" + elif [[ $CURRENT_ARCH == "aarch64" ]]; then + echo -en "\e[32m[PASS]\e[0m Architecture: ${CURRENT_ARCH}\n" + else + echo -en "\e[41m[FAIL]\e[0m Architecture: ${CURRENT_ARCH}\n" + + echo " You are running an unsupported processor architecture." + echo " Automated AzuraCast installation is not currently supported on this " + echo " operating system." + exit 1 + fi + + REQUIRED_COMMANDS=(curl awk) + for COMMAND in "${REQUIRED_COMMANDS[@]}" ; do + if [[ $(command -v "$COMMAND") ]]; then + echo -en "\e[32m[PASS]\e[0m Command Present: ${COMMAND}\n" + else + echo -en "\e[41m[FAIL]\e[0m Command Present: ${COMMAND}\n" + + echo " ${COMMAND} does not appear to be installed." + echo " Install ${COMMAND} using your host's package manager," + echo " then continue installing using this script." + exit 1 + fi + done + + if [[ $EUID -ne 0 ]]; then + if [[ $(command -v sudo) ]]; then + echo -en "\e[32m[PASS]\e[0m User Permissions\n" + else + echo -en "\e[41m[FAIL]\e[0m User Permissions\n" + + echo " You are not currently the root user, and " + echo " 'sudo' does not appear to be installed." + echo " Install sudo using your host's package manager," + echo " then continue installing using this script." + exit 1 + fi + else + echo -en "\e[32m[PASS]\e[0m User Permissions\n" + fi + + SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + if [[ $SCRIPT_DIR == "/var/azuracast" ]]; then + echo -en "\e[32m[PASS]\e[0m Installation Directory\n" + else + echo -en "\e[93m[WARN]\e[0m Installation Directory\n" + echo " AzuraCast is not installed in /var/azuracast, as is recommended" + echo " for most installations. This will not prevent AzuraCast from" + echo " working, but you will need to update any instructions in our" + echo " documentation to reflect your current directory:" + echo " $SCRIPT_DIR" + fi + + echo -en "\e[32m[PASS]\e[0m All requirements met!\n" + + set +e +} + +install-docker() { + set -e + + curl -fsSL get.docker.com -o get-docker.sh + sh get-docker.sh + rm get-docker.sh + + if [[ $EUID -ne 0 ]]; then + sudo usermod -aG docker "$(whoami)" + + echo "You must log out or restart to apply necessary Docker permissions changes." + echo "Restart, then continue installing using this script." + exit 1 + fi + + set +e +} + +install-docker-compose() { + set -e + echo "Installing Docker Compose..." + + curl -fsSL -o docker-compose https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-$(uname -m) + + ARCHITECTURE=amd64 + if [ "$(uname -m)" = "aarch64" ]; then + ARCHITECTURE=arm64 + fi + curl -fsSL -o docker-compose-switch https://github.com/docker/compose-switch/releases/download/v1.0.4/docker-compose-linux-${ARCHITECTURE} + + if [[ $EUID -ne 0 ]]; then + sudo chmod a+x ./docker-compose + sudo chmod a+x ./docker-compose-switch + + sudo mv ./docker-compose /usr/libexec/docker/cli-plugins/docker-compose + sudo mv ./docker-compose-switch /usr/local/bin/docker-compose + else + chmod a+x ./docker-compose + chmod a+x ./docker-compose-switch + + mv ./docker-compose /usr/libexec/docker/cli-plugins/docker-compose + mv ./docker-compose-switch /usr/local/bin/docker-compose + fi + + echo "Docker Compose updated!" + set +e +} + +run-installer() { + local AZURACAST_RELEASE_BRANCH + AZURACAST_RELEASE_BRANCH=$(get-release-branch-name) + + if [[ ! -f .env ]]; then + curl -fsSL https://raw.githubusercontent.com/AzuraCast/AzuraCast/$AZURACAST_RELEASE_BRANCH/sample.env -o .env + fi + if [[ ! -f azuracast.env ]]; then + curl -fsSL https://raw.githubusercontent.com/AzuraCast/AzuraCast/$AZURACAST_RELEASE_BRANCH/azuracast.sample.env -o azuracast.env + fi + if [[ ! -f docker-compose.yml ]]; then + curl -fsSL https://raw.githubusercontent.com/AzuraCast/AzuraCast/$AZURACAST_RELEASE_BRANCH/docker-compose.sample.yml -o docker-compose.yml + fi + + touch docker-compose.new.yml + + local dc_config_test=$(dc -f docker-compose.new.yml config 2>/dev/null) + if [ $? -ne 0 ]; then + if ask "Docker Compose needs to be updated to continue. Update to latest version?" Y; then + install-docker-compose + fi + fi + + curl -fsSL https://raw.githubusercontent.com/AzuraCast/AzuraCast/$AZURACAST_RELEASE_BRANCH/docker-compose.installer.yml -o docker-compose.installer.yml + + dc -p azuracast_installer -f docker-compose.installer.yml pull + dc -p azuracast_installer -f docker-compose.installer.yml run --rm installer install "$@" + + rm docker-compose.installer.yml +} + +# +# Run the initial installer of Docker and AzuraCast. +# Usage: ./docker.sh install +# +install() { + check-install-requirements + + if [[ $PODMAN_MODE -ne 0 ]]; then + echo "Podman was detected and will be used instead of Docker..." + + if [[ $(command -v podman-compose) ]]; then + echo "Podman-compose is installed!" + else + echo "Podman mode is active, but podman-compose is not found." + echo "Install it by following the instructions on this page:" + echo "https://github.com/containers/podman-compose" + exit 1 + fi + else + if [[ $(command -v docker) && $(docker --version) ]]; then + echo "Docker is already installed! Continuing..." + else + if ask "Docker does not appear to be installed. Install Docker now?" Y; then + install-docker + fi + fi + + if [[ $(docker compose version) ]]; then + echo "Docker Compose v2 is already installed. Continuing..." + else + if [[ $(command -v docker-compose) ]]; then + echo "Docker Compose is already installed. Continuing..." + else + if ask "Docker Compose does not appear to be installed. Install Docker Compose now?" Y; then + install-docker-compose + fi + fi + fi + fi + + setup-release + + run-installer "$@" + + # Installer creates a file at docker-compose.new.yml; copy it to the main spot. + if [[ -s docker-compose.new.yml ]]; then + if [[ -f docker-compose.yml ]]; then + rm docker-compose.yml + fi + + mv docker-compose.new.yml docker-compose.yml + fi + + # If this script is running as a non-root user, set the PUID/PGID in the environment vars appropriately. + if [[ $EUID -ne 0 ]]; then + .env --file .env set AZURACAST_PUID="$(id -u)" + .env --file .env set AZURACAST_PGID="$(id -g)" + fi + + if [[ $PODMAN_MODE -ne 0 ]]; then + .env --file .env set AZURACAST_PODMAN_MODE=true + fi + + dc pull + + dc run --rm web -- azuracast_install "$@" + dc up -d + exit +} + +install-dev() { + if [[ $(command -v docker) && $(docker --version) ]]; then + echo "Docker is already installed! Continuing..." + else + if ask "Docker does not appear to be installed. Install Docker now?" Y; then + install-docker + fi + fi + + if [[ $(docker compose version) ]]; then + echo "Docker Compose v2 is already installed. Continuing..." + else + if [[ $(command -v docker-compose) ]]; then + echo "Docker Compose is already installed. Continuing..." + else + if ask "Docker Compose does not appear to be installed. Install Docker Compose now?" Y; then + install-docker-compose + fi + fi + fi + + if [[ ! -f docker-compose.yml ]]; then + cp docker-compose.sample.yml docker-compose.yml + fi + if [[ ! -f docker-compose.override.yml ]]; then + cp docker-compose.dev.yml docker-compose.override.yml + fi + if [[ ! -f .env ]]; then + cp dev.env .env + fi + if [[ ! -f azuracast.env ]]; then + cp azuracast.dev.env azuracast.env + + echo "Customize azuracast.env file now before continuing. Re-run this command to continue installation." + exit + fi + + # If this script is running as a non-root user, set the PUID/PGID in the environment vars appropriately. + if [[ $EUID -ne 0 ]]; then + .env --file .env set AZURACAST_PUID="$(id -u)" + .env --file .env set AZURACAST_PGID="$(id -g)" + fi + + if [[ $PODMAN_MODE -ne 0 ]]; then + .env --file .env set AZURACAST_PODMAN_MODE=true + fi + + dc build + dc run --rm web -- azuracast_dev_install "$@" + dc up -d + exit +} + +# +# Update the Docker images and codebase. +# Usage: ./docker.sh update +# +update() { + echo "[NOTICE] Before you continue, please make sure you have a recent snapshot of your system and or backed it up." + if ask "Are you ready to continue with the update?" Y; then + + # Check for a new Docker Utility Script. + local AZURACAST_RELEASE_BRANCH + AZURACAST_RELEASE_BRANCH=$(get-release-branch-name) + + curl -fsSL https://raw.githubusercontent.com/AzuraCast/AzuraCast/$AZURACAST_RELEASE_BRANCH/docker.sh -o docker.new.sh + + local UTILITY_FILES_MATCH + UTILITY_FILES_MATCH="$( + cmp --silent docker.sh docker.new.sh + echo $? + )" + + local UPDATE_UTILITY=0 + if [[ ${UTILITY_FILES_MATCH} -ne 0 ]]; then + if ask "The Docker Utility Script has changed since your version. Update to latest version?" Y; then + UPDATE_UTILITY=1 + fi + fi + + if [[ ${UPDATE_UTILITY} -ne 0 ]]; then + mv docker.new.sh docker.sh + chmod a+x docker.sh + + echo "A new Docker Utility Script has been downloaded." + echo "Please re-run the update process to continue." + exit + else + rm docker.new.sh + fi + + # Check Docker version. + if [[ $PODMAN_MODE -eq 0 ]]; then + DOCKER_VERSION=$(docker version -f "{{.Server.Version}}") + DOCKER_VERSION_MAJOR=$(echo "$DOCKER_VERSION"| cut -d'.' -f 1) + + if [ "${DOCKER_VERSION_MAJOR}" -ge 20 ]; then + echo "Docker server (version ${DOCKER_VERSION}) meets minimum version requirements." + else + if ask "Docker is out of date on this server. Attempt automatic upgrade?" Y; then + install-docker + install-docker-compose + fi + fi + fi + + run-installer --update "$@" + + # Check for updated Docker Compose config. + local COMPOSE_FILES_MATCH + + if [[ ! -s docker-compose.new.yml ]]; then + curl -fsSL https://raw.githubusercontent.com/AzuraCast/AzuraCast/$AZURACAST_RELEASE_BRANCH/docker-compose.sample.yml -o docker-compose.new.yml + fi + + COMPOSE_FILES_MATCH="$( + cmp --silent docker-compose.yml docker-compose.new.yml + echo $? + )" + + if [[ ${COMPOSE_FILES_MATCH} -ne 0 ]]; then + dc -f docker-compose.new.yml pull + dc down --timeout 60 + + cp docker-compose.yml docker-compose.backup.yml + mv docker-compose.new.yml docker-compose.yml + else + rm docker-compose.new.yml + + dc pull + dc down --timeout 60 + fi + + dc run --rm web -- azuracast_update "$@" + dc up -d + + if ask "Clean up all stopped Docker containers and images to save space?" Y; then + d system prune -f + fi + + echo "Update complete!" + fi + exit +} + +# +# Update this Docker utility script. +# Usage: ./docker.sh update-self +# +update-self() { + local AZURACAST_RELEASE_BRANCH + AZURACAST_RELEASE_BRANCH=$(get-release-branch-name) + + curl -H 'Cache-Control: no-cache, no-store' -fsSL \ + https://raw.githubusercontent.com/AzuraCast/AzuraCast/$AZURACAST_RELEASE_BRANCH/docker.sh?$(date +%s) \ + -o docker.sh + chmod a+x docker.sh + + echo "New Docker utility script downloaded." + exit +} + +# +# Run a CLI command inside the Docker container. +# Usage: ./docker.sh cli [command] +# +cli() { + dc exec --user="azuracast" web azuracast_cli "$@" + exit +} + +# +# Enter the bash terminal of the running web container. +# Usage: ./docker.sh bash +# +bash() { + dc exec --user="azuracast" web bash + exit +} + +# +# Enter the MariaDB database management terminal with the correct credentials. +# +db() { + dc exec web azuracast_db + exit +} + +# +# Back up the Docker volumes to a .tar.gz file. +# Usage: +# ./docker.sh backup [/custom/backup/dir/custombackupname.zip] +# +backup() { + local BACKUP_PATH BACKUP_DIR BACKUP_FILENAME BACKUP_EXT + BACKUP_PATH=$(readlink -f ${1:-"./backup.tar.gz"}) + BACKUP_DIR=$(dirname -- "$BACKUP_PATH") + BACKUP_FILENAME=$(basename -- "$BACKUP_PATH") + BACKUP_EXT="${BACKUP_FILENAME##*.}" + shift + + # Prepare permissions + if [[ $EUID -ne 0 ]]; then + .env --file .env set AZURACAST_PUID="$(id -u)" + .env --file .env set AZURACAST_PGID="$(id -g)" + fi + + dc exec --user="azuracast" web azuracast_cli azuracast:backup "/var/azuracast/backups/${BACKUP_FILENAME}" "$@" + + # Move from Docker volume to local filesystem + d run --rm -v "azuracast_backups:/backup_src" \ + -v "$BACKUP_DIR:/backup_dest" \ + busybox mv "/backup_src/${BACKUP_FILENAME}" "/backup_dest/${BACKUP_FILENAME}" + + echo "Backup completed." + exit +} + +# +# Restore an AzuraCast backup into Docker. +# Usage: +# ./docker.sh restore [/custom/backup/dir/custombackupname.zip] +# +restore() { + if [[ ! -f .env ]] || [[ ! -f azuracast.env ]]; then + echo "AzuraCast hasn't been installed yet on this server." + echo "You should run './docker.sh install' first before restoring." + exit 1 + fi + + if ask "Restoring will remove any existing AzuraCast installation data, replacing it with your backup. Continue?" Y; then + if [[ $1 != "" ]]; then + local BACKUP_PATH BACKUP_DIR BACKUP_FILENAME BACKUP_EXT + BACKUP_PATH=$(readlink -f ${1:-"./backup.tar.gz"}) + BACKUP_DIR=$(dirname -- "$BACKUP_PATH") + BACKUP_FILENAME=$(basename -- "$BACKUP_PATH") + BACKUP_EXT="${BACKUP_FILENAME##*.}" + shift + + if [[ ! -f ${BACKUP_PATH} ]]; then + echo "File '${BACKUP_PATH}' does not exist. Nothing to restore." + exit 1 + fi + + dc down + + # Remove most AzuraCast volumes but preserve some essential ones. + d volume rm -f $(d volume ls | grep 'azuracast' | grep -v 'station\|install' | awk 'NR>1 {print $2}') + d volume create azuracast_backups + + # Move from local filesystem to Docker volume + d run --rm -v "$BACKUP_DIR:/backup_src" \ + -v "azuracast_backups:/backup_dest" \ + busybox mv "/backup_src/${BACKUP_FILENAME}" "/backup_dest/${BACKUP_FILENAME}" + + # Prepare permissions + if [[ $EUID -ne 0 ]]; then + .env --file .env set AZURACAST_PUID="$(id -u)" + .env --file .env set AZURACAST_PGID="$(id -g)" + fi + + dc run --rm web -- azuracast_restore "/var/azuracast/backups/${BACKUP_FILENAME}" "$@" + + # Move file back from volume to local filesystem + d run --rm -v "azuracast_backups:/backup_src" \ + -v "$BACKUP_DIR:/backup_dest" \ + busybox mv "/backup_src/${BACKUP_FILENAME}" "/backup_dest/${BACKUP_FILENAME}" + + dc down --timeout 30 + dc up -d + else + dc down + + # Remove most AzuraCast volumes but preserve some essential ones. + d volume rm -f $(d volume ls | grep 'azuracast' | grep -v 'station\|backups\|install' | awk 'NR>1 {print $2}') + + dc run --rm web -- azuracast_restore "$@" + + dc down --timeout 30 + dc up -d + fi + fi + exit +} + +# +# Restore the Docker volumes from a legacy backup format .tar.gz file. +# Usage: +# ./docker.sh restore [/custom/backup/dir/custombackupname.tar.gz] +# +restore-legacy() { + local APP_BASE_DIR BACKUP_PATH BACKUP_DIR BACKUP_FILENAME + + APP_BASE_DIR=$(pwd) + + BACKUP_PATH=${1:-"./backup.tar.gz"} + BACKUP_DIR=$(cd "$(dirname "$BACKUP_PATH")" && pwd) + BACKUP_FILENAME=$(basename "$BACKUP_PATH") + + cd "$APP_BASE_DIR" || exit + + if [ -f "$BACKUP_PATH" ]; then + dc down --timeout 30 + + d volume rm azuracast_db_data azuracast_station_data + d volume create azuracast_db_data + d volume create azuracast_station_data + + d run --rm -v "$BACKUP_DIR:/backup" \ + -v azuracast_db_data:/azuracast/db \ + -v azuracast_station_data:/azuracast/stations \ + busybox tar zxvf "/backup/$BACKUP_FILENAME" + + dc up -d + else + echo "File $BACKUP_PATH does not exist in this directory. Nothing to restore." + exit 1 + fi + + exit +} + +# +# Stop all Docker containers and remove related volumes. +# Usage: ./docker.sh uninstall +# +uninstall() { + if ask "This operation is destructive and will wipe your existing Docker containers. Continue?" N; then + + dc down -v + dc rm -f + d volume prune -f + + echo "All AzuraCast Docker containers and volumes were removed." + echo "To remove *all* Docker containers and volumes, run:" + echo " docker stop \$(docker ps -a -q)" + echo " docker rm \$(docker ps -a -q)" + echo " docker volume prune -f" + echo "" + fi + + exit +} + +# +# Roll back to a specific stable release version. +# +rollback() { + local AZURACAST_ROLLBACK_VERSION + AZURACAST_ROLLBACK_VERSION="$1" + + if [[ -z "$AZURACAST_ROLLBACK_VERSION" ]]; then + echo "No version specified. Specify a version, like 0.19.0." + exit 1 + fi + + echo "[NOTICE] Before you continue, please make sure you have a recent snapshot of your system and or backed it up." + if ask "Are you ready to continue with the rollback?" Y; then + dc exec --user="azuracast" web azuracast_cli azuracast:setup:rollback "${AZURACAST_ROLLBACK_VERSION}" + dc down --timeout 60 + + .env --file .env set AZURACAST_VERSION=${AZURACAST_ROLLBACK_VERSION} + + dc pull + dc run --rm web -- azuracast_update + dc up -d + + if ask "Clean up all stopped Docker containers and images to save space?" Y; then + d system prune -f + fi + + echo "Rollback complete. Your installation has been returned to stable version '${AZURACAST_ROLLBACK_VERSION}'." + echo "To return to the regular update channels, run:" + echo " ./docker.sh setup-release" + echo " " + fi + exit +} + +# +# LetsEncrypt: Now managed via the Web UI. +# +setup-letsencrypt() { + echo "LetsEncrypt is now managed from within the web interface." + echo "You can manage it via the 'Administration' panel, then 'System Settings'." + echo "Under 'Services' you will find the LetsEncrypt settings." +} + +letsencrypt-create() { + setup-letsencrypt + exit +} + +# +# Utility script to facilitate switching ports. +# Usage: ./docker.sh change-ports +# +change-ports() { + setup-ports + + dc down --timeout 60 + dc up -d +} + +# +# Helper scripts for basic Docker Compose functions +# +up() { + echo "Starting up AzuraCast services..." + dc up -d +} + +down() { + echo "Shutting down AzuraCast services..." + dc down --timeout 60 +} + +restart() { + down + up +} + +# Ensure we're in the same directory as this script. +cd "$( dirname "${BASH_SOURCE[0]}" )" || exit + +# Podman support +if [[ $(command -v podman) ]]; then + PODMAN_MODE=1 +fi + +"$@" diff --git a/env b/env new file mode 100644 index 0000000..7aae943 --- /dev/null +++ b/env @@ -0,0 +1,59 @@ +# This file was automatically generated by AzuraCast. +# You can modify it as necessary. To apply changes, restart the Docker containers. +# Remove the leading "#" symbol from lines to uncomment them. + +# (Docker Compose) All Docker containers are prefixed by this name. Do not change this after installation. +# Default: azuracast +COMPOSE_PROJECT_NAME=azuracast + +# (Docker Compose) The amount of time to wait before a Docker Compose operation fails. Increase this on lower performance computers. +# Default: 300 +COMPOSE_HTTP_TIMEOUT=300 + +# Release Channel +# Valid options: latest, stable +# Default: latest +AZURACAST_VERSION=stable + +# HTTP Port +# The main port AzuraCast listens to for insecure HTTP connections. +# Default: 80 +AZURACAST_HTTP_PORT=8600 + +# HTTPS Port +# The main port AzuraCast listens to for secure HTTPS connections. +# Default: 443 +# AZURACAST_HTTPS_PORT=443 + +# SFTP Port +# The port AzuraCast listens to for SFTP file management connections. +# Default: 2022 +# AZURACAST_SFTP_PORT=2022 + +# Station Ports +# The ports AzuraCast should listen to for station broadcasts and incoming DJ +# connections. +# Default: 8000,8005,8006,8010,8015,8016,8020,8025,8026,8030,8035,8036,8040,8045,8046,8050,8055,8056,8060,8065,8066,8070,8075,8076,8090,8095,8096,8100,8105,8106,8110,8115,8116,8120,8125,8126,8130,8135,8136,8140,8145,8146,8150,8155,8156,8160,8165,8166,8170,8175,8176,8180,8185,8186,8190,8195,8196,8200,8205,8206,8210,8215,8216,8220,8225,8226,8230,8235,8236,8240,8245,8246,8250,8255,8256,8260,8265,8266,8270,8275,8276,8280,8285,8286,8290,8295,8296,8300,8305,8306,8310,8315,8316,8320,8325,8326,8330,8335,8336,8340,8345,8346,8350,8355,8356,8360,8365,8366,8370,8375,8376,8380,8385,8386,8390,8395,8396,8400,8405,8406,8410,8415,8416,8420,8425,8426,8430,8435,8436,8440,8445,8446,8450,8455,8456,8460,8465,8466,8470,8475,8476,8480,8485,8486,8490,8495,8496 +AZURACAST_STATION_PORTS=8000,8005,8006,8010,8015,8016,8020,8025,8026,8030 + +# Docker User UID +# Set the UID of the user running inside the Docker containers. Matching this +# with your host UID can fix permission issues. +# Default: 1000 +# AZURACAST_PUID=1000 + +# Docker User GID +# Set the GID of the user running inside the Docker containers. Matching this +# with your host GID can fix permission issues. +# Default: 1000 +# AZURACAST_PGID=1000 + +# Use Podman instead of Docker. +# AZURACAST_PODMAN_MODE= + +# Advanced: Use Privileged Docker Settings +# Default: 1 +# AZURACAST_COMPOSE_PRIVILEGED=1 + +# Additional Environment Variables +NGINX_TIMEOUT=1800 \ No newline at end of file diff --git a/env_backup_20240306-091007.bak b/env_backup_20240306-091007.bak new file mode 100644 index 0000000..8cf9f59 --- /dev/null +++ b/env_backup_20240306-091007.bak @@ -0,0 +1,58 @@ +# This file was automatically generated by AzuraCast. +# You can modify it as necessary. To apply changes, restart the Docker containers. +# Remove the leading "#" symbol from lines to uncomment them. + +# (Docker Compose) All Docker containers are prefixed by this name. Do not change this after installation. +# Default: azuracast +COMPOSE_PROJECT_NAME=azuracast + +# (Docker Compose) The amount of time to wait before a Docker Compose operation fails. Increase this on lower performance computers. +# Default: 300 +COMPOSE_HTTP_TIMEOUT=300 + +# Release Channel +# Valid options: latest, stable +# Default: latest +AZURACAST_VERSION=stable + +# HTTP Port +# The main port AzuraCast listens to for insecure HTTP connections. +# Default: 80 +AZURACAST_HTTP_PORT=8600 + +# HTTPS Port +# The main port AzuraCast listens to for secure HTTPS connections. +# Default: 443 +# AZURACAST_HTTPS_PORT=443 + +# SFTP Port +# The port AzuraCast listens to for SFTP file management connections. +# Default: 2022 +# AZURACAST_SFTP_PORT=2022 + +# Station Ports +# The ports AzuraCast should listen to for station broadcasts and incoming DJ +# connections. +# Default: 8000,8005,8006,8010,8015,8016,8020,8025,8026,8030,8035,8036,8040,8045,8046,8050,8055,8056,8060,8065,8066,8070,8075,8076,8090,8095,8096,8100,8105,8106,8110,8115,8116,8120,8125,8126,8130,8135,8136,8140,8145,8146,8150,8155,8156,8160,8165,8166,8170,8175,8176,8180,8185,8186,8190,8195,8196,8200,8205,8206,8210,8215,8216,8220,8225,8226,8230,8235,8236,8240,8245,8246,8250,8255,8256,8260,8265,8266,8270,8275,8276,8280,8285,8286,8290,8295,8296,8300,8305,8306,8310,8315,8316,8320,8325,8326,8330,8335,8336,8340,8345,8346,8350,8355,8356,8360,8365,8366,8370,8375,8376,8380,8385,8386,8390,8395,8396,8400,8405,8406,8410,8415,8416,8420,8425,8426,8430,8435,8436,8440,8445,8446,8450,8455,8456,8460,8465,8466,8470,8475,8476,8480,8485,8486,8490,8495,8496 +# AZURACAST_STATION_PORTS=8000,8005,8006,8010,8015,8016,8020,8025,8026,8030,8035,8036,8040,8045,8046,8050,8055,8056,8060,8065,8066,8070,8075,8076,8090,8095,8096,8100,8105,8106,8110,8115,8116,8120,8125,8126,8130,8135,8136,8140,8145,8146,8150,8155,8156,8160,8165,8166,8170,8175,8176,8180,8185,8186,8190,8195,8196,8200,8205,8206,8210,8215,8216,8220,8225,8226,8230,8235,8236,8240,8245,8246,8250,8255,8256,8260,8265,8266,8270,8275,8276,8280,8285,8286,8290,8295,8296,8300,8305,8306,8310,8315,8316,8320,8325,8326,8330,8335,8336,8340,8345,8346,8350,8355,8356,8360,8365,8366,8370,8375,8376,8380,8385,8386,8390,8395,8396,8400,8405,8406,8410,8415,8416,8420,8425,8426,8430,8435,8436,8440,8445,8446,8450,8455,8456,8460,8465,8466,8470,8475,8476,8480,8485,8486,8490,8495,8496 + +# Docker User UID +# Set the UID of the user running inside the Docker containers. Matching this +# with your host UID can fix permission issues. +# Default: 1000 +# AZURACAST_PUID=1000 + +# Docker User GID +# Set the GID of the user running inside the Docker containers. Matching this +# with your host GID can fix permission issues. +# Default: 1000 +# AZURACAST_PGID=1000 + +# Advanced: Use Privileged Docker Settings +# Default: true +# AZURACAST_COMPOSE_PRIVILEGED=true + +# Additional Environment Variables +NGINX_TIMEOUT=1800 +AZURACAST_PUID=1000 +AZURACAST_PGID=1000 diff --git a/env_backup_20240418-080053.bak b/env_backup_20240418-080053.bak new file mode 100644 index 0000000..afb3d8c --- /dev/null +++ b/env_backup_20240418-080053.bak @@ -0,0 +1,61 @@ +# This file was automatically generated by AzuraCast. +# You can modify it as necessary. To apply changes, restart the Docker containers. +# Remove the leading "#" symbol from lines to uncomment them. + +# (Docker Compose) All Docker containers are prefixed by this name. Do not change this after installation. +# Default: azuracast +COMPOSE_PROJECT_NAME=azuracast + +# (Docker Compose) The amount of time to wait before a Docker Compose operation fails. Increase this on lower performance computers. +# Default: 300 +COMPOSE_HTTP_TIMEOUT=300 + +# Release Channel +# Valid options: latest, stable +# Default: latest +AZURACAST_VERSION=stable +# AZURACAST_VERSION=0.17.2 + +# HTTP Port +# The main port AzuraCast listens to for insecure HTTP connections. +# Default: 80 +AZURACAST_HTTP_PORT=8600 + +# HTTPS Port +# The main port AzuraCast listens to for secure HTTPS connections. +# Default: 443 +# AZURACAST_HTTPS_PORT=443 + +# SFTP Port +# The port AzuraCast listens to for SFTP file management connections. +# Default: 2022 +# AZURACAST_SFTP_PORT=2022 + +# Station Ports +# The ports AzuraCast should listen to for station broadcasts and incoming DJ +# connections. +# Default: 8000,8005,8006,8010,8015,8016,8020,8025,8026,8030,8035,8036,8040,8045,8046,8050,8055,8056,8060,8065,8066,8070,8075,8076,8090,8095,8096,8100,8105,8106,8110,8115,8116,8120,8125,8126,8130,8135,8136,8140,8145,8146,8150,8155,8156,8160,8165,8166,8170,8175,8176,8180,8185,8186,8190,8195,8196,8200,8205,8206,8210,8215,8216,8220,8225,8226,8230,8235,8236,8240,8245,8246,8250,8255,8256,8260,8265,8266,8270,8275,8276,8280,8285,8286,8290,8295,8296,8300,8305,8306,8310,8315,8316,8320,8325,8326,8330,8335,8336,8340,8345,8346,8350,8355,8356,8360,8365,8366,8370,8375,8376,8380,8385,8386,8390,8395,8396,8400,8405,8406,8410,8415,8416,8420,8425,8426,8430,8435,8436,8440,8445,8446,8450,8455,8456,8460,8465,8466,8470,8475,8476,8480,8485,8486,8490,8495,8496 +AZURACAST_STATION_PORTS=8000,8005,8006,8010,8015,8016,8020,8025,8026,8030 + + +# Docker User UID +# Set the UID of the user running inside the Docker containers. Matching this +# with your host UID can fix permission issues. +# Default: 1000 +# AZURACAST_PUID=1000 + +# Docker User GID +# Set the GID of the user running inside the Docker containers. Matching this +# with your host GID can fix permission issues. +# Default: 1000 +# AZURACAST_PGID=1000 + +# Use Podman instead of Docker. +# AZURACAST_PODMAN_MODE= + +# Advanced: Use Privileged Docker Settings +# Default: 1 +# AZURACAST_COMPOSE_PRIVILEGED=1 + +# Additional Environment Variables +NGINX_TIMEOUT=1800