fix(docker): crash loop fallback и observer-web на IFT
CI / test (push) Failing after 11m40s

fallback: default_type вне if-блока nginx. observer-web: Hex/deps.compile в образе, без dev-watchers в контейнере.
This commit is contained in:
2026-07-12 11:12:16 +03:00
parent 09ecfdff1e
commit a8e6dcb8f5
3 changed files with 25 additions and 46 deletions
+5 -2
View File
@@ -9,7 +9,7 @@ WORKDIR /app
RUN git clone --depth 1 https://github.com/thiagoesteves/observer_web.git . 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 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 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; \ echo "apk retry $i/5..."; sleep 15; \
done done
RUN mix local.hex --force && mix local.rebar --force
WORKDIR /app WORKDIR /app
COPY --from=builder /app /app COPY --from=builder /app /app
COPY docker/observer_web/dev.exs ./dev.exs COPY docker/observer_web/dev.exs ./dev.exs
EXPOSE 4000 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
+6 -7
View File
@@ -2,16 +2,15 @@ server {
listen 80 default_server; listen 80 default_server;
root /usr/share/nginx/html; root /usr/share/nginx/html;
location / { location ~ ^/v1/ {
set $json 0; default_type application/json;
if ($uri ~* "^/v1/") { set $json 1; } return 503 '{"error":"Service Unavailable","message":"EventHub is temporarily unavailable. Please try again later."}';
if ($http_accept ~* "application/json") { set $json 1; } }
if ($json = 1) { location / {
default_type application/json; if ($http_accept ~* "application/json") {
return 503 '{"error":"Service Unavailable","message":"EventHub is temporarily unavailable. Please try again later."}'; return 503 '{"error":"Service Unavailable","message":"EventHub is temporarily unavailable. Please try again later."}';
} }
return 503; return 503;
} }
+12 -35
View File
@@ -1,6 +1,4 @@
# Development server for Observer Web # Observer Web in Docker: assets pre-built in image, no dev watchers.
# Phoenix
defmodule WebDev.Router do defmodule WebDev.Router do
use Phoenix.Router, helpers: false use Phoenix.Router, helpers: false
@@ -22,10 +20,6 @@ defmodule WebDev.Endpoint do
use Phoenix.Endpoint, otp_app: :observer_web use Phoenix.Endpoint, otp_app: :observer_web
socket("/live", Phoenix.LiveView.Socket) socket("/live", Phoenix.LiveView.Socket)
socket("/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket)
plug(Phoenix.LiveReloader)
plug(Phoenix.CodeReloader)
plug(Plug.Session, plug(Plug.Session,
store: :cookie, store: :cookie,
@@ -44,38 +38,25 @@ defmodule WebDev.ErrorHTML do
end end
end end
# Configuration
port = "PORT" |> System.get_env("4000") |> String.to_integer() port = "PORT" |> System.get_env("4000") |> String.to_integer()
Application.put_env(:observer_web, WebDev.Endpoint, Application.put_env(:observer_web, WebDev.Endpoint,
adapter: Bandit.PhoenixAdapter, adapter: Bandit.PhoenixAdapter,
check_origin: false, check_origin: false,
debug_errors: true, debug_errors: false,
http: [port: port], http: [port: port],
live_view: [signing_salt: "eX7TFPY6Y/+XQ1o2pOUW3DjgAoXGTAdX"], live_view: [signing_salt: "eX7TFPY6Y/+XQ1o2pOUW3DjgAoXGTAdX"],
pubsub_server: ObserverWeb.PubSub, pubsub_server: ObserverWeb.PubSub,
render_errors: [formats: [html: WebDev.ErrorHTML], layout: false], render_errors: [formats: [html: WebDev.ErrorHTML], layout: false],
secret_key_base: "jAu3udxm+8tIRDXLLKo+EupAlEvdLsnNG82O8e9nqylpBM9gP8AjUnZ4PWNttztU", secret_key_base: "jAu3udxm+8tIRDXLLKo+EupAlEvdLsnNG82O8e9nqylpBM9gP8AjUnZ4PWNttztU",
url: [host: "localhost"], url: [host: "localhost"],
watchers: [ 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)$"
]
]
) )
Application.put_env(:phoenix, :serve_endpoints, true) Application.put_env(:phoenix, :serve_endpoints, true)
Application.put_env(:phoenix, :persistent, true) Application.put_env(:phoenix, :persistent, true)
Task.async(fn -> 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() mode = "OBSERVER_WEB_TELEMETRY_MODE" |> System.get_env("local") |> String.to_atom()
retention_period = retention_period =
@@ -96,20 +77,16 @@ Task.async(fn ->
Process.sleep(:infinity) Process.sleep(:infinity)
end) end)
# ============================================================
# Автоподключение к узлам EventHub с задержкой
# ============================================================
Task.start(fn -> Task.start(fn ->
:timer.sleep(7000) # даём время на полный старт Phoenix :timer.sleep(7000)
nodes = [ slots = "OBSERVER_EVENTHUB_SLOTS" |> System.get_env("2") |> String.to_integer()
:"eventhub-node1@eventhub-node1",
:"eventhub-node2@eventhub-node2", for slot <- 1..slots do
:"eventhub-node3@eventhub-node3" node = :"eventhub-node#{slot}@eventhub-node#{slot}"
]
Enum.each(nodes, fn node ->
case Node.connect(node) do case Node.connect(node) do
true -> IO.puts("Connected to #{node}") true -> IO.puts("Connected to #{node}")
false -> IO.puts("Failed to connect to #{node} (will retry manually)") false -> IO.puts("Failed to connect to #{node}")
end end
end) end
end) end)