From 4c6bf353aefe1c895cc4ab70eb863d1885163f4b Mon Sep 17 00:00:00 2001 From: Sebastian <379651+czarly@users.noreply.github.com> Date: Thu, 6 Mar 2025 07:33:29 +0100 Subject: [PATCH] initial commit --- drpc-beacon-proxy-holesky.yml | 18 ++++++++++++++++++ drpc-beacon-proxy/Dockerfile | 9 +++++++++ drpc-beacon-proxy/proxy.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 drpc-beacon-proxy-holesky.yml create mode 100644 drpc-beacon-proxy/Dockerfile create mode 100644 drpc-beacon-proxy/proxy.py diff --git a/drpc-beacon-proxy-holesky.yml b/drpc-beacon-proxy-holesky.yml new file mode 100644 index 00000000..4663f88e --- /dev/null +++ b/drpc-beacon-proxy-holesky.yml @@ -0,0 +1,18 @@ +services: + beacon-proxy: + build: ./drpc-beacon-proxy/ + expose: + - "80:80" + environment: + DKEY: "${DRPC_API_KEY}" + NETWORK: "holesky" + labels: + - "traefik.enable=true" + - "traefik.http.middlewares.drpc-beacon-proxy-holesky-stripprefix.stripprefix.prefixes=/drpc-beacon-proxy-holesky" + - "traefik.http.services.drpc-beacon-proxy-holesky.loadbalancer.server.port=80" + - "traefik.http.routers.drpc-beacon-proxy-holesky.entrypoints=websecure" + - "traefik.http.routers.drpc-beacon-proxy-holesky.tls.certresolver=myresolver" + - "traefik.http.routers.drpc-beacon-proxy-holesky.rule=Host(`$DOMAIN`) && PathPrefix(`/drpc-beacon-proxy-holesky`)" + - "traefik.http.routers.drpc-beacon-proxy-holesky.middlewares=drpc-beacon-proxy-holesky-stripprefix, ipwhitelist" + networks: + - chains diff --git a/drpc-beacon-proxy/Dockerfile b/drpc-beacon-proxy/Dockerfile new file mode 100644 index 00000000..7793149a --- /dev/null +++ b/drpc-beacon-proxy/Dockerfile @@ -0,0 +1,9 @@ +FROM python:3.11-slim + +WORKDIR /app + +RUN pip install flask requests + +COPY proxy.py /app/ + +CMD ["python", "proxy.py"] diff --git a/drpc-beacon-proxy/proxy.py b/drpc-beacon-proxy/proxy.py new file mode 100644 index 00000000..0e0c5bbf --- /dev/null +++ b/drpc-beacon-proxy/proxy.py @@ -0,0 +1,33 @@ +import os +from flask import Flask, request, Response +import requests + +app = Flask(__name__) + +# Read config from environment variables +DKEY = os.getenv("DKEY", "your-default-dkey") +NETWORK = os.getenv("NETWORK", "holesky") +TARGET_URL = f"https://lb.drpc.org/rest/eth-beacon-chain-{NETWORK}" + +@app.route('/', methods=["GET", "POST", "PUT", "DELETE", "PATCH"]) +def proxy(subpath): + url = f"{TARGET_URL}/{subpath}" + + # Forward query params and add the dkey + params = request.args.to_dict() + params["dkey"] = DKEY + + # Forward headers (except Host) and body + headers = {k: v for k, v in request.headers if k.lower() != "host"} + data = request.get_data() if request.method in ["POST", "PUT", "PATCH"] else None + + # Forward the request + resp = requests.request( + method=request.method, url=url, params=params, headers=headers, data=data + ) + + # Return response with original status and headers + return Response(resp.content, resp.status_code, resp.headers.items()) + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=80)