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.
Container diagram
Section titled “Container diagram”graph LR
Browser["Browser"] -->|"localhost:4263"| app["app\nFastAPI + React\n(SQLite + LocalFsClient)"]
app -->|"bind mount"| data[("config/app")]
Config folder
Section titled “Config folder”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
- …
Database scale
Section titled “Database scale”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.