diff --git a/.docker/docker-compose.proxy.yml b/.docker/docker-compose.proxy.yml index b2e36a2b..21328efc 100644 --- a/.docker/docker-compose.proxy.yml +++ b/.docker/docker-compose.proxy.yml @@ -1,38 +1,49 @@ services: - nginx-proxy: - image: nginxproxy/nginx-proxy:1.11.6-alpine@sha256:99376e95c8754547213d411222a2c4dca046d974e753ae2a1c9aef09b2c03364 + traefik: + image: traefik:v3.7.13@sha256:f86a2cab1b5c649070c49f883c743dd32d8485a56e3368c5f93b9e91f1e91259 container_name: librecode-dev-proxy labels: coop.librecode.dev-proxy: "true" - working_dir: /dashboard - command: ["forego", "start", "-r"] + traefik.enable: "true" + traefik.http.routers.librecode-api.rule: Path(`/api/http/routers`) + traefik.http.routers.librecode-api.priority: "200" + traefik.http.routers.librecode-api.entrypoints: api + traefik.http.routers.librecode-api.service: api@internal + command: + - --api=true + - --providers.docker=true + - --providers.docker.exposedbydefault=false + - --providers.docker.network=librecode-dev-proxy + - --entrypoints.web.address=:80 + - --entrypoints.web.http.redirections.entrypoint.to=websecure + - --entrypoints.web.http.redirections.entrypoint.scheme=https + - --entrypoints.websecure.address=:443 + - --entrypoints.api.address=:8080 + - --entrypoints.websecure.asdefault=true + - --entrypoints.websecure.http.tls=true ports: - "${PROXY_IP_BIND:-127.0.0.1}:80:80" - "${PROXY_IP_BIND:-127.0.0.1}:443:443" volumes: - - ${DOCKER_SOCKET:-/var/run/docker.sock}:/tmp/docker.sock:ro - - librecode-dev-proxy-vhost:/etc/nginx/vhost.d - - librecode-dev-proxy-assets:/dashboard:ro - - librecode-dev-proxy-log:/etc/nginx/log - - librecode-dev-proxy-certs:/etc/nginx/certs:ro - environment: - - ENABLE_IPV6=true - - VIRTUAL_HOST=localhost,*.localhost - - VIRTUAL_PORT=80 - - SELF_SIGNED_HOST=localhost,*.localhost + - ${DOCKER_SOCKET:-/var/run/docker.sock}:/var/run/docker.sock:ro networks: - proxy - ssl-companion: - image: sebastienheyd/self-signed-proxy-companion:1.1.0@sha256:dd698341f804aaffe2974931a185aa088561d76094e040e374847f3a64004d43 - container_name: librecode-dev-proxy-ssl-companion + dashboard: + image: nginx:1.31.5-alpine@sha256:72ba65eb42c10344912a84ff42408db7d34f2feb642204570ab8fc5ffd29f1d3 + container_name: librecode-dev-dashboard labels: - coop.librecode.dev-proxy-companion: "true" - volumes: - - ${DOCKER_SOCKET:-/var/run/docker.sock}:/var/run/docker.sock:ro - - librecode-dev-proxy-certs:/etc/nginx/certs:rw - environment: - - NGINX_PROXY_CONTAINER=librecode-dev-proxy + coop.librecode.dev-proxy-dashboard: "true" + traefik.enable: "true" + traefik.http.routers.librecode-dashboard.rule: Host(`localhost`) + traefik.http.routers.librecode-dashboard.priority: "100" + traefik.http.routers.librecode-dashboard.service: librecode-dashboard + traefik.http.routers.librecode-dashboard-catchall.rule: HostRegexp(`[a-z0-9-]+\.localhost`) + traefik.http.routers.librecode-dashboard-catchall.priority: "1" + traefik.http.routers.librecode-dashboard-catchall.service: librecode-dashboard + traefik.http.routers.librecode-dashboard-catchall.middlewares: librecode-not-found + traefik.http.middlewares.librecode-not-found.replacepath.path: /__librecode_not_found__ + traefik.http.services.librecode-dashboard.loadbalancer.server.port: "80" networks: - proxy @@ -40,13 +51,3 @@ networks: proxy: name: librecode-dev-proxy external: true - -volumes: - librecode-dev-proxy-vhost: - name: librecode-dev-proxy-vhost - librecode-dev-proxy-assets: - name: librecode-dev-proxy-assets - librecode-dev-proxy-log: - name: librecode-dev-proxy-log - librecode-dev-proxy-certs: - name: librecode-dev-proxy-certs diff --git a/.docker/nginx-proxy/*.localhost b/.docker/nginx-proxy/*.localhost deleted file mode 100644 index b66d860e..00000000 --- a/.docker/nginx-proxy/*.localhost +++ /dev/null @@ -1,6 +0,0 @@ -root /usr/share/nginx/html; -error_page 404 =404 @librecode_dashboard_404; - -location @librecode_dashboard_404 { - try_files /index.html =404; -} diff --git a/.docker/nginx-proxy/*.localhost_location_override b/.docker/nginx-proxy/*.localhost_location_override deleted file mode 100644 index 421c127f..00000000 --- a/.docker/nginx-proxy/*.localhost_location_override +++ /dev/null @@ -1 +0,0 @@ -return 404; diff --git a/.docker/nginx-proxy/Procfile b/.docker/nginx-proxy/Procfile deleted file mode 100644 index c0f1ad20..00000000 --- a/.docker/nginx-proxy/Procfile +++ /dev/null @@ -1,2 +0,0 @@ -dockergen: docker-gen -config /dashboard/docker-gen.cfg -event-filter event=connect -event-filter event=disconnect -nginx: nginx -g "daemon off;" diff --git a/.docker/nginx-proxy/docker-gen.cfg b/.docker/nginx-proxy/docker-gen.cfg deleted file mode 100644 index 15161780..00000000 --- a/.docker/nginx-proxy/docker-gen.cfg +++ /dev/null @@ -1,12 +0,0 @@ -[[config]] -template = "/app/nginx.tmpl" -dest = "/etc/nginx/conf.d/default.conf" -watch = true -wait = "100ms:500ms" -notifycmd = "nginx -s reload" - -[[config]] -template = "/dashboard/dashboard.tmpl" -dest = "/usr/share/nginx/html/index.html" -watch = true -wait = "100ms:500ms" diff --git a/.docker/nginx-proxy/localhost_location_override b/.docker/nginx-proxy/localhost_location_override deleted file mode 100644 index b3f4e9c6..00000000 --- a/.docker/nginx-proxy/localhost_location_override +++ /dev/null @@ -1,2 +0,0 @@ -root /usr/share/nginx/html; -try_files $uri /index.html =404; diff --git a/.docker/scripts/proxy-coordinator.sh b/.docker/scripts/proxy-coordinator.sh index 72f16a01..e6c9e70a 100755 --- a/.docker/scripts/proxy-coordinator.sh +++ b/.docker/scripts/proxy-coordinator.sh @@ -18,8 +18,8 @@ export COORDINATOR_CONTAINER PROJECT_NAME # analyze the complete dependency graph without file-wide suppressions. # shellcheck source=.docker/scripts/proxy/infrastructure.sh . "$proxy_lib_dir/infrastructure.sh" -# shellcheck source=.docker/scripts/proxy/assets.sh -. "$proxy_lib_dir/assets.sh" +# shellcheck source=.docker/scripts/proxy/dashboard.sh +. "$proxy_lib_dir/dashboard.sh" # shellcheck source=.docker/scripts/proxy/diagnostics.sh . "$proxy_lib_dir/diagnostics.sh" # shellcheck source=.docker/scripts/proxy/services.sh @@ -86,9 +86,8 @@ wait_for_shutdown() { run() { validate_environment ensure_proxy_network - install_proxy_assets - proxy_state="$(ensure_proxy_running)" + install_dashboard_assets install_runtime_diagnostics acquire_proxy_lease diff --git a/.docker/scripts/proxy/assets.sh b/.docker/scripts/proxy/assets.sh deleted file mode 100644 index 58991c5a..00000000 --- a/.docker/scripts/proxy/assets.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/sh - -proxy_helper_image() { - if [ -n "${PROXY_HELPER_IMAGE:-}" ]; then - printf '%s\n' "$PROXY_HELPER_IMAGE" - return 0 - fi - - container_image "${COORDINATOR_CONTAINER:-}" -} - -copy_to_named_volume() { - volume="$1" - source="$2" - destination="$3" - helper_image="$(proxy_helper_image)" - - [ -n "$helper_image" ] || return 1 - - Docker run --rm -i \ - -v "$volume:/target" \ - "$helper_image" \ - tee "/target/$destination" \ - < "$source" >/dev/null -} - -install_proxy_assets() { - assets_volume="$(proxy_assets_volume_name)" - vhost_volume="$(proxy_vhost_volume_name)" - helper_image="$(proxy_helper_image)" - - [ -n "$helper_image" ] || return 1 - - Docker volume create "$assets_volume" >/dev/null - Docker volume create "$vhost_volume" >/dev/null - - Docker run --rm \ - -v "$assets_volume:/target" \ - "$helper_image" \ - sh -c 'rm -f /target/Procfile /target/docker-gen.cfg /target/dashboard.tmpl' - - copy_to_named_volume "$assets_volume" "${PROJECT_DIR:-}/.docker/nginx-proxy/Procfile" Procfile - copy_to_named_volume "$assets_volume" "${PROJECT_DIR:-}/.docker/nginx-proxy/docker-gen.cfg" docker-gen.cfg - copy_to_named_volume "$assets_volume" "${PROJECT_DIR:-}/.docker/nginx-proxy/dashboard.tmpl" dashboard.tmpl - - Docker run --rm \ - -v "$vhost_volume:/target" \ - "$helper_image" \ - sh -c 'rm -f /target/librecode-localhost.conf /target/localhost /target/localhost_location_override /target/\*.localhost /target/\*.localhost_location_override' - - copy_to_named_volume "$vhost_volume" "${PROJECT_DIR:-}/.docker/nginx-proxy/localhost_location_override" localhost_location_override - copy_to_named_volume "$vhost_volume" "${PROJECT_DIR:-}/.docker/nginx-proxy/*.localhost" '*.localhost' - copy_to_named_volume "$vhost_volume" "${PROJECT_DIR:-}/.docker/nginx-proxy/*.localhost_location_override" '*.localhost_location_override' -} diff --git a/.docker/scripts/proxy/dashboard.sh b/.docker/scripts/proxy/dashboard.sh new file mode 100644 index 00000000..c81ac158 --- /dev/null +++ b/.docker/scripts/proxy/dashboard.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +install_dashboard_assets() { + dashboard_container="${PROXY_DASHBOARD_CONTAINER:-librecode-dev-dashboard}" + + Docker cp "${PROJECT_DIR:-}/.docker/traefik/dashboard.html" "$dashboard_container:/usr/share/nginx/html/index.html" + Docker cp "${PROJECT_DIR:-}/.docker/traefik/dashboard.conf" "$dashboard_container:/etc/nginx/conf.d/default.conf" + Docker exec "$dashboard_container" nginx -s reload +} diff --git a/.docker/scripts/proxy/diagnostics.sh b/.docker/scripts/proxy/diagnostics.sh index aaf79ea0..1710e3cb 100644 --- a/.docker/scripts/proxy/diagnostics.sh +++ b/.docker/scripts/proxy/diagnostics.sh @@ -79,10 +79,13 @@ runtime_diagnostics_json() { } install_runtime_diagnostics() { - proxy_container="$(compatible_proxy_container)" - [ -n "$proxy_container" ] || return 1 + dashboard_container="${PROXY_DASHBOARD_CONTAINER:-librecode-dev-dashboard}" + + if ! Docker inspect "$dashboard_container" >/dev/null 2>&1; then + return 1 + fi runtime_diagnostics_json | - Docker exec -i "$proxy_container" \ + Docker exec -i "$dashboard_container" \ sh -c 'cat > /usr/share/nginx/html/runtime.json' } diff --git a/.docker/traefik/dashboard.conf b/.docker/traefik/dashboard.conf new file mode 100644 index 00000000..d49028c4 --- /dev/null +++ b/.docker/traefik/dashboard.conf @@ -0,0 +1,29 @@ +server { + listen 80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + location = /__librecode_not_found__ { + return 404; + } + + error_page 404 /index.html; + + location = /index.html { + } + + location = /runtime.json { + try_files $uri =404; + } + + location = /api/http/routers { + proxy_pass http://traefik:8080; + proxy_set_header Host localhost; + } + + location / { + try_files $uri /index.html; + } +} diff --git a/.docker/nginx-proxy/dashboard.tmpl b/.docker/traefik/dashboard.html similarity index 78% rename from .docker/nginx-proxy/dashboard.tmpl rename to .docker/traefik/dashboard.html index 57df7502..38f99f08 100644 --- a/.docker/nginx-proxy/dashboard.tmpl +++ b/.docker/traefik/dashboard.html @@ -1,42 +1,3 @@ -{{- $routes := list -}} -{{- $proxyNetworks := dict -}} -{{- range $container := . -}} - {{- if eq (index $container.Labels "coop.librecode.dev-proxy") "true" -}} - {{- range $network := $container.Networks -}} - {{- $_ := set $proxyNetworks $network.Name true -}} - {{- end -}} - {{- end -}} -{{- end -}} -{{- range $hostname, $containers := groupByMulti . "Env.VIRTUAL_HOST" "," -}} - {{- $hostname = trim $hostname -}} - {{- if or (eq $hostname "") (eq $hostname "localhost") (eq $hostname "*.localhost") -}} - {{- continue -}} - {{- end -}} - - {{- range $container := $containers -}} - {{- $reachableFromProxy := false -}} - {{- range $network := $container.Networks -}} - {{- if index $proxyNetworks $network.Name -}} - {{- $reachableFromProxy = true -}} - {{- end -}} - {{- end -}} - {{- if not $reachableFromProxy -}} - {{- continue -}} - {{- end -}} - - {{- $project := index $container.Labels "com.docker.compose.project" -}} - {{- $service := index $container.Labels "com.docker.compose.service" -}} - {{- if not $project -}} - {{- $project = "Docker" -}} - {{- end -}} - {{- if not $service -}} - {{- $service = "Service" -}} - {{- end -}} - - {{- $routes = append $routes (dict "host" $hostname "project" $project "service" $service) -}} - {{- break -}} - {{- end -}} -{{- end -}}
@@ -82,7 +43,7 @@Loading active development routes…