From b0ff551ca0bbc494583ed4caab579017dc4d89bd Mon Sep 17 00:00:00 2001 From: Dicken Date: Sun, 19 Jul 2026 02:35:29 +0200 Subject: [PATCH] =?UTF-8?q?Zentrale=20.env-Konfiguration=20f=C3=BCr=20alle?= =?UTF-8?q?=20Umgebungsvariablen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 41 +++++++++++++++++++++++++++++++++++++++ README.md | 35 ++++++++++++++++++++------------- apps/backend/package.json | 1 + apps/backend/src/env.ts | 11 +++++++++++ apps/backend/src/index.ts | 1 + docker-compose.yml | 3 +++ pnpm-lock.yaml | 9 +++++++++ 7 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 .env.example create mode 100644 apps/backend/src/env.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..f459bee --- /dev/null +++ b/.env.example @@ -0,0 +1,41 @@ +# LaunchPad – Umgebungsvariablen +# +# Kopiere diese Datei nach ".env" und trage echte Werte ein: +# cp .env.example .env +# +# ".env" ist in .gitignore und wird NIE committet. Auf dem Server +# (/opt/LaunchPad) muss sie nach dem ersten `git pull` einmalig manuell +# angelegt werden, da git-ignorierte Dateien nicht mitgepullt werden. + +# ─── Backend ───────────────────────────────────────────────────────── +# Node-Umgebung: "development" oder "production" +NODE_ENV=production + +# Host/Port, auf dem das Backend lauscht (innerhalb des Containers) +HOST=0.0.0.0 +PORT=3001 + +# Pfad zur SQLite-Datenbankdatei (im Docker-Container: das gemountete Volume) +DATABASE_PATH=/data/launchpad.db + +# Log-Level für Fastify/Pino: fatal | error | warn | info | debug | trace +LOG_LEVEL=info + +# CORS-Origin fürs Frontend. "true" erlaubt alle Origins (Default – im lokalen +# Betrieb hinter Nginx unbedenklich). Für strengere Regeln z. B.: +# CORS_ORIGIN=https://launchpad.home +CORS_ORIGIN=true + +# ─── FritzBox-Scan (optional) ─────────────────────────────────────── +# Nur nötig für POST /api/scan/fritzbox. TR-064-Zugriff muss in der FritzBox +# aktiviert sein: Heimnetz -> Netzwerk -> Netzwerkeinstellungen -> +# "Zugriff für Anwendungen zulassen". Leer lassen = Scan liefert kontrolliert +# HTTP 400 statt zu fehlen. +FRITZBOX_HOST=192.168.1.1 +FRITZBOX_PORT=49000 +FRITZBOX_USERNAME= +FRITZBOX_PASSWORD= + +# ─── Frontend (nur für lokale Entwicklung, `pnpm dev:frontend`) ───── +# Ziel für den Vite-Dev-Proxy von /api -> Backend +BACKEND_URL=http://localhost:3001 diff --git a/README.md b/README.md index c8cf4a2..a42a978 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ Kein überladenes Dashboard. Keine Kacheln. Im Mittelpunkt steht eine extrem sch ```bash git clone LaunchPad cd LaunchPad +cp .env.example .env # optional anpassen, siehe unten docker compose up -d --build ``` @@ -78,23 +79,31 @@ Noch **nicht** enthalten (folgt in den nächsten Commits): — beide Backend-APIs existieren bereits vollständig - TanStack Router, Plugin-System, PWA-Manifest, shadcn/ui, RHF -### FritzBox-Scan konfigurieren +### Umgebungsvariablen (.env) -Der FritzBox-Scan benötigt drei Umgebungsvariablen (z. B. in `docker-compose.yml` -beim `backend`-Service oder lokal per `.env`): +Alle Umgebungsvariablen sind in `.env.example` dokumentiert. Für die lokale +Entwicklung und für Docker Compose: -``` -FRITZBOX_HOST=192.168.1.1 -FRITZBOX_USERNAME= -FRITZBOX_PASSWORD= -FRITZBOX_PORT=49000 # optional, Default 49000 +```bash +cp .env.example .env +# .env anpassen (v. a. FRITZBOX_* für den FritzBox-Scan) ``` -TR-064-Zugriff muss in der FritzBox unter *Heimnetz → Netzwerk → Netzwerkeinstellungen -→ „Zugriff für Anwendungen zulassen"* aktiviert sein. Getestet wurde der komplette -SOAP-/Digest-Auth-Ablauf gegen einen Mock-Server mit realistischer TR-064-Antwort -(korrektes und falsches Passwort); ein Test gegen eine echte FritzBox war in dieser -Entwicklungsumgebung nicht möglich (kein Netzwerkzugriff auf lokale Geräte). +`.env` ist in `.gitignore` und wird nie committet. **Auf dem Server +(`/opt/LaunchPad`) muss sie nach dem ersten `git pull` einmalig manuell +angelegt werden**, da git-ignorierte Dateien nicht mitgepullt werden: + +```bash +cd /opt/LaunchPad +cp .env.example .env +nano .env # FRITZBOX_* eintragen +docker compose up -d --build +``` + +Fehlt `.env` komplett, startet alles trotzdem mit den in `docker-compose.yml` +hinterlegten Defaults – der FritzBox-Scan liefert dann kontrolliert `HTTP 400` +statt abzustürzen. Für `pnpm dev:backend` (ohne Docker) wird `.env` automatisch +über `dotenv` geladen (`apps/backend/src/env.ts`, wird als allererstes importiert). Siehe [`docs/ROADMAP.md`](./docs/ROADMAP.md) für die geplante Reihenfolge. diff --git a/apps/backend/package.json b/apps/backend/package.json index 8b5693e..43e2d82 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -15,6 +15,7 @@ "@launchpad/shared": "workspace:*", "@fastify/cors": "^9.0.1", "better-sqlite3": "^11.3.0", + "dotenv": "^16.4.5", "drizzle-orm": "^0.33.0", "fastify": "^4.28.1" }, diff --git a/apps/backend/src/env.ts b/apps/backend/src/env.ts new file mode 100644 index 0000000..6a86f38 --- /dev/null +++ b/apps/backend/src/env.ts @@ -0,0 +1,11 @@ +import { config } from "dotenv"; +import { fileURLToPath } from "node:url"; +import { dirname, resolve } from "node:path"; + +const currentDir = dirname(fileURLToPath(import.meta.url)); + +// apps/backend/src/env.ts (bzw. apps/backend/dist/env.js) -> Repo-Root liegt +// drei Verzeichnisebenen höher. Existiert dort keine .env (z. B. im +// Docker-Image), passiert einfach nichts – die Werte kommen dann bereits aus +// der Container-Umgebung (docker-compose env_file/environment). +config({ path: resolve(currentDir, "../../../.env") }); diff --git a/apps/backend/src/index.ts b/apps/backend/src/index.ts index ee0c6b4..0f18d9e 100644 --- a/apps/backend/src/index.ts +++ b/apps/backend/src/index.ts @@ -1,3 +1,4 @@ +import "./env.js"; import Fastify from "fastify"; import cors from "@fastify/cors"; import { ensureSchema } from "./db/client.js"; diff --git a/docker-compose.yml b/docker-compose.yml index 0d23242..13b5f57 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,6 +5,9 @@ services: dockerfile: apps/backend/Dockerfile container_name: launchpad-backend restart: unless-stopped + env_file: + - path: ./.env + required: false environment: - DATABASE_PATH=/data/launchpad.db - PORT=3001 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b9a049a..70d06d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: better-sqlite3: specifier: ^11.3.0 version: 11.10.0 + dotenv: + specifier: ^16.4.5 + version: 16.6.1 drizzle-orm: specifier: ^0.33.0 version: 0.33.0(@types/better-sqlite3@7.6.13)(@types/react@18.3.31)(better-sqlite3@11.10.0)(react@18.3.1) @@ -1157,6 +1160,10 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + drizzle-kit@0.24.2: resolution: {integrity: sha512-nXOaTSFiuIaTMhS8WJC2d4EBeIcN9OSt2A2cyFbQYBAZbi7lRsVGJNqDpEwPqYfJz38yxbY/UtbvBBahBfnExQ==} hasBin: true @@ -2640,6 +2647,8 @@ snapshots: dlv@1.1.3: {} + dotenv@16.6.1: {} + drizzle-kit@0.24.2: dependencies: '@drizzle-team/brocli': 0.10.2