From 10cb1f128addaf4824f2b8826f68543db6594047 Mon Sep 17 00:00:00 2001 From: claude Date: Fri, 2 Oct 2026 08:27:42 +0200 Subject: [PATCH 1/5] =?UTF-8?q?docs:=20sch=C3=A9ma=20d'architecture=20logi?= =?UTF-8?q?que=20(Excalidraw)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/architecture.excalidraw | 2093 ++++++++++++++++++++++++++++++++++ 1 file changed, 2093 insertions(+) create mode 100644 docs/architecture.excalidraw diff --git a/docs/architecture.excalidraw b/docs/architecture.excalidraw new file mode 100644 index 0000000..4334c69 --- /dev/null +++ b/docs/architecture.excalidraw @@ -0,0 +1,2093 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "text-1", + "type": "text", + "x": 596.0, + "y": 20, + "width": 528.0, + "height": 37.5, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1390851129, + "version": 1, + "versionNonce": 647892280, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Searchgit : architecture logique", + "originalText": "Searchgit : architecture logique", + "fontSize": 30, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 27, + "autoResize": true + }, + { + "id": "rectangle-2", + "type": "rectangle", + "x": 40, + "y": 160, + "width": 320, + "height": 400, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 1695753999, + "version": 1, + "versionNonce": 207388625, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-3", + "type": "text", + "x": 54, + "y": 170, + "width": 110.00000000000001, + "height": 25.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 311111476, + "version": 1, + "versionNonce": 404285458, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Navigateur", + "originalText": "Navigateur", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 18, + "autoResize": true + }, + { + "id": "text-4", + "type": "text", + "x": 54, + "y": 200.0, + "width": 299.20000000000005, + "height": 220.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1570621945, + "version": 1, + "versionNonce": 249103478, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "UI embarquée (go:embed web/)\nservie par GET /\n\nindex.html · app.js · style.css\n\nOnglets Recherche · Veille · Revue\nthème clair / sombre\ninterface FR / EN\n\nlocalStorage : préférences\n(searchgit.*)", + "originalText": "UI embarquée (go:embed web/)\nservie par GET /\n\nindex.html · app.js · style.css\n\nOnglets Recherche · Veille · Revue\nthème clair / sombre\ninterface FR / EN\n\nlocalStorage : préférences\n(searchgit.*)", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 214, + "autoResize": true + }, + { + "id": "rectangle-5", + "type": "rectangle", + "x": 420, + "y": 80, + "width": 880, + "height": 820, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 922121677, + "version": 1, + "versionNonce": 161042649, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-6", + "type": "text", + "x": 436, + "y": 90, + "width": 605.0, + "height": 25.0, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 369140571, + "version": 1, + "versionNonce": 1862494043, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Conteneur Docker « searchgit » (alpine 3.24, port 8080)", + "originalText": "Conteneur Docker « searchgit » (alpine 3.24, port 8080)", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 18, + "autoResize": true + }, + { + "id": "rectangle-7", + "type": "rectangle", + "x": 460, + "y": 140, + "width": 400, + "height": 70, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 1796035740, + "version": 1, + "versionNonce": 300026768, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-8", + "type": "text", + "x": 474, + "y": 150, + "width": 198.00000000000003, + "height": 22.5, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1033639717, + "version": 1, + "versionNonce": 389609434, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Middleware basicAuth", + "originalText": "Middleware basicAuth", + "fontSize": 18, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 16, + "autoResize": true + }, + { + "id": "text-9", + "type": "text", + "x": 474, + "y": 177.4, + "width": 325.6, + "height": 20.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1823296039, + "version": 1, + "versionNonce": 253877687, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "AUTH_USER / AUTH_PASS (sauf /healthz)", + "originalText": "AUTH_USER / AUTH_PASS (sauf /healthz)", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 14, + "autoResize": true + }, + { + "id": "rectangle-10", + "type": "rectangle", + "x": 460, + "y": 240, + "width": 400, + "height": 260, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 531725348, + "version": 1, + "versionNonce": 958804058, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-11", + "type": "text", + "x": 474, + "y": 250, + "width": 465.3, + "height": 22.5, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 265695474, + "version": 1, + "versionNonce": 1703729685, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Serveur Go : routes HTTP (api.go, saved_api.go)", + "originalText": "Serveur Go : routes HTTP (api.go, saved_api.go)", + "fontSize": 18, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 16, + "autoResize": true + }, + { + "id": "text-12", + "type": "text", + "x": 474, + "y": 277.4, + "width": 343.20000000000005, + "height": 160.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 212984477, + "version": 1, + "versionNonce": 949539217, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "GET / fichiers statiques\nGET /healthz sonde de santé\nGET /api/search recherche directe\nGET /api/status jeton, quota, fuseau\nGET|POST /api/saved\nGET|PUT|DELETE /api/saved/{id}\nPOST /api/saved/{id}/run\nGET /api/saved/{id}/runs[/{run}]", + "originalText": "GET / fichiers statiques\nGET /healthz sonde de santé\nGET /api/search recherche directe\nGET /api/status jeton, quota, fuseau\nGET|POST /api/saved\nGET|PUT|DELETE /api/saved/{id}\nPOST /api/saved/{id}/run\nGET /api/saved/{id}/runs[/{run}]", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 154, + "autoResize": true + }, + { + "id": "rectangle-13", + "type": "rectangle", + "x": 460, + "y": 530, + "width": 400, + "height": 80, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 200071089, + "version": 1, + "versionNonce": 571981486, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-14", + "type": "text", + "x": 474, + "y": 540, + "width": 188.10000000000002, + "height": 22.5, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1243862423, + "version": 1, + "versionNonce": 1800188483, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Critères (query.go)", + "originalText": "Critères (query.go)", + "fontSize": 18, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 16, + "autoResize": true + }, + { + "id": "text-15", + "type": "text", + "x": 474, + "y": 567.4, + "width": 325.6, + "height": 20.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 619570853, + "version": 1, + "versionNonce": 505913793, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "ParseCriteria → requête GitHub « q= »", + "originalText": "ParseCriteria → requête GitHub « q= »", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 14, + "autoResize": true + }, + { + "id": "rectangle-16", + "type": "rectangle", + "x": 460, + "y": 660, + "width": 400, + "height": 110, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 1324919353, + "version": 1, + "versionNonce": 776213900, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-17", + "type": "text", + "x": 474, + "y": 670, + "width": 188.10000000000002, + "height": 22.5, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 442620899, + "version": 1, + "versionNonce": 806899910, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Stockage (store.go)", + "originalText": "Stockage (store.go)", + "fontSize": 18, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 16, + "autoResize": true + }, + { + "id": "text-18", + "type": "text", + "x": 474, + "y": 697.4, + "width": 281.6, + "height": 60.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1599435268, + "version": 1, + "versionNonce": 418461139, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "fichiers JSON, écriture atomique\n(fichier .tmp puis rename)\nmarque nouveaux / en hausse", + "originalText": "fichiers JSON, écriture atomique\n(fichier .tmp puis rename)\nmarque nouveaux / en hausse", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 54, + "autoResize": true + }, + { + "id": "rectangle-19", + "type": "rectangle", + "x": 920, + "y": 140, + "width": 350, + "height": 130, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 269676600, + "version": 1, + "versionNonce": 255985077, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-20", + "type": "text", + "x": 934, + "y": 150, + "width": 198.00000000000003, + "height": 22.5, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 884585952, + "version": 1, + "versionNonce": 2132084005, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Sandbox du conteneur", + "originalText": "Sandbox du conteneur", + "fontSize": 18, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 16, + "autoResize": true + }, + { + "id": "text-21", + "type": "text", + "x": 934, + "y": 177.4, + "width": 237.60000000000002, + "height": 80.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1836494975, + "version": 1, + "versionNonce": 1349251824, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "binaire Go statique (CGO=0)\nutilisateur non-root 10001\nseul /data est inscriptible\nHEALTHCHECK → /healthz", + "originalText": "binaire Go statique (CGO=0)\nutilisateur non-root 10001\nseul /data est inscriptible\nHEALTHCHECK → /healthz", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 74, + "autoResize": true + }, + { + "id": "rectangle-22", + "type": "rectangle", + "x": 920, + "y": 300, + "width": 350, + "height": 150, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#d0bfff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 1999744785, + "version": 1, + "versionNonce": 1946412081, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-23", + "type": "text", + "x": 934, + "y": 310, + "width": 277.20000000000005, + "height": 22.5, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1552984409, + "version": 1, + "versionNonce": 1287489454, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Planificateur (scheduler.go)", + "originalText": "Planificateur (scheduler.go)", + "fontSize": 18, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 16, + "autoResize": true + }, + { + "id": "text-24", + "type": "text", + "x": 934, + "y": 337.4, + "width": 290.40000000000003, + "height": 80.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1066984056, + "version": 1, + "versionNonce": 772092315, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "tic toutes les 30 s (heure TZ)\nune exécution à la fois (mutex)\nheures / jour / semaine\nquota épuisé → nouvel essai 3 min", + "originalText": "tic toutes les 30 s (heure TZ)\nune exécution à la fois (mutex)\nheures / jour / semaine\nquota épuisé → nouvel essai 3 min", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 74, + "autoResize": true + }, + { + "id": "rectangle-25", + "type": "rectangle", + "x": 920, + "y": 530, + "width": 350, + "height": 130, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#d0bfff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 1048386556, + "version": 1, + "versionNonce": 351564608, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-26", + "type": "text", + "x": 934, + "y": 540, + "width": 247.50000000000003, + "height": 22.5, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1289560150, + "version": 1, + "versionNonce": 2126508551, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Client GitHub (github.go)", + "originalText": "Client GitHub (github.go)", + "fontSize": 18, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 16, + "autoResize": true + }, + { + "id": "text-27", + "type": "text", + "x": 934, + "y": 567.4, + "width": 299.20000000000005, + "height": 60.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1475216846, + "version": 1, + "versionNonce": 1927728187, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "cache mémoire CACHE_TTL (5 min)\nquota RateLimit mémorisé\nAuthorization: Bearer GITHUB_TOKEN", + "originalText": "cache mémoire CACHE_TTL (5 min)\nquota RateLimit mémorisé\nAuthorization: Bearer GITHUB_TOKEN", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 54, + "autoResize": true + }, + { + "id": "rectangle-28", + "type": "rectangle", + "x": 1380, + "y": 530, + "width": 320, + "height": 130, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 1236683273, + "version": 1, + "versionNonce": 314395343, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-29", + "type": "text", + "x": 1394, + "y": 540, + "width": 187.00000000000003, + "height": 25.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 507088657, + "version": 1, + "versionNonce": 1795823849, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "API GitHub Search", + "originalText": "API GitHub Search", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 18, + "autoResize": true + }, + { + "id": "text-30", + "type": "text", + "x": 1394, + "y": 570.0, + "width": 264.0, + "height": 60.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 708506837, + "version": 1, + "versionNonce": 1469118511, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "api.github.com\n/search/repositories\n10 req/min sans jeton, 30 avec", + "originalText": "api.github.com\n/search/repositories\n10 req/min sans jeton, 30 avec", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 54, + "autoResize": true + }, + { + "id": "rectangle-31", + "type": "rectangle", + "x": 1380, + "y": 140, + "width": 320, + "height": 250, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#fff9db", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 652768598, + "version": 1, + "versionNonce": 2100080515, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-32", + "type": "text", + "x": 1394, + "y": 150, + "width": 209.00000000000003, + "height": 25.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1811180650, + "version": 1, + "versionNonce": 168393880, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Configuration (env)", + "originalText": "Configuration (env)", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 18, + "autoResize": true + }, + { + "id": "text-33", + "type": "text", + "x": 1394, + "y": 180.0, + "width": 184.8, + "height": 140.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 333377415, + "version": 1, + "versionNonce": 1347535309, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "GITHUB_TOKEN\nCACHE_TTL = 5m\nAUTH_USER / AUTH_PASS\nTZ = Europe/Paris\nHISTORY_KEEP = 100\nDATA_DIR = /data\nHTTP_PORT → 8080", + "originalText": "GITHUB_TOKEN\nCACHE_TTL = 5m\nAUTH_USER / AUTH_PASS\nTZ = Europe/Paris\nHISTORY_KEEP = 100\nDATA_DIR = /data\nHTTP_PORT → 8080", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 134, + "autoResize": true + }, + { + "id": "rectangle-34", + "type": "rectangle", + "x": 520, + "y": 960, + "width": 640, + "height": 140, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffd8a8", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 1460814403, + "version": 1, + "versionNonce": 1504004732, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-35", + "type": "text", + "x": 534, + "y": 970, + "width": 528.0, + "height": 25.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2133201996, + "version": 1, + "versionNonce": 1959386987, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Volume Docker « searchgit-data » monté sur /data", + "originalText": "Volume Docker « searchgit-data » monté sur /data", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 18, + "autoResize": true + }, + { + "id": "text-36", + "type": "text", + "x": 534, + "y": 1000.0, + "width": 492.80000000000007, + "height": 80.0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 295334610, + "version": 1, + "versionNonce": 401991736, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "searches.json recherches programmées\nruns//index.json résumés des passages\nruns//seen.json première apparition\nruns//.json instantané (HISTORY_KEEP)", + "originalText": "searches.json recherches programmées\nruns//index.json résumés des passages\nruns//seen.json première apparition\nruns//.json instantané (HISTORY_KEEP)", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 74, + "autoResize": true + }, + { + "id": "arrow-37", + "type": "arrow", + "x": 360, + "y": 260, + "width": 100, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1159380354, + "version": 1, + "versionNonce": 2036236842, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 100, + -85 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "text-38", + "type": "text", + "x": 370, + "y": 180, + "width": 123.75000000000001, + "height": 37.5, + "angle": 0, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 279172787, + "version": 1, + "versionNonce": 260573196, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "HTTP :8080\nJSON + fichiers", + "originalText": "HTTP :8080\nJSON + fichiers", + "fontSize": 15, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 31, + "autoResize": true + }, + { + "id": "arrow-39", + "type": "arrow", + "x": 660, + "y": 210, + "width": 0, + "height": 30, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1329753548, + "version": 1, + "versionNonce": 1914012529, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 30 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "arrow-40", + "type": "arrow", + "x": 660, + "y": 500, + "width": 0, + "height": 30, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1222328496, + "version": 1, + "versionNonce": 1656961616, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 30 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "text-41", + "type": "text", + "x": 670, + "y": 505, + "width": 90.75000000000001, + "height": 18.75, + "angle": 0, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1490376254, + "version": 1, + "versionNonce": 96907016, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "/api/search", + "originalText": "/api/search", + "fontSize": 15, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 13, + "autoResize": true + }, + { + "id": "arrow-42", + "type": "arrow", + "x": 860, + "y": 580, + "width": 60, + "height": 10, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1982966163, + "version": 1, + "versionNonce": 1526706730, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 60, + 10 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "arrow-43", + "type": "arrow", + "x": 860, + "y": 390, + "width": 60, + "height": 10, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 721762279, + "version": 1, + "versionNonce": 502922617, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 60, + -10 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "text-44", + "type": "text", + "x": 866, + "y": 352, + "width": 41.25, + "height": 18.75, + "angle": 0, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2120395275, + "version": 1, + "versionNonce": 253207297, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Run()", + "originalText": "Run()", + "fontSize": 15, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 13, + "autoResize": true + }, + { + "id": "arrow-45", + "type": "arrow", + "x": 460, + "y": 460, + "width": 25, + "height": 255, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 937195260, + "version": 1, + "versionNonce": 1234510746, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -25, + 0 + ], + [ + -25, + 255 + ], + [ + 0, + 255 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "text-46", + "type": "text", + "x": 330, + "y": 600, + "width": 82.5, + "height": 37.5, + "angle": 0, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 555512016, + "version": 1, + "versionNonce": 1063497604, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "CRUD\nhistorique", + "originalText": "CRUD\nhistorique", + "fontSize": 15, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 31, + "autoResize": true + }, + { + "id": "arrow-47", + "type": "arrow", + "x": 1095, + "y": 450, + "width": 0, + "height": 80, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1708957521, + "version": 1, + "versionNonce": 1679116189, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 80 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "text-48", + "type": "text", + "x": 1105, + "y": 475, + "width": 66.0, + "height": 18.75, + "angle": 0, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2132480061, + "version": 1, + "versionNonce": 346094056, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Search()", + "originalText": "Search()", + "fontSize": 15, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 13, + "autoResize": true + }, + { + "id": "arrow-49", + "type": "arrow", + "x": 920, + "y": 430, + "width": 60, + "height": 300, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 714537755, + "version": 1, + "versionNonce": 1929245187, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -30, + 0 + ], + [ + -30, + 300 + ], + [ + -60, + 300 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "text-50", + "type": "text", + "x": 898, + "y": 680, + "width": 49.50000000000001, + "height": 37.5, + "angle": 0, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1725048951, + "version": 1, + "versionNonce": 1193309984, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "AddRun\nUpdate", + "originalText": "AddRun\nUpdate", + "fontSize": 15, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 31, + "autoResize": true + }, + { + "id": "arrow-51", + "type": "arrow", + "x": 1270, + "y": 595, + "width": 110, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 588093311, + "version": 1, + "versionNonce": 1849076401, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 110, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "text-52", + "type": "text", + "x": 1280, + "y": 565, + "width": 82.5, + "height": 18.75, + "angle": 0, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1195809358, + "version": 1, + "versionNonce": 1783684942, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "REST HTTPS", + "originalText": "REST HTTPS", + "fontSize": 15, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 13, + "autoResize": true + }, + { + "id": "arrow-53", + "type": "arrow", + "x": 660, + "y": 770, + "width": 0, + "height": 190, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1540910401, + "version": 1, + "versionNonce": 1633982922, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 190 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "text-54", + "type": "text", + "x": 672, + "y": 850, + "width": 189.75000000000003, + "height": 18.75, + "angle": 0, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 991070208, + "version": 1, + "versionNonce": 648200382, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "lecture / écriture JSON", + "originalText": "lecture / écriture JSON", + "fontSize": 15, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 13, + "autoResize": true + }, + { + "id": "arrow-55", + "type": "arrow", + "x": 1380, + "y": 265, + "width": 110, + "height": 55, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 356416555, + "version": 1, + "versionNonce": 756849393, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -110, + -55 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "text-56", + "type": "text", + "x": 1290, + "y": 240, + "width": 74.25, + "height": 18.75, + "angle": 0, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 649821630, + "version": 1, + "versionNonce": 996247159, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "variables", + "originalText": "variables", + "fontSize": 15, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 13, + "autoResize": true + } + ], + "appState": { + "gridSize": 20, + "viewBackgroundColor": "#ffffff", + "currentItemFontFamily": 1 + }, + "files": {} +} \ No newline at end of file -- 2.54.0 From 020ed99f7bc59c32b14120c47b9e3fae2a8cc690 Mon Sep 17 00:00:00 2001 From: claude Date: Fri, 2 Oct 2026 08:28:38 +0200 Subject: [PATCH 2/5] =?UTF-8?q?docs:=20le=20serveur=20de=20C=C3=A9dric=20c?= =?UTF-8?q?omme=20h=C3=B4te=20sandbox=20du=20conteneur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/architecture.excalidraw | 1158 ++++++++++++++++++++-------------- 1 file changed, 686 insertions(+), 472 deletions(-) diff --git a/docs/architecture.excalidraw b/docs/architecture.excalidraw index 4334c69..3b8503f 100644 --- a/docs/architecture.excalidraw +++ b/docs/architecture.excalidraw @@ -7,7 +7,7 @@ "id": "text-1", "type": "text", "x": 596.0, - "y": 20, + "y": -50, "width": 528.0, "height": 37.5, "angle": 0, @@ -43,16 +43,16 @@ { "id": "rectangle-2", "type": "rectangle", - "x": 40, - "y": 160, - "width": 320, - "height": 400, + "x": 400, + "y": 30, + "width": 940, + "height": 1110, "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#a5d8ff", + "strokeColor": "#2f9e44", + "backgroundColor": "#f8f9fa", "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", + "strokeWidth": 3, + "strokeStyle": "dashed", "roughness": 1, "opacity": 100, "groupIds": [], @@ -72,12 +72,12 @@ { "id": "text-3", "type": "text", - "x": 54, - "y": 170, - "width": 110.00000000000001, + "x": 416, + "y": 38, + "width": 627.0, "height": 25.0, "angle": 0, - "strokeColor": "#1e1e1e", + "strokeColor": "#2f9e44", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, @@ -95,8 +95,8 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "Navigateur", - "originalText": "Navigateur", + "text": "Sandbox : serveur de Cédric (hôte Docker 192.168.200.158)", + "originalText": "Sandbox : serveur de Cédric (hôte Docker 192.168.200.158)", "fontSize": 20, "fontFamily": 1, "textAlign": "left", @@ -107,12 +107,41 @@ "autoResize": true }, { - "id": "text-4", + "id": "rectangle-4", + "type": "rectangle", + "x": 40, + "y": 20, + "width": 320, + "height": 110, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 1570621945, + "version": 1, + "versionNonce": 249103478, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false + }, + { + "id": "text-5", "type": "text", "x": 54, - "y": 200.0, - "width": 299.20000000000005, - "height": 220.0, + "y": 30, + "width": 237.60000000000002, + "height": 22.5, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -124,45 +153,6 @@ "groupIds": [], "frameId": null, "roundness": null, - "seed": 1570621945, - "version": 1, - "versionNonce": 249103478, - "isDeleted": false, - "boundElements": null, - "updated": 1759386000000, - "link": null, - "locked": false, - "text": "UI embarquée (go:embed web/)\nservie par GET /\n\nindex.html · app.js · style.css\n\nOnglets Recherche · Veille · Revue\nthème clair / sombre\ninterface FR / EN\n\nlocalStorage : préférences\n(searchgit.*)", - "originalText": "UI embarquée (go:embed web/)\nservie par GET /\n\nindex.html · app.js · style.css\n\nOnglets Recherche · Veille · Revue\nthème clair / sombre\ninterface FR / EN\n\nlocalStorage : préférences\n(searchgit.*)", - "fontSize": 16, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "lineHeight": 1.25, - "baseline": 214, - "autoResize": true - }, - { - "id": "rectangle-5", - "type": "rectangle", - "x": 420, - "y": 80, - "width": 880, - "height": 820, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "dashed", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 3 - }, "seed": 922121677, "version": 1, "versionNonce": 161042649, @@ -170,17 +160,27 @@ "boundElements": null, "updated": 1759386000000, "link": null, - "locked": false + "locked": false, + "text": "Gitea vLab-BZH/searchgit", + "originalText": "Gitea vLab-BZH/searchgit", + "fontSize": 18, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 16, + "autoResize": true }, { "id": "text-6", "type": "text", - "x": 436, - "y": 90, - "width": 605.0, - "height": 25.0, + "x": 54, + "y": 57.400000000000006, + "width": 246.40000000000003, + "height": 40.0, "angle": 0, - "strokeColor": "#1971c2", + "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, @@ -198,53 +198,24 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "Conteneur Docker « searchgit » (alpine 3.24, port 8080)", - "originalText": "Conteneur Docker « searchgit » (alpine 3.24, port 8080)", - "fontSize": 20, + "text": "git pull\ndocker compose up -d --build", + "originalText": "git pull\ndocker compose up -d --build", + "fontSize": 16, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 18, + "baseline": 34, "autoResize": true }, { - "id": "rectangle-7", - "type": "rectangle", - "x": 460, - "y": 140, - "width": 400, - "height": 70, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#ffec99", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 3 - }, - "seed": 1796035740, - "version": 1, - "versionNonce": 300026768, - "isDeleted": false, - "boundElements": null, - "updated": 1759386000000, - "link": null, - "locked": false - }, - { - "id": "text-8", - "type": "text", - "x": 474, - "y": 150, - "width": 198.00000000000003, - "height": 22.5, + "id": "arrow-7", + "type": "arrow", + "x": 360, + "y": 75, + "width": 40, + "height": 0, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -255,7 +226,54 @@ "opacity": 100, "groupIds": [], "frameId": null, - "roundness": null, + "roundness": { + "type": 2 + }, + "seed": 1796035740, + "version": 1, + "versionNonce": 300026768, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 40, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "rectangle-8", + "type": "rectangle", + "x": 40, + "y": 160, + "width": 320, + "height": 400, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, "seed": 1033639717, "version": 1, "versionNonce": 389609434, @@ -263,25 +281,15 @@ "boundElements": null, "updated": 1759386000000, "link": null, - "locked": false, - "text": "Middleware basicAuth", - "originalText": "Middleware basicAuth", - "fontSize": 18, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "lineHeight": 1.25, - "baseline": 16, - "autoResize": true + "locked": false }, { "id": "text-9", "type": "text", - "x": 474, - "y": 177.4, - "width": 325.6, - "height": 20.0, + "x": 54, + "y": 170, + "width": 110.00000000000001, + "height": 25.0, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -301,53 +309,24 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "AUTH_USER / AUTH_PASS (sauf /healthz)", - "originalText": "AUTH_USER / AUTH_PASS (sauf /healthz)", - "fontSize": 16, + "text": "Navigateur", + "originalText": "Navigateur", + "fontSize": 20, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 14, + "baseline": 18, "autoResize": true }, { - "id": "rectangle-10", - "type": "rectangle", - "x": 460, - "y": 240, - "width": 400, - "height": 260, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#b2f2bb", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 3 - }, - "seed": 531725348, - "version": 1, - "versionNonce": 958804058, - "isDeleted": false, - "boundElements": null, - "updated": 1759386000000, - "link": null, - "locked": false - }, - { - "id": "text-11", + "id": "text-10", "type": "text", - "x": 474, - "y": 250, - "width": 465.3, - "height": 22.5, + "x": 54, + "y": 200.0, + "width": 299.20000000000005, + "height": 220.0, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -359,6 +338,45 @@ "groupIds": [], "frameId": null, "roundness": null, + "seed": 531725348, + "version": 1, + "versionNonce": 958804058, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "UI embarquée (go:embed web/)\nservie par GET /\n\nindex.html · app.js · style.css\n\nOnglets Recherche · Veille · Revue\nthème clair / sombre\ninterface FR / EN\n\nlocalStorage : préférences\n(searchgit.*)", + "originalText": "UI embarquée (go:embed web/)\nservie par GET /\n\nindex.html · app.js · style.css\n\nOnglets Recherche · Veille · Revue\nthème clair / sombre\ninterface FR / EN\n\nlocalStorage : préférences\n(searchgit.*)", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 214, + "autoResize": true + }, + { + "id": "rectangle-11", + "type": "rectangle", + "x": 420, + "y": 80, + "width": 880, + "height": 820, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, "seed": 265695474, "version": 1, "versionNonce": 1703729685, @@ -366,27 +384,17 @@ "boundElements": null, "updated": 1759386000000, "link": null, - "locked": false, - "text": "Serveur Go : routes HTTP (api.go, saved_api.go)", - "originalText": "Serveur Go : routes HTTP (api.go, saved_api.go)", - "fontSize": 18, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "lineHeight": 1.25, - "baseline": 16, - "autoResize": true + "locked": false }, { "id": "text-12", "type": "text", - "x": 474, - "y": 277.4, - "width": 343.20000000000005, - "height": 160.0, + "x": 436, + "y": 90, + "width": 770.0000000000001, + "height": 25.0, "angle": 0, - "strokeColor": "#1e1e1e", + "strokeColor": "#1971c2", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, @@ -404,27 +412,27 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "GET / fichiers statiques\nGET /healthz sonde de santé\nGET /api/search recherche directe\nGET /api/status jeton, quota, fuseau\nGET|POST /api/saved\nGET|PUT|DELETE /api/saved/{id}\nPOST /api/saved/{id}/run\nGET /api/saved/{id}/runs[/{run}]", - "originalText": "GET / fichiers statiques\nGET /healthz sonde de santé\nGET /api/search recherche directe\nGET /api/status jeton, quota, fuseau\nGET|POST /api/saved\nGET|PUT|DELETE /api/saved/{id}\nPOST /api/saved/{id}/run\nGET /api/saved/{id}/runs[/{run}]", - "fontSize": 16, + "text": "Conteneur Docker « searchgit » (alpine 3.24, port 8080 publié en 8686)", + "originalText": "Conteneur Docker « searchgit » (alpine 3.24, port 8080 publié en 8686)", + "fontSize": 20, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 154, + "baseline": 18, "autoResize": true }, { "id": "rectangle-13", "type": "rectangle", "x": 460, - "y": 530, + "y": 140, "width": 400, - "height": 80, + "height": 70, "angle": 0, "strokeColor": "#1e1e1e", - "backgroundColor": "#b2f2bb", + "backgroundColor": "#ffec99", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", @@ -448,8 +456,8 @@ "id": "text-14", "type": "text", "x": 474, - "y": 540, - "width": 188.10000000000002, + "y": 150, + "width": 198.00000000000003, "height": 22.5, "angle": 0, "strokeColor": "#1e1e1e", @@ -470,8 +478,8 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "Critères (query.go)", - "originalText": "Critères (query.go)", + "text": "Middleware basicAuth", + "originalText": "Middleware basicAuth", "fontSize": 18, "fontFamily": 1, "textAlign": "left", @@ -485,7 +493,7 @@ "id": "text-15", "type": "text", "x": 474, - "y": 567.4, + "y": 177.4, "width": 325.6, "height": 20.0, "angle": 0, @@ -507,8 +515,8 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "ParseCriteria → requête GitHub « q= »", - "originalText": "ParseCriteria → requête GitHub « q= »", + "text": "AUTH_USER / AUTH_PASS (sauf /healthz)", + "originalText": "AUTH_USER / AUTH_PASS (sauf /healthz)", "fontSize": 16, "fontFamily": 1, "textAlign": "left", @@ -522,9 +530,9 @@ "id": "rectangle-16", "type": "rectangle", "x": 460, - "y": 660, + "y": 240, "width": 400, - "height": 110, + "height": 260, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "#b2f2bb", @@ -551,8 +559,8 @@ "id": "text-17", "type": "text", "x": 474, - "y": 670, - "width": 188.10000000000002, + "y": 250, + "width": 465.3, "height": 22.5, "angle": 0, "strokeColor": "#1e1e1e", @@ -573,8 +581,8 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "Stockage (store.go)", - "originalText": "Stockage (store.go)", + "text": "Serveur Go : routes HTTP (api.go, saved_api.go)", + "originalText": "Serveur Go : routes HTTP (api.go, saved_api.go)", "fontSize": 18, "fontFamily": 1, "textAlign": "left", @@ -588,9 +596,9 @@ "id": "text-18", "type": "text", "x": 474, - "y": 697.4, - "width": 281.6, - "height": 60.0, + "y": 277.4, + "width": 343.20000000000005, + "height": 160.0, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -610,27 +618,27 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "fichiers JSON, écriture atomique\n(fichier .tmp puis rename)\nmarque nouveaux / en hausse", - "originalText": "fichiers JSON, écriture atomique\n(fichier .tmp puis rename)\nmarque nouveaux / en hausse", + "text": "GET / fichiers statiques\nGET /healthz sonde de santé\nGET /api/search recherche directe\nGET /api/status jeton, quota, fuseau\nGET|POST /api/saved\nGET|PUT|DELETE /api/saved/{id}\nPOST /api/saved/{id}/run\nGET /api/saved/{id}/runs[/{run}]", + "originalText": "GET / fichiers statiques\nGET /healthz sonde de santé\nGET /api/search recherche directe\nGET /api/status jeton, quota, fuseau\nGET|POST /api/saved\nGET|PUT|DELETE /api/saved/{id}\nPOST /api/saved/{id}/run\nGET /api/saved/{id}/runs[/{run}]", "fontSize": 16, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 54, + "baseline": 154, "autoResize": true }, { "id": "rectangle-19", "type": "rectangle", - "x": 920, - "y": 140, - "width": 350, - "height": 130, + "x": 460, + "y": 530, + "width": 400, + "height": 80, "angle": 0, "strokeColor": "#1e1e1e", - "backgroundColor": "#e9ecef", + "backgroundColor": "#b2f2bb", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", @@ -653,9 +661,9 @@ { "id": "text-20", "type": "text", - "x": 934, - "y": 150, - "width": 198.00000000000003, + "x": 474, + "y": 540, + "width": 188.10000000000002, "height": 22.5, "angle": 0, "strokeColor": "#1e1e1e", @@ -676,8 +684,8 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "Sandbox du conteneur", - "originalText": "Sandbox du conteneur", + "text": "Critères (query.go)", + "originalText": "Critères (query.go)", "fontSize": 18, "fontFamily": 1, "textAlign": "left", @@ -690,10 +698,10 @@ { "id": "text-21", "type": "text", - "x": 934, - "y": 177.4, - "width": 237.60000000000002, - "height": 80.0, + "x": 474, + "y": 567.4, + "width": 325.6, + "height": 20.0, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -713,27 +721,27 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "binaire Go statique (CGO=0)\nutilisateur non-root 10001\nseul /data est inscriptible\nHEALTHCHECK → /healthz", - "originalText": "binaire Go statique (CGO=0)\nutilisateur non-root 10001\nseul /data est inscriptible\nHEALTHCHECK → /healthz", + "text": "ParseCriteria → requête GitHub « q= »", + "originalText": "ParseCriteria → requête GitHub « q= »", "fontSize": 16, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 74, + "baseline": 14, "autoResize": true }, { "id": "rectangle-22", "type": "rectangle", - "x": 920, - "y": 300, - "width": 350, - "height": 150, + "x": 460, + "y": 660, + "width": 400, + "height": 110, "angle": 0, "strokeColor": "#1e1e1e", - "backgroundColor": "#d0bfff", + "backgroundColor": "#b2f2bb", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", @@ -756,9 +764,9 @@ { "id": "text-23", "type": "text", - "x": 934, - "y": 310, - "width": 277.20000000000005, + "x": 474, + "y": 670, + "width": 188.10000000000002, "height": 22.5, "angle": 0, "strokeColor": "#1e1e1e", @@ -779,8 +787,8 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "Planificateur (scheduler.go)", - "originalText": "Planificateur (scheduler.go)", + "text": "Stockage (store.go)", + "originalText": "Stockage (store.go)", "fontSize": 18, "fontFamily": 1, "textAlign": "left", @@ -793,10 +801,10 @@ { "id": "text-24", "type": "text", - "x": 934, - "y": 337.4, - "width": 290.40000000000003, - "height": 80.0, + "x": 474, + "y": 697.4, + "width": 281.6, + "height": 60.0, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -816,27 +824,27 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "tic toutes les 30 s (heure TZ)\nune exécution à la fois (mutex)\nheures / jour / semaine\nquota épuisé → nouvel essai 3 min", - "originalText": "tic toutes les 30 s (heure TZ)\nune exécution à la fois (mutex)\nheures / jour / semaine\nquota épuisé → nouvel essai 3 min", + "text": "fichiers JSON, écriture atomique\n(fichier .tmp puis rename)\nmarque nouveaux / en hausse", + "originalText": "fichiers JSON, écriture atomique\n(fichier .tmp puis rename)\nmarque nouveaux / en hausse", "fontSize": 16, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 74, + "baseline": 54, "autoResize": true }, { "id": "rectangle-25", "type": "rectangle", "x": 920, - "y": 530, + "y": 140, "width": 350, "height": 130, "angle": 0, "strokeColor": "#1e1e1e", - "backgroundColor": "#d0bfff", + "backgroundColor": "#e9ecef", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", @@ -860,8 +868,8 @@ "id": "text-26", "type": "text", "x": 934, - "y": 540, - "width": 247.50000000000003, + "y": 150, + "width": 217.8, "height": 22.5, "angle": 0, "strokeColor": "#1e1e1e", @@ -882,8 +890,8 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "Client GitHub (github.go)", - "originalText": "Client GitHub (github.go)", + "text": "Isolation du conteneur", + "originalText": "Isolation du conteneur", "fontSize": 18, "fontFamily": 1, "textAlign": "left", @@ -897,9 +905,9 @@ "id": "text-27", "type": "text", "x": 934, - "y": 567.4, - "width": 299.20000000000005, - "height": 60.0, + "y": 177.4, + "width": 237.60000000000002, + "height": 80.0, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -919,27 +927,27 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "cache mémoire CACHE_TTL (5 min)\nquota RateLimit mémorisé\nAuthorization: Bearer GITHUB_TOKEN", - "originalText": "cache mémoire CACHE_TTL (5 min)\nquota RateLimit mémorisé\nAuthorization: Bearer GITHUB_TOKEN", + "text": "binaire Go statique (CGO=0)\nutilisateur non-root 10001\nseul /data est inscriptible\nHEALTHCHECK → /healthz", + "originalText": "binaire Go statique (CGO=0)\nutilisateur non-root 10001\nseul /data est inscriptible\nHEALTHCHECK → /healthz", "fontSize": 16, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 54, + "baseline": 74, "autoResize": true }, { "id": "rectangle-28", "type": "rectangle", - "x": 1380, - "y": 530, - "width": 320, - "height": 130, + "x": 920, + "y": 300, + "width": 350, + "height": 150, "angle": 0, "strokeColor": "#1e1e1e", - "backgroundColor": "#ffc9c9", + "backgroundColor": "#d0bfff", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", @@ -962,10 +970,10 @@ { "id": "text-29", "type": "text", - "x": 1394, - "y": 540, - "width": 187.00000000000003, - "height": 25.0, + "x": 934, + "y": 310, + "width": 277.20000000000005, + "height": 22.5, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -985,24 +993,24 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "API GitHub Search", - "originalText": "API GitHub Search", - "fontSize": 20, + "text": "Planificateur (scheduler.go)", + "originalText": "Planificateur (scheduler.go)", + "fontSize": 18, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 18, + "baseline": 16, "autoResize": true }, { "id": "text-30", "type": "text", - "x": 1394, - "y": 570.0, - "width": 264.0, - "height": 60.0, + "x": 934, + "y": 337.4, + "width": 290.40000000000003, + "height": 80.0, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -1022,30 +1030,30 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "api.github.com\n/search/repositories\n10 req/min sans jeton, 30 avec", - "originalText": "api.github.com\n/search/repositories\n10 req/min sans jeton, 30 avec", + "text": "tic toutes les 30 s (heure TZ)\nune exécution à la fois (mutex)\nheures / jour / semaine\nquota épuisé → nouvel essai 3 min", + "originalText": "tic toutes les 30 s (heure TZ)\nune exécution à la fois (mutex)\nheures / jour / semaine\nquota épuisé → nouvel essai 3 min", "fontSize": 16, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 54, + "baseline": 74, "autoResize": true }, { "id": "rectangle-31", "type": "rectangle", - "x": 1380, - "y": 140, - "width": 320, - "height": 250, + "x": 920, + "y": 530, + "width": 350, + "height": 130, "angle": 0, "strokeColor": "#1e1e1e", - "backgroundColor": "#fff9db", + "backgroundColor": "#d0bfff", "fillStyle": "solid", "strokeWidth": 2, - "strokeStyle": "dashed", + "strokeStyle": "solid", "roughness": 1, "opacity": 100, "groupIds": [], @@ -1065,10 +1073,10 @@ { "id": "text-32", "type": "text", - "x": 1394, - "y": 150, - "width": 209.00000000000003, - "height": 25.0, + "x": 934, + "y": 540, + "width": 247.50000000000003, + "height": 22.5, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -1088,24 +1096,24 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "Configuration (env)", - "originalText": "Configuration (env)", - "fontSize": 20, + "text": "Client GitHub (github.go)", + "originalText": "Client GitHub (github.go)", + "fontSize": 18, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 18, + "baseline": 16, "autoResize": true }, { "id": "text-33", "type": "text", - "x": 1394, - "y": 180.0, - "width": 184.8, - "height": 140.0, + "x": 934, + "y": 567.4, + "width": 299.20000000000005, + "height": 60.0, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -1125,27 +1133,27 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "GITHUB_TOKEN\nCACHE_TTL = 5m\nAUTH_USER / AUTH_PASS\nTZ = Europe/Paris\nHISTORY_KEEP = 100\nDATA_DIR = /data\nHTTP_PORT → 8080", - "originalText": "GITHUB_TOKEN\nCACHE_TTL = 5m\nAUTH_USER / AUTH_PASS\nTZ = Europe/Paris\nHISTORY_KEEP = 100\nDATA_DIR = /data\nHTTP_PORT → 8080", + "text": "cache mémoire CACHE_TTL (5 min)\nquota RateLimit mémorisé\nAuthorization: Bearer GITHUB_TOKEN", + "originalText": "cache mémoire CACHE_TTL (5 min)\nquota RateLimit mémorisé\nAuthorization: Bearer GITHUB_TOKEN", "fontSize": 16, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 134, + "baseline": 54, "autoResize": true }, { "id": "rectangle-34", "type": "rectangle", - "x": 520, - "y": 960, - "width": 640, - "height": 140, + "x": 1380, + "y": 530, + "width": 320, + "height": 130, "angle": 0, "strokeColor": "#1e1e1e", - "backgroundColor": "#ffd8a8", + "backgroundColor": "#ffc9c9", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", @@ -1168,9 +1176,9 @@ { "id": "text-35", "type": "text", - "x": 534, - "y": 970, - "width": 528.0, + "x": 1394, + "y": 540, + "width": 187.00000000000003, "height": 25.0, "angle": 0, "strokeColor": "#1e1e1e", @@ -1191,8 +1199,8 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "Volume Docker « searchgit-data » monté sur /data", - "originalText": "Volume Docker « searchgit-data » monté sur /data", + "text": "API GitHub Search", + "originalText": "API GitHub Search", "fontSize": 20, "fontFamily": 1, "textAlign": "left", @@ -1205,10 +1213,10 @@ { "id": "text-36", "type": "text", - "x": 534, - "y": 1000.0, - "width": 492.80000000000007, - "height": 80.0, + "x": 1394, + "y": 570.0, + "width": 264.0, + "height": 60.0, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -1228,36 +1236,36 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "searches.json recherches programmées\nruns//index.json résumés des passages\nruns//seen.json première apparition\nruns//.json instantané (HISTORY_KEEP)", - "originalText": "searches.json recherches programmées\nruns//index.json résumés des passages\nruns//seen.json première apparition\nruns//.json instantané (HISTORY_KEEP)", + "text": "api.github.com\n/search/repositories\n10 req/min sans jeton, 30 avec", + "originalText": "api.github.com\n/search/repositories\n10 req/min sans jeton, 30 avec", "fontSize": 16, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 74, + "baseline": 54, "autoResize": true }, { - "id": "arrow-37", - "type": "arrow", - "x": 360, - "y": 260, - "width": 100, - "height": 85, + "id": "rectangle-37", + "type": "rectangle", + "x": 1380, + "y": 140, + "width": 320, + "height": 250, "angle": 0, "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", + "backgroundColor": "#fff9db", "fillStyle": "solid", "strokeWidth": 2, - "strokeStyle": "solid", + "strokeStyle": "dashed", "roughness": 1, "opacity": 100, "groupIds": [], "frameId": null, "roundness": { - "type": 2 + "type": 3 }, "seed": 1159380354, "version": 1, @@ -1266,33 +1274,17 @@ "boundElements": null, "updated": 1759386000000, "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 100, - -85 - ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": false + "locked": false }, { "id": "text-38", "type": "text", - "x": 370, - "y": 180, - "width": 123.75000000000001, - "height": 37.5, + "x": 1394, + "y": 150, + "width": 209.00000000000003, + "height": 25.0, "angle": 0, - "strokeColor": "#495057", + "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, @@ -1310,24 +1302,24 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "HTTP :8080\nJSON + fichiers", - "originalText": "HTTP :8080\nJSON + fichiers", - "fontSize": 15, + "text": "Configuration (env)", + "originalText": "Configuration (env)", + "fontSize": 20, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 31, + "baseline": 18, "autoResize": true }, { - "id": "arrow-39", - "type": "arrow", - "x": 660, - "y": 210, - "width": 0, - "height": 30, + "id": "text-39", + "type": "text", + "x": 1394, + "y": 180.0, + "width": 202.4, + "height": 140.0, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -1338,9 +1330,7 @@ "opacity": 100, "groupIds": [], "frameId": null, - "roundness": { - "type": 2 - }, + "roundness": null, "seed": 1329753548, "version": 1, "versionNonce": 1914012529, @@ -1349,33 +1339,27 @@ "updated": 1759386000000, "link": null, "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 0, - 30 - ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": false + "text": "GITHUB_TOKEN\nCACHE_TTL = 5m\nAUTH_USER / AUTH_PASS\nTZ = Europe/Paris\nHISTORY_KEEP = 100\nDATA_DIR = /data\nHTTP_PORT = 8686 → 8080", + "originalText": "GITHUB_TOKEN\nCACHE_TTL = 5m\nAUTH_USER / AUTH_PASS\nTZ = Europe/Paris\nHISTORY_KEEP = 100\nDATA_DIR = /data\nHTTP_PORT = 8686 → 8080", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 134, + "autoResize": true }, { - "id": "arrow-40", - "type": "arrow", - "x": 660, - "y": 500, - "width": 0, - "height": 30, + "id": "rectangle-40", + "type": "rectangle", + "x": 520, + "y": 960, + "width": 640, + "height": 140, "angle": 0, "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", + "backgroundColor": "#ffd8a8", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", @@ -1384,7 +1368,7 @@ "groupIds": [], "frameId": null, "roundness": { - "type": 2 + "type": 3 }, "seed": 1222328496, "version": 1, @@ -1393,33 +1377,17 @@ "boundElements": null, "updated": 1759386000000, "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 0, - 30 - ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": false + "locked": false }, { "id": "text-41", "type": "text", - "x": 670, - "y": 505, - "width": 90.75000000000001, - "height": 18.75, + "x": 534, + "y": 970, + "width": 528.0, + "height": 25.0, "angle": 0, - "strokeColor": "#495057", + "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, @@ -1437,24 +1405,24 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "/api/search", - "originalText": "/api/search", - "fontSize": 15, + "text": "Volume Docker « searchgit-data » monté sur /data", + "originalText": "Volume Docker « searchgit-data » monté sur /data", + "fontSize": 20, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 13, + "baseline": 18, "autoResize": true }, { - "id": "arrow-42", - "type": "arrow", - "x": 860, - "y": 580, - "width": 60, - "height": 10, + "id": "text-42", + "type": "text", + "x": 534, + "y": 1000.0, + "width": 492.80000000000007, + "height": 80.0, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -1465,9 +1433,7 @@ "opacity": 100, "groupIds": [], "frameId": null, - "roundness": { - "type": 2 - }, + "roundness": null, "seed": 1982966163, "version": 1, "versionNonce": 1526706730, @@ -1476,30 +1442,24 @@ "updated": 1759386000000, "link": null, "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 60, - 10 - ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": false + "text": "searches.json recherches programmées\nruns//index.json résumés des passages\nruns//seen.json première apparition\nruns//.json instantané (HISTORY_KEEP)", + "originalText": "searches.json recherches programmées\nruns//index.json résumés des passages\nruns//seen.json première apparition\nruns//.json instantané (HISTORY_KEEP)", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 74, + "autoResize": true }, { "id": "arrow-43", "type": "arrow", - "x": 860, - "y": 390, - "width": 60, - "height": 10, + "x": 360, + "y": 260, + "width": 100, + "height": 80, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -1527,8 +1487,8 @@ 0 ], [ - 60, - -10 + 100, + -80 ] ], "lastCommittedPoint": null, @@ -1541,10 +1501,10 @@ { "id": "text-44", "type": "text", - "x": 866, - "y": 352, - "width": 41.25, - "height": 18.75, + "x": 368, + "y": 205, + "width": 82.5, + "height": 56.25, "angle": 0, "strokeColor": "#495057", "backgroundColor": "transparent", @@ -1564,24 +1524,24 @@ "updated": 1759386000000, "link": null, "locked": false, - "text": "Run()", - "originalText": "Run()", + "text": "HTTP :8686\nJSON\nfichiers", + "originalText": "HTTP :8686\nJSON\nfichiers", "fontSize": 15, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, "lineHeight": 1.25, - "baseline": 13, + "baseline": 49, "autoResize": true }, { "id": "arrow-45", "type": "arrow", - "x": 460, - "y": 460, - "width": 25, - "height": 255, + "x": 660, + "y": 210, + "width": 0, + "height": 30, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -1603,6 +1563,260 @@ "updated": 1759386000000, "link": null, "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 30 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "arrow-46", + "type": "arrow", + "x": 660, + "y": 500, + "width": 0, + "height": 30, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 555512016, + "version": 1, + "versionNonce": 1063497604, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 30 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "text-47", + "type": "text", + "x": 670, + "y": 505, + "width": 90.75000000000001, + "height": 18.75, + "angle": 0, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1708957521, + "version": 1, + "versionNonce": 1679116189, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "/api/search", + "originalText": "/api/search", + "fontSize": 15, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 13, + "autoResize": true + }, + { + "id": "arrow-48", + "type": "arrow", + "x": 860, + "y": 580, + "width": 60, + "height": 10, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 2132480061, + "version": 1, + "versionNonce": 346094056, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 60, + 10 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "arrow-49", + "type": "arrow", + "x": 860, + "y": 390, + "width": 60, + "height": 10, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 714537755, + "version": 1, + "versionNonce": 1929245187, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 60, + -10 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "text-50", + "type": "text", + "x": 866, + "y": 352, + "width": 41.25, + "height": 18.75, + "angle": 0, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1725048951, + "version": 1, + "versionNonce": 1193309984, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, + "text": "Run()", + "originalText": "Run()", + "fontSize": 15, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "lineHeight": 1.25, + "baseline": 13, + "autoResize": true + }, + { + "id": "arrow-51", + "type": "arrow", + "x": 460, + "y": 460, + "width": 25, + "height": 255, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 588093311, + "version": 1, + "versionNonce": 1849076401, + "isDeleted": false, + "boundElements": null, + "updated": 1759386000000, + "link": null, + "locked": false, "points": [ [ 0, @@ -1629,7 +1843,7 @@ "elbowed": false }, { - "id": "text-46", + "id": "text-52", "type": "text", "x": 330, "y": 600, @@ -1646,9 +1860,9 @@ "groupIds": [], "frameId": null, "roundness": null, - "seed": 555512016, + "seed": 1195809358, "version": 1, - "versionNonce": 1063497604, + "versionNonce": 1783684942, "isDeleted": false, "boundElements": null, "updated": 1759386000000, @@ -1666,7 +1880,7 @@ "autoResize": true }, { - "id": "arrow-47", + "id": "arrow-53", "type": "arrow", "x": 1095, "y": 450, @@ -1685,9 +1899,9 @@ "roundness": { "type": 2 }, - "seed": 1708957521, + "seed": 1540910401, "version": 1, - "versionNonce": 1679116189, + "versionNonce": 1633982922, "isDeleted": false, "boundElements": null, "updated": 1759386000000, @@ -1711,7 +1925,7 @@ "elbowed": false }, { - "id": "text-48", + "id": "text-54", "type": "text", "x": 1105, "y": 475, @@ -1728,9 +1942,9 @@ "groupIds": [], "frameId": null, "roundness": null, - "seed": 2132480061, + "seed": 991070208, "version": 1, - "versionNonce": 346094056, + "versionNonce": 648200382, "isDeleted": false, "boundElements": null, "updated": 1759386000000, @@ -1748,7 +1962,7 @@ "autoResize": true }, { - "id": "arrow-49", + "id": "arrow-55", "type": "arrow", "x": 920, "y": 430, @@ -1767,9 +1981,9 @@ "roundness": { "type": 2 }, - "seed": 714537755, + "seed": 356416555, "version": 1, - "versionNonce": 1929245187, + "versionNonce": 756849393, "isDeleted": false, "boundElements": null, "updated": 1759386000000, @@ -1801,7 +2015,7 @@ "elbowed": false }, { - "id": "text-50", + "id": "text-56", "type": "text", "x": 898, "y": 680, @@ -1818,9 +2032,9 @@ "groupIds": [], "frameId": null, "roundness": null, - "seed": 1725048951, + "seed": 649821630, "version": 1, - "versionNonce": 1193309984, + "versionNonce": 996247159, "isDeleted": false, "boundElements": null, "updated": 1759386000000, @@ -1838,7 +2052,7 @@ "autoResize": true }, { - "id": "arrow-51", + "id": "arrow-57", "type": "arrow", "x": 1270, "y": 595, @@ -1857,9 +2071,9 @@ "roundness": { "type": 2 }, - "seed": 588093311, + "seed": 1002170859, "version": 1, - "versionNonce": 1849076401, + "versionNonce": 51810463, "isDeleted": false, "boundElements": null, "updated": 1759386000000, @@ -1883,7 +2097,7 @@ "elbowed": false }, { - "id": "text-52", + "id": "text-58", "type": "text", "x": 1280, "y": 565, @@ -1900,9 +2114,9 @@ "groupIds": [], "frameId": null, "roundness": null, - "seed": 1195809358, + "seed": 2082899072, "version": 1, - "versionNonce": 1783684942, + "versionNonce": 783156688, "isDeleted": false, "boundElements": null, "updated": 1759386000000, @@ -1920,7 +2134,7 @@ "autoResize": true }, { - "id": "arrow-53", + "id": "arrow-59", "type": "arrow", "x": 660, "y": 770, @@ -1939,9 +2153,9 @@ "roundness": { "type": 2 }, - "seed": 1540910401, + "seed": 1128488134, "version": 1, - "versionNonce": 1633982922, + "versionNonce": 1210883261, "isDeleted": false, "boundElements": null, "updated": 1759386000000, @@ -1965,7 +2179,7 @@ "elbowed": false }, { - "id": "text-54", + "id": "text-60", "type": "text", "x": 672, "y": 850, @@ -1982,9 +2196,9 @@ "groupIds": [], "frameId": null, "roundness": null, - "seed": 991070208, + "seed": 17581914, "version": 1, - "versionNonce": 648200382, + "versionNonce": 625675343, "isDeleted": false, "boundElements": null, "updated": 1759386000000, @@ -2002,7 +2216,7 @@ "autoResize": true }, { - "id": "arrow-55", + "id": "arrow-61", "type": "arrow", "x": 1380, "y": 265, @@ -2021,9 +2235,9 @@ "roundness": { "type": 2 }, - "seed": 356416555, + "seed": 1799361520, "version": 1, - "versionNonce": 756849393, + "versionNonce": 1585932014, "isDeleted": false, "boundElements": null, "updated": 1759386000000, @@ -2047,7 +2261,7 @@ "elbowed": false }, { - "id": "text-56", + "id": "text-62", "type": "text", "x": 1290, "y": 240, @@ -2064,9 +2278,9 @@ "groupIds": [], "frameId": null, "roundness": null, - "seed": 649821630, + "seed": 1368426742, "version": 1, - "versionNonce": 996247159, + "versionNonce": 538981927, "isDeleted": false, "boundElements": null, "updated": 1759386000000, -- 2.54.0 From 34300b20a3a2f8dc2dcdab7ec3b6a44219beb394 Mon Sep 17 00:00:00 2001 From: claude Date: Fri, 2 Oct 2026 08:33:52 +0200 Subject: [PATCH 3/5] =?UTF-8?q?docs:=20fl=C3=A8ches=20coud=C3=A9es=20nette?= =?UTF-8?q?s=20dans=20le=20sch=C3=A9ma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/architecture.excalidraw | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/architecture.excalidraw b/docs/architecture.excalidraw index 3b8503f..e18f06f 100644 --- a/docs/architecture.excalidraw +++ b/docs/architecture.excalidraw @@ -1806,9 +1806,7 @@ "opacity": 100, "groupIds": [], "frameId": null, - "roundness": { - "type": 2 - }, + "roundness": null, "seed": 588093311, "version": 1, "versionNonce": 1849076401, @@ -1845,7 +1843,7 @@ { "id": "text-52", "type": "text", - "x": 330, + "x": 300, "y": 600, "width": 82.5, "height": 37.5, @@ -1978,9 +1976,7 @@ "opacity": 100, "groupIds": [], "frameId": null, - "roundness": { - "type": 2 - }, + "roundness": null, "seed": 356416555, "version": 1, "versionNonce": 756849393, -- 2.54.0 From 707fff4ed951fd5b44bfba716496dd0f46c981d0 Mon Sep 17 00:00:00 2001 From: claude Date: Fri, 2 Oct 2026 09:06:22 +0200 Subject: [PATCH 4/5] =?UTF-8?q?docs:=20image=20SVG=20du=20sch=C3=A9ma=20d'?= =?UTF-8?q?architecture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/architecture.svg | 103 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 docs/architecture.svg diff --git a/docs/architecture.svg b/docs/architecture.svg new file mode 100644 index 0000000..73bbeb6 --- /dev/null +++ b/docs/architecture.svg @@ -0,0 +1,103 @@ + + + +Searchgit : architecture logique + + +Sandbox : serveur de Cédric (hôte Docker 192.168.200.158) + + +Gitea vLab-BZH/searchgit +git pulldocker compose up -d --build + + + + + +Navigateur +UI embarquée (go:embed web/)servie par GET /index.html · app.js · style.cssOnglets Recherche · Veille · Revuethème clair / sombreinterface FR / ENlocalStorage : préférences(searchgit.*) + +Conteneur Docker « searchgit » (alpine 3.24, port 8080 publié en 8686) + + +Middleware basicAuth +AUTH_USER / AUTH_PASS (sauf /healthz) + + +Serveur Go : routes HTTP (api.go, saved_api.go) +GET / fichiers statiquesGET /healthz sonde de santéGET /api/search recherche directeGET /api/status jeton, quota, fuseauGET|POST /api/savedGET|PUT|DELETE /api/saved/{id}POST /api/saved/{id}/runGET /api/saved/{id}/runs[/{run}] + + +Critères (query.go) +ParseCriteria → requête GitHub « q= » + + +Stockage (store.go) +fichiers JSON, écriture atomique(fichier .tmp puis rename)marque nouveaux / en hausse + + +Isolation du conteneur +binaire Go statique (CGO=0)utilisateur non-root 10001seul /data est inscriptibleHEALTHCHECK → /healthz + + +Planificateur (scheduler.go) +tic toutes les 30 s (heure TZ)une exécution à la fois (mutex)heures / jour / semainequota épuisé → nouvel essai 3 min + + +Client GitHub (github.go) +cache mémoire CACHE_TTL (5 min)quota RateLimit mémoriséAuthorization: Bearer GITHUB_TOKEN + + +API GitHub Search +api.github.com/search/repositories10 req/min sans jeton, 30 avec + + +Configuration (env) +GITHUB_TOKENCACHE_TTL = 5mAUTH_USER / AUTH_PASSTZ = Europe/ParisHISTORY_KEEP = 100DATA_DIR = /dataHTTP_PORT = 8686 → 8080 + + +Volume Docker « searchgit-data » monté sur /data +searches.json recherches programméesruns/<id>/index.json résumés des passagesruns/<id>/seen.json première apparitionruns/<id>/<run>.json instantané (HISTORY_KEEP) + + + +HTTP :8686JSONfichiers + + + + + + +/api/search + + + + + + +Run() + + + +CRUDhistorique + + + +Search() + + + +AddRunUpdate + + + +REST HTTPS + + + +lecture / écriture JSON + + + +variables + -- 2.54.0 From ee118f47355037be7ffe8c8a4b5f9f1d5f863773 Mon Sep 17 00:00:00 2001 From: claude Date: Fri, 2 Oct 2026 09:07:13 +0200 Subject: [PATCH 5/5] =?UTF-8?q?docs:=20sch=C3=A9ma=20d'architecture=20dans?= =?UTF-8?q?=20le=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) --- README.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 710a05d..1c17342 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,15 @@ Recherche de dépôts GitHub selon des critères, avec une interface web claire résultats (thème clair/sombre, responsive, interface en anglais ou en français). L'interface reprend le style de [Logstream](https://gitea.vlab.bzh/cedric/logstream). -``` -navigateur ──/api/search──▶ searchgit (Go) ──REST──▶ api.github.com/search/repositories - ──/api/saved───▶ ├── cache 5 min - └── planificateur ──▶ /data (instantanés JSON) -``` +## Architecture + +![Schéma d'architecture logique de Searchgit](docs/architecture.svg) + +Le navigateur charge l'interface embarquée dans le binaire Go, puis appelle l'API `/api/*` du +serveur. Le serveur interroge l'API GitHub Search à travers un cache mémoire de 5 minutes ; le +planificateur relance les recherches programmées et enregistre leurs instantanés en JSON dans le +volume `searchgit-data`. Le schéma se modifie dans +[`docs/architecture.excalidraw`](docs/architecture.excalidraw) (excalidraw.com, menu Ouvrir). ## Démarrage rapide -- 2.54.0