From f9221fb335635484cb4683484fcf663108430671 Mon Sep 17 00:00:00 2001 From: "Buster \"Silver Eagle\" Neece" Date: Tue, 22 Jun 2021 07:36:58 -0500 Subject: [PATCH] Initial commit of unified Docker build and standalone image. --- .dockerignore | 4 +- Dockerfile | 80 ++++++-- config/cli.php | 5 + docker-compose.dev.yml | 6 - docker-compose.sample.yml | 182 +----------------- docker.sh | 22 +++ src/Console/Command/InitializeCommand.php | 79 ++++++++ src/Console/Command/SetupCommand.php | 61 +----- src/Version.php | 2 +- util/docker/{web => base}/add_user.sh | 4 +- util/docker/{web => base}/buildconfig | 0 util/docker/{web => base}/cleanup.sh | 4 +- util/docker/{web => base}/prepare.sh | 6 +- util/docker/base/setup.sh | 12 ++ util/docker/base/setup/icecast.sh | 15 ++ util/docker/base/setup/liquidsoap.sh | 10 + util/docker/final/buildconfig | 4 + util/docker/final/cleanup.sh | 9 + util/docker/{web => final}/cron/azuracast | 0 .../{web => final}/nginx/azuracast.conf.tmpl | 0 util/docker/{web => final}/nginx/nginx.conf | 0 util/docker/{web => final}/php/php.ini.tmpl | 0 util/docker/{web => final}/php/www.conf.tmpl | 0 .../{web => final}/scripts/azuracast_cli | 6 +- .../{web => final}/scripts/azuracast_install | 4 +- .../scripts/azuracast_migrate_stations | 0 .../{web => final}/scripts/azuracast_restore | 4 +- .../scripts/azuracast_sftp_auth | 0 .../scripts/azuracast_sftp_event | 0 .../{web => final}/scripts/azuracast_update | 0 util/docker/{web => final}/scripts/cron_task | 2 +- util/docker/{web => final}/scripts/my_init | 0 util/docker/final/scripts/setuser | 64 ++++++ .../{web => final}/scripts/temp_cleanup | 4 +- .../docker/{web => final}/scripts/uptime_wait | 0 .../{web/runit => final/service}/cron/run | 0 .../{web/runit => final/service}/nginx/run | 0 .../{web/runit => final/service}/php-fpm/run | 0 .../runit => final/service}/php-worker/run | 0 .../{web/runit => final/service}/sftpgo/run | 0 .../final/service_standalone/supervisord/run | 3 + util/docker/final/setup.sh | 22 +++ .../{web => final}/setup/audiowaveform.sh | 2 +- util/docker/{web => final}/setup/cron.sh | 6 +- util/docker/{web => final}/setup/dbip.sh | 2 +- util/docker/{web => final}/setup/dockerize.sh | 2 +- util/docker/{web => final}/setup/flac.sh | 2 +- util/docker/{web => final}/setup/nginx.sh | 6 +- util/docker/{web => final}/setup/php.sh | 8 +- util/docker/{web => final}/setup/sftpgo.sh | 4 +- util/docker/final/setup/supervisor.sh | 12 ++ util/docker/final/setup/tmpreaper.sh | 6 + util/docker/{web => final}/setup/vorbis.sh | 2 +- util/docker/{web => final}/sftpgo/sftpgo.json | 0 .../startup_scripts/00_nginx.sh} | 0 .../startup_scripts/01_php.sh} | 0 .../startup_scripts/02_standalone_mode.sh | 18 ++ .../startup_scripts/05_sftpgo_private_key.sh} | 0 .../final/startup_scripts/10_clear_temp.sh | 4 + .../final/startup_scripts/15_initialize.sh | 5 + util/docker/final/supervisor/supervisord.conf | 25 +++ util/docker/web/setup.sh | 26 --- util/docker/web/setup/tmpreaper.sh | 6 - .../docker/web/startup_scripts/php_workers.sh | 24 --- 64 files changed, 430 insertions(+), 344 deletions(-) create mode 100644 src/Console/Command/InitializeCommand.php rename util/docker/{web => base}/add_user.sh (85%) rename util/docker/{web => base}/buildconfig (100%) rename util/docker/{web => base}/cleanup.sh (57%) rename util/docker/{web => base}/prepare.sh (94%) create mode 100644 util/docker/base/setup.sh create mode 100644 util/docker/base/setup/icecast.sh create mode 100644 util/docker/base/setup/liquidsoap.sh create mode 100644 util/docker/final/buildconfig create mode 100644 util/docker/final/cleanup.sh rename util/docker/{web => final}/cron/azuracast (100%) rename util/docker/{web => final}/nginx/azuracast.conf.tmpl (100%) rename util/docker/{web => final}/nginx/nginx.conf (100%) rename util/docker/{web => final}/php/php.ini.tmpl (100%) rename util/docker/{web => final}/php/www.conf.tmpl (100%) rename util/docker/{web => final}/scripts/azuracast_cli (67%) rename util/docker/{web => final}/scripts/azuracast_install (92%) rename util/docker/{web => final}/scripts/azuracast_migrate_stations (100%) rename util/docker/{web => final}/scripts/azuracast_restore (90%) rename util/docker/{web => final}/scripts/azuracast_sftp_auth (100%) rename util/docker/{web => final}/scripts/azuracast_sftp_event (100%) rename util/docker/{web => final}/scripts/azuracast_update (100%) rename util/docker/{web => final}/scripts/cron_task (51%) rename util/docker/{web => final}/scripts/my_init (100%) create mode 100644 util/docker/final/scripts/setuser rename util/docker/{web => final}/scripts/temp_cleanup (64%) rename util/docker/{web => final}/scripts/uptime_wait (100%) rename util/docker/{web/runit => final/service}/cron/run (100%) rename util/docker/{web/runit => final/service}/nginx/run (100%) rename util/docker/{web/runit => final/service}/php-fpm/run (100%) rename util/docker/{web/runit => final/service}/php-worker/run (100%) rename util/docker/{web/runit => final/service}/sftpgo/run (100%) create mode 100644 util/docker/final/service_standalone/supervisord/run create mode 100644 util/docker/final/setup.sh rename util/docker/{web => final}/setup/audiowaveform.sh (78%) rename util/docker/{web => final}/setup/cron.sh (82%) rename util/docker/{web => final}/setup/dbip.sh (89%) rename util/docker/{web => final}/setup/dockerize.sh (89%) rename util/docker/{web => final}/setup/flac.sh (61%) rename util/docker/{web => final}/setup/nginx.sh (69%) rename util/docker/{web => final}/setup/php.sh (84%) rename util/docker/{web => final}/setup/sftpgo.sh (72%) create mode 100644 util/docker/final/setup/supervisor.sh create mode 100644 util/docker/final/setup/tmpreaper.sh rename util/docker/{web => final}/setup/vorbis.sh (65%) rename util/docker/{web => final}/sftpgo/sftpgo.json (100%) rename util/docker/{web/startup_scripts/nginx.sh => final/startup_scripts/00_nginx.sh} (100%) rename util/docker/{web/startup_scripts/php.sh => final/startup_scripts/01_php.sh} (100%) create mode 100644 util/docker/final/startup_scripts/02_standalone_mode.sh rename util/docker/{web/startup_scripts/sftpgo_private_key.sh => final/startup_scripts/05_sftpgo_private_key.sh} (100%) create mode 100644 util/docker/final/startup_scripts/10_clear_temp.sh create mode 100644 util/docker/final/startup_scripts/15_initialize.sh create mode 100644 util/docker/final/supervisor/supervisord.conf delete mode 100644 util/docker/web/setup.sh delete mode 100644 util/docker/web/setup/tmpreaper.sh delete mode 100644 util/docker/web/startup_scripts/php_workers.sh diff --git a/.dockerignore b/.dockerignore index 13da2c8ab..49502cc51 100644 --- a/.dockerignore +++ b/.dockerignore @@ -6,9 +6,9 @@ !bin !config !resources/locale/compiled -!util/docker/web +!util/docker !util/openapi.php !web !templates !plugins -!crowdin.yaml \ No newline at end of file +!crowdin.yaml diff --git a/Dockerfile b/Dockerfile index 68d28572e..2ed1e31eb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,72 @@ # Base install step (done first for caching purposes). -FROM ubuntu:focal as base +FROM ubuntu:focal as build_base ENV TZ="UTC" # Run base build process -COPY ./util/docker/web/ /bd_build +COPY ./util/docker/base/ /bd_build_base -RUN chmod a+x /bd_build/*.sh \ - && /bd_build/prepare.sh \ - && /bd_build/add_user.sh \ - && /bd_build/setup.sh \ - && /bd_build/cleanup.sh \ - && rm -rf /bd_build +RUN chmod a+x /bd_build_base/*.sh \ + && /bd_build_base/prepare.sh \ + && /bd_build_base/add_user.sh \ + && /bd_build_base/setup.sh \ + && /bd_build_base/cleanup.sh \ + && rm -rf /bd_build_base + +# +# Icecast build stage (for later copy) +# +FROM azuracast/icecast-kh-ac:2.4.0-kh15-ac1 AS build_icecast + +# +# Liquidsoap build stage +# +FROM build_base AS build_liquidsoap + +# Install build tools +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -q -y --no-install-recommends \ + build-essential libssl-dev libcurl4-openssl-dev bubblewrap unzip m4 software-properties-common \ + ocaml opam \ + autoconf automake + +USER azuracast + +RUN opam init --disable-sandboxing -a --bare && opam switch create ocaml-system.4.08.1 + +# Uncomment to Pin specific commit of Liquidsoap +RUN cd ~/ \ + && git clone --recursive https://github.com/savonet/liquidsoap.git \ + && cd liquidsoap \ + && git checkout 75d530c86bf638e3c50c08b7802d92270288e31b \ + && opam pin add --no-action liquidsoap . + +ARG opam_packages="ladspa.0.1.5 ffmpeg.0.4.3 samplerate.0.1.4 taglib.0.3.3 mad.0.4.5 faad.0.4.0 fdkaac.0.3.1 lame.0.3.3 vorbis.0.7.1 cry.0.6.1 flac.0.1.5 opus.0.1.3 duppy.0.8.0 ssl liquidsoap" +RUN opam install -y ${opam_packages} + +FROM build_base AS build_final + +# Run base build process +COPY ./util/docker/final/ /bd_build_final + +RUN chmod a+x /bd_build_final/*.sh \ + && /bd_build_final/setup.sh \ + && /bd_build_final/cleanup.sh \ + && rm -rf /bd_build_final + +# +# Final unified container build +# +FROM build_final + +# Import Icecast-KH from build container +COPY --from=build_icecast /usr/local/bin/icecast /usr/local/bin/icecast +COPY --from=build_icecast /usr/local/share/icecast /usr/local/share/icecast + +# Import Liquidsoap from build container +COPY --from=build_liquidsoap --chown=azuracast:azuracast /var/azuracast/.opam/ocaml-system.4.08.1 /var/azuracast/.opam/ocaml-system.4.08.1 + +RUN ln -s /var/azuracast/.opam/ocaml-system.4.08.1/bin/liquidsoap /usr/local/bin/liquidsoap # # START Operations as `azuracast` user @@ -32,14 +87,17 @@ COPY --chown=azuracast:azuracast . . RUN composer dump-autoload --optimize --classmap-authoritative \ && touch /var/azuracast/.docker -VOLUME ["/var/azuracast/www_tmp", "/var/azuracast/backups", "/var/azuracast/sftpgo/persist"] +# Include radio services in PATH +ENV PATH="${PATH}:/var/azuracast/servers/shoutcast2" + +VOLUME ["/var/azuracast/www_tmp", "/var/azuracast/backups", "/var/azuracast/sftpgo/persist", "/var/azuracast/servers/shoutcast2"] # # END Operations as `azuracast` user # USER root -EXPOSE 80 2022 +EXPOSE 80 2022 9001 8000-8999 # Nginx Proxy environment variables. ENV VIRTUAL_HOST="azuracast.local" \ @@ -48,7 +106,7 @@ ENV VIRTUAL_HOST="azuracast.local" \ # Sensible default environment variables. ENV LANG="en_US.UTF-8" \ APPLICATION_ENV="production" \ - ENABLE_ADVANCED_FEATURES="false" \ + AZURACAST_DOCKER_STANDALONE_MODE=0 \ MYSQL_HOST="mariadb" \ MYSQL_PORT=3306 \ MYSQL_USER="azuracast" \ diff --git a/config/cli.php b/config/cli.php index 9333c0d93..ec76dcc2e 100644 --- a/config/cli.php +++ b/config/cli.php @@ -61,6 +61,11 @@ return function (Application $console) { )->setDescription(__('Convert translated locale files into PHP arrays.')); // Setup + $console->command( + 'azuracast:setup:initialize', + Command\InitializeCommand::class + )->setDescription(__('Ensure key settings are initialized within AzuraCast.')); + $console->command( 'azuracast:config:migrate', Command\MigrateConfigCommand::class diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 701d0f42a..b82675171 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -27,9 +27,3 @@ services: context: ../docker-azuracast-redis ports: - "127.0.0.1:6379:6379" - - stations: - build: - context: ../docker-azuracast-radio - volumes: - - ./util/local_ssl:/etc/nginx/certs diff --git a/docker-compose.sample.yml b/docker-compose.sample.yml index 7c075b9fe..86d18cc46 100644 --- a/docker-compose.sample.yml +++ b/docker-compose.sample.yml @@ -14,7 +14,7 @@ version : '2.2' services : nginx_proxy : container_name : nginx_proxy - image : "azuracast/azuracast_nginx_proxy:${AZURACAST_VERSION:-latest}" + image : "ghcr.io/azuracast/nginx_proxy:${AZURACAST_VERSION:-latest}" ports : - '${AZURACAST_HTTP_PORT:-80}:80' - '${AZURACAST_HTTPS_PORT:-443}:443' @@ -34,7 +34,7 @@ services : nginx_proxy_letsencrypt : container_name : nginx_proxy_letsencrypt - image : "azuracast/azuracast_nginx_proxy_letsencrypt:${AZURACAST_VERSION:-latest}" + image : "ghcr.io/azuracast/nginx_proxy_letsencrypt:${AZURACAST_VERSION:-latest}" volumes_from : - nginx_proxy volumes : @@ -48,19 +48,19 @@ services : web : container_name : azuracast_web - image : "azuracast/azuracast_web_v2:${AZURACAST_VERSION:-latest}" + image : "ghcr.io/azuracast/web:${AZURACAST_VERSION:-latest}" # Want to customize the HTTP/S ports? Follow the instructions here: # https://docs.azuracast.com/en/administration/docker#using-non-standard-ports ports : - '${AZURACAST_SFTP_PORT:-2022}:2022' depends_on : - mariadb - - stations - redis env_file : azuracast.env environment : LANG : ${LANG:-en_US.UTF-8} - AZURACAST_DC_REVISION : 11 + AZURACAST_DC_REVISION : 12 + AZURACAST_DOCKER_STANDALONE_MODE : 1 AZURACAST_VERSION : ${AZURACAST_VERSION:-latest} AZURACAST_SFTP_PORT : ${AZURACAST_SFTP_PORT:-2022} VIRTUAL_HOST : ${LETSENCRYPT_HOST:-azuracast.local} @@ -91,7 +91,7 @@ services : mariadb : container_name : azuracast_mariadb - image : "azuracast/azuracast_db:${AZURACAST_VERSION:-latest}" + image : "ghcr.io/azuracast/db:${AZURACAST_VERSION:-latest}" volumes : - db_data:/var/lib/mysql env_file : azuracast.env @@ -102,7 +102,7 @@ services : redis : container_name : azuracast_redis - image : "azuracast/azuracast_redis:${AZURACAST_VERSION:-latest}" + image : "ghcr.io/azuracast/redis:${AZURACAST_VERSION:-latest}" sysctls : net.core.somaxconn : 1024 volumes : @@ -112,174 +112,6 @@ services : restart : always logging : *default-logging - stations : - container_name : azuracast_stations - image : "azuracast/azuracast_radio:${AZURACAST_VERSION:-latest}" - ports : - # This default mapping is the outgoing and incoming ports for the first 50 stations. - # You can override this port mapping in your own docker-compose.override.yml file. - # For instructions, see: - # https://docs.azuracast.com/en/administration/docker#expanding-the-station-port-range - - '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 : always - ulimits : *default-ulimits - logging : *default-logging - networks : frontend : driver : bridge diff --git a/docker.sh b/docker.sh index d05a1228d..afe602c81 100755 --- a/docker.sh +++ b/docker.sh @@ -111,6 +111,11 @@ __dotenv_cmd=.env esac } +# Shortcut to have Docker run YQ files +yq() { + docker run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@" +} + # 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. @@ -201,6 +206,19 @@ setup-release() { .env --file .env set AZURACAST_VERSION=${AZURACAST_VERSION} } +# Add Ports to Docker Compose +add-ports-to-docker-compose() { + local LEGACY_PORTS + LEGACY_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" + + .env --file .env get AZURACAST_STATION_PORTS + + local PORTS + PORTS="${REPLY:-$LEGACY_PORTS}" + + yq eval ".services.web.ports += [$PORTS]" -i docker-compose.yml +} + # # Run the initial installer of Docker and AzuraCast. # Usage: ./docker.sh install @@ -285,6 +303,8 @@ install() { else curl -fsSL https://raw.githubusercontent.com/AzuraCast/AzuraCast/main/docker-compose.sample.yml -o docker-compose.yml fi + + add-ports-to-docker-compose fi if ask "Customize AzuraCast ports?" N; then @@ -384,6 +404,8 @@ update() { cp docker-compose.yml docker-compose.backup.yml mv docker-compose.new.yml docker-compose.yml + + add-ports-to-docker-compose else rm docker-compose.new.yml diff --git a/src/Console/Command/InitializeCommand.php b/src/Console/Command/InitializeCommand.php new file mode 100644 index 000000000..761565e12 --- /dev/null +++ b/src/Console/Command/InitializeCommand.php @@ -0,0 +1,79 @@ +title(__('Initialize AzuraCast')); + $io->writeln(__('Initializing essential settings...')); + + $io->listing( + [ + __('Environment: %s', ucfirst($environment->getAppEnvironment())), + __('Installation Method: %s', $environment->isDocker() ? 'Docker' : 'Ansible'), + ] + ); + + $io->newLine(); + $io->section(__('Running Database Migrations')); + + $this->runCommand( + $output, + 'migrations:migrate', + [ + '--allow-no-migration' => true, + ] + ); + + $io->newLine(); + $io->section(__('Generating Database Proxy Classes')); + + $this->runCommand($output, 'orm:generate-proxies'); + + $io->newLine(); + $io->section(__('Reload System Data')); + + $this->runCommand($output, 'cache:clear'); + $this->runCommand($output, 'queue:clear'); + + $stationRepo->clearNowPlaying(); + + // Clear settings that should be reset upon update. + $settings = $settingsRepo->readSettings(); + $settings->setNowplaying(null); + $settings->updateUpdateLastRun(); + $settings->setUpdateResults(null); + + if ('127.0.0.1' !== $settings->getExternalIp()) { + $settings->setExternalIp(null); + } + + $settingsRepo->writeSettings($settings); + + $storageLocationRepo->createDefaultStorageLocations(); + + $io->newLine(); + $io->success( + [ + __('AzuraCast is now initialized.'), + ] + ); + + return 0; + } +} diff --git a/src/Console/Command/SetupCommand.php b/src/Console/Command/SetupCommand.php index ae8b8c1fc..838e714c6 100644 --- a/src/Console/Command/SetupCommand.php +++ b/src/Console/Command/SetupCommand.php @@ -2,10 +2,8 @@ namespace App\Console\Command; -use App\Entity; use App\Environment; use App\Service\AzuraCastCentral; -use Doctrine\ORM\EntityManagerInterface; use Psr\Container\ContainerInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; @@ -17,9 +15,6 @@ class SetupCommand extends CommandAbstract OutputInterface $output, Environment $environment, ContainerInterface $di, - Entity\Repository\SettingsRepository $settingsRepo, - Entity\Repository\StationRepository $stationRepo, - Entity\Repository\StorageLocationRepository $storageLocationRepo, AzuraCastCentral $acCentral, bool $update = false, bool $loadFixtures = false @@ -27,36 +22,7 @@ class SetupCommand extends CommandAbstract $io->title(__('AzuraCast Setup')); $io->writeln(__('Welcome to AzuraCast. Please wait while some key dependencies of AzuraCast are set up...')); - $io->listing( - [ - __('Environment: %s', ucfirst($environment->getAppEnvironment())), - __('Installation Method: %s', $environment->isDocker() ? 'Docker' : 'Ansible'), - ] - ); - - if ($update) { - $io->note(__('Running in update mode.')); - } - - $conn = $di->get(EntityManagerInterface::class)->getConnection(); - - $io->newLine(); - $io->section(__('Running Database Migrations')); - - $conn->ping(); - $this->runCommand( - $output, - 'migrations:migrate', - [ - '--allow-no-migration' => true, - ] - ); - - $io->newLine(); - $io->section(__('Generating Database Proxy Classes')); - - $conn->ping(); - $this->runCommand($output, 'orm:generate-proxies'); + $this->runCommand($output, 'azuracast:setup:initialize'); if ($loadFixtures || (!$environment->isProduction() && !$update)) { $io->newLine(); @@ -65,36 +31,11 @@ class SetupCommand extends CommandAbstract $this->runCommand($output, 'azuracast:setup:fixtures'); } - $io->newLine(); - $io->section(__('Reload System Data')); - - $this->runCommand($output, 'cache:clear'); - - $this->runCommand($output, 'queue:clear'); - - $settings = $settingsRepo->readSettings(); - $settings->setNowplaying(null); - - $stationRepo->clearNowPlaying(); - $io->newLine(); $io->section(__('Refreshing All Stations')); - $conn->ping(); $this->runCommand($output, 'azuracast:radio:restart'); - // Clear settings that should be reset upon update. - $settings->updateUpdateLastRun(); - $settings->setUpdateResults(null); - - if ('127.0.0.1' !== $settings->getExternalIp()) { - $settings->setExternalIp(null); - } - - $settingsRepo->writeSettings($settings); - - $storageLocationRepo->createDefaultStorageLocations(); - $io->newLine(); if ($update) { diff --git a/src/Version.php b/src/Version.php index 36ceed90a..53b766529 100644 --- a/src/Version.php +++ b/src/Version.php @@ -19,7 +19,7 @@ class Version public const RELEASE_CHANNEL_STABLE = 'stable'; // phpcs:disable Generic.Files.LineLength - public const LATEST_COMPOSE_REVISION = 11; + public const LATEST_COMPOSE_REVISION = 12; public const LATEST_COMPOSE_URL = 'https://raw.githubusercontent.com/AzuraCast/AzuraCast/main/docker-compose.sample.yml'; public const UPDATE_URL = 'https://docs.azuracast.com/en/getting-started/updates'; diff --git a/util/docker/web/add_user.sh b/util/docker/base/add_user.sh similarity index 85% rename from util/docker/web/add_user.sh rename to util/docker/base/add_user.sh index fb662148d..32afd3fc4 100644 --- a/util/docker/web/add_user.sh +++ b/util/docker/base/add_user.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -source /bd_build/buildconfig +source /bd_build_base/buildconfig set -x $minimal_apt_get_install sudo @@ -18,4 +18,4 @@ mkdir -p /var/azuracast/www /var/azuracast/backups /var/azuracast/www_tmp /var/a chown -R azuracast:azuracast /var/azuracast chmod -R 777 /var/azuracast/www_tmp -echo 'azuracast ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers \ No newline at end of file +echo 'azuracast ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers diff --git a/util/docker/web/buildconfig b/util/docker/base/buildconfig similarity index 100% rename from util/docker/web/buildconfig rename to util/docker/base/buildconfig diff --git a/util/docker/web/cleanup.sh b/util/docker/base/cleanup.sh similarity index 57% rename from util/docker/web/cleanup.sh rename to util/docker/base/cleanup.sh index f26907f1f..feaec38af 100644 --- a/util/docker/web/cleanup.sh +++ b/util/docker/base/cleanup.sh @@ -1,9 +1,9 @@ #!/bin/bash set -e -source /bd_build/buildconfig +source /bd_build_base/buildconfig set -x apt-get clean rm -rf /var/lib/apt/lists/* -rm -rf /tmp/tmp* \ No newline at end of file +rm -rf /tmp/tmp* diff --git a/util/docker/web/prepare.sh b/util/docker/base/prepare.sh similarity index 94% rename from util/docker/web/prepare.sh rename to util/docker/base/prepare.sh index 47dc6ff72..f38f8b861 100644 --- a/util/docker/web/prepare.sh +++ b/util/docker/base/prepare.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -source /bd_build/buildconfig +source /bd_build_base/buildconfig set -x ## Prevent initramfs updates from trying to run grub and lilo. @@ -14,7 +14,7 @@ echo -n no > /etc/container_environment/INITRD echo "UTC" > /etc/timezone # Avoid ERROR: invoke-rc.d: policy-rc.d denied execution of start. -sed -i "s/^exit 101$/exit 0/" /usr/sbin/policy-rc.d +sed -i "s/^exit 101$/exit 0/" /usr/sbin/policy-rc.d ## Enable Ubuntu Universe, Multiverse, and deb-src for main. sed -i 's/^#\s*\(deb.*main restricted\)$/\1/g' /etc/apt/sources.list @@ -67,4 +67,4 @@ chmod 700 /etc/container_environment groupadd -g 8377 docker_env chown :docker_env /etc/container_environment.sh /etc/container_environment.json chmod 640 /etc/container_environment.sh /etc/container_environment.json -ln -s /etc/container_environment.sh /etc/profile.d/ \ No newline at end of file +ln -s /etc/container_environment.sh /etc/profile.d/ diff --git a/util/docker/base/setup.sh b/util/docker/base/setup.sh new file mode 100644 index 000000000..3f5e2134a --- /dev/null +++ b/util/docker/base/setup.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e +source /bd_build_base/buildconfig +set -x + +# Install scripts commonly used during setup. +$minimal_apt_get_install runit curl wget tar zip unzip git rsync tzdata gpg-agent openssh-client + +# Run service setup for all setup scripts +for f in /bd_build_base/setup/*.sh; do + bash "$f" -H +done diff --git a/util/docker/base/setup/icecast.sh b/util/docker/base/setup/icecast.sh new file mode 100644 index 000000000..cf2205b1c --- /dev/null +++ b/util/docker/base/setup/icecast.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -e +source /bd_build_base/buildconfig +set -x + +# Only install Icecast deps (Icecast is handled by another container). +$minimal_apt_get_install libxml2 libxslt1-dev libvorbis-dev openssl + +mkdir -p /etc/nginx +chown azuracast:azuracast /etc/nginx + +openssl req -new -nodes -x509 -subj "/C=US/ST=Texas/L=Austin/O=IT/CN=localhost" \ + -days 365 -extensions v3_ca \ + -keyout /etc/nginx/ssl.key \ + -out /etc/nginx/ssl.crt diff --git a/util/docker/base/setup/liquidsoap.sh b/util/docker/base/setup/liquidsoap.sh new file mode 100644 index 000000000..a6ec52a9d --- /dev/null +++ b/util/docker/base/setup/liquidsoap.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -e +source /bd_build_base/buildconfig +set -x + +# Only install Liquidsoap deps (Liquidsoap build is handled by another container). +$minimal_apt_get_install libfaad-dev libfdk-aac-dev libflac-dev libmad0-dev libmp3lame-dev libogg-dev \ + libopus-dev libpcre3-dev libtag1-dev libsamplerate0-dev libavcodec-dev libavfilter-dev \ + libavformat-dev libavresample-dev libavutil-dev libpostproc-dev libswresample-dev \ + ladspa-sdk multimedia-audio-plugins swh-plugins tap-plugins lsp-plugins-ladspa diff --git a/util/docker/final/buildconfig b/util/docker/final/buildconfig new file mode 100644 index 000000000..3973f55bb --- /dev/null +++ b/util/docker/final/buildconfig @@ -0,0 +1,4 @@ +export LC_ALL=C +export DEBIAN_FRONTEND=noninteractive + +minimal_apt_get_install='apt-get install -y --no-install-recommends' diff --git a/util/docker/final/cleanup.sh b/util/docker/final/cleanup.sh new file mode 100644 index 000000000..4a67f46f5 --- /dev/null +++ b/util/docker/final/cleanup.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -e +source /bd_build_final/buildconfig +set -x + +apt-get clean +rm -rf /var/lib/apt/lists/* + +rm -rf /tmp/tmp* diff --git a/util/docker/web/cron/azuracast b/util/docker/final/cron/azuracast similarity index 100% rename from util/docker/web/cron/azuracast rename to util/docker/final/cron/azuracast diff --git a/util/docker/web/nginx/azuracast.conf.tmpl b/util/docker/final/nginx/azuracast.conf.tmpl similarity index 100% rename from util/docker/web/nginx/azuracast.conf.tmpl rename to util/docker/final/nginx/azuracast.conf.tmpl diff --git a/util/docker/web/nginx/nginx.conf b/util/docker/final/nginx/nginx.conf similarity index 100% rename from util/docker/web/nginx/nginx.conf rename to util/docker/final/nginx/nginx.conf diff --git a/util/docker/web/php/php.ini.tmpl b/util/docker/final/php/php.ini.tmpl similarity index 100% rename from util/docker/web/php/php.ini.tmpl rename to util/docker/final/php/php.ini.tmpl diff --git a/util/docker/web/php/www.conf.tmpl b/util/docker/final/php/www.conf.tmpl similarity index 100% rename from util/docker/web/php/www.conf.tmpl rename to util/docker/final/php/www.conf.tmpl diff --git a/util/docker/web/scripts/azuracast_cli b/util/docker/final/scripts/azuracast_cli similarity index 67% rename from util/docker/web/scripts/azuracast_cli rename to util/docker/final/scripts/azuracast_cli index 2f4197d3c..07d2cd9e0 100644 --- a/util/docker/web/scripts/azuracast_cli +++ b/util/docker/final/scripts/azuracast_cli @@ -2,9 +2,9 @@ if [ `whoami` != 'azuracast' ]; then echo 'This script must be run as the "azuracast" user. Rerunning...' - sudo -E -u azuracast azuracast_cli "$@" - exit 1 + setuser azuracast azuracast_cli "$@" + exit $? fi cd /var/azuracast/www -php bin/console "$@" \ No newline at end of file +php bin/console "$@" diff --git a/util/docker/web/scripts/azuracast_install b/util/docker/final/scripts/azuracast_install similarity index 92% rename from util/docker/web/scripts/azuracast_install rename to util/docker/final/scripts/azuracast_install index 66d3dd775..e2e3158f2 100644 --- a/util/docker/web/scripts/azuracast_install +++ b/util/docker/final/scripts/azuracast_install @@ -9,8 +9,8 @@ bool() { if [ $(whoami) != 'azuracast' ]; then echo 'This script must be run as the "azuracast" user. Rerunning...' - sudo -E -u azuracast azuracast_install "$@" - exit 1 + setuser azuracast azuracast_install "$@" + exit $? fi echo "AzuraCast Setup" diff --git a/util/docker/web/scripts/azuracast_migrate_stations b/util/docker/final/scripts/azuracast_migrate_stations similarity index 100% rename from util/docker/web/scripts/azuracast_migrate_stations rename to util/docker/final/scripts/azuracast_migrate_stations diff --git a/util/docker/web/scripts/azuracast_restore b/util/docker/final/scripts/azuracast_restore similarity index 90% rename from util/docker/web/scripts/azuracast_restore rename to util/docker/final/scripts/azuracast_restore index 05a2e23e1..41750211b 100644 --- a/util/docker/web/scripts/azuracast_restore +++ b/util/docker/final/scripts/azuracast_restore @@ -9,8 +9,8 @@ bool() { if [ $(whoami) != 'azuracast' ]; then echo 'This script must be run as the "azuracast" user. Rerunning...' - sudo -E -u azuracast azuracast_install "$@" - exit 1 + setuser azuracast azuracast_restore "$@" + exit $? fi echo "AzuraCast Setup" diff --git a/util/docker/web/scripts/azuracast_sftp_auth b/util/docker/final/scripts/azuracast_sftp_auth similarity index 100% rename from util/docker/web/scripts/azuracast_sftp_auth rename to util/docker/final/scripts/azuracast_sftp_auth diff --git a/util/docker/web/scripts/azuracast_sftp_event b/util/docker/final/scripts/azuracast_sftp_event similarity index 100% rename from util/docker/web/scripts/azuracast_sftp_event rename to util/docker/final/scripts/azuracast_sftp_event diff --git a/util/docker/web/scripts/azuracast_update b/util/docker/final/scripts/azuracast_update similarity index 100% rename from util/docker/web/scripts/azuracast_update rename to util/docker/final/scripts/azuracast_update diff --git a/util/docker/web/scripts/cron_task b/util/docker/final/scripts/cron_task similarity index 51% rename from util/docker/web/scripts/cron_task rename to util/docker/final/scripts/cron_task index 25b4749cd..75da12636 100644 --- a/util/docker/web/scripts/cron_task +++ b/util/docker/final/scripts/cron_task @@ -2,4 +2,4 @@ source /etc/container_environment.sh -sudo -E -u azuracast "$@" >/proc/1/fd/1 2>/proc/1/fd/2 +setuser azuracast "$@" >/proc/1/fd/1 2>/proc/1/fd/2 diff --git a/util/docker/web/scripts/my_init b/util/docker/final/scripts/my_init similarity index 100% rename from util/docker/web/scripts/my_init rename to util/docker/final/scripts/my_init diff --git a/util/docker/final/scripts/setuser b/util/docker/final/scripts/setuser new file mode 100644 index 000000000..06d7430a3 --- /dev/null +++ b/util/docker/final/scripts/setuser @@ -0,0 +1,64 @@ +#!/usr/bin/python3 + +''' +Copyright (c) 2013-2015 Phusion Holding B.V. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +''' + +import sys +import os +import pwd + + +def abort(message): + sys.stderr.write("setuser: %s\n" % message) + sys.exit(1) + + +def main(): + ''' + A simple alternative to sudo that executes a command as a user by setting + the user ID and user parameters to those described by the system and then + using execvp(3) to execute the command without the necessity of a TTY + ''' + + username = sys.argv[1] + try: + user = pwd.getpwnam(username) + except KeyError: + abort("user %s not found" % username) + os.initgroups(username, user.pw_gid) + os.setgid(user.pw_gid) + os.setuid(user.pw_uid) + os.environ['USER'] = username + os.environ['HOME'] = user.pw_dir + os.environ['UID'] = str(user.pw_uid) + try: + os.execvp(sys.argv[2], sys.argv[2:]) + except OSError as e: + abort("cannot execute %s: %s" % (sys.argv[2], str(e))) + +if __name__ == '__main__': + + if len(sys.argv) < 3: + sys.stderr.write("Usage: /sbin/setuser USERNAME COMMAND [args..]\n") + sys.exit(1) + + main() diff --git a/util/docker/web/scripts/temp_cleanup b/util/docker/final/scripts/temp_cleanup similarity index 64% rename from util/docker/web/scripts/temp_cleanup rename to util/docker/final/scripts/temp_cleanup index b4e5038f7..8f96d13f6 100644 --- a/util/docker/web/scripts/temp_cleanup +++ b/util/docker/final/scripts/temp_cleanup @@ -1,6 +1,8 @@ #!/usr/bin/env bash /usr/sbin/tmpreaper 12h --protect '.tmpreaper' --verbose \ + /tmp \ /tmp/azuracast_nginx_client \ /tmp/azuracast_fastcgi_temp \ - > /proc/1/fd/1 2> /proc/1/fd/2 \ No newline at end of file + /var/azuracast/stations/*/temp \ + > /proc/1/fd/1 2> /proc/1/fd/2 diff --git a/util/docker/web/scripts/uptime_wait b/util/docker/final/scripts/uptime_wait similarity index 100% rename from util/docker/web/scripts/uptime_wait rename to util/docker/final/scripts/uptime_wait diff --git a/util/docker/web/runit/cron/run b/util/docker/final/service/cron/run similarity index 100% rename from util/docker/web/runit/cron/run rename to util/docker/final/service/cron/run diff --git a/util/docker/web/runit/nginx/run b/util/docker/final/service/nginx/run similarity index 100% rename from util/docker/web/runit/nginx/run rename to util/docker/final/service/nginx/run diff --git a/util/docker/web/runit/php-fpm/run b/util/docker/final/service/php-fpm/run similarity index 100% rename from util/docker/web/runit/php-fpm/run rename to util/docker/final/service/php-fpm/run diff --git a/util/docker/web/runit/php-worker/run b/util/docker/final/service/php-worker/run similarity index 100% rename from util/docker/web/runit/php-worker/run rename to util/docker/final/service/php-worker/run diff --git a/util/docker/web/runit/sftpgo/run b/util/docker/final/service/sftpgo/run similarity index 100% rename from util/docker/web/runit/sftpgo/run rename to util/docker/final/service/sftpgo/run diff --git a/util/docker/final/service_standalone/supervisord/run b/util/docker/final/service_standalone/supervisord/run new file mode 100644 index 000000000..9393d158e --- /dev/null +++ b/util/docker/final/service_standalone/supervisord/run @@ -0,0 +1,3 @@ +#!/bin/sh + +/usr/bin/supervisord -c /etc/supervisor/supervisord.conf \ No newline at end of file diff --git a/util/docker/final/setup.sh b/util/docker/final/setup.sh new file mode 100644 index 000000000..78734cc65 --- /dev/null +++ b/util/docker/final/setup.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -e +source /bd_build_final/buildconfig +set -x + +# Install common scripts +cp -rT /bd_build_final/scripts/ /usr/local/bin +chmod -R a+x /usr/local/bin + +# Install runit scripts +cp -rT /bd_build_final/startup_scripts/. /etc/my_init.d/ +cp -rT /bd_build_final/service/. /etc/service/ +cp -rT /bd_build_final/service_standalone/. /etc/service_standalone/ + +chmod -R +x /etc/service +chmod -R +x /etc/service_standalone +chmod -R +x /etc/my_init.d + +# Run service setup for all setup scripts +for f in /bd_build_final/setup/*.sh; do + bash "$f" -H +done diff --git a/util/docker/web/setup/audiowaveform.sh b/util/docker/final/setup/audiowaveform.sh similarity index 78% rename from util/docker/web/setup/audiowaveform.sh rename to util/docker/final/setup/audiowaveform.sh index 5bfc45894..d7decdf08 100644 --- a/util/docker/web/setup/audiowaveform.sh +++ b/util/docker/final/setup/audiowaveform.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -source /bd_build/buildconfig +source /bd_build_final/buildconfig set -x add-apt-repository -y ppa:chris-needham/ppa diff --git a/util/docker/web/setup/cron.sh b/util/docker/final/setup/cron.sh similarity index 82% rename from util/docker/web/setup/cron.sh rename to util/docker/final/setup/cron.sh index 0e2bc2dae..369374bb6 100644 --- a/util/docker/web/setup/cron.sh +++ b/util/docker/final/setup/cron.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -source /bd_build/buildconfig +source /bd_build_final/buildconfig set -x $minimal_apt_get_install cron @@ -20,5 +20,5 @@ rm -f /etc/cron.daily/dpkg rm -f /etc/cron.daily/password rm -f /etc/cron.weekly/fstrim -cp -r /bd_build/cron/. /etc/cron.d/ -chmod -R 600 /etc/cron.d/* \ No newline at end of file +cp -r /bd_build_final/cron/. /etc/cron.d/ +chmod -R 600 /etc/cron.d/* diff --git a/util/docker/web/setup/dbip.sh b/util/docker/final/setup/dbip.sh similarity index 89% rename from util/docker/web/setup/dbip.sh rename to util/docker/final/setup/dbip.sh index ca1d77829..2da02fb5a 100644 --- a/util/docker/web/setup/dbip.sh +++ b/util/docker/final/setup/dbip.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -source /bd_build/buildconfig +source /bd_build_final/buildconfig set -x cd /tmp diff --git a/util/docker/web/setup/dockerize.sh b/util/docker/final/setup/dockerize.sh similarity index 89% rename from util/docker/web/setup/dockerize.sh rename to util/docker/final/setup/dockerize.sh index 28f56097c..69e5714a3 100644 --- a/util/docker/web/setup/dockerize.sh +++ b/util/docker/final/setup/dockerize.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -source /bd_build/buildconfig +source /bd_build_final/buildconfig set -x DOCKERIZE_VERSION=v0.6.1 diff --git a/util/docker/web/setup/flac.sh b/util/docker/final/setup/flac.sh similarity index 61% rename from util/docker/web/setup/flac.sh rename to util/docker/final/setup/flac.sh index e20d8e5d8..e3e326c90 100644 --- a/util/docker/web/setup/flac.sh +++ b/util/docker/final/setup/flac.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -source /bd_build/buildconfig +source /bd_build_final/buildconfig set -x $minimal_apt_get_install flac diff --git a/util/docker/web/setup/nginx.sh b/util/docker/final/setup/nginx.sh similarity index 69% rename from util/docker/web/setup/nginx.sh rename to util/docker/final/setup/nginx.sh index d0a27713d..6c03cd3be 100644 --- a/util/docker/web/setup/nginx.sh +++ b/util/docker/final/setup/nginx.sh @@ -1,13 +1,13 @@ #!/bin/bash set -e -source /bd_build/buildconfig +source /bd_build_final/buildconfig set -x $minimal_apt_get_install nginx nginx-common nginx-extras openssl # Install nginx and configuration -cp /bd_build/nginx/nginx.conf /etc/nginx/nginx.conf -cp /bd_build/nginx/azuracast.conf.tmpl /etc/nginx/azuracast.conf.tmpl +cp /bd_build_final/nginx/nginx.conf /etc/nginx/nginx.conf +cp /bd_build_final/nginx/azuracast.conf.tmpl /etc/nginx/azuracast.conf.tmpl mkdir -p /etc/nginx/azuracast.conf.d/ diff --git a/util/docker/web/setup/php.sh b/util/docker/final/setup/php.sh similarity index 84% rename from util/docker/web/setup/php.sh rename to util/docker/final/setup/php.sh index cc8ee568b..ffa5cc796 100644 --- a/util/docker/web/setup/php.sh +++ b/util/docker/final/setup/php.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -source /bd_build/buildconfig +source /bd_build_final/buildconfig set -x PHP_VERSION=8.0 @@ -20,8 +20,8 @@ touch /run/php/php${PHP_VERSION}-fpm.pid echo "PHP_VERSION=${PHP_VERSION}" >>/etc/php/.version -cp /bd_build/php/php.ini.tmpl /etc/php/${PHP_VERSION}/fpm/05-azuracast.ini.tmpl -cp /bd_build/php/www.conf.tmpl /etc/php/${PHP_VERSION}/fpm/www.conf.tmpl +cp /bd_build_final/php/php.ini.tmpl /etc/php/${PHP_VERSION}/fpm/05-azuracast.ini.tmpl +cp /bd_build_final/php/www.conf.tmpl /etc/php/${PHP_VERSION}/fpm/www.conf.tmpl # Install Composer curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer @@ -29,7 +29,7 @@ curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --fil # Install PHP SPX profiler $minimal_apt_get_install php${PHP_VERSION}-dev zlib1g-dev build-essential -cd /bd_build +cd /bd_build_final git clone https://github.com/NoiseByNorthwest/php-spx.git cd php-spx phpize diff --git a/util/docker/web/setup/sftpgo.sh b/util/docker/final/setup/sftpgo.sh similarity index 72% rename from util/docker/web/setup/sftpgo.sh rename to util/docker/final/setup/sftpgo.sh index 497daee6f..ae2df7974 100644 --- a/util/docker/web/setup/sftpgo.sh +++ b/util/docker/final/setup/sftpgo.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -source /bd_build/buildconfig +source /bd_build_final/buildconfig set -x add-apt-repository -y ppa:sftpgo/sftpgo @@ -10,7 +10,7 @@ $minimal_apt_get_install sftpgo mkdir -p /var/azuracast/sftpgo/persist /var/azuracast/sftpgo/backups -cp /bd_build/sftpgo/sftpgo.json /var/azuracast/sftpgo/sftpgo.json +cp /bd_build_final/sftpgo/sftpgo.json /var/azuracast/sftpgo/sftpgo.json touch /var/azuracast/sftpgo/sftpgo.db chown -R azuracast:azuracast /var/azuracast/sftpgo diff --git a/util/docker/final/setup/supervisor.sh b/util/docker/final/setup/supervisor.sh new file mode 100644 index 000000000..e40db246c --- /dev/null +++ b/util/docker/final/setup/supervisor.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e +source /bd_build_final/buildconfig +set -x + +# $minimal_apt_get_install python3-minimal python3-pip +# pip3 install setuptools supervisor + +$minimal_apt_get_install supervisor + +# mkdir -p /etc/supervisor +cp /bd_build_final/supervisor/supervisord.conf /etc/supervisor/supervisord.conf diff --git a/util/docker/final/setup/tmpreaper.sh b/util/docker/final/setup/tmpreaper.sh new file mode 100644 index 000000000..881e9734c --- /dev/null +++ b/util/docker/final/setup/tmpreaper.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -e +source /bd_build_final/buildconfig +set -x + +$minimal_apt_get_install tmpreaper diff --git a/util/docker/web/setup/vorbis.sh b/util/docker/final/setup/vorbis.sh similarity index 65% rename from util/docker/web/setup/vorbis.sh rename to util/docker/final/setup/vorbis.sh index 21f8c75b2..5a9e31b79 100644 --- a/util/docker/web/setup/vorbis.sh +++ b/util/docker/final/setup/vorbis.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -source /bd_build/buildconfig +source /bd_build_final/buildconfig set -x $minimal_apt_get_install vorbis-tools diff --git a/util/docker/web/sftpgo/sftpgo.json b/util/docker/final/sftpgo/sftpgo.json similarity index 100% rename from util/docker/web/sftpgo/sftpgo.json rename to util/docker/final/sftpgo/sftpgo.json diff --git a/util/docker/web/startup_scripts/nginx.sh b/util/docker/final/startup_scripts/00_nginx.sh similarity index 100% rename from util/docker/web/startup_scripts/nginx.sh rename to util/docker/final/startup_scripts/00_nginx.sh diff --git a/util/docker/web/startup_scripts/php.sh b/util/docker/final/startup_scripts/01_php.sh similarity index 100% rename from util/docker/web/startup_scripts/php.sh rename to util/docker/final/startup_scripts/01_php.sh diff --git a/util/docker/final/startup_scripts/02_standalone_mode.sh b/util/docker/final/startup_scripts/02_standalone_mode.sh new file mode 100644 index 000000000..cfc93581d --- /dev/null +++ b/util/docker/final/startup_scripts/02_standalone_mode.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +bool() { + case "$1" in + Y* | y* | true | TRUE | 1) return 0 ;; + esac + return 1 +} + +STANDALONE_MODE=${AZURACAST_DOCKER_STANDALONE_MODE:-0} + +if bool "$STANDALONE_MODE"; then + echo "Running in standalone mode; enabling optional services..." + + cp /etc/service_standalone/. /etc/service/ +else + echo "Not running in standalone mode; skipping optional services." +fi diff --git a/util/docker/web/startup_scripts/sftpgo_private_key.sh b/util/docker/final/startup_scripts/05_sftpgo_private_key.sh similarity index 100% rename from util/docker/web/startup_scripts/sftpgo_private_key.sh rename to util/docker/final/startup_scripts/05_sftpgo_private_key.sh diff --git a/util/docker/final/startup_scripts/10_clear_temp.sh b/util/docker/final/startup_scripts/10_clear_temp.sh new file mode 100644 index 000000000..a9ef4d628 --- /dev/null +++ b/util/docker/final/startup_scripts/10_clear_temp.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +shopt -s dotglob +rm -rf /var/azuracast/www_tmp/* diff --git a/util/docker/final/startup_scripts/15_initialize.sh b/util/docker/final/startup_scripts/15_initialize.sh new file mode 100644 index 000000000..db1caf3f8 --- /dev/null +++ b/util/docker/final/startup_scripts/15_initialize.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +set -ex + +azuracast_cli azuracast:setup:initialize diff --git a/util/docker/final/supervisor/supervisord.conf b/util/docker/final/supervisor/supervisord.conf new file mode 100644 index 000000000..c3361fdf1 --- /dev/null +++ b/util/docker/final/supervisor/supervisord.conf @@ -0,0 +1,25 @@ +[unix_http_server] +file=/tmp/supervisor.sock ; (the path to the socket file) + +[inet_http_server] ; inet (TCP) server disabled by default +port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface) + +[supervisord] +user=root +logfile=/var/azuracast/www_tmp/supervisord.log ; (main log file;default $CWD/supervisord.log) +logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) +logfile_backups=10 ; (num of main logfile rotation backups;default 10) +loglevel=info ; (log level;default info; others: debug,warn,trace) +pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) +nodaemon=true ; (start in foreground if true;default false) +minfds=1024 ; (min. avail startup file descriptors;default 1024) +minprocs=200 ; (min. avail process descriptors;default 200) + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket + +[include] +files = /var/azuracast/stations/*/config/supervisord.conf conf.d/* diff --git a/util/docker/web/setup.sh b/util/docker/web/setup.sh deleted file mode 100644 index 6084adb94..000000000 --- a/util/docker/web/setup.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -set -e -source /bd_build/buildconfig -set -x - -# Install common scripts -cp -rT /bd_build/scripts/ /usr/local/bin -chmod -R a+x /usr/local/bin - -# Install runit -$minimal_apt_get_install runit - -# Install runit scripts -cp -rT /bd_build/startup_scripts/. /etc/my_init.d/ -cp -rT /bd_build/runit/. /etc/service/ - -chmod -R +x /etc/service -chmod -R +x /etc/my_init.d - -# Install scripts commonly used during setup. -$minimal_apt_get_install curl wget tar zip unzip git rsync tzdata gpg-agent openssh-client - -# Run service setup for all setup scripts -for f in /bd_build/setup/*.sh; do - bash "$f" -H -done \ No newline at end of file diff --git a/util/docker/web/setup/tmpreaper.sh b/util/docker/web/setup/tmpreaper.sh deleted file mode 100644 index 28992225f..000000000 --- a/util/docker/web/setup/tmpreaper.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -set -e -source /bd_build/buildconfig -set -x - -$minimal_apt_get_install tmpreaper \ No newline at end of file diff --git a/util/docker/web/startup_scripts/php_workers.sh b/util/docker/web/startup_scripts/php_workers.sh deleted file mode 100644 index 1957b8f5c..000000000 --- a/util/docker/web/startup_scripts/php_workers.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# Duplicate php-worker runit script based on environment variable - -echo "Additional workers currently disabled." -exit 0 -# Temporarily disabled. Explanation: -# The current worker setup uses MariaDB as the underlying message queue implementation. Multiple workers on the same -# queues causes multiple process to have write locks on the same table of the same database at the same time, which -# can tend to create a condition where the processes "pile up" on each other, causing semaphore lock overflow issues -# that can bring down an installation rather easily. -# -# Disabling this script forces a single worker to run to process message queues. - -echo "Adding $ADDITIONAL_MEDIA_SYNC_WORKER_COUNT additional workers" - -for ((WORKER_NUMBER = 1; WORKER_NUMBER <= ADDITIONAL_MEDIA_SYNC_WORKER_COUNT; WORKER_NUMBER++)); do - echo "Adding worker $WORKER_NUMBER..." - cp -r /etc/service/php-worker "/etc/service/php-worker-${WORKER_NUMBER}" - - sed -i "s/app_worker_0/app_worker_${WORKER_NUMBER}/" "/etc/service/php-worker-${WORKER_NUMBER}/run" -done - -echo "Done"