2184a1892f
- schema.ts: zod schemas per DATA_MODEL (profile, projects, experience, skills, meta)
- nested {en,no} model: invariant facts once, prose twice; validated at build
- content: profile, skills, experience (with apprentice->developer progression),
JobTrack + InboxIntel case studies with data-driven arch diagrams, homelab capability page
- per-page SEO meta (EN/NO)
- content.ts: locale-resolved view models; CV PDFs wired
- deviation from literal Astro-collections logged in PROJECT_STATUS with rationale
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
191 lines
6.2 KiB
TypeScript
191 lines
6.2 KiB
TypeScript
import type { Project } from '@lib/schema';
|
||
|
||
/* Homelab — capability page (lighter template): no TL;DR/decisions/gallery rendered. */
|
||
export const homelab: Project = {
|
||
id: 'homelab',
|
||
name: 'Self-hosted infrastructure lab',
|
||
order: 3,
|
||
status: 'active',
|
||
template: 'capability',
|
||
stack: [
|
||
{ name: 'Ubuntu' },
|
||
{ name: 'Docker' },
|
||
{ name: 'nginx' },
|
||
{ name: 'Gitea' },
|
||
{ name: 'Monitoring' },
|
||
{ name: 'Backups' },
|
||
],
|
||
links: [],
|
||
diagram: {
|
||
viewBox: '0 0 1120 300',
|
||
title: { en: 'Homelab topology', no: 'Hjemmelab-topologi' },
|
||
desc: {
|
||
en: 'Inbound traffic reaches an nginx reverse proxy terminating TLS, which routes to self-hosted services: Gitea, application containers and a monitoring stack.',
|
||
no: 'Innkommende trafikk når en nginx reverse proxy som terminerer TLS, og rutes videre til egendriftede tjenester: Gitea, applikasjonscontainere og en overvåkingsstack.',
|
||
},
|
||
nodes: [
|
||
{
|
||
id: 'internet',
|
||
x: 40,
|
||
y: 116,
|
||
w: 160,
|
||
h: 72,
|
||
kind: 'external',
|
||
label: 'Internet',
|
||
sub: { en: 'HTTPS', no: 'HTTPS' },
|
||
},
|
||
{
|
||
id: 'proxy',
|
||
x: 280,
|
||
y: 116,
|
||
w: 190,
|
||
h: 72,
|
||
kind: 'primary',
|
||
label: 'nginx',
|
||
sub: { en: 'reverse proxy · TLS', no: 'reverse proxy · TLS' },
|
||
},
|
||
{
|
||
id: 'gitea',
|
||
x: 560,
|
||
y: 40,
|
||
w: 190,
|
||
h: 60,
|
||
kind: 'internal',
|
||
label: 'Gitea',
|
||
sub: { en: 'git.cesnimda.uk', no: 'git.cesnimda.uk' },
|
||
},
|
||
{
|
||
id: 'apps',
|
||
x: 560,
|
||
y: 120,
|
||
w: 190,
|
||
h: 60,
|
||
kind: 'internal',
|
||
label: 'App services',
|
||
sub: { en: 'Docker containers', no: 'Docker-containere' },
|
||
},
|
||
{
|
||
id: 'monitor',
|
||
x: 560,
|
||
y: 200,
|
||
w: 190,
|
||
h: 60,
|
||
kind: 'internal',
|
||
label: 'Monitoring',
|
||
sub: { en: 'uptime · logs', no: 'oppetid · logger' },
|
||
},
|
||
],
|
||
edges: [
|
||
{ d: 'M200 152 H280', kind: 'flow' },
|
||
{ d: 'M470 140 L560 70', kind: 'flow' },
|
||
{ d: 'M470 152 H560', kind: 'flow' },
|
||
{ d: 'M470 164 L560 230', kind: 'flow' },
|
||
],
|
||
},
|
||
media: [],
|
||
content: {
|
||
en: {
|
||
valueProp: 'Where I run, break and fix real infrastructure — not just deploy it.',
|
||
cardTeaser:
|
||
'Ubuntu · Docker services · reverse proxy · auth · monitoring · Gitea (this site’s own git remote).',
|
||
tldr: {
|
||
what: 'A self-hosted home lab running production-style services.',
|
||
why: 'To keep operations skills hands-on.',
|
||
stack: 'Ubuntu · Docker · nginx · Gitea · monitoring.',
|
||
role: 'Operator.',
|
||
},
|
||
sections: [
|
||
{
|
||
kind: 'problem',
|
||
heading: 'What it is',
|
||
anchorId: 'problem',
|
||
blocks: [
|
||
{
|
||
type: 'p',
|
||
text: 'A home lab running Ubuntu and Docker-based services behind an nginx reverse proxy, with authentication, monitoring and backups. It’s where I get ongoing, hands-on practice with deployment, troubleshooting and real-world operations — including the self-hosted Gitea instance that this very site is built and deployed from.',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
kind: 'architecture',
|
||
heading: 'How it fits together',
|
||
anchorId: 'architecture',
|
||
blocks: [
|
||
{
|
||
type: 'ul',
|
||
items: [
|
||
'nginx reverse proxy terminating TLS in front of every service.',
|
||
'Docker Compose stacks for applications, each isolated on its own network.',
|
||
'Authentication in front of internal tools; monitoring for uptime and logs.',
|
||
'Self-hosted Gitea with CI runners — the deployment target for this portfolio.',
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
kind: 'next',
|
||
heading: 'What’s next',
|
||
anchorId: 'next',
|
||
blocks: [
|
||
{
|
||
type: 'p',
|
||
text: 'Tightening backup verification and adding more automated health checks and alerting across the stack.',
|
||
},
|
||
],
|
||
},
|
||
],
|
||
},
|
||
no: {
|
||
valueProp: 'Der jeg drifter, ødelegger og fikser ekte infrastruktur — ikke bare ruller den ut.',
|
||
cardTeaser:
|
||
'Ubuntu · Docker-tjenester · reverse proxy · auth · overvåking · Gitea (git-remoten til denne siden).',
|
||
tldr: {
|
||
what: 'En egendriftet hjemmelab som kjører produksjonslignende tjenester.',
|
||
why: 'For å holde driftsferdighetene praktiske.',
|
||
stack: 'Ubuntu · Docker · nginx · Gitea · overvåking.',
|
||
role: 'Operatør.',
|
||
},
|
||
sections: [
|
||
{
|
||
kind: 'problem',
|
||
heading: 'Hva det er',
|
||
anchorId: 'problem',
|
||
blocks: [
|
||
{
|
||
type: 'p',
|
||
text: 'En hjemmelab som kjører Ubuntu og Docker-baserte tjenester bak en nginx reverse proxy, med autentisering, overvåking og sikkerhetskopier. Det er her jeg får løpende, praktisk øving på utrulling, feilsøking og ekte drift — inkludert den egendriftede Gitea-instansen som denne siden bygges og rulles ut fra.',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
kind: 'architecture',
|
||
heading: 'Hvordan det henger sammen',
|
||
anchorId: 'arkitektur',
|
||
blocks: [
|
||
{
|
||
type: 'ul',
|
||
items: [
|
||
'nginx reverse proxy som terminerer TLS foran hver tjeneste.',
|
||
'Docker Compose-stacker for applikasjoner, hver isolert på eget nettverk.',
|
||
'Autentisering foran interne verktøy; overvåking av oppetid og logger.',
|
||
'Egendriftet Gitea med CI-runnere — utrullingsmålet for denne porteføljen.',
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
kind: 'next',
|
||
heading: 'Veien videre',
|
||
anchorId: 'videre',
|
||
blocks: [
|
||
{
|
||
type: 'p',
|
||
text: 'Strammere verifisering av sikkerhetskopier og flere automatiske helsesjekker og varsling på tvers av stacken.',
|
||
},
|
||
],
|
||
},
|
||
],
|
||
},
|
||
},
|
||
};
|