diff --git a/service-command.php b/service-command.php index 2d4c198..c1de75b 100644 --- a/service-command.php +++ b/service-command.php @@ -1,5 +1,33 @@ filter_service( $args ); + $service = $this->filter_service( $args ); + $service_name = "global-$service"; + $container = "ee-$service_name"; + + if ( EE_PROXY_TYPE === $container ) { + \EE\Service\Utils\nginx_proxy_check(); + } else { + \EE\Service\Utils\init_global_container( $service_name ); + } - EE::exec( "docker-compose start $service", true, true ); } /** @@ -58,6 +69,8 @@ private function filter_service( $args ) { EE::error( "Unable to find global EasyEngine service $args[0]" ); } + $services = array_values( $services ); + return $services[0]; } @@ -115,8 +128,12 @@ public function restart( $args, $assoc_args ) { */ public function reload( $args, $assoc_args ) { $service = $this->filter_service( $args ); - $command = $this->service_reload_command( $service ); - EE::exec( "docker-compose exec $service $command", true, true ); + $command = $this->service_reload_command( $service ); + if ( $command ) { + EE::exec( "docker-compose exec $service $command", true, true ); + } else { + EE::warning( "$service can not be reloaded." ); + } } /** @@ -132,6 +149,6 @@ private function service_reload_command( string $service ) { 'nginx-proxy' => "sh -c 'nginx -t && service nginx reload'", ]; - return $command_map[ $service ]; + return array_key_exists( $service, $command_map ) ? $command_map[ $service ] : false; } } diff --git a/src/helper/service-utils.php b/src/helper/service-utils.php new file mode 100644 index 0000000..6f978e0 --- /dev/null +++ b/src/helper/service-utils.php @@ -0,0 +1,143 @@ +exists( EE_CONF_ROOT . '/docker-compose.yml' ) ) { + generate_global_docker_compose_yml( $fs ); + } + + $EE_CONF_ROOT = EE_CONF_ROOT; + if ( ! EE::docker()::docker_network_exists( GLOBAL_BACKEND_NETWORK ) && + ! EE::docker()::create_network( GLOBAL_BACKEND_NETWORK ) ) { + EE::error( 'Unable to create network ' . GLOBAL_BACKEND_NETWORK ); + } + if ( ! EE::docker()::docker_network_exists( GLOBAL_FRONTEND_NETWORK ) && + ! EE::docker()::create_network( GLOBAL_FRONTEND_NETWORK ) ) { + EE::error( 'Unable to create network ' . GLOBAL_FRONTEND_NETWORK ); + } + if ( EE::docker()::docker_compose_up( EE_CONF_ROOT, [ 'global-nginx-proxy' ] ) ) { + $fs->dumpFile( "$EE_CONF_ROOT/nginx/conf.d/custom.conf", file_get_contents( EE_ROOT . '/templates/custom.conf.mustache' ) ); + EE::success( "$proxy_type container is up." ); + } else { + EE::error( "There was some error in starting $proxy_type container. Please check logs." ); + } + } + } +} + +/** + * Function to start global conainer if it is not running. + * + * @param string $container Global container to be brought up. + */ +function init_global_container( $service, $container = '' ) { + + if ( empty( $container ) ) { + $container = 'ee-' . $service; + } + if ( ! EE::docker()::docker_network_exists( GLOBAL_BACKEND_NETWORK ) && + ! EE::docker()::create_network( GLOBAL_BACKEND_NETWORK ) ) { + EE::error( 'Unable to create network ' . GLOBAL_BACKEND_NETWORK ); + } + + $fs = new Filesystem(); + + if ( ! $fs->exists( EE_CONF_ROOT . '/docker-compose.yml' ) ) { + generate_global_docker_compose_yml( $fs ); + } + + if ( 'running' !== EE::docker()::container_status( $container ) ) { + chdir( EE_CONF_ROOT ); + EE::docker()::boot_container( $container, 'docker-compose up -d ' . $container ); + } +} + +/** + * Generates global docker-compose.yml at EE_CONF_ROOT + * + * @param Filesystem $fs Filesystem object to write file + */ +function generate_global_docker_compose_yml( Filesystem $fs ) { + $img_versions = EE\Utils\get_image_versions(); + + $data = [ + 'services' => [ + [ + 'name' => 'global-nginx-proxy', + 'container_name' => EE_PROXY_TYPE, + 'image' => 'easyengine/nginx-proxy:' . $img_versions['easyengine/nginx-proxy'], + 'restart' => 'always', + 'ports' => [ + '80:80', + '443:443', + ], + 'environment' => [ + 'LOCAL_USER_ID=' . posix_geteuid(), + 'LOCAL_GROUP_ID=' . posix_getegid(), + ], + 'volumes' => [ + EE_CONF_ROOT . '/nginx/certs:/etc/nginx/certs', + EE_CONF_ROOT . '/nginx/dhparam:/etc/nginx/dhparam', + EE_CONF_ROOT . '/nginx/conf.d:/etc/nginx/conf.d', + EE_CONF_ROOT . '/nginx/htpasswd:/etc/nginx/htpasswd', + EE_CONF_ROOT . '/nginx/vhost.d:/etc/nginx/vhost.d', + EE_CONF_ROOT . '/nginx/html:/usr/share/nginx/html', + '/var/run/docker.sock:/tmp/docker.sock:ro', + ], + 'networks' => [ + 'global-frontend-network', + ], + ], + [ + 'name' => GLOBAL_DB, + 'container_name' => GLOBAL_DB_CONTAINER, + 'image' => 'easyengine/mariadb:' . $img_versions['easyengine/mariadb'], + 'restart' => 'always', + 'environment' => [ + 'MYSQL_ROOT_PASSWORD=' . \EE\Utils\random_password(), + ], + 'volumes' => [ './app/db:/var/lib/mysql' ], + 'networks' => [ + 'global-backend-network', + ], + ], + [ + 'name' => GLOBAL_REDIS, + 'container_name' => GLOBAL_REDIS_CONTAINER, + 'image' => 'easyengine/redis:' . $img_versions['easyengine/redis'], + 'restart' => 'always', + 'volumes' => [ EE_CONF_ROOT . '/services/redis:/data' ], + 'networks' => [ + 'global-backend-network', + ], + ], + ], + ]; + + $contents = EE\Utils\mustache_render( SERVICE_TEMPLATE_ROOT . '/global_docker_compose.yml.mustache', $data ); + $fs->dumpFile( EE_CONF_ROOT . '/docker-compose.yml', $contents ); +} diff --git a/templates/global_docker_compose.yml.mustache b/templates/global_docker_compose.yml.mustache new file mode 100644 index 0000000..57e485d --- /dev/null +++ b/templates/global_docker_compose.yml.mustache @@ -0,0 +1,57 @@ +version: '3.5' + +services: + +{{#services}} + {{name}}: + container_name: {{container_name}} + image: {{image}} + {{#ports.0}} + ports: + {{#ports}} + - "{{.}}" + {{/ports}} + {{/ports.0}} + {{#depends_on}} + depends_on: + - {{.}} + {{/depends_on}} + {{#restart}} + restart: {{.}} + {{/restart}} + {{#command}} + command: {{.}} + {{/command}} + {{#labels.0}} + labels: + {{#labels}} + - "{{.}}" + {{/labels}} + {{/labels.0}} + {{#volumes.0}} + volumes: + {{#volumes}} + - "{{.}}" + {{/volumes}} + {{/volumes.0}} + {{#environment.0}} + environment: + {{#environment}} + - {{.}} + {{/environment}} + {{/environment.0}} + {{#networks.0}} + networks: + {{#networks}} + - {{.}} + {{/networks}} + {{/networks.0}} +{{/services}} + +networks: + global-frontend-network: + external: + name: ee-global-frontend-network + global-backend-network: + external: + name: ee-global-backend-network