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.', }, ], }, ], }, }, };