diff --git a/roles/6-generic-apps/tasks/main.yml b/roles/6-generic-apps/tasks/main.yml
index b90927af7..02a3b8dda 100644
--- a/roles/6-generic-apps/tasks/main.yml
+++ b/roles/6-generic-apps/tasks/main.yml
@@ -3,6 +3,12 @@
- name: ...IS BEGINNING ====================================
command: echo
+- name: AZURACAST
+ include_role:
+ name: azuracast
+ when: azuracast_install | bool
+ tags: azuracast
+
- name: DOKUWIKI
include_role:
name: dokuwiki
diff --git a/roles/azuracast/README.rst b/roles/azuracast/README.rst
new file mode 100644
index 000000000..ee9984850
--- /dev/null
+++ b/roles/azuracast/README.rst
@@ -0,0 +1,19 @@
+==========
+AzuraCast README
+==========
+
+This playbook adds `AzuraCast `_ to Internet-in-a-Box (IIAB) for network radio station functionality. With 'AzuraCast' you and your community can schedule podcasts, music, and even do live streaming of audio content. A variety of streaming formats are supported.
+
+Please see AzuraCast's `screenshots `_.
+
+Currently, this will only run on Ubuntu 18.04, Debian 9, Debian 10. Support for Raspberry Pi is experimental, so please test and report any issues.
+
+Using It
+--------
+
+* Do a normal IIAB install (http://download.iiab.io), making sure to set both variables ``azuracast_install`` and ``azuracast_enabled`` to ``True`` when it prompts you to edit `/etc/iiab/local_vars.yml `_, as you begin the installation.
+* When the IIAB software install completes, it will ask you to reboot, and AzuraCast's console will then be available at http://box.lan:10080
+* This console site will prompt you to complete AzuraCast's initial setup: user accounts, managing stations, radio streams, etc.
+* Finally, check out some `how-to videos `_ to learn to manage your own radio station!
+
+Note: When creating a station using AzuraCast's console, its default streaming ports for ``station`` and ``autodj`` need to be in the `port range 10000-10100 `_.
diff --git a/roles/azuracast/defaults/main.yml b/roles/azuracast/defaults/main.yml
new file mode 100644
index 000000000..1bc43afae
--- /dev/null
+++ b/roles/azuracast/defaults/main.yml
@@ -0,0 +1,22 @@
+# A full-featured online radio station suite.
+# Works on Ubuntu 18.04, Debian 9, 10. Uses docker
+
+# azuracast_install: False
+# azuracast_enabled: False
+
+# azuracast_http_port: 10080
+# azuracast_https_port: 10443
+
+## AzuraCast needs many ports in the 8000:8100 range by default, but IIAB services
+## conflict with those ports so this variable below sets a sane prefix.
+## e.g. setting the below variable to 10 will result in port ranges 10000-10100
+## being reserved for AzuraCast:
+# azuracast_port_range_prefix: 10
+
+# All above are set in: github.com/iiab/iiab/blob/master/vars/default_vars.yml
+# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
+
+docker_sh_url: https://raw.githubusercontent.com/AzuraCast/AzuraCast/master/docker.sh
+docker_compose_url: https://raw.githubusercontent.com/AzuraCast/AzuraCast/master/docker-compose.sample.yml
+docker_container_dir: /library/docker
+azuracast_host_dir: /opt/azuracast
diff --git a/roles/azuracast/tasks/install.yml b/roles/azuracast/tasks/install.yml
new file mode 100644
index 000000000..88259141b
--- /dev/null
+++ b/roles/azuracast/tasks/install.yml
@@ -0,0 +1,64 @@
+- name: AzuraCast - Make AzuraCast config directory
+ file:
+ path: "{{ azuracast_host_dir }}"
+ state: directory
+
+- name: AzuraCast - Copy over .env template to AzuraCast config directory
+ template:
+ src: env.j2
+ dest: "{{ azuracast_host_dir }}/.env"
+ owner: root
+ group: root
+ mode: 0644
+
+- name: AzuraCast - Copy over docker-compose.override.yml template to AzuraCast config directory
+ template:
+ src: docker-compose.override.yml.j2
+ dest: "{{ azuracast_host_dir }}/docker-compose.override.yml"
+ owner: root
+ group: root
+ mode: 0644
+
+- name: AzuraCast - Download docker.sh script
+ get_url:
+ url: "{{ docker_sh_url }}"
+ dest: "{{ azuracast_host_dir }}/"
+ timeout: "{{ download_timeout }}"
+ mode: 0755
+ when: internet_available | bool
+
+- name: AzuraCast - Download docker-compose.yml
+ get_url:
+ url: "{{ docker_compose_url }}"
+ dest: "{{ azuracast_host_dir }}/docker-compose.yml"
+ timeout: "{{ download_timeout }}"
+ mode: 0755
+
+- name: AzuraCast - Make changes to docker.sh script so it runs headless
+ lineinfile:
+ path: "{{ azuracast_host_dir }}/docker.sh"
+ regexp: "^(.*)read reply.*"
+ line: "\\1reply='Y'"
+ backrefs: yes
+
+- name: AzuraCast - Make docker container directory
+ file:
+ path: "{{ docker_container_dir }}"
+ state: directory
+
+- name: AzuraCast - Link docker container directory
+ file:
+ src: "{{ docker_container_dir }}"
+ dest: "/var/lib/docker"
+ state: link
+
+- name: Change default port number ranges 8xxx:8xxx to Nxxx:Nxxx icecast-stations in docker-compose.yml (N - azuracast_port_range_prefix)
+ replace:
+ path: "{{ azuracast_host_dir }}/docker-compose.yml"
+ regexp: "^( *- \\')8([0-9]{3})\\:8([0-9]{3}\\'.*)$"
+ replace: "\\g<1>{{ azuracast_port_range_prefix }}\\g<2>:{{ azuracast_port_range_prefix }}\\g<3>"
+
+- name: AzuraCast - Run the installer
+ shell: "/bin/bash docker.sh install"
+ args:
+ chdir: "{{ azuracast_host_dir }}"
diff --git a/roles/azuracast/tasks/main.yml b/roles/azuracast/tasks/main.yml
new file mode 100644
index 000000000..a9a8fcaf4
--- /dev/null
+++ b/roles/azuracast/tasks/main.yml
@@ -0,0 +1,3 @@
+- name: AzuraCast install
+ include_tasks: install.yml
+ when: azuracast_install
diff --git a/roles/azuracast/templates/docker-compose.override.yml.j2 b/roles/azuracast/templates/docker-compose.override.yml.j2
new file mode 100644
index 000000000..e35d7af46
--- /dev/null
+++ b/roles/azuracast/templates/docker-compose.override.yml.j2
@@ -0,0 +1,30 @@
+version: '2.2'
+
+services:
+ web:
+ networks:
+ - azure
+
+ mariadb:
+ networks:
+ - azure
+
+ influxdb:
+ networks:
+ - azure
+
+ redis:
+ networks:
+ - azure
+
+ stations:
+ networks:
+ - azure
+
+networks:
+ azure:
+ driver: bridge
+ ipam:
+ driver: default
+ config:
+ - subnet: 172.36.0.1/16
diff --git a/roles/azuracast/templates/env.j2 b/roles/azuracast/templates/env.j2
new file mode 100644
index 000000000..6ec52cfb8
--- /dev/null
+++ b/roles/azuracast/templates/env.j2
@@ -0,0 +1,4 @@
+COMPOSE_PROJECT_NAME=azuracast
+
+AZURACAST_HTTP_PORT={{ azuracast_http_port }}
+AZURACAST_HTTPS_PORT={{ azuracast_https_port }}
diff --git a/roles/kalite/tasks/install.yml b/roles/kalite/tasks/install.yml
index 8089696b3..77eff2871 100644
--- a/roles/kalite/tasks/install.yml
+++ b/roles/kalite/tasks/install.yml
@@ -84,6 +84,3 @@
path: /usr/local/kalite/venv/local/lib/python2.7/site-packages/kalite/packages/dist/ifcfg/parser.py
regexp: 'a-zA-Z0-9'
replace: 'a-zA-Z0-9\-'
-
-
-
diff --git a/roles/network/templates/gateway/iiab-gen-iptables b/roles/network/templates/gateway/iiab-gen-iptables
index 9e3038c70..668c3d0d7 100755
--- a/roles/network/templates/gateway/iiab-gen-iptables
+++ b/roles/network/templates/gateway/iiab-gen-iptables
@@ -52,6 +52,9 @@ gui_port={{ gui_port }}
iiab_gateway_enabled={{ iiab_gateway_enabled }}
block_DNS={{ block_DNS }}
+azuracast_ports="{{ azuracast_port_range_prefix }}000:{{ azuracast_port_range_prefix }}100"
+azuracast_https_port={{ azuracast_https_port }}
+azuracast_http_port={{ azuracast_http_port }}
calibre_port={{ calibre_port }}
calibreweb_port={{ calibreweb_port }}
cups_port={{ cups_port }}
@@ -141,6 +144,9 @@ if [ "$wan" != "none" ]; then
# 3 = ssh + http-or-https + common IIAB services
if [ "$ports_externally_visible" -ge 3 ]; then
+ $IPTABLES -A INPUT -p tcp --dport $azuracast_ports -m state --state NEW -i $wan -j ACCEPT
+ $IPTABLES -A INPUT -p tcp --dport $azuracast_http_port -m state --state NEW -i $wan -j ACCEPT
+ $IPTABLES -A INPUT -p tcp --dport $azuracast_https_port -m state --state NEW -i $wan -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport $calibre_port -m state --state NEW -i $wan -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport $calibreweb_port -m state --state NEW -i $wan -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport $cups_port -m state --state NEW -i $wan -j ACCEPT
diff --git a/vars/default_vars.yml b/vars/default_vars.yml
index ea90fe111..abbfd8616 100644
--- a/vars/default_vars.yml
+++ b/vars/default_vars.yml
@@ -285,6 +285,18 @@ idmgr_enables: False
# 6-GENERIC-APPS
+azuracast_install: False
+azuracast_enabled: False
+
+azuracast_http_port: 10080
+azuracast_https_port: 10443
+
+# AzuraCast needs many ports in the 8000:8100 range by default, but IIAB services
+# conflict with those ports so this variable below sets a sane prefix.
+# e.g. setting the below variable to 10 will result in port ranges 10000-10100
+# being reserved for AzuraCast:
+azuracast_port_range_prefix: 10
+
dokuwiki_install: False
dokuwiki_enabled: False
diff --git a/vars/local_vars_big.yml b/vars/local_vars_big.yml
index 3f6e59768..a45673118 100644
--- a/vars/local_vars_big.yml
+++ b/vars/local_vars_big.yml
@@ -178,6 +178,9 @@ iiab_usb_lib_show_all: True
# 6-GENERIC-APPS
+azuracast_install: False
+azuracast_enabled: False
+
dokuwiki_install: True
dokuwiki_enabled: True
diff --git a/vars/local_vars_medium.yml b/vars/local_vars_medium.yml
index 3dbb1f1bc..e3d37b2de 100644
--- a/vars/local_vars_medium.yml
+++ b/vars/local_vars_medium.yml
@@ -178,6 +178,9 @@ iiab_usb_lib_show_all: True
# 6-GENERIC-APPS
+azuracast_install: False
+azuracast_enabled: False
+
dokuwiki_install: False
dokuwiki_enabled: False
diff --git a/vars/local_vars_min.yml b/vars/local_vars_min.yml
index b393f4a83..8442a84c0 100644
--- a/vars/local_vars_min.yml
+++ b/vars/local_vars_min.yml
@@ -178,6 +178,9 @@ iiab_usb_lib_show_all: True
# 6-GENERIC-APPS
+azuracast_install: False
+azuracast_enabled: False
+
dokuwiki_install: False
dokuwiki_enabled: False