diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..6f8c52b --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +.src diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..190e922 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM python:3.12-alpine + +WORKDIR /app + +COPY requirements.txt /app/ +RUN pip install --no-cache-dir -r requirements.txt + +COPY . /app/ + +EXPOSE 5000 + +CMD ["python", "app.py"] diff --git a/app.py b/app.py new file mode 100644 index 0000000..b2f49f3 --- /dev/null +++ b/app.py @@ -0,0 +1,26 @@ +from flask import Flask, render_template, request, jsonify +import threading + +app = Flask(__name__) + +# Speicher für Proxy-Subdomains (dict mit Liste für jeden Server) +proxy_data = {} + +@app.route('/') +def index(): + return render_template('index.html', proxies=proxy_data) + +@app.route('/update', methods=['POST']) +def update(): + """Empfängt Subdomain-Daten von Caddy-Proxies""" + data = request.json + if not data or "server" not in data or "entries" not in data: + return jsonify({"error": "Invalid data"}), 400 + + server_name = data["server"] + proxy_data[server_name] = data["entries"] + + return jsonify({"message": "Updated successfully"}), 200 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..fef4c42 --- /dev/null +++ b/compose.yml @@ -0,0 +1,5 @@ +services: + caddydb: + image: caddydb:latest + ports: + - 5000:5000 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7e10602 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +flask diff --git a/src/update.py b/src/update.py new file mode 100644 index 0000000..3be94f3 --- /dev/null +++ b/src/update.py @@ -0,0 +1,34 @@ +import requests +import re +import os + +CADDYFILE_PATH = "/opt/docker/caddy/conf/Caddyfile" # Pfad zur Caddyfile +DASHBOARD_URL = "http://10.0.0.25:5000/update" # Anpassen! +SERVER_NAME = os.getenv("CADDY_SERVER_NAME", "Unknown Server") + +def parse_caddyfile(): + entries = {} + try: + with open(CADDYFILE_PATH, "r") as file: + content = file.read() + + pattern = re.compile(r"(?P[^\s{]+(?:,\s*[^\s{]+)*)\s*{.*?reverse_proxy\s+(?Phttps?:\/\/[\d\.]+:\d+|[\d\.]+:\d+).*?}", re.DOTALL) + matches = pattern.findall(content) + + for domains, target in matches: + for domain in domains.split(", "): + entries[domain] = target.strip() + except Exception as e: + print(f"Fehler beim Lesen der Caddyfile: {e}") + return entries + +def send_update(): + data = {"server": SERVER_NAME, "entries": parse_caddyfile()} + try: + response = requests.post(DASHBOARD_URL, json=data) + print(response.json()) + except Exception as e: + print(f"Fehler beim Senden: {e}") + +if __name__ == "__main__": + send_update() diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..2228386 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,35 @@ + + + + + Zentrales Caddy-Dashboard + + + +
+

Zentrales Caddy-Dashboard

+
+ +
+ {% for server, entries in proxies.items() %} +

{{ server }}

+ + + + + + + + + {% for domain, target in entries.items() %} + + + + + {% endfor %} + +
DomainZiel
{{ domain }}{{ target }}
+ {% endfor %} +
+ +