From e8a03cfa07733199fe6fcdbe3d20534c49cd68a2 Mon Sep 17 00:00:00 2001 From: Buster Silver Date: Thu, 1 Jun 2017 00:18:21 -0500 Subject: [PATCH] Add docker utilities, allow docker and non-docker codebase to coexist, add support for auto-installing fixtures. --- .gitignore | 2 + app/bootstrap/services.php | 15 +++++-- app/config/docker/cache.conf.php | 44 +++++++++++++++++++ .../config/docker/db.conf.php | 0 .../config/docker/influx.conf.php | 0 .../AzuraCast/Radio/Backend/LiquidSoap.php | 4 +- util/ansible/docker_install.yml | 3 +- .../roles/azuracast-fixtures/tasks/main.yml | 35 +++++++++++++++ .../roles/docker-install/tasks/main.yml | 11 +---- util/docker/web/Dockerfile | 2 +- util/docker/web/scripts/azuracast_install | 19 +++++++- util/docker_rebuild.sh | 9 ++++ util/fixtures/.gitkeep | 0 13 files changed, 126 insertions(+), 18 deletions(-) create mode 100644 app/config/docker/cache.conf.php rename util/ansible/roles/docker-install/templates/db.conf.php.j2 => app/config/docker/db.conf.php (100%) rename util/ansible/roles/docker-install/templates/influx.conf.php.j2 => app/config/docker/influx.conf.php (100%) create mode 100644 util/ansible/roles/azuracast-fixtures/tasks/main.yml create mode 100644 util/docker_rebuild.sh create mode 100644 util/fixtures/.gitkeep diff --git a/.gitignore b/.gitignore index 332eec453..cd82e04d6 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,8 @@ app/models/Proxy/*.php # Local development files. app/.env +/util/fixtures/* +!/util/fixtures/.gitkeep # Composer-generated content /vendor/ diff --git a/app/bootstrap/services.php b/app/bootstrap/services.php index a4972d32b..e42b9eabf 100644 --- a/app/bootstrap/services.php +++ b/app/bootstrap/services.php @@ -34,7 +34,10 @@ return function (\Slim\Container $di, \App\Config $config) { try { $config = $di['config']; $options = $config->application->doctrine->toArray(); - $options['conn'] = $config->db->toArray(); + + $options['conn'] = (APP_INSIDE_DOCKER) ? + $config->docker->db->toArray() : + $config->db->toArray(); // Fetch and store entity manager. $config = new \Doctrine\ORM\Configuration; @@ -96,7 +99,10 @@ return function (\Slim\Container $di, \App\Config $config) { // Caching $di['cache_driver'] = function ($di) { $config = $di['config']; - $cache_config = $config->cache->toArray(); + + $cache_config = (APP_INSIDE_DOCKER) ? + $config->docker->cache->toArray() : + $config->cache->toArray(); switch ($cache_config['cache']) { case 'redis': @@ -160,7 +166,10 @@ return function (\Slim\Container $di, \App\Config $config) { // InfluxDB $di['influx'] = function ($di) { $config = $di['config']; - $opts = $config->influx->toArray(); + + $opts = (APP_INSIDE_DOCKER) ? + $config->docker->influx->toArray() : + $config->influx->toArray(); $influx = new \InfluxDB\Client($opts['host'], $opts['port']); diff --git a/app/config/docker/cache.conf.php b/app/config/docker/cache.conf.php new file mode 100644 index 000000000..8e4a9b3d0 --- /dev/null +++ b/app/config/docker/cache.conf.php @@ -0,0 +1,44 @@ + 'file', + + // Flatfile configuration + 'file' => [ + 'path' => APP_INCLUDE_CACHE . DIRECTORY_SEPARATOR, + ], + + // Redis configuration + 'redis' => [ + 'servers' => [ + [ + 'server' => 'localhost', + 'port' => 6379, // default: 6379 + ], + ], + + // 'password' => '', // Must be commented out to have no authentication + 'database' => 0, + ], + + // Memcached configuration + 'memcached' => [ + 'servers' => [ + [ + 'server' => 'memcached', + 'port' => 11211, // default: 11211 + 'weight' => 1, + ], + ], + 'extension' => 'memcached', // Use libmemcached instead of memcache + ], + +]; \ No newline at end of file diff --git a/util/ansible/roles/docker-install/templates/db.conf.php.j2 b/app/config/docker/db.conf.php similarity index 100% rename from util/ansible/roles/docker-install/templates/db.conf.php.j2 rename to app/config/docker/db.conf.php diff --git a/util/ansible/roles/docker-install/templates/influx.conf.php.j2 b/app/config/docker/influx.conf.php similarity index 100% rename from util/ansible/roles/docker-install/templates/influx.conf.php.j2 rename to app/config/docker/influx.conf.php diff --git a/app/src/AzuraCast/Radio/Backend/LiquidSoap.php b/app/src/AzuraCast/Radio/Backend/LiquidSoap.php index 172d296b2..6dbe53fe2 100644 --- a/app/src/AzuraCast/Radio/Backend/LiquidSoap.php +++ b/app/src/AzuraCast/Radio/Backend/LiquidSoap.php @@ -26,7 +26,7 @@ class LiquidSoap extends BackendAbstract 'set("init.daemon.pidfile.path","' . $config_path . '/liquidsoap.pid")', 'set("log.file.path","' . $config_path . '/liquidsoap.log")', 'set("server.telnet",true)', - 'set("server.telnet.bind_addr","127.0.0.1")', + 'set("server.telnet.bind_addr","'.(APP_INSIDE_DOCKER ? '0.0.0.0' : '127.0.0.1').'")', 'set("server.telnet.port", ' . $this->_getTelnetPort() . ')', 'set("server.telnet.reverse_dns",false)', 'set("harbor.bind_addr","0.0.0.0")', @@ -372,7 +372,7 @@ class LiquidSoap extends BackendAbstract protected function _getTelnetPort() { - return (8500 + (($this->station->id - 1) * 10)); + return (8000 + (($this->station->id - 1) * 10) + 4); } /* diff --git a/util/ansible/docker_install.yml b/util/ansible/docker_install.yml index 178cf934c..a4d5b1ef4 100644 --- a/util/ansible/docker_install.yml +++ b/util/ansible/docker_install.yml @@ -15,4 +15,5 @@ roles: - docker-install - composer - - azuracast-db \ No newline at end of file + - azuracast-db + - { role: azuracast-fixtures, when: testing_mode == false and app_env == 'development' } \ No newline at end of file diff --git a/util/ansible/roles/azuracast-fixtures/tasks/main.yml b/util/ansible/roles/azuracast-fixtures/tasks/main.yml new file mode 100644 index 000000000..6773b848c --- /dev/null +++ b/util/ansible/roles/azuracast-fixtures/tasks/main.yml @@ -0,0 +1,35 @@ +--- +- name: Find fixture ZIP files + find: + paths: "{{ util_base }}/fixtures" + patterns: "*.zip" + recurse: yes + register: fixture_zip_files + +- name: Extract fixture ZIP files + unarchive: + src: "{{ item.path }}" + dest: "{{ app_base }}/stations" + owner: azuracast + with_items: "{{ fixture_zip_files.files }}" + when: fixture_zip_files.matched > 0 + +- name: Find fixture SQL files + find: + paths: "{{ util_base }}/fixtures" + patterns: "*.sql" + recurse: yes + register: fixture_sql_files + +- name: Import fixture SQL files + become: true + become_user: azuracast + shell: "php {{ util_base }}/cli.php dbal:import {{ item.path }}" + with_items: "{{ fixture_sql_files.files }}" + when: fixture_sql_files.matched > 0 + +- name: Clear AzuraCast Cache and Restart Stations + become: true + become_user: azuracast + shell: php {{ util_base }}/cli.php cache:clear && php {{ util_base }}/cli.php radio:restart + when: fixture_zip_files.matched > 0 or fixture_sql_files.matched > 0 \ No newline at end of file diff --git a/util/ansible/roles/docker-install/tasks/main.yml b/util/ansible/roles/docker-install/tasks/main.yml index 19e93ea96..d0e3881f9 100644 --- a/util/ansible/roles/docker-install/tasks/main.yml +++ b/util/ansible/roles/docker-install/tasks/main.yml @@ -36,13 +36,4 @@ database: "stations" retentions: "1h:1h,1d:1d" measurements: [{'measurement':':MEASUREMENT', 'fields': ['min(value) AS min','mean(value) AS value','max(value) AS max']}] - prune: true - -- name: Write InfluxDB configuration - become: true - template: src=influx.conf.php.j2 dest="{{ www_base }}/app/config/influx.conf.php" owner=azuracast group=azuracast mode=0644 force=yes - -- name: Write DB configuration - become: true - template: src=db.conf.php.j2 dest="{{ www_base }}/app/config/db.conf.php" owner=azuracast group=azuracast mode=0644 force=yes - register: azuracast_db_created \ No newline at end of file + prune: true \ No newline at end of file diff --git a/util/docker/web/Dockerfile b/util/docker/web/Dockerfile index c54eae6e4..689533d52 100644 --- a/util/docker/web/Dockerfile +++ b/util/docker/web/Dockerfile @@ -3,7 +3,7 @@ FROM ubuntu:xenial # Install essential packages RUN apt-get update && \ apt-get install -q -y apt-transport-https curl wget tar python-software-properties \ - software-properties-common pwgen whois lnav sudo + software-properties-common pwgen whois lnav sudo zip # Set directory permissions RUN mkdir -p /var/azuracast/www_tmp diff --git a/util/docker/web/scripts/azuracast_install b/util/docker/web/scripts/azuracast_install index 14150de1f..ab0c2b7b6 100644 --- a/util/docker/web/scripts/azuracast_install +++ b/util/docker/web/scripts/azuracast_install @@ -1,3 +1,20 @@ #!/usr/bin/env bash -ansible-playbook /var/azuracast/www/util/ansible/docker_install.yml --inventory=/var/azuracast/www/util/ansible/hosts \ No newline at end of file +while test $# -gt 0; do + case "$1" in + --dev) + APP_ENV="development" + shift + ;; + + *) + break + ;; + esac +done + +APP_ENV="${APP_ENV:-production}" + +echo "Updating AzuraCast (Environment: $APP_ENV)" + +ansible-playbook /var/azuracast/www/util/ansible/docker_install.yml --inventory=/var/azuracast/www/util/ansible/hosts --extra-vars "app_env=$APP_ENV" \ No newline at end of file diff --git a/util/docker_rebuild.sh b/util/docker_rebuild.sh new file mode 100644 index 000000000..107eeb936 --- /dev/null +++ b/util/docker_rebuild.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +docker-compose kill +docker stop $(docker ps -a -q) +docker rm $(docker ps -a -q) +docker volume prune -f + +docker-compose up -d --build +docker-compose run web azuracast_install --dev \ No newline at end of file diff --git a/util/fixtures/.gitkeep b/util/fixtures/.gitkeep new file mode 100644 index 000000000..e69de29bb