<?php use Symfony\Component\Yaml\Yaml; require './vendor/autoload.php'; $config = Yaml::parseFile('config.yaml'); $data = [ 'http' => [ 'routers' => [], 'services' => [], ], ]; foreach ($config['servers'] as $server_name => $server_ip) { $proxy_routers = @file_get_contents("http://{$server_ip}:8080/api/http/routers"); if (empty($proxy_routers)) { continue; } $proxy_routers = json_decode($proxy_routers, TRUE); $server_key = 'proxy-'.$server_name; $data['http']['services'][$server_key] = [ 'loadBalancer' => [ 'servers' => [ ['url' => "http://{$server_ip}:80"], ], 'passHostHeader' => TRUE, ], ]; foreach ($proxy_routers as $router) { if ($router['status'] !== 'enabled' || $router['provider'] !== 'docker') { continue; } preg_match_all("/Host\(\`(?'domain'[a-zA-Z\.\-]+)\`\)/m", $router['rule'], $rule_hosts); if (empty($rule_hosts['domain'])) { continue; } $domains = []; foreach ($rule_hosts['domain'] as $domain) { $is_docker_name = !str_contains($domain, '.'); if ($is_docker_name) { continue; } $domains[] = $domain; } if (empty($domains)) { continue; } $main_router = [ 'entryPoints' => ['websecure'], 'rule' => $router['rule'], 'service' => $server_key, 'tls' => [ 'certResolver' => 'defaultResolver', 'domains' => [], ], ]; foreach ($domains as $domain) { $main_router['tls']['domains'][] = [ 'main' => $domain, 'sans' => [], ]; } $router_name = $server_key . '--' . $router['name']; $router_name = str_replace(['@'], '_', $router_name); $data['http']['routers'][$router_name] = $main_router; } } header('application/x-yaml'); echo Yaml::dump($data, 4, 2, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK | Yaml::DUMP_OBJECT_AS_MAP);