feat: ein Name statt zwei, und PUBLIC_URL ist nur noch der Ursprung
fivecdn.d4rkst3r.de und fivemanage.d4rkst3r.de fallen weg -- wir betreiben kein Fivemanage, also tragen unsere Adressen auch nicht dessen Namen. Dashboard und API liegen an der Wurzel, die Dateien unter /f/. Der Ein-Namen-Betrieb war bis jetzt nicht ausdrueckbar. Der Kommentar in config.ts versprach "leer lassen, wenn alles unter einem Namen laufen soll", aber optional() faellt bei leerem Wert auf den Host aus PUBLIC_URL zurueck -- und dann gilt JEDE Anfrage als Anfrage an den Dateiwirt: kein Dashboard, keine API, /health gibt 404 und die Anmeldung 405 "hier gibt es nur Dateien". Nichts ist kaputt, und niemand kommt darauf. Deshalb ist der Ein-Namen-Betrieb jetzt der Standard und der zweite Name die Ansage. PUBLIC_URL ist nur noch der Ursprung; das /f haengt der Dienst selbst an. Wer es mitschriebe, bekaeme Adressen mit /f/f/, und das faellt erst auf, wenn das erste Bild fehlt. Praefix und Route haengen jetzt an derselben Stelle (config.filePrefix), damit die zurueckgegebene Adresse und die Route, die sie ausliefert, nicht auseinanderlaufen koennen. Beide Betriebsarten durchgemessen: mit einem Namen kommt .../f/vehicles/adder.png zurueck und liefert die Datei; mit gesetztem FILES_HOST kommt sie ohne Praefix, liegt unter dem Dateihost, ist am Dashboard-Namen zusaetzlich unter /f/ erreichbar, und unter dem Dateihost gibt es weiterhin keine API. Welche Betriebsart laeuft, sagt der Dienst in der zweiten Startzeile. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+31
-14
@@ -1,19 +1,23 @@
|
||||
// Der Einstiegspunkt.
|
||||
//
|
||||
// ZWEI HOSTNAMEN, EIN PROZESS. Kommt eine Anfrage unter FILES_HOST herein,
|
||||
// gibt es nur Dateien — kein Dashboard, keine API, kein Anmeldeformular. Das
|
||||
// hat zwei Gruende:
|
||||
// EIN NAME ODER ZWEI, ein Prozess in beiden Faellen. Was gilt, entscheidet
|
||||
// FILES_HOST, und der Start sagt es in einer Zeile.
|
||||
//
|
||||
// 1. Die oeffentliche Adresse bleibt huebsch. Das Handy fragt
|
||||
// https://fivecdn.d4rkst3r.de/vehicles/adder.webp ab und nicht
|
||||
// irgendein /f/-Praefix — die Vorlage lautet weiterhin schlicht
|
||||
// {model}.webp.
|
||||
// 2. Der Name, der im Internet steht und den jeder Spieler kennt, hat
|
||||
// ueberhaupt keine Angriffsflaeche. Es gibt dort nichts anzumelden.
|
||||
// EIN NAME (Standard). Dashboard und API an der Wurzel, Dateien unter /f/:
|
||||
// https://media.d4rkst3r.de/f/vehicles/adder.webp
|
||||
// Ein DNS-Eintrag, ein Host im Proxy. Dafuer traegt die oeffentliche Adresse
|
||||
// auch das Anmeldeformular.
|
||||
//
|
||||
// Unter dem anderen Namen laeuft das Dashboard samt API, und die Dateien sind
|
||||
// dort zusaetzlich unter /f/ erreichbar — praktisch fuer die Galerie, wenn
|
||||
// jemand den zweiten Hostnamen noch nicht eingerichtet hat.
|
||||
// ZWEI NAMEN. Unter FILES_HOST gibt es dann ausschliesslich Dateien — kein
|
||||
// Dashboard, keine API, nichts anzumelden:
|
||||
// https://cdn.example.de/vehicles/adder.webp
|
||||
// Das haelt den Namen, den jeder Spieler kennt, ohne Angriffsflaeche und
|
||||
// spart das Praefix. Unter dem anderen Namen laeuft das Dashboard, und die
|
||||
// Dateien sind dort zusaetzlich unter /f/ erreichbar.
|
||||
//
|
||||
// In beiden Faellen gilt: DER PFAD IST DER SCHLUESSEL. vehicles/adder.webp
|
||||
// bleibt vehicles/adder.webp, damit die Vorlage im Handy {model}.webp lauten
|
||||
// kann. Nur der Teil davor aendert sich — und der steht in PUBLIC_URL.
|
||||
|
||||
import { createReadStream } from 'node:fs'
|
||||
import { stat } from 'node:fs/promises'
|
||||
@@ -96,6 +100,11 @@ async function serveFile(c: any, rawPath: string) {
|
||||
// ------------------------------------------------------------ Der Dateiwirt
|
||||
|
||||
app.use('*', async (c, next) => {
|
||||
// Kein zweiter Name gesetzt: dann gibt es hier nichts zu entscheiden.
|
||||
// Ohne diese Zeile wuerde im Ein-Namen-Betrieb jede Anfrage als Anfrage an
|
||||
// den Dateiwirt gelten und die eigene API verschwinden.
|
||||
if (!config.filesHost) return next()
|
||||
|
||||
const host = (c.req.header('host') ?? '').split(':')[0]?.toLowerCase()
|
||||
if (host !== config.filesHost.split(':')[0]?.toLowerCase()) return next()
|
||||
|
||||
@@ -225,7 +234,15 @@ setInterval(pruneSessions, 3600_000).unref()
|
||||
|
||||
serve({ fetch: app.fetch, port: config.port }, (info) => {
|
||||
console.log(`[d4rk_media] Port ${info.port}`)
|
||||
console.log(`[d4rk_media] Dateien oeffentlich unter ${config.publicUrl}`)
|
||||
console.log(`[d4rk_media] Dateiwirt hoert auf Host "${config.filesHost}"`)
|
||||
console.log(
|
||||
`[d4rk_media] Dateien oeffentlich unter ${config.publicUrl}${config.filePrefix}/`,
|
||||
)
|
||||
// Welche Betriebsart laeuft, steht beim Start da und nicht im Quelltext.
|
||||
// Wer sich wundert, warum das Dashboard nicht aufgeht, liest hier zuerst.
|
||||
console.log(
|
||||
config.filesHost
|
||||
? `[d4rk_media] Zwei Namen: Dateiwirt hoert auf "${config.filesHost}", Dashboard und API unter jedem anderen`
|
||||
: '[d4rk_media] Ein Name: Dashboard und API an der Wurzel, Dateien unter /f/',
|
||||
)
|
||||
console.log(`[d4rk_media] Daten in ${config.dataDir}`)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user