317 lines
5.8 KiB
JSON
317 lines
5.8 KiB
JSON
{
|
|
"schema_version": 1,
|
|
"diagram_type": "architecture",
|
|
"meta": {
|
|
"title": "Kontra \u2014 GOTH News-Opinion Site",
|
|
"output": "kontra-architecture-map.html",
|
|
"quality_profile": "showcase",
|
|
"views": [
|
|
{
|
|
"id": "publish-path",
|
|
"label": "Content publish path",
|
|
"focus": [
|
|
"editors",
|
|
"git",
|
|
"pull",
|
|
"bin",
|
|
"caddy",
|
|
"users"
|
|
],
|
|
"note": "Editors push markdown to Gitea; production pulls and serves it automatically."
|
|
},
|
|
{
|
|
"id": "auth-and-media",
|
|
"label": "Auth and media",
|
|
"focus": [
|
|
"auth",
|
|
"admin",
|
|
"bin",
|
|
"garage"
|
|
],
|
|
"note": "Decap logs in via Gitea OAuth; site media resolves from Garage S3 shortcodes."
|
|
}
|
|
]
|
|
},
|
|
"components": [
|
|
{
|
|
"id": "editors",
|
|
"type": "external",
|
|
"label": "Editors",
|
|
"sublabel": "Obsidian \u00b7 Neovim \u00b7 CLI",
|
|
"pos": [
|
|
40,
|
|
300
|
|
],
|
|
"size": [
|
|
130,
|
|
64
|
|
]
|
|
},
|
|
{
|
|
"id": "admin",
|
|
"type": "frontend",
|
|
"label": "Decap CMS",
|
|
"sublabel": "admin.kontra.lab",
|
|
"pos": [
|
|
40,
|
|
160
|
|
],
|
|
"size": [
|
|
130,
|
|
64
|
|
]
|
|
},
|
|
{
|
|
"id": "auth",
|
|
"type": "security",
|
|
"label": "Gitea OAuth",
|
|
"sublabel": "PKCE",
|
|
"pos": [
|
|
250,
|
|
110
|
|
],
|
|
"size": [
|
|
130,
|
|
56
|
|
],
|
|
"tag": "non-confidential"
|
|
},
|
|
{
|
|
"id": "git",
|
|
"type": "cloud",
|
|
"label": "Gitea",
|
|
"sublabel": "sam/kontra-content",
|
|
"pos": [
|
|
250,
|
|
300
|
|
],
|
|
"size": [
|
|
150,
|
|
64
|
|
],
|
|
"tag": "origin of truth"
|
|
},
|
|
{
|
|
"id": "pull",
|
|
"type": "backend",
|
|
"label": "Pull loop",
|
|
"sublabel": "git pull \u00b7 30s",
|
|
"pos": [
|
|
470,
|
|
300
|
|
],
|
|
"size": [
|
|
140,
|
|
64
|
|
]
|
|
},
|
|
{
|
|
"id": "bin",
|
|
"type": "backend",
|
|
"label": "Go binary",
|
|
"sublabel": "templ + htmx + Goldmark",
|
|
"pos": [
|
|
680,
|
|
300
|
|
],
|
|
"size": [
|
|
160,
|
|
68
|
|
],
|
|
"tag": ":8600 Docker"
|
|
},
|
|
{
|
|
"id": "garage",
|
|
"type": "cloud",
|
|
"label": "Git media",
|
|
"sublabel": "images beside articles",
|
|
"pos": [
|
|
680,
|
|
160
|
|
],
|
|
"size": [
|
|
150,
|
|
64
|
|
]
|
|
},
|
|
{
|
|
"id": "caddy",
|
|
"type": "cloud",
|
|
"label": "Caddy master",
|
|
"sublabel": ":80/:443 reverse proxy",
|
|
"pos": [
|
|
900,
|
|
300
|
|
],
|
|
"size": [
|
|
150,
|
|
64
|
|
]
|
|
},
|
|
{
|
|
"id": "users",
|
|
"type": "external",
|
|
"label": "Readers",
|
|
"sublabel": "public web",
|
|
"pos": [
|
|
1120,
|
|
300
|
|
],
|
|
"size": [
|
|
130,
|
|
64
|
|
]
|
|
}
|
|
],
|
|
"boundaries": [
|
|
{
|
|
"kind": "region",
|
|
"label": "Editors (dev box .27)",
|
|
"wraps": [
|
|
"editors",
|
|
"admin"
|
|
]
|
|
},
|
|
{
|
|
"kind": "region",
|
|
"label": "Gitea Docker (.35)",
|
|
"wraps": [
|
|
"auth",
|
|
"git"
|
|
]
|
|
},
|
|
{
|
|
"kind": "region",
|
|
"label": "Kontra container (.13 :8600)",
|
|
"wraps": [
|
|
"pull",
|
|
"bin",
|
|
"garage"
|
|
]
|
|
},
|
|
{
|
|
"kind": "region",
|
|
"label": "Edge (Caddy .35)",
|
|
"wraps": [
|
|
"caddy",
|
|
"users"
|
|
]
|
|
}
|
|
],
|
|
"connections": [
|
|
{
|
|
"id": "editors-git",
|
|
"from": "editors",
|
|
"to": "git",
|
|
"label": "git push",
|
|
"variant": "emphasis"
|
|
},
|
|
{
|
|
"id": "admin-git",
|
|
"from": "admin",
|
|
"to": "git",
|
|
"label": "commit",
|
|
"fromSide": "bottom",
|
|
"toSide": "top",
|
|
"variant": "dashed"
|
|
},
|
|
{
|
|
"id": "auth-login",
|
|
"from": "admin",
|
|
"to": "auth",
|
|
"label": "Login with Gitea",
|
|
"variant": "security",
|
|
"fromSide": "right",
|
|
"toSide": "bottom",
|
|
"labelAt": [
|
|
308,
|
|
180
|
|
]
|
|
},
|
|
{
|
|
"id": "auth-git",
|
|
"from": "auth",
|
|
"to": "git",
|
|
"label": "authorize",
|
|
"variant": "security",
|
|
"fromSide": "bottom",
|
|
"toSide": "left"
|
|
},
|
|
{
|
|
"id": "git-pull",
|
|
"from": "git",
|
|
"to": "pull",
|
|
"label": "SSH",
|
|
"variant": "emphasis"
|
|
},
|
|
{
|
|
"id": "pull-bin",
|
|
"from": "pull",
|
|
"to": "bin",
|
|
"label": "restart on change",
|
|
"labelAt": [
|
|
645,
|
|
378
|
|
]
|
|
},
|
|
{
|
|
"id": "bin-garage",
|
|
"from": "bin",
|
|
"to": "garage",
|
|
"label": "media shortcode",
|
|
"variant": "dashed",
|
|
"fromSide": "top",
|
|
"toSide": "bottom",
|
|
"labelDy": -58,
|
|
"labelAt": [
|
|
768,
|
|
238
|
|
]
|
|
},
|
|
{
|
|
"id": "bin-caddy",
|
|
"from": "bin",
|
|
"to": "caddy",
|
|
"label": "reverse_proxy :8600",
|
|
"labelAt": [
|
|
870,
|
|
378
|
|
]
|
|
},
|
|
{
|
|
"id": "caddy-users",
|
|
"from": "caddy",
|
|
"to": "users",
|
|
"label": "HTTPS",
|
|
"variant": "emphasis"
|
|
}
|
|
],
|
|
"cards": [
|
|
{
|
|
"dot": "emerald",
|
|
"title": "Publish path",
|
|
"items": [
|
|
"Editors write markdown + front-matter in Obsidian/Neovim/CLI",
|
|
"All commits land on Gitea sam/kontra-content (origin)",
|
|
"Production container pulls every 30s and restarts on change"
|
|
]
|
|
},
|
|
{
|
|
"dot": "cyan",
|
|
"title": "Serving",
|
|
"items": [
|
|
"Single static Go binary (templ + htmx + Tailwind tokens)",
|
|
"Goldmark renders markdown per request; SEO-friendly",
|
|
"Caddy master terminates HTTPS and proxies :8600"
|
|
]
|
|
},
|
|
{
|
|
"dot": "rose",
|
|
"title": "Auth & media",
|
|
"items": [
|
|
"Decap CMS logs in with Gitea OAuth (PKCE)",
|
|
"Media = git files beside articles; {{media:slug/file}}"
|
|
]
|
|
}
|
|
]
|
|
} |