2.8 KiB
2.8 KiB
Architectuur
Lagen
molodetz/main.py: FastAPI-object (/swagger,/openapi.json), lifespan (init-lock,init_db, bootstrap, services met service-lock), statische mounts (uploads, versioned/static/v<STATIC_VERSION>/, fallback), middleware in templatevolgorde, exception handlers, routers.molodetz/config.py: enige plek voorload_dotenv, paden, env-bindingen met prefixMOLODETZ_,APP_VERSIONviatomllib,BOOT_ID,STATIC_VERSION.molodetz/database/: synchronedataset-handle (SQLAlchemy NullPool, WAL-PRAGMA's), per-tabel modules, soft delete met registries,init_dbmet indexen enANALYZE. Geen async driver; routes lopen in de threadpool waar nodig.molodetz/routers/: een module per oppervlak. Elke HTML-route geeft JSON bijAccept: application/jsonviaresponses.responden een Pydantic-uitvoerschema uitschemas/.molodetz/templating.py: de enigeJinja2Templates. Globalsstatic_url,local_dt,avatar_url,render_contenten meer.molodetz/rendering.py: server-side markdown (mistune, escape aan), emoji, URL-allowlist, streepjesnormalisatie. Gepubliceerde inhoud wordt altijd server-side gerenderd.molodetz/stealth.py: enige fabriek voor uitgaande HTTP-clients (httpx met curl_cffi-transport,net_guardSSRF-bescherming).link_check.pygebruikt hem voor de repo-linkcontrole bij aanmeldingen.molodetz/services/: achtergrondservices (presence, housekeeping, backup) onder eenServiceManager, zichtbaar en bestuurbaar via/admin/services.molodetz/gallery.py: flyers en memes uitstatic/media/, Pillow-thumbnails (webp) als blobs onderdata/uploads, perceptuele hash (imagehash) tegen duplicaten.molodetz/cli/: argparse-CLImolodetz.molodetz/static/js/: ES6-modules zonder bundler.Application.jslaadtcomponents/index.js(custom elements in light DOM) en zet singletons opwindow.app. Vendor: marked, DOMPurify, highlight.js als ES-modules instatic/vendor/.molodetz/static/css/: handgeschreven, tokens invariables.css, breakpoints exact 360/480/768/1024.
Auth
Sessiecookie (HttpOnly, SameSite=Lax, Secure achter TLS), rijen in sessions. Daarnaast X-API-KEY, Authorization: Bearer <api key> en Basic voor scripts. Wachtwoorden met passlib PBKDF2-SHA256. Geen JWT, geen OAuth. De eerste gebruiker is de beheerder uit .env; er is geen publieke registratie.
Datastromen
- Schrijven: beheerder ->
/admin/posts->content.create_post/edit_post-> SQLite -> server-render bij lezen (lru-cache op tekst). - Aanmelden: bezoeker ->
POST /binnen(honeypot, rate limit) ->join_requests-> melding aan beheerders ->/admin/joins. - Galerij: start ->
sync_gallery->media-tabel + thumbnails ->/flyers,/memesmet lightbox.