- New Go backend binary (backend + runner) replacing old scraper/ - Rename SCRAPER_API_URL → BACKEND_API_URL in UI env and docker-compose - Rename scraperFetch → backendFetch across all 19 UI server files - Remove SCRAPER_PROXY env var and proxy transport from browser.Config - Add Meilisearch, Valkey, Caddy to docker-compose - Add docs/: api-endpoints.md, request-flow.mermaid.md, data-flow.mermaid.md
126 lines
51 KiB
XML
126 lines
51 KiB
XML
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="0.7.1" preserveAspectRatio="xMinYMin meet" viewBox="0 0 3083 1759"><svg class="d2-1466119237 d2-svg" width="3083" height="1759" viewBox="-101 -101 3083 1759"><rect x="-101.000000" y="-101.000000" width="3083.000000" height="1759.000000" rx="0.000000" fill="#1E1E2E" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
|
|
.d2-1466119237 .text {
|
|
font-family: "d2-1466119237-font-regular";
|
|
}
|
|
@font-face {
|
|
font-family: d2-1466119237-font-regular;
|
|
src: url("data:application/font-woff;base64,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");
|
|
}
|
|
.d2-1466119237 .text-bold {
|
|
font-family: "d2-1466119237-font-bold";
|
|
}
|
|
@font-face {
|
|
font-family: d2-1466119237-font-bold;
|
|
src: url("data:application/font-woff;base64,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");
|
|
}
|
|
.d2-1466119237 .text-italic {
|
|
font-family: "d2-1466119237-font-italic";
|
|
}
|
|
@font-face {
|
|
font-family: d2-1466119237-font-italic;
|
|
src: url("data:application/font-woff;base64,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");
|
|
}]]></style><style type="text/css"><![CDATA[.shape {
|
|
shape-rendering: geometricPrecision;
|
|
stroke-linejoin: round;
|
|
}
|
|
.connection {
|
|
stroke-linecap: round;
|
|
stroke-linejoin: round;
|
|
}
|
|
.blend {
|
|
mix-blend-mode: multiply;
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.d2-1466119237 .fill-N1{fill:#CDD6F4;}
|
|
.d2-1466119237 .fill-N2{fill:#BAC2DE;}
|
|
.d2-1466119237 .fill-N3{fill:#A6ADC8;}
|
|
.d2-1466119237 .fill-N4{fill:#585B70;}
|
|
.d2-1466119237 .fill-N5{fill:#45475A;}
|
|
.d2-1466119237 .fill-N6{fill:#313244;}
|
|
.d2-1466119237 .fill-N7{fill:#1E1E2E;}
|
|
.d2-1466119237 .fill-B1{fill:#CBA6f7;}
|
|
.d2-1466119237 .fill-B2{fill:#CBA6f7;}
|
|
.d2-1466119237 .fill-B3{fill:#6C7086;}
|
|
.d2-1466119237 .fill-B4{fill:#585B70;}
|
|
.d2-1466119237 .fill-B5{fill:#45475A;}
|
|
.d2-1466119237 .fill-B6{fill:#313244;}
|
|
.d2-1466119237 .fill-AA2{fill:#f38BA8;}
|
|
.d2-1466119237 .fill-AA4{fill:#45475A;}
|
|
.d2-1466119237 .fill-AA5{fill:#313244;}
|
|
.d2-1466119237 .fill-AB4{fill:#45475A;}
|
|
.d2-1466119237 .fill-AB5{fill:#313244;}
|
|
.d2-1466119237 .stroke-N1{stroke:#CDD6F4;}
|
|
.d2-1466119237 .stroke-N2{stroke:#BAC2DE;}
|
|
.d2-1466119237 .stroke-N3{stroke:#A6ADC8;}
|
|
.d2-1466119237 .stroke-N4{stroke:#585B70;}
|
|
.d2-1466119237 .stroke-N5{stroke:#45475A;}
|
|
.d2-1466119237 .stroke-N6{stroke:#313244;}
|
|
.d2-1466119237 .stroke-N7{stroke:#1E1E2E;}
|
|
.d2-1466119237 .stroke-B1{stroke:#CBA6f7;}
|
|
.d2-1466119237 .stroke-B2{stroke:#CBA6f7;}
|
|
.d2-1466119237 .stroke-B3{stroke:#6C7086;}
|
|
.d2-1466119237 .stroke-B4{stroke:#585B70;}
|
|
.d2-1466119237 .stroke-B5{stroke:#45475A;}
|
|
.d2-1466119237 .stroke-B6{stroke:#313244;}
|
|
.d2-1466119237 .stroke-AA2{stroke:#f38BA8;}
|
|
.d2-1466119237 .stroke-AA4{stroke:#45475A;}
|
|
.d2-1466119237 .stroke-AA5{stroke:#313244;}
|
|
.d2-1466119237 .stroke-AB4{stroke:#45475A;}
|
|
.d2-1466119237 .stroke-AB5{stroke:#313244;}
|
|
.d2-1466119237 .background-color-N1{background-color:#CDD6F4;}
|
|
.d2-1466119237 .background-color-N2{background-color:#BAC2DE;}
|
|
.d2-1466119237 .background-color-N3{background-color:#A6ADC8;}
|
|
.d2-1466119237 .background-color-N4{background-color:#585B70;}
|
|
.d2-1466119237 .background-color-N5{background-color:#45475A;}
|
|
.d2-1466119237 .background-color-N6{background-color:#313244;}
|
|
.d2-1466119237 .background-color-N7{background-color:#1E1E2E;}
|
|
.d2-1466119237 .background-color-B1{background-color:#CBA6f7;}
|
|
.d2-1466119237 .background-color-B2{background-color:#CBA6f7;}
|
|
.d2-1466119237 .background-color-B3{background-color:#6C7086;}
|
|
.d2-1466119237 .background-color-B4{background-color:#585B70;}
|
|
.d2-1466119237 .background-color-B5{background-color:#45475A;}
|
|
.d2-1466119237 .background-color-B6{background-color:#313244;}
|
|
.d2-1466119237 .background-color-AA2{background-color:#f38BA8;}
|
|
.d2-1466119237 .background-color-AA4{background-color:#45475A;}
|
|
.d2-1466119237 .background-color-AA5{background-color:#313244;}
|
|
.d2-1466119237 .background-color-AB4{background-color:#45475A;}
|
|
.d2-1466119237 .background-color-AB5{background-color:#313244;}
|
|
.d2-1466119237 .color-N1{color:#CDD6F4;}
|
|
.d2-1466119237 .color-N2{color:#BAC2DE;}
|
|
.d2-1466119237 .color-N3{color:#A6ADC8;}
|
|
.d2-1466119237 .color-N4{color:#585B70;}
|
|
.d2-1466119237 .color-N5{color:#45475A;}
|
|
.d2-1466119237 .color-N6{color:#313244;}
|
|
.d2-1466119237 .color-N7{color:#1E1E2E;}
|
|
.d2-1466119237 .color-B1{color:#CBA6f7;}
|
|
.d2-1466119237 .color-B2{color:#CBA6f7;}
|
|
.d2-1466119237 .color-B3{color:#6C7086;}
|
|
.d2-1466119237 .color-B4{color:#585B70;}
|
|
.d2-1466119237 .color-B5{color:#45475A;}
|
|
.d2-1466119237 .color-B6{color:#313244;}
|
|
.d2-1466119237 .color-AA2{color:#f38BA8;}
|
|
.d2-1466119237 .color-AA4{color:#45475A;}
|
|
.d2-1466119237 .color-AA5{color:#313244;}
|
|
.d2-1466119237 .color-AB4{color:#45475A;}
|
|
.d2-1466119237 .color-AB5{color:#313244;}.appendix text.text{fill:#CDD6F4}.md{--color-fg-default:#CDD6F4;--color-fg-muted:#BAC2DE;--color-fg-subtle:#A6ADC8;--color-canvas-default:#1E1E2E;--color-canvas-subtle:#313244;--color-border-default:#CBA6f7;--color-border-muted:#CBA6f7;--color-neutral-muted:#313244;--color-accent-fg:#CBA6f7;--color-accent-emphasis:#CBA6f7;--color-attention-subtle:#BAC2DE;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-normal-d2-1466119237);mix-blend-mode:color-burn}.sketch-overlay-B2{fill:url(#streaks-normal-d2-1466119237);mix-blend-mode:color-burn}.sketch-overlay-B3{fill:url(#streaks-dark-d2-1466119237);mix-blend-mode:overlay}.sketch-overlay-B4{fill:url(#streaks-dark-d2-1466119237);mix-blend-mode:overlay}.sketch-overlay-B5{fill:url(#streaks-darker-d2-1466119237);mix-blend-mode:lighten}.sketch-overlay-B6{fill:url(#streaks-darker-d2-1466119237);mix-blend-mode:lighten}.sketch-overlay-AA2{fill:url(#streaks-normal-d2-1466119237);mix-blend-mode:color-burn}.sketch-overlay-AA4{fill:url(#streaks-darker-d2-1466119237);mix-blend-mode:lighten}.sketch-overlay-AA5{fill:url(#streaks-darker-d2-1466119237);mix-blend-mode:lighten}.sketch-overlay-AB4{fill:url(#streaks-darker-d2-1466119237);mix-blend-mode:lighten}.sketch-overlay-AB5{fill:url(#streaks-darker-d2-1466119237);mix-blend-mode:lighten}.sketch-overlay-N1{fill:url(#streaks-normal-d2-1466119237);mix-blend-mode:color-burn}.sketch-overlay-N2{fill:url(#streaks-normal-d2-1466119237);mix-blend-mode:color-burn}.sketch-overlay-N3{fill:url(#streaks-normal-d2-1466119237);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-dark-d2-1466119237);mix-blend-mode:overlay}.sketch-overlay-N5{fill:url(#streaks-darker-d2-1466119237);mix-blend-mode:lighten}.sketch-overlay-N6{fill:url(#streaks-darker-d2-1466119237);mix-blend-mode:lighten}.sketch-overlay-N7{fill:url(#streaks-darker-d2-1466119237);mix-blend-mode:lighten}.light-code{display: none}.dark-code{display: block}]]></style><g class="bm92ZWxmaXJl"><g class="shape" ><path d="M 2687 151 C 2687 152 2686 153 2685 153 C 2671 154 2660 165 2660 179 C 2660 194 2673 206 2689 206 H 2797 C 2814 206 2828 193 2828 178 C 2828 163 2815 151 2799 150 C 2798 150 2797 149 2796 148 C 2792 133 2776 122 2756 122 C 2743 122 2732 127 2724 134 C 2723 135 2722 135 2721 135 C 2718 134 2715 134 2712 134 C 2699 134 2688 141 2687 151 Z" stroke="#CBA6f7" fill="#f0f4ff" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2742.796000" y="185.516000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">novelfire.net</text></g><g class="a29rb3Jv"><g class="shape" ><path d="M 2667 295 C 2667 296 2665 297 2664 297 C 2645 298 2630 309 2630 323 C 2630 338 2647 350 2668 350 H 2814 C 2837 350 2856 337 2856 322 C 2856 307 2839 295 2817 294 C 2815 294 2814 293 2814 292 C 2809 277 2787 266 2760 266 C 2743 266 2727 271 2717 278 C 2716 279 2714 279 2713 279 C 2709 278 2705 278 2701 278 C 2683 278 2669 285 2667 295 Z" stroke="#CBA6f7" fill="#f0f4ff" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2742.547000" y="329.516000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Kokoro-FastAPI TTS</text></g><g class="bGV0c2VuY3J5cHQ="><g class="shape" ><path d="M 1185 29 C 1185 30 1184 31 1183 31 C 1169 32 1157 43 1157 57 C 1157 72 1170 84 1186 84 H 1295 C 1312 84 1326 71 1326 56 C 1326 41 1313 29 1297 28 C 1296 28 1295 27 1294 26 C 1290 11 1273 0 1254 0 C 1241 0 1230 5 1222 12 C 1221 13 1220 13 1219 13 C 1216 12 1213 12 1210 12 C 1197 12 1186 19 1185 29 Z" stroke="#CBA6f7" fill="#f0f4ff" class=" stroke-B1" style="stroke-width:2;" /></g><text x="1241.205500" y="63.516000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Let's Encrypt</text></g><g class="YnJvd3Nlcg=="><g class="shape" ><path d="M 140 562 H 0 V 561 C 0 545 15 531 40 524 C 26 518 18 509 18 499 C 18 483 41 469 70 469 C 98 469 122 483 122 499 C 122 509 114 518 101 524 C 125 531 141 545 141 561 V 562 H 140 Z" stroke="#CBA6f7" fill="#fff9e6" class=" stroke-B1" style="stroke-width:2;" /></g><text x="70.000000" y="583.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Browser / iOS App</text></g><g class="aW5pdA=="><g class="shape" ><rect x="1798.000000" y="1218.000000" width="265.000000" height="291.000000" stroke="#CBA6f7" fill="#f5f5f5" class=" stroke-B2" style="stroke-width:2;stroke-dasharray:8.000000,7.892511;" /></g><text x="1930.500000" y="1205.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:28px">Init containers</text></g><g class="c3RvcmFnZQ=="><g class="shape" ><rect x="2606.000000" y="446.000000" width="275.000000" height="1111.000000" stroke="#CBA6f7" fill="#eaf7ea" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2743.500000" y="433.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:28px">Storage</text></g><g class="YXBw"><g class="shape" ><rect x="551.000000" y="436.000000" width="1523.000000" height="530.000000" stroke="#CBA6f7" fill="#eef3ff" class=" stroke-B1" style="stroke-width:2;" /></g><text x="1312.500000" y="423.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:28px">Application</text></g><g class="aW5pdC5taW5pby1pbml0"><g class="shape" ><rect x="1836.000000" y="1248.000000" width="188.000000" height="82.000000" stroke="#CBA6f7" fill="#45475A" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1930.000000" y="1286.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1930.000000" dy="0.000000">minio-init</tspan><tspan x="1930.000000" dy="18.500000">(mc: create buckets)</tspan></text></g><g class="aW5pdC5wYi1pbml0"><g class="shape" ><rect x="1828.000000" y="1397.000000" width="205.000000" height="82.000000" stroke="#CBA6f7" fill="#45475A" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1930.500000" y="1435.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1930.500000" dy="0.000000">pb-init</tspan><tspan x="1930.500000" dy="18.500000">(bootstrap collections)</tspan></text></g><g class="c3RvcmFnZS5taW5pbw=="><g class="shape" ><path d="M 2655 500 C 2655 476 2735 476 2744 476 C 2752 476 2832 476 2832 500 V 666 C 2832 690 2752 690 2744 690 C 2735 690 2655 690 2655 666 V 500 Z" stroke="#CBA6f7" fill="#313244" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 2655 500 C 2655 524 2735 524 2744 524 C 2752 524 2832 524 2832 500" stroke="#CBA6f7" fill="#313244" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="2743.500000" y="552.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2743.500000" dy="0.000000">MinIO :9000</tspan><tspan x="2743.500000" dy="16.714286"> </tspan><tspan x="2743.500000" dy="16.714286">buckets:</tspan><tspan x="2743.500000" dy="16.714286"> libnovel-chapters</tspan><tspan x="2743.500000" dy="16.714286"> libnovel-audio</tspan><tspan x="2743.500000" dy="16.714286"> libnovel-avatars</tspan><tspan x="2743.500000" dy="16.714286"> libnovel-browse</tspan></text></g><g class="c3RvcmFnZS5wb2NrZXRiYXNl"><g class="shape" ><path d="M 2636 885 C 2636 861 2733 861 2744 861 C 2754 861 2851 861 2851 885 V 1051 C 2851 1075 2754 1075 2744 1075 C 2733 1075 2636 1075 2636 1051 V 885 Z" stroke="#CBA6f7" fill="#313244" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 2636 885 C 2636 909 2733 909 2744 909 C 2754 909 2851 909 2851 885" stroke="#CBA6f7" fill="#313244" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="2743.500000" y="937.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2743.500000" dy="0.000000">PocketBase :8090</tspan><tspan x="2743.500000" dy="16.714286"> </tspan><tspan x="2743.500000" dy="16.714286">collections:</tspan><tspan x="2743.500000" dy="16.714286"> books chapters_idx</tspan><tspan x="2743.500000" dy="16.714286"> audio_cache progress</tspan><tspan x="2743.500000" dy="16.714286"> scrape_jobs app_users</tspan><tspan x="2743.500000" dy="16.714286"> ranking</tspan></text></g><g class="c3RvcmFnZS52YWxrZXk="><g class="shape" ><path d="M 2652 1159 C 2652 1135 2734 1135 2743 1135 C 2752 1135 2834 1135 2834 1159 V 1277 C 2834 1301 2752 1301 2743 1301 C 2734 1301 2652 1301 2652 1277 V 1159 Z" stroke="#CBA6f7" fill="#313244" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 2652 1159 C 2652 1183 2734 1183 2743 1183 C 2752 1183 2834 1183 2834 1159" stroke="#CBA6f7" fill="#313244" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="2743.000000" y="1211.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2743.000000" dy="0.000000">Valkey :6379</tspan><tspan x="2743.000000" dy="17.250000"> </tspan><tspan x="2743.000000" dy="17.250000">(presign URL cache</tspan><tspan x="2743.000000" dy="17.250000">TTL-based, shared)</tspan></text></g><g class="c3RvcmFnZS5tZWlsaXNlYXJjaA=="><g class="shape" ><path d="M 2659 1385 C 2659 1361 2735 1361 2743 1361 C 2751 1361 2827 1361 2827 1385 V 1503 C 2827 1527 2751 1527 2743 1527 C 2735 1527 2659 1527 2659 1503 V 1385 Z" stroke="#CBA6f7" fill="#313244" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 2659 1385 C 2659 1409 2735 1409 2743 1409 C 2751 1409 2827 1409 2827 1385" stroke="#CBA6f7" fill="#313244" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="2743.000000" y="1437.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2743.000000" dy="0.000000">Meilisearch :7700</tspan><tspan x="2743.000000" dy="17.250000"> </tspan><tspan x="2743.000000" dy="17.250000">indices:</tspan><tspan x="2743.000000" dy="17.250000"> books</tspan></text></g><g class="YXBwLmNhZGR5"><g class="shape" ><rect x="581.000000" y="466.000000" width="256.000000" height="98.000000" stroke="#CBA6f7" fill="#45475A" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="709.000000" y="504.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="709.000000" dy="0.000000">Caddy :443 / :80</tspan><tspan x="709.000000" dy="17.666667">(reverse proxy</tspan><tspan x="709.000000" dy="17.666667">auto-HTTPS via Let's Encrypt)</tspan></text></g><g class="YXBwLmJhY2tlbmQ="><g class="shape" ><rect x="1828.000000" y="758.000000" width="204.000000" height="82.000000" stroke="#CBA6f7" fill="#45475A" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1930.000000" y="796.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1930.000000" dy="0.000000">Backend API :8080</tspan><tspan x="1930.000000" dy="18.500000">(Go — HTTP API server)</tspan></text></g><g class="YXBwLnJ1bm5lcg=="><g class="shape" ><rect x="1816.000000" y="575.000000" width="228.000000" height="114.000000" stroke="#CBA6f7" fill="#45475A" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1930.000000" y="613.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1930.000000" dy="0.000000">Runner :9091</tspan><tspan x="1930.000000" dy="17.250000">(Go — background worker</tspan><tspan x="1930.000000" dy="17.250000">scraping + TTS jobs</tspan><tspan x="1930.000000" dy="17.250000">/metrics endpoint)</tspan></text></g><g class="YXBwLnVp"><g class="shape" ><rect x="1156.000000" y="854.000000" width="170.000000" height="82.000000" stroke="#CBA6f7" fill="#45475A" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1241.000000" y="892.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1241.000000" dy="0.000000">SvelteKit UI :3000</tspan><tspan x="1241.000000" dy="18.500000">(adapter-node)</tspan></text></g><g class="KGluaXQubWluaW8taW5pdCAtJmd0OyBzdG9yYWdlLm1pbmlvKVswXQ=="><marker id="mk-d2-1466119237-2177206569" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#CBA6f7" class="connection fill-B2" stroke-width="2" /> </marker><path d="M 2026.000000 1289.000000 C 2124.800049 1289.000000 2187.399902 1192.400024 2243.500000 1047.500000 C 2299.600098 902.598999 2550.399902 779.000000 2653.203528 673.860025" stroke="#CBA6f7" fill="none" class="connection stroke-B2" style="stroke-width:2;stroke-dasharray:8.000000,7.892511;" marker-end="url(#mk-d2-1466119237-2177206569)" mask="url(#d2-1466119237)" /><text x="2282.500000" y="953.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">create buckets</text></g><g class="KGluaXQucGItaW5pdCAtJmd0OyBzdG9yYWdlLnBvY2tldGJhc2UpWzBd"><path d="M 2035.500000 1437.500000 C 2126.699951 1437.500000 2187.399902 1365.449951 2243.500000 1257.375000 C 2299.600098 1149.300049 2546.399902 1066.000000 2632.425488 1022.795233" stroke="#CBA6f7" fill="none" class="connection stroke-B2" style="stroke-width:2;stroke-dasharray:8.000000,7.892511;" marker-end="url(#mk-d2-1466119237-2177206569)" mask="url(#d2-1466119237)" /><text x="2283.500000" y="1186.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">bootstrap schema</text></g><g class="KGFwcC5iYWNrZW5kIC0mZ3Q7IHN0b3JhZ2UubWluaW8pWzBd"><marker id="mk-d2-1466119237-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#CBA6f7" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 1997.697234 756.941984 C 2119.199951 681.200012 2187.399902 662.000000 2243.500000 662.000000 C 2299.600098 662.000000 2550.199951 652.599976 2651.234987 616.350805" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="2316.500000" y="659.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2316.500000" dy="0.000000">blobs (chapters, audio,</tspan><tspan x="2316.500000" dy="18.500000">avatars, browse)</tspan></text></g><g class="KGFwcC5iYWNrZW5kIC0mZ3Q7IHN0b3JhZ2UucG9ja2V0YmFzZSlbMF0="><path d="M 2033.938337 824.492798 C 2126.399902 848.000000 2187.399902 871.900024 2243.500000 898.750000 C 2299.600098 925.599976 2546.399902 946.000000 2632.024682 955.556327" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="2324.500000" y="925.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2324.500000" dy="0.000000">structured records</tspan><tspan x="2324.500000" dy="18.500000">(books, progress, jobs…)</tspan></text></g><g class="KGFwcC5iYWNrZW5kIC0mZ3Q7IHN0b3JhZ2UudmFsa2V5KVswXQ=="><path d="M 1976.480263 841.344925 C 2115.000000 967.200012 2187.399902 1059.599976 2243.500000 1150.500000 C 2299.600098 1241.400024 2549.600098 1292.199951 2648.264366 1254.430047" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="2259.000000" y="1173.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2259.000000" dy="0.000000">cache presigned URLs</tspan><tspan x="2259.000000" dy="18.500000">(SET/GET with TTL)</tspan></text></g><g class="KGFwcC5ydW5uZXIgLSZndDsgc3RvcmFnZS5taW5pbylbMF0="><path d="M 2045.871204 588.043886 C 2128.800049 556.750000 2187.399902 548.750000 2243.500000 548.750000 C 2299.600098 548.750000 2550.199951 552.799988 2651.046950 568.388937" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="2347.000000" y="547.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2347.000000" dy="0.000000">write chapter markdown</tspan><tspan x="2347.000000" dy="18.500000">& audio MP3s</tspan></text></g><g class="KGFwcC5ydW5uZXIgLSZndDsgc3RvcmFnZS5wb2NrZXRiYXNlKVswXQ=="><path d="M 2032.742760 689.981218 C 2126.199951 742.599976 2187.399902 775.799988 2243.500000 805.500000 C 2299.600098 835.200012 2546.399902 866.599976 2632.448022 911.160584" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="2321.500000" y="835.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2321.500000" dy="0.000000">read/update scrape jobs</tspan><tspan x="2321.500000" dy="18.500000">write book records</tspan></text></g><g class="KGFwcC5ydW5uZXIgLSZndDsgc3RvcmFnZS5tZWlsaXNlYXJjaClbMF0="><path d="M 1956.817748 690.825181 C 2111.199951 1035.400024 2187.399902 1186.300049 2243.500000 1282.750000 C 2299.600098 1379.199951 2551.000000 1443.400024 2655.000027 1443.014816" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="2198.000000" y="1202.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2198.000000" dy="0.000000">index books on</tspan><tspan x="2198.000000" dy="18.500000">scrape completion</tspan></text></g><g class="KGFwcC51aSAtJmd0OyBzdG9yYWdlLnZhbGtleSlbMF0="><path d="M 1327.995431 900.885108 C 1479.599976 911.150024 1556.400024 913.750000 1614.000000 913.750000 C 1671.599976 913.750000 1754.000000 913.750000 1820.000000 913.750000 C 1886.000000 913.750000 1974.000000 913.750000 2040.000000 913.750000 C 2106.000000 913.750000 2187.399902 952.549988 2243.500000 1010.750000 C 2299.600098 1068.949951 2549.600098 1120.599976 2648.425090 1170.205560" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="2026.500000" y="911.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2026.500000" dy="0.000000">read presigned URL cache</tspan><tspan x="2026.500000" dy="18.500000">(replaces in-process Map)</tspan></text></g><g class="YXBwLih1aSAtJmd0OyBiYWNrZW5kKVswXQ=="><path d="M 1327.969360 878.401259 C 1479.599976 851.549988 1733.599976 839.750000 1824.086860 820.579055" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="1577.000000" y="845.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="1577.000000" dy="0.000000">REST API calls</tspan><tspan x="1577.000000" dy="18.500000">(server-side)</tspan></text></g><g class="YXBwLihjYWRkeSAtJmd0OyB1aSlbMF0="><path d="M 747.353243 565.843800 C 946.429016 828.450012 1028.500000 894.500000 1152.500000 894.500000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="916.500000" y="795.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">/* (proxy)</text></g><g class="YXBwLihjYWRkeSAtJmd0OyBiYWNrZW5kKVswXQ=="><path d="M 838.372658 564.452247 C 964.500000 611.750000 1045.400024 623.750000 1118.750000 623.750000 C 1192.099976 623.750000 1296.400024 623.750000 1379.500000 623.750000 C 1462.599976 623.750000 1743.800049 650.549988 1875.865699 755.264813" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="1372.000000" y="629.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">/api/*, /health (proxy)</text></g><g class="KGFwcC5jYWRkeSAtJmd0OyBzdG9yYWdlLm1pbmlvKVswXQ=="><path d="M 838.486046 499.764157 C 964.500000 484.799988 1045.400024 481.000000 1118.750000 481.000000 C 1192.099976 481.000000 1296.400024 481.000000 1379.500000 481.000000 C 1462.599976 481.000000 1556.400024 481.000000 1614.000000 481.000000 C 1671.599976 481.000000 1754.000000 481.000000 1820.000000 481.000000 C 1886.000000 481.000000 1974.000000 481.000000 2040.000000 481.000000 C 2106.000000 481.000000 2187.399902 481.000000 2243.500000 481.000000 C 2299.600098 481.000000 2550.199951 493.200012 2651.373854 540.311490" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="1751.000000" y="487.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">/s3/* (proxy, internal only)</text></g><g class="KGFwcC5ydW5uZXIgLSZndDsgbm92ZWxmaXJlKVswXQ=="><path d="M 1960.839237 573.184599 C 2112.000000 246.199997 2187.399902 164.000000 2243.500000 164.000000 C 2299.600098 164.000000 2552.199951 164.000000 2661.000000 164.000000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="2189.000000" y="162.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2189.000000" dy="0.000000">scrape</tspan><tspan x="2189.000000" dy="18.500000">(HTTP GET)</tspan></text></g><g class="KGFwcC5ydW5uZXIgLSZndDsga29rb3JvKVswXQ=="><path d="M 1976.096355 573.327276 C 2115.000000 361.399994 2187.399902 308.000000 2243.500000 308.000000 C 2299.600098 308.000000 2546.600098 308.000000 2633.000000 308.000000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="2239.500000" y="306.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2239.500000" dy="0.000000">TTS generation</tspan><tspan x="2239.500000" dy="18.500000">(HTTP POST)</tspan></text></g><g class="KGFwcC5jYWRkeSAtJmd0OyBsZXRzZW5jcnlwdClbMF0="><path d="M 786.010433 464.689049 C 954.099976 318.799011 1036.800049 242.399994 1195.146903 86.803540" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="995.500000" y="278.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="995.500000" dy="0.000000">ACME certificate</tspan><tspan x="995.500000" dy="18.500000">(TLS-ALPN-01)</tspan></text></g><g class="KGJyb3dzZXIgLSZndDsgYXBwLmNhZGR5KVswXQ=="><path d="M 115.999998 515.002584 C 268.799988 515.200012 496.200012 515.250000 577.000000 515.250000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1466119237-3488378134)" mask="url(#d2-1466119237)" /><text x="347.500000" y="513.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="347.500000" dy="0.000000">HTTPS :443</tspan><tspan x="347.500000" dy="18.500000">(single entry point)</tspan></text></g><mask id="d2-1466119237" maskUnits="userSpaceOnUse" x="-101" y="-101" width="3083" height="1759">
|
|
<rect x="-101" y="-101" width="3083" height="1759" fill="white"></rect>
|
|
<rect x="2232.000000" y="937.000000" width="101" height="21" fill="black"></rect>
|
|
<rect x="2222.000000" y="1170.000000" width="123" height="21" fill="black"></rect>
|
|
<rect x="2240.000000" y="643.000000" width="153" height="37" fill="black"></rect>
|
|
<rect x="2244.000000" y="909.000000" width="161" height="37" fill="black"></rect>
|
|
<rect x="2185.000000" y="1157.000000" width="148" height="37" fill="black"></rect>
|
|
<rect x="2264.000000" y="531.000000" width="166" height="37" fill="black"></rect>
|
|
<rect x="2239.000000" y="819.000000" width="165" height="37" fill="black"></rect>
|
|
<rect x="2135.000000" y="1186.000000" width="126" height="37" fill="black"></rect>
|
|
<rect x="1939.000000" y="895.000000" width="175" height="37" fill="black"></rect>
|
|
<rect x="1529.000000" y="829.000000" width="96" height="37" fill="black"></rect>
|
|
<rect x="883.000000" y="779.000000" width="67" height="21" fill="black"></rect>
|
|
<rect x="1298.000000" y="613.000000" width="148" height="21" fill="black"></rect>
|
|
<rect x="1663.000000" y="471.000000" width="176" height="21" fill="black"></rect>
|
|
<rect x="2150.000000" y="146.000000" width="78" height="37" fill="black"></rect>
|
|
<rect x="2188.000000" y="290.000000" width="103" height="37" fill="black"></rect>
|
|
<rect x="940.000000" y="262.000000" width="111" height="37" fill="black"></rect>
|
|
<rect x="284.000000" y="497.000000" width="127" height="37" fill="black"></rect>
|
|
</mask></svg></svg>
|