From a8e6dcb8f50ecfc4701b79438d1b815645533423 Mon Sep 17 00:00:00 2001 From: Aleksey Sabilin Date: Sun, 12 Jul 2026 11:12:16 +0300 Subject: [PATCH] =?UTF-8?q?fix(docker):=20crash=20loop=20fallback=20=D0=B8?= =?UTF-8?q?=20observer-web=20=D0=BD=D0=B0=20IFT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fallback: default_type вне if-блока nginx. observer-web: Hex/deps.compile в образе, без dev-watchers в контейнере. --- docker/ObserverWeb.Dockerfile | 7 +++-- docker/fallback/default.conf | 15 +++++------ docker/observer_web/dev.exs | 49 ++++++++++------------------------- 3 files changed, 25 insertions(+), 46 deletions(-) diff --git a/docker/ObserverWeb.Dockerfile b/docker/ObserverWeb.Dockerfile index 53fe086..2b249b1 100644 --- a/docker/ObserverWeb.Dockerfile +++ b/docker/ObserverWeb.Dockerfile @@ -9,7 +9,7 @@ WORKDIR /app RUN git clone --depth 1 https://github.com/thiagoesteves/observer_web.git . -RUN mix local.hex --force && mix local.rebar --force && mix deps.get +RUN mix local.hex --force && mix local.rebar --force && mix deps.get && mix deps.compile COPY docker/observer_web/build-assets.config.exs config/build-assets.config.exs RUN printf '\nimport_config "build-assets.config.exs"\n' >> config/config.exs @@ -30,10 +30,13 @@ RUN for i in 1 2 3 4 5; do \ echo "apk retry $i/5..."; sleep 15; \ done +RUN mix local.hex --force && mix local.rebar --force + WORKDIR /app COPY --from=builder /app /app COPY docker/observer_web/dev.exs ./dev.exs EXPOSE 4000 -CMD elixir --sname observer_web@observer_web --cookie eventhub_cookie -S mix run --no-halt dev.exs +ENV RELEASE_COOKIE=eventhub_cookie +CMD elixir --sname observer_web@observer_web --cookie "${RELEASE_COOKIE}" -S mix run --no-halt dev.exs diff --git a/docker/fallback/default.conf b/docker/fallback/default.conf index 02897ae..e8690bb 100644 --- a/docker/fallback/default.conf +++ b/docker/fallback/default.conf @@ -2,16 +2,15 @@ server { listen 80 default_server; root /usr/share/nginx/html; - location / { - set $json 0; - if ($uri ~* "^/v1/") { set $json 1; } - if ($http_accept ~* "application/json") { set $json 1; } + location ~ ^/v1/ { + default_type application/json; + return 503 '{"error":"Service Unavailable","message":"EventHub is temporarily unavailable. Please try again later."}'; + } - if ($json = 1) { - default_type application/json; + location / { + if ($http_accept ~* "application/json") { return 503 '{"error":"Service Unavailable","message":"EventHub is temporarily unavailable. Please try again later."}'; } - return 503; } @@ -19,4 +18,4 @@ server { location = /503.html { internal; } -} \ No newline at end of file +} diff --git a/docker/observer_web/dev.exs b/docker/observer_web/dev.exs index b28aef0..583ca09 100644 --- a/docker/observer_web/dev.exs +++ b/docker/observer_web/dev.exs @@ -1,6 +1,4 @@ -# Development server for Observer Web - -# Phoenix +# Observer Web in Docker: assets pre-built in image, no dev watchers. defmodule WebDev.Router do use Phoenix.Router, helpers: false @@ -22,10 +20,6 @@ defmodule WebDev.Endpoint do use Phoenix.Endpoint, otp_app: :observer_web socket("/live", Phoenix.LiveView.Socket) - socket("/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket) - - plug(Phoenix.LiveReloader) - plug(Phoenix.CodeReloader) plug(Plug.Session, store: :cookie, @@ -44,38 +38,25 @@ defmodule WebDev.ErrorHTML do end end -# Configuration - port = "PORT" |> System.get_env("4000") |> String.to_integer() Application.put_env(:observer_web, WebDev.Endpoint, adapter: Bandit.PhoenixAdapter, check_origin: false, - debug_errors: true, + debug_errors: false, http: [port: port], live_view: [signing_salt: "eX7TFPY6Y/+XQ1o2pOUW3DjgAoXGTAdX"], pubsub_server: ObserverWeb.PubSub, render_errors: [formats: [html: WebDev.ErrorHTML], layout: false], secret_key_base: "jAu3udxm+8tIRDXLLKo+EupAlEvdLsnNG82O8e9nqylpBM9gP8AjUnZ4PWNttztU", url: [host: "localhost"], - watchers: [ - esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]}, - tailwind: {Tailwind, :install_and_run, [:default, ~w(--watch)]} - ], - live_reload: [ - patterns: [ - ~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$", - ~r"lib/web/components/.*(ex)$", - ~r"lib/web/live/.*(ex)$" - ] - ] + watchers: [] ) Application.put_env(:phoenix, :serve_endpoints, true) Application.put_env(:phoenix, :persistent, true) Task.async(fn -> - # Stop the default Telemetry server to start a new one with new defaults mode = "OBSERVER_WEB_TELEMETRY_MODE" |> System.get_env("local") |> String.to_atom() retention_period = @@ -96,20 +77,16 @@ Task.async(fn -> Process.sleep(:infinity) end) -# ============================================================ -# Автоподключение к узлам EventHub с задержкой -# ============================================================ Task.start(fn -> - :timer.sleep(7000) # даём время на полный старт Phoenix - nodes = [ - :"eventhub-node1@eventhub-node1", - :"eventhub-node2@eventhub-node2", - :"eventhub-node3@eventhub-node3" - ] - Enum.each(nodes, fn node -> + :timer.sleep(7000) + slots = "OBSERVER_EVENTHUB_SLOTS" |> System.get_env("2") |> String.to_integer() + + for slot <- 1..slots do + node = :"eventhub-node#{slot}@eventhub-node#{slot}" + case Node.connect(node) do - true -> IO.puts("Connected to #{node}") - false -> IO.puts("Failed to connect to #{node} (will retry manually)") + true -> IO.puts("Connected to #{node}") + false -> IO.puts("Failed to connect to #{node}") end - end) -end) \ No newline at end of file + end +end)