Files
RAPPORT-HOST/server/index.js
T
karim 6290475ea3 Initial: RAPPORT-HOST Iteration 1 (proprietär)
Kommerzielle Hosting-/Abo-Plattform für Rapport-Instanzen.

- React-Frontend (Vite/JSX): Landing, Register, Login, Plans, Dashboard
- Node/Express-Backend: Auth (bcrypt+JWT), Stripe-Billing, Provisioning
- HOST-Postgres-Schema: accounts, subscriptions, instances
- Provisioning-Interface + Modell-A-Adapter (Studio im geteilten Stack)
- MOCK-Modus: voller End-to-End-Flow ohne Stripe/Rapport-Stack testbar
- Idempotentes Fulfillment (Upsert auf stripe_subscription_id)
- docker-compose für lokale host-db; identisch auf Hetzner deploybar

E2E lokal verifiziert: Register -> Checkout(mock) -> Instanz -> Idempotenz.

Lizenz: proprietär (kein AGPL-Code eingebunden, nur Netzwerk-API zur Familie).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 15:37:33 +02:00

35 lines
1.4 KiB
JavaScript

// RAPPORT-HOST Backend-Entry.
import express from "express";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { env } from "./env.js";
import { authRouter } from "./routes/auth.js";
import { billingRouter } from "./routes/billing.js";
import { accountRouter } from "./routes/account.js";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const app = express();
// WICHTIG: Der Stripe-Webhook braucht den ROHEN Body für die Signaturprüfung.
// express.raw greift nur für diese Route und setzt req._body, sodass das danach
// registrierte express.json() den Webhook-Body NICHT erneut parst.
app.use("/api/billing/webhook", express.raw({ type: "application/json" }));
app.use(express.json());
app.get("/api/health", (_req, res) => res.json({ ok: true, service: "rapport-host" }));
app.use("/api/auth", authRouter);
app.use("/api/billing", billingRouter);
app.use("/api/account", accountRouter);
// In Produktion liefert dasselbe Backend das gebaute Frontend aus (dist/).
const dist = path.resolve(__dirname, "..", "dist");
app.use(express.static(dist));
app.get("*", (req, res, next) => {
if (req.path.startsWith("/api/")) return next();
res.sendFile(path.join(dist, "index.html"), (err) => err && next());
});
app.listen(env.port, () => {
console.log(`RAPPORT-HOST API läuft auf :${env.port} (Base: ${env.publicBaseUrl})`);
});