Files
d4rk_media/tools/proxy-pruefen.ps1
T
D4rkst3randClaude Opus 5 914f2fb854 docs: der NPM-Block zum Einfuegen, und ein Skript, das sagt ob er sitzt
docs/npm-advanced.conf enthaelt genau das, was in NPM unter Advanced ->
Custom Nginx Configuration gehoert: die drei ^~-Bloecke fuer /f/, /t/ und
/api/, samt Begruendung als Kommentar. Die ganze Datei ist einfuegbar --
nginx kennt '#'. Syntax gegengeprueft mit `nginx -t` in einem
Wegwerf-Container, und zwar mit DIESEM Dateiinhalt und nicht mit einer
abgetippten Kurzfassung.

/s/ steht bewusst NICHT drin: die Schluessel bestehen aus einem festen
Alphabet ohne Punkt, eine Freigabe-Adresse endet also nie auf eine
Bildendung und faellt gar nicht erst in die assets.conf-Regel. /assets/
ebenfalls nicht -- die Dateinamen der gebauten Oberflaeche tragen einen Hash
und aendern sich nie unter demselben Namen, dort ist der Zwischenspeicher
richtig.

tools/proxy-pruefen.ps1 misst danach, ob es gewirkt hat, und sagt sonst, was
zu tun ist. Beim Schreiben hat es gleich eine SCHWAECHE IN SICH SELBST
gezeigt: die erste Fassung prueft "/api/ ohne Token -> 401" und meldete
Erfolg -- der 401 war aber nur ein zwischengespeicherter, den der Proxy an
alle ausliefert. Gemessen bekam ihn sogar ein Aufrufer MIT gueltigem Token.

Verlaesslich ist nur das Paar auf einer FRISCHEN, zufaelligen Adresse:

    GET /api/exists/probe-xyz.webp   mit Token    -> 200
    GET /api/exists/probe-xyz.webp   ohne Token   -> 401  gut
                                                  -> 200  Block fehlt

Aktueller Stand, gemessen:

    [ok]  /f/  Cache-Control                     public, max-age=300
    [!!]  /t/  Cache-Control                     max-age=10608
    [ok]  /api/ mit Token -> 200                 HTTP 200
    [!!]  /api/ dieselbe Adresse ohne Token      HTTP 200 -- der Proxy gibt sie weiter
    [ok]  /api/exists?pfad ohne Token -> 401     HTTP 401

Die letzte Zeile ist der Grund, warum die Abfrageform gebaut wurde: sie ist
dicht, ohne von dieser Proxy-Einstellung abzuhaengen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 23:34:02 +02:00

115 lines
4.9 KiB
PowerShell

# Sitzt der NPM-Block? Eine Antwort, keine Vermutung.
#
# pwsh -File tools\proxy-pruefen.ps1
#
# Nach dem Einfuegen von docs\npm-advanced.conf und "Save" in NPM ausfuehren.
# Das Skript AENDERT NICHTS -- es misst nur, was ueber die Leitung kommt.
#
# WARUM ES DAS GIBT: der Block wurde schon einmal fuer eingefuegt gehalten und
# war es nicht. Die Kopfzeile sagt es eindeutig, aber man muss sie eben ansehen.
param(
[string]$Basis = 'https://fivemanage.d4rkst3r.de',
# Fuer die API-Messung. Ohne ihn wird sie uebersprungen -- sie braucht einen
# gueltigen Token, um "mit" und "ohne" unterscheiden zu koennen.
[string]$Token = ''
)
$ErrorActionPreference = 'Continue'
$fehler = 0
function Kopf([string]$url, [hashtable]$header = @{}) {
try {
$a = Invoke-WebRequest -Uri $url -Method Head -Headers $header -SkipHttpErrorCheck `
-MaximumRedirection 0 -ErrorAction Stop
return @{ code = [int]$a.StatusCode; kopf = $a.Headers }
} catch {
return @{ code = 0; kopf = @{}; fehler = $_.Exception.Message }
}
}
function Wert($kopf, [string]$name) {
foreach ($k in $kopf.Keys) {
if ($k -ieq $name) { return ($kopf[$k] -join ', ') }
}
return ''
}
function Zeile([string]$was, [bool]$gut, [string]$gemessen) {
$zeichen = if ($gut) { ' [ok] ' } else { ' [!!] ' }
$farbe = if ($gut) { 'Green' } else { 'Red' }
Write-Host ($zeichen + $was.PadRight(42) + $gemessen) -ForegroundColor $farbe
if (-not $gut) { $script:fehler++ }
}
Write-Host ''
Write-Host "Messe $Basis" -ForegroundColor Cyan
Write-Host ''
# -- 1. Die Dateien ------------------------------------------------------------
#
# Unsere Vorgabe ist "public, max-age=300". Kommt etwas anderes an, hat
# assets.conf sie ueberschrieben -- dann fehlt der Block.
$f = Kopf "$Basis/f/vehicles/adder.webp"
$cc = Wert $f.kopf 'Cache-Control'
Zeile '/f/ Cache-Control' ($cc -match 'max-age=300') $(if ($cc) { $cc } else { '(keine)' })
# -- 2. Die Vorschaubilder -----------------------------------------------------
$t = Kopf "$Basis/t/vehicles/adder.webp"
$cc = Wert $t.kopf 'Cache-Control'
Zeile '/t/ Cache-Control' ($cc -match 'max-age=60\b') $(if ($cc) { $cc } else { '(keine)' })
# -- 3. Die API, und das ist die entscheidende ---------------------------------
#
# EIN EINZELNER AUFRUF TAUGT HIER NICHT, und das ist beim Schreiben dieses
# Skripts aufgefallen: "ohne Token -> 401" sah nach Erfolg aus, war aber nur
# ein zwischengespeicherter 401, den der Proxy an ALLE ausliefert -- gemessen
# gab er ihn sogar Aufrufern MIT gueltigem Token.
#
# Verlaesslich ist nur das Paar auf einer FRISCHEN Adresse, die noch in keinem
# Zwischenspeicher liegt:
#
# mit Token -> 200 (der Dienst antwortet)
# ohne Token -> 401 (der Proxy hat NICHT weggelegt) <- gut
# ohne Token -> 200 (er hat weggelegt) <- Block fehlt
#
# Die Adresse endet auf ".webp", damit sie ueberhaupt in die assets.conf-Regel
# faellt -- ohne diese Endung wuerde die Messung nichts messen.
if (-not $Token) {
Write-Host ' [--] /api/ (uebersprungen) kein -Token uebergeben' -ForegroundColor DarkGray
Write-Host ' Dashboard -> Token -> einen anlegen, dann:' -ForegroundColor DarkGray
Write-Host ' pwsh -File tools\proxy-pruefen.ps1 -Token d4rk_...' -ForegroundColor DarkGray
} else {
$zufall = -join ((1..12) | ForEach-Object { 'abcdefghijklmnopqrstuvwxyz0123456789'[(Get-Random -Max 36)] })
$probe = "$Basis/api/exists/probe-$zufall.webp"
$mit = Kopf $probe @{ Authorization = "Bearer $Token" }
Zeile '/api/ mit Token -> 200' ($mit.code -eq 200) "HTTP $($mit.code)"
$ohne = Kopf $probe
Zeile '/api/ dieselbe Adresse ohne Token -> 401' ($ohne.code -eq 401) `
$(if ($ohne.code -eq 200) { 'HTTP 200 — der Proxy gibt sie weiter!' } else { "HTTP $($ohne.code)" })
}
# Die Abfrageform ist von sich aus dicht -- sie muss auch OHNE den Block 401
# geben. Faellt SIE durch, stimmt etwas am Dienst und nicht am Proxy.
$b = Kopf "$Basis/api/exists?pfad=vehicles/adder.webp"
Zeile '/api/exists?pfad ohne Token -> 401' ($b.code -eq 401) "HTTP $($b.code)"
Write-Host ''
if ($fehler -eq 0) {
Write-Host ' Der Block sitzt. Nichts weiter zu tun.' -ForegroundColor Green
} else {
Write-Host " $fehler Messung(en) sagen: der Block ist NICHT wirksam." -ForegroundColor Red
Write-Host ''
Write-Host ' Naechste Schritte:' -ForegroundColor Yellow
Write-Host ' 1. In NPM den Proxy-Host oeffnen -> Advanced -> Inhalt von'
Write-Host ' docs\npm-advanced.conf einfuegen -> SAVE druecken.'
Write-Host ' 2. Gegenpruefen, was NPM daraus gemacht hat:'
Write-Host ' docker exec npm sh -c "grep -n ''location'' /data/nginx/proxy_host/9.conf"'
Write-Host ' Stehen dort ^~ /f/, ^~ /t/ und ^~ /api/, ist gespeichert worden.'
Write-Host ' 3. Dieses Skript erneut ausfuehren.'
}
Write-Host ''
exit $(if ($fehler -eq 0) { 0 } else { 1 })