From de6b50d702b304c783ab56c889468f5fe822df96 Mon Sep 17 00:00:00 2001 From: Miguel Palhas Date: Thu, 16 Oct 2025 16:26:11 +0100 Subject: [PATCH 1/3] wip --- config/config.exs | 1 + lib/ethui/stacks/supervisor.ex | 3 +++ 2 files changed, 4 insertions(+) diff --git a/config/config.exs b/config/config.exs index ee958f5..c531cb3 100644 --- a/config/config.exs +++ b/config/config.exs @@ -85,6 +85,7 @@ config :exqlite, force_build: true config :ethui, Ethui.Stacks, graph_node_image: "graphprotocol/graph-node:f02dfa2", ipfs_image: "ipfs/kubo:v0.34.1", + explorer_image: "ghcr.io/ethui/explorer:latest" pg_image: "postgres:17.4", anvil_bin: System.get_env("ANVIL_BIN", "anvil"), docker_host: System.get_env("DOCKER_HOST", "172.17.0.1"), diff --git a/lib/ethui/stacks/supervisor.ex b/lib/ethui/stacks/supervisor.ex index 4d716c7..24437d6 100644 --- a/lib/ethui/stacks/supervisor.ex +++ b/lib/ethui/stacks/supervisor.ex @@ -31,6 +31,9 @@ defmodule Ethui.Stacks.Supervisor do # global Postgres service {Ethui.Services.Pg, []}, + # owned instance of ethui-explorer + {Ethui.Services.Explorer, []}, + # services supervisor MultiStackSupervisor, Server From a5c499cc266ec8cd5e0abeca002701cdc52b45e9 Mon Sep 17 00:00:00 2001 From: Miguel Palhas Date: Thu, 16 Oct 2025 16:26:12 +0100 Subject: [PATCH 2/3] wip --- lib/ethui/services/explorer.ex | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 lib/ethui/services/explorer.ex diff --git a/lib/ethui/services/explorer.ex b/lib/ethui/services/explorer.ex new file mode 100644 index 0000000..85a56f9 --- /dev/null +++ b/lib/ethui/services/explorer.ex @@ -0,0 +1,21 @@ +defmodule Ethui.Services.Explorer do + @moduledoc """ + GenServer that manages a global `@ethui/explorer` instace, to be shared by all anvil instances + This wraps a MuontipTrap Daemon + """ + + use Ethui.Services.Docker, + image: &__MODULE__.docker_image/0, + named_args: [ + network: "ethui-stacks", + name: "ethui-stacks-ipfs" + ] + + def docker_image do + config()[:ipfs_image] + end + + defp config do + Application.get_env(:ethui, Ethui.Stacks) + end +end From 2a7ad3d0a172dfa646de83a80eb827026ba4673c Mon Sep 17 00:00:00 2001 From: Miguel Palhas Date: Thu, 16 Oct 2025 18:12:34 +0100 Subject: [PATCH 3/3] wip --- config/config.exs | 2 +- lib/ethui/services/explorer.ex | 4 +-- lib/ethui_web/controllers/proxy_controller.ex | 27 +++++++++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/config/config.exs b/config/config.exs index c531cb3..f6189c2 100644 --- a/config/config.exs +++ b/config/config.exs @@ -85,7 +85,7 @@ config :exqlite, force_build: true config :ethui, Ethui.Stacks, graph_node_image: "graphprotocol/graph-node:f02dfa2", ipfs_image: "ipfs/kubo:v0.34.1", - explorer_image: "ghcr.io/ethui/explorer:latest" + explorer_image: "ghcr.io/ethui/explorer:latest", pg_image: "postgres:17.4", anvil_bin: System.get_env("ANVIL_BIN", "anvil"), docker_host: System.get_env("DOCKER_HOST", "172.17.0.1"), diff --git a/lib/ethui/services/explorer.ex b/lib/ethui/services/explorer.ex index 85a56f9..c924da3 100644 --- a/lib/ethui/services/explorer.ex +++ b/lib/ethui/services/explorer.ex @@ -8,11 +8,11 @@ defmodule Ethui.Services.Explorer do image: &__MODULE__.docker_image/0, named_args: [ network: "ethui-stacks", - name: "ethui-stacks-ipfs" + name: "ethui-stacks-explorer" ] def docker_image do - config()[:ipfs_image] + config()[:explorer_image] end defp config do diff --git a/lib/ethui_web/controllers/proxy_controller.ex b/lib/ethui_web/controllers/proxy_controller.ex index 41da904..a2f217f 100644 --- a/lib/ethui_web/controllers/proxy_controller.ex +++ b/lib/ethui_web/controllers/proxy_controller.ex @@ -15,7 +15,11 @@ defmodule EthuiWeb.ProxyController do def reverse_proxy(conn, _params), do: conn |> send_resp(404, "Not found") - defp proxy_component(conn, params, {slug, nil}), do: anvil(conn, params, slug) + defp proxy_component(%{method: "POST"} = conn, params, {slug, nil}), + do: anvil(conn, params, slug) + + defp proxy_component(%{method: "GET"} = conn, params, {slug, nil}), + do: explorer_redirect(conn, params, slug) defp proxy_component(conn, params, {slug, "graph"}), do: subgraph_generic(conn, params, slug, 8000) @@ -29,6 +33,9 @@ defmodule EthuiWeb.ProxyController do defp proxy_component(conn, params, {_slug, "ipfs"}), do: ipfs(conn, params) + defp proxy_component(conn, params, {_slug, "explorer"}), + do: explorer(conn, params) + defp proxy_component(%Plug.Conn{assigns: assigns} = conn, _params, _proxy) do Logger.error("cannot proxy #{inspect(assigns)}") @@ -49,6 +56,22 @@ defmodule EthuiWeb.ProxyController do end end + defp explorer_redirect(conn, _params, _slug) do + conn |> redirect(external: "http://google.com") + end + + defp explorer(conn, %{"proxied_path" => proxied_path}) do + case Ethui.Services.Explorer.ip() do + {:ok, ip} -> + forward(conn, "http://#{ip}:3000/#{Enum.join(proxied_path, "/")}") + + _ -> + conn + |> put_status(:not_found) + |> json(%{error: "Explorer not running"}) + end + end + defp subgraph_generic(conn, %{"proxied_path" => proxied_path}, slug, target_port) do case Graph.ip_from_slug(slug) do {:ok, ip} -> @@ -70,7 +93,7 @@ defmodule EthuiWeb.ProxyController do _ -> conn |> put_status(:not_found) - |> json(%{error: "Stack not found"}) + |> json(%{error: "IPFS not found"}) end end