Skip to content

Architecture

MC GamerTime runs as a single mc-gamertime container (FastAPI + React, embedded SQLite, local filesystem storage). A one-shot mc-gamertime-init container runs first to fix ownership on the bind-mounted config/ directory, then exits. There is no built-in reverse proxy or TLS termination — see HTTPS / Reverse Proxy for bringing your own.

graph LR
  Browser["Browser"] -->|"localhost:4263"| app["app\nFastAPI + React\n(SQLite + LocalFsClient)"]
  app -->|"bind mount"| data[("config/app")]

Runtime data lives in ./config/ on the host — no Docker volume commands needed.

  • Directoryconfig/
    • Directoryapp/
      • boardsite.db SQLite database
      • .jwt_secret auto-generated, mode 0600, never served
      • Directorystorage/
        • Directoryavatars/ user avatar PNGs
        • Directoryblog-images/ blog post uploads
        • Directorygame-images/ game cover uploads

The SQLite backend mirrors the DynamoDB data model: one table per entity type, each row a primary key plus a JSON document, and list endpoints read the whole table. There are no secondary indexes. That is the right trade for a friend group logging a few hundred sessions a year; it is not built for thousands of players or tens of thousands of results. If you outgrow it, the AWS deployment is the intended next step.

Port 4263 is the only port exposed to the host. See Quickstart → What’s running.