Minimalistische File- und Image-Upload-Plattform auf Basis von Next.js 15, Tailwind CSS, shadcn/ui und Supabase.
npm installnpm run devnpm run lint
npm run typecheckKopiere .env.example nach .env.local und setze:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYNEXT_PUBLIC_APP_URLSUPABASE_SERVICE_ROLE_KEYUPLOAD_IP_HASH_SALTNEXT_REVALIDATE_SECRETNEXT_REVALIDATE_URLCLEANUP_FUNCTION_TOKEN
app/
(app)/dashboard/page.tsx
(auth)/login/page.tsx
f/[id]/page.tsx
i/[id]/page.tsx
layout.tsx
page.tsx
components/
dashboard/
home/
layout/
providers/
ui/
lib/
constants.ts
supabase/
types/
supabase/
migrations/
- Bilder und beliebige Dateien hochladen
- Anonym oder registriert mit E-Mail/Passwort und Magic Link
- Private Supabase Storage Buckets mit Share-Links unter
/i/[id]und/f/[id] - Automatische Loeschung nach sieben Tagen
- Galerie der neuesten oeffentlichen Bilder
- Dashboard mit Restlaufzeit, Link kopieren, manuellem Loeschen und Tagesverbrauch
| Bereich | Testfall | Erwartetes Ergebnis |
|---|---|---|
| Startseite | Landingpage auf Desktop und Mobile oeffnen | Hero, Galerie, Info-Bereich und Footer werden sauber gerendert |
| Anonymer Upload | Kleine Datei unter 50 MB hochladen | Upload erfolgreich, Share-Link sichtbar, Eintrag in Galerie falls Bild |
| Anonymer Upload | Datei ueber 50 MB hochladen | Klare Fehlermeldung zur Dateigroesse |
| Anonymer Upload | Mehr als 3 Uploads innerhalb einer Stunde ausloesen | Klare Fehlermeldung zum Stundenlimit |
| Registrierung | Neues Konto mit E-Mail + Passwort anlegen | Konto wird erstellt, Bestätigungs- oder Login-Hinweis erscheint |
| Magic Link | Magic Link anfordern und oeffnen | Session wird erstellt und Dashboard wird geladen |
| Login | Mit E-Mail + Passwort anmelden | Redirect auf /dashboard |
| Registrierter Upload | Mehrere Dateien hochladen | Fortschritt sichtbar, Uploads erscheinen im Dashboard |
| Tageslimit | Mehr als 2 GB an einem Tag simulieren | Klare Fehlermeldung zum Tageslimit |
| Dashboard | Share-Link kopieren | Button zeigt kurz Kopiert, Link ist in der Zwischenablage |
| Dashboard | Upload manuell loeschen | Erfolgsmeldung erscheint, Liste aktualisiert sich |
| Share-Seite Bild | Gueltigen /i/[id] Link aufrufen |
Bild wird geladen, Metadaten sind gesetzt |
| Share-Seite Datei | Gueltigen /f/[id] Link aufrufen |
Download-Link wird angezeigt, Metadaten sind gesetzt |
| Expired/Deleted | Abgelaufenen oder geloeschten Link aufrufen | Freundliche Unavailable-Seite statt harter Fehlermeldung |
| Cleanup Function | Edge Function manuell triggern | Abgelaufene Storage-Dateien und DB-Eintraege werden bereinigt |
| Revalidation | Cleanup oder Delete ausloesen | Startseite und Dashboard zeigen aktualisierte Daten |
Fuehre die Migrationen aus dem Ordner supabase/migrations aus.
Buckets:
imagesfiles
Die Migrationen legen an:
- Tabellen und RLS fuer
uploads,profiles,upload_limits,upload_usage_windows - Private Storage-Buckets und zugehoerige Policies
- Helper-Funktionen fuer Quoten und Cleanup-Trigger
In der Next.js-App:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYNEXT_PUBLIC_APP_URLSUPABASE_SERVICE_ROLE_KEYUPLOAD_IP_HASH_SALTNEXT_REVALIDATE_SECRETNEXT_REVALIDATE_URLCLEANUP_FUNCTION_TOKEN
In der Supabase Edge Function:
SUPABASE_URLSUPABASE_SERVICE_ROLE_KEYCLEANUP_FUNCTION_TOKENNEXT_REVALIDATE_SECRETNEXT_REVALIDATE_URL
Bevorzugt ueber Supabase Vault:
cleanup_expired_uploads_urlWert:https://<project-ref>.supabase.co/functions/v1/cleanup-expired-uploadscleanup_expired_uploads_tokenWert: derselbe Wert wieCLEANUP_FUNCTION_TOKEN
Falls vault auf deinem Projekt nicht verfuegbar ist, nutze die Fallback-Migration
supabase/migrations/20260411_000003_cleanup_cron_fallback.sql
und setze die Werte per SQL ueber app.set_runtime_secret(...).
supabase functions deploy cleanup-expired-uploadsOptional lokal testen:
supabase functions serve cleanup-expired-uploads --env-file supabase/.env.localDie Migration supabase/migrations/20260411_000002_cleanup_cron.sql aktiviert den bevorzugten Vault-Pfad.
Falls vault auf deinem Projekt nicht installiert werden kann, verwende stattdessen
supabase/migrations/20260411_000003_cleanup_cron_fallback.sql.
Beide Varianten aktivieren:
pg_cronpg_net
Die Vault-Variante nutzt zusaetzlich vault.
Der eigentliche Job laeuft alle sechs Stunden:
select cron.schedule(
'cleanup-expired-uploads',
'15 */6 * * *',
'select app.invoke_cleanup_expired_uploads();'
);- Registrierung und Login testen
- Magic Link testen
- Anonymen Upload mit 50-MB-Limit pruefen
- Registrierten Upload ueber mehrere Dateien pruefen
- Dashboard: Link kopieren und manuelles Loeschen pruefen
- Share-Links fuer Bild und Datei pruefen
- Cleanup-Function manuell aufrufen und Revalidierung testen
- Repository bei GitHub pushen.
- Projekt in Vercel importieren.
- Framework automatisch als Next.js erkennen lassen.
- In den Vercel Project Settings alle Variablen aus
.env.examplesetzen. NEXT_PUBLIC_APP_URLauf die spaetere Produktiv-Domain setzen, z. B.https://foxyverse.de/sharingking.- Nach dem ersten Deploy die finale Domain mit Vercel verbinden.
Diese Anwendung ist keine statische HTML-Seite. Sie nutzt Next.js App Router, Middleware, Route Handler, Server Actions und serverseitige Supabase-Authentifizierung. Ein einfaches Hochladen einer index.html auf einen reinen Webspace reicht deshalb nicht aus.
Fuer Plesk brauchst du eine Node.js-faehige Bereitstellung oder einen Reverse-Proxy auf einen Node-Prozess.
- In Plesk die Node.js-Erweiterung fuer die Domain oder den Anwendungsordner
/sharingkingaktivieren. NEXT_PUBLIC_APP_URLaufhttps://foxyverse.de/sharingkingsetzen.- Alle weiteren Supabase- und Secret-Variablen in Plesk setzen.
npm installausfuehren.npm run buildausfuehren.- Die App mit
npm startstarten oder den von Next erzeugten Standalone-Output verwenden. - Falls die Hauptdomain weiterhin statisch ueber Plesk bedient wird,
/sharingkingper Reverse-Proxy auf die Node.js-App routen.
Wenn dein Tarif nur statisches Hosting mit index.html erlaubt, ist dieses Projekt in der aktuellen Form dort nicht lauffaehig. Dann brauchst du entweder:
- Plesk mit Node.js-Unterstuetzung
- oder ein Hosting fuer Next.js/Node.js wie Vercel, Railway, Render oder einen eigenen VPS
-
Neues Supabase-Projekt anlegen oder bestehendes Projekt verwenden.
-
SQL-Migrationen aus supabase/migrations anwenden.
-
Buckets
imagesundfilespruefen. -
Auth fuer E-Mail/Passwort und Magic Link aktivieren.
-
Redirect-URLs fuer Auth setzen.
http://localhost:3000/auth/callbackhttps://foxyverse.de/sharingking/auth/callback
-
Edge-Function-Variablen und Vault-Secrets setzen.
-
Function
cleanup-expired-uploadsdeployen. -
Cron-Job ueber die Migration aktivieren.
- Startseite unter der Produktiv-Domain aufrufen und Layout, Footer und Galerie pruefen.
- Anonymen Upload testen.
- Registrierten Upload testen.
- Login, Register und Magic Link pruefen.
- Dashboard mit Copy-Link und manuellem Loeschen pruefen.
- Share-Links fuer Bild und Datei in einem privaten Browserfenster pruefen.
- Cleanup-Function manuell triggern und Revalidierung pruefen.
- Domain-Platzhalter:
https://foxyverse.de/sharingking - GitHub-Repo-Platzhalter:
https://github.com/GERMANFOXY/sharingking
- Eigene Domain spaeter final mit Vercel verbinden
- Impressum- und Datenschutz-Seiten statt Platzhaltern anlegen
- Optional: Rate-Limiting und Abuse-Protection weiter verstaerken
- Optional: Analytics integrieren, z. B. Vercel Analytics oder Umami