diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 0000000..e333d82
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,27 @@
+{
+ "name": "Logbuch Dev",
+ "dockerComposeFile": "docker-compose.yml",
+ "service": "app",
+ "workspaceFolder": "/workspace",
+ "forwardPorts": [3000, 3306],
+ "portsAttributes": {
+ "3000": {
+ "label": "Next.js Dev Server",
+ "onAutoForward": "notify"
+ },
+ "3306": {
+ "label": "MySQL",
+ "onAutoForward": "silent"
+ }
+ },
+ "postCreateCommand": "npm install",
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ "dbaeumer.vscode-eslint",
+ "bradlc.vscode-tailwindcss",
+ "ms-vscode.vscode-typescript-next"
+ ]
+ }
+ }
+}
diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
new file mode 100644
index 0000000..5d67e36
--- /dev/null
+++ b/.devcontainer/docker-compose.yml
@@ -0,0 +1,17 @@
+services:
+ app:
+ image: mcr.microsoft.com/devcontainers/javascript-node:20
+ volumes:
+ - ..:/workspace:cached
+ environment:
+ DB_HOST: host.docker.internal
+ DB_USER: logbuch
+ DB_PASS: Ds!?f?f6X5B2
+ DB_NAME: sternwarte
+ DB_PORT: 3336
+ AUTH_SECRET: 75c3075e200d50f2273c60edcea5aca58796831e2c99ce2a69fca0005d5920cd
+ DEFAULT_PASSWORD: welzheim
+ NODE_ENV: development
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
+ command: sleep infinity
diff --git a/ANLEITUNG.md b/ANLEITUNG.md
index 082edd1..acee7ec 100644
--- a/ANLEITUNG.md
+++ b/ANLEITUNG.md
@@ -175,3 +175,28 @@ Zeigt alle bekannten Objekte mit ID, Name und Datum der letzten Verwendung.
- **Neues Objekt anlegen**: Feld unten ausfüllen und **Hinzufügen** klicken.
- **Objekt umbenennen**: Stift-Symbol ✎ in der Zeile anklicken, Namen ändern und mit **Speichern** bestätigen oder mit **Abbrechen** verwerfen.
- **Objekt löschen**: × in der Zeile – es erscheint ein Bestätigungsdialog. Das Löschen ist **unwiderruflich** und entfernt das Objekt aus allen bestehenden Logbucheinträgen.
+
+## Neue Features (Statistik Grafik Proxy)
+
+Dieses Release ergänzt eine serverseitige Proxy-Lösung für das interne Statistik-Portal, damit geschützte Diagramme sicher eingeblendet werden können, ohne Zugangsdaten im Browser zu speichern.
+
+- Was neu ist:
+ - Server-seitiger Proxy unter `/api/statistik/grafik` und Catch-all `/api/statistik/grafik/*`.
+ - Holt die Statistik-Seite mit Basic-Auth (serverseitig) und liefert sie an den Browser weiter.
+ - Schreibt die HTML-Antwort so um, dass relative Assets (CSS/JS/Images) über die Proxy-URL geladen werden (es wird ein `` eingefügt).
+ - Leitet auch AJAX-POSTs (z. B. `php/statistic.php`) weiter – Methoden und Bodies werden beibehalten.
+ - Entfernt framing-blockierende Header (z. B. `X-Frame-Options`, CSP-Meta-Tags) in der proxied HTML-Antwort.
+
+- Wichtige Environment-Variablen (nur serverseitig):
+ - `STATISTIK_GRAFIK_URL` — Basis-URL des internen Statistik-Portals (z. B. `https://sternwarte-welzheim.de/intern/statistik`).
+ - `STATISTIK_GRAFIK_USER` — Benutzername für Basic-Auth.
+ - `STATISTIK_GRAFIK_PASS` — Passwort für Basic-Auth.
+
+- UI-Änderung:
+ - Der `Grafik`-Button in der Statistik-Ansicht öffnet die Statistik jetzt in einem neuen Fenster (`window.open('/api/statistik/grafik', '_blank')`). Die vorherige iframe-Integration wurde entfernt, weil manche Browser (insbesondere Firefox und Safari) Probleme mit eingebetteten, geschützten Seiten machen.
+
+- Sicherheit & Hinweise:
+ - Setze die `STATISTIK_...` Variablen in deiner Server-Umgebung (Docker secrets, CI/CD env vars, oder im Host-Umfeld). Niemals Zugangsdaten ins Repository committen.
+ - Die Proxy-Route ist so konfiguriert, dass Assets und AJAX-Aufrufe über den gleichen Proxy laufen, damit die Seite vollständig funktioniert.
+
+Wenn du möchtest, pushe ich die Änderungen an `ANLEITUNG.md` in `origin/main` für dich.
diff --git a/README.md b/README.md
index e215bc4..d743cf8 100644
--- a/README.md
+++ b/README.md
@@ -34,3 +34,24 @@ You can check out [the Next.js GitHub repository](https://github.com/vercel/next
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
+
+## Neue Features (Statistik Grafik Proxy)
+
+- Proxy für das interne Statistik-Portal:
+ - Neuer Server-seitiger Proxy unter `/api/statistik/grafik` (und Catch-all `/api/statistik/grafik/*`).
+ - Holt die Statistik-Seite serverseitig mit Basic-Auth und gibt sie an den Browser weiter, damit Zugangsdaten nicht im Client landen.
+ - Leitet auch CSS/JS/Images und AJAX-POSTs durch den Proxy (weitergeleitete Methoden und Bodies werden erhalten).
+ - Die HTML-Antwort wird bereinigt und relative URLs so umgeschrieben, dass Assets über die Proxy-URL geladen werden (``).
+
+- Environment-Variablen (server-side only):
+ - `STATISTIK_GRAFIK_URL` — Basis-URL des internen Statistik-Portals (z. B. `https://sternwarte-welzheim.de/intern/statistik`).
+ - `STATISTIK_GRAFIK_USER` — Benutzername für Basic-Auth.
+ - `STATISTIK_GRAFIK_PASS` — Passwort für Basic-Auth.
+
+- UI-Änderung:
+ - Der `Grafik`-Button in der Statistik-Ansicht öffnet jetzt die Statistik-Seite in einem neuen Fenster (`window.open('/api/statistik/grafik', '_blank')`). Die vorherige iframe-Integration wurde entfernt, da Browser (insb. Firefox/Safari) bei Einbettung Probleme mit X-Frame-Options/CSP gemacht haben.
+
+- Middleware / Sicherheit:
+ - Die Proxy-Route wird in der App-Auth-Middleware erlaubt, so dass der Proxy die Statistik-Seite auch ohne Benutzer-Session laden kann (Zugangskontrolle erfolgt über die serverseitigen Basic-Auth-Variablen).
+
+Hinweis: Speichere sensible Zugangsdaten nicht in Repositories. Setze die drei `STATISTIK_...` Variablen in deiner Deployment-Umgebung (z. B. Docker secrets, CI/CD environment variables oder auf dem Server). Die Proxy-Implementierung entfernt framing-blockierende Header und schiebt relative Asset-Pfade durch den Proxy, um Kompatibilitätsprobleme mit Browsern zu vermeiden.
diff --git a/app/MainClient.tsx b/app/MainClient.tsx
index 9d85fb9..e8782b3 100644
--- a/app/MainClient.tsx
+++ b/app/MainClient.tsx
@@ -22,6 +22,8 @@ export default function MainClient({ kuerzel, beoId, beoName, role }: Props) {
const [refreshKey, setRefreshKey] = useState(0);
const [editEntry, setEditEntry] = useState(null);
+ const grafikSrc = '/api/statistik/grafik';
+
const version = packageJson.version;
const buildDate =
process.env.NEXT_PUBLIC_BUILD_DATE ||
@@ -98,7 +100,10 @@ export default function MainClient({ kuerzel, beoId, beoName, role }: Props) {
.map((tab) => (