- Caddy: custom image with caddy-ratelimit plugin, security headers (X-Frame-Options, HSTS, CSP-adjacent, etc.), per-IP rate limiting on auth/scrape/global zones, static error pages (502/503/504), fix routing to remove /api/scrape/* and /api/chapter-text-preview/* direct-to-backend (were bypassing SvelteKit auth middleware) - docker-compose: Caddy build context + error volume, Watchtower service (label-enable mode, 5 min poll), watchtower labels on backend/runner/ui - Scraper: ScrapeChapterList uses retryGet (9 attempts, Retry-After backoff) to fix 429-induced chapter list failures; upTo param stops pagination early for range scrapes - UI: Browse→Catalogue rename (routes, API, links), admin scrape page Continue/Retry buttons, +error.svelte branded error page, type cleanup (removed dead exports, added BookPreviewMeta/BookPreviewResponse to scraper.ts) - Meilisearch: meta_updated field, sort=update fix, facet distribution - Docs: reorganise into docs/d2/ and docs/mermaid/ subdirectories, update all diagrams to reflect Caddy/Watchtower/routing changes, add api-routing.d2 ownership map with auth-level colour coding, regenerate SVGs
52 lines
1.3 KiB
HTML
52 lines
1.3 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>504 — Gateway Timeout</title>
|
|
<style>
|
|
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
body {
|
|
min-height: 100svh;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
gap: 1rem;
|
|
background: #09090b;
|
|
color: #a1a1aa;
|
|
font-family: ui-sans-serif, system-ui, sans-serif;
|
|
padding: 2rem;
|
|
text-align: center;
|
|
}
|
|
.code {
|
|
font-size: clamp(4rem, 20vw, 8rem);
|
|
font-weight: 800;
|
|
color: #27272a;
|
|
line-height: 1;
|
|
letter-spacing: -0.04em;
|
|
}
|
|
h1 { font-size: 1.25rem; font-weight: 600; color: #e4e4e7; }
|
|
p { font-size: 0.9rem; max-width: 36ch; line-height: 1.6; }
|
|
a {
|
|
margin-top: 0.5rem;
|
|
display: inline-block;
|
|
padding: 0.6rem 1.4rem;
|
|
border-radius: 0.5rem;
|
|
background: #f59e0b;
|
|
color: #000;
|
|
font-weight: 600;
|
|
font-size: 0.875rem;
|
|
text-decoration: none;
|
|
}
|
|
a:hover { background: #d97706; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="code">504</div>
|
|
<h1>Gateway Timeout</h1>
|
|
<p>The request took too long to complete. Please refresh and try again.</p>
|
|
<a href="/">Go home</a>
|
|
</body>
|
|
</html>
|