Files
ResumeSite/site/src/content/projects/homelab.ts
T
cesnimda 2184a1892f feat: content layer — zod schemas, validated bilingual data, locale view models
- 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>
2026-07-04 01:05:21 +02:00

191 lines
6.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 sites 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. Its 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: 'Whats 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.',
},
],
},
],
},
},
};