|
1 | 1 | --- |
2 | 2 | import PageLayout from '../layouts/PageLayout.astro'; |
3 | 3 | import Container from '../components/Container.astro'; |
| 4 | +import Hero from '../components/Hero.astro'; |
| 5 | +import AccordionItem from '../components/AccordionItem.astro'; |
| 6 | +import NodeInventoryTable from '../components/NodeInventoryTable.astro'; |
| 7 | +import VMInventoryTable from '../components/VMInventoryTable.astro'; |
| 8 | +import Button from '../components/Button.astro'; |
| 9 | +
|
| 10 | +const nodeRows = [ |
| 11 | + { node: 'node01', cpu: 'i9-12900H', cores: '20', ram: '96 GB', role: 'Compute (K8s)' }, |
| 12 | + { node: 'node02', cpu: 'i5-12600H', cores: '16', ram: '96 GB', role: 'Light compute + storage' }, |
| 13 | + { node: 'node03', cpu: 'i9-12900H', cores: '20', ram: '96 GB', role: 'Compute (K8s)' }, |
| 14 | + { node: 'node04', cpu: 'i9-12900H', cores: '20', ram: '96 GB', role: 'Compute (K8s)' }, |
| 15 | + { node: 'node05', cpu: 'i5-12600H', cores: '16', ram: '96 GB', role: 'Light compute + storage' }, |
| 16 | + { node: 'node06', cpu: 'i9-13900H', cores: '20', ram: '96 GB', role: 'Heavy compute (databases)' }, |
| 17 | + { node: 'node07', cpu: 'AMD 5950X', cores: '32', ram: '128 GB', role: 'GPU compute' }, |
| 18 | +]; |
| 19 | +
|
| 20 | +const vmRows = [ |
| 21 | + { vm: 'radio-k8s01', vcpu: '12', ram: '48G', purpose: 'Kubernetes primary' }, |
| 22 | + { vm: 'radio-k8s02', vcpu: '12', ram: '48G', purpose: 'Kubernetes worker' }, |
| 23 | + { vm: 'radio-k8s03', vcpu: '12', ram: '48G', purpose: 'Kubernetes worker' }, |
| 24 | + { vm: 'radio-gpu01', vcpu: '12', ram: '48G', purpose: 'GPU worker (A4000)' }, |
| 25 | + { vm: 'radio-pgsql01', vcpu: '8', ram: '32G', purpose: 'Research PostgreSQL' }, |
| 26 | + { vm: 'radio-pgsql02', vcpu: '4', ram: '16G', purpose: 'Application PostgreSQL' }, |
| 27 | + { vm: 'radio-neo4j01', vcpu: '6', ram: '24G', purpose: 'Graph database' }, |
| 28 | + { vm: 'radio-fs02', vcpu: '4', ram: '6G', purpose: 'SMB file server' }, |
| 29 | + { vm: 'radio-agents01', vcpu: '8', ram: '32G', purpose: 'AI agents, monitoring' }, |
| 30 | +]; |
4 | 31 | --- |
5 | 32 |
|
6 | | -<PageLayout title="Infrastructure | RadioAstronomy.io"> |
| 33 | +<PageLayout |
| 34 | + title="Infrastructure | RadioAstronomy.io" |
| 35 | + description="The Proxmox Astronomy Lab is a seven-node Proxmox cluster with 144 cores, 704 GB RAM, 26 TB NVMe, and RTX A4000 GPU compute. Enterprise-grade infrastructure for independent astronomical research." |
| 36 | + ogImage="/images/og/infrastructure.png" |
| 37 | +> |
| 38 | + <Hero |
| 39 | + variant="banner" |
| 40 | + title="Research Platform" |
| 41 | + subtitle="Enterprise-grade astronomical computing on a seven-node Proxmox cluster" |
| 42 | + backgroundImage="/images/heroes/infrastructure.png" |
| 43 | + /> |
| 44 | + |
7 | 45 | <Container> |
8 | | - <h1 class="text-4xl font-bold py-20 text-center">Coming soon</h1> |
| 46 | + <section class="py-16 max-w-3xl mx-auto"> |
| 47 | + <h2 class="text-2xl font-bold mb-6">Platform Overview</h2> |
| 48 | + <p class="text-brand-gray dark:text-gray-400 leading-relaxed">The Proxmox Astronomy Lab is a production-scale computing platform built on a seven-node Proxmox VE cluster with hybrid RKE2 Kubernetes and strategic VM architecture. We're demonstrating that sophisticated astronomical computing doesn't require institutional resources, just deliberate engineering and open-science principles.</p> |
| 49 | + </section> |
| 50 | + |
| 51 | + <section class="py-16"> |
| 52 | + <h2 class="text-2xl font-bold text-center mb-10">Cluster Specifications</h2> |
| 53 | + <div class="max-w-2xl mx-auto overflow-x-auto"> |
| 54 | + <table class="w-full text-left border-collapse"> |
| 55 | + <tbody> |
| 56 | + <tr class="border-b border-brand-grid dark:border-dark-surface"><td class="py-3 px-4 font-semibold">Nodes</td><td class="py-3 px-4">7</td></tr> |
| 57 | + <tr class="border-b border-brand-grid dark:border-dark-surface"><td class="py-3 px-4 font-semibold">Total Cores</td><td class="py-3 px-4">144</td></tr> |
| 58 | + <tr class="border-b border-brand-grid dark:border-dark-surface"><td class="py-3 px-4 font-semibold">Total RAM</td><td class="py-3 px-4">704 GB</td></tr> |
| 59 | + <tr class="border-b border-brand-grid dark:border-dark-surface"><td class="py-3 px-4 font-semibold">Total NVMe</td><td class="py-3 px-4">26 TB</td></tr> |
| 60 | + <tr class="border-b border-brand-grid dark:border-dark-surface"><td class="py-3 px-4 font-semibold">Network Fabric</td><td class="py-3 px-4">10G LACP per node</td></tr> |
| 61 | + <tr class="border-b border-brand-grid dark:border-dark-surface"><td class="py-3 px-4 font-semibold">GPU</td><td class="py-3 px-4">RTX A4000 16GB</td></tr> |
| 62 | + </tbody> |
| 63 | + </table> |
| 64 | + </div> |
| 65 | + </section> |
| 66 | + |
| 67 | + <section class="py-16 space-y-4"> |
| 68 | + <h2 class="text-2xl font-bold text-center mb-10">Node Inventory</h2> |
| 69 | + <AccordionItem title="Node details (7 nodes)"> |
| 70 | + <NodeInventoryTable rows={nodeRows} /> |
| 71 | + </AccordionItem> |
| 72 | + </section> |
| 73 | + |
| 74 | + <section class="py-16 space-y-4"> |
| 75 | + <h2 class="text-2xl font-bold text-center mb-10">VM Inventory</h2> |
| 76 | + <AccordionItem title="VM details (9 VMs)"> |
| 77 | + <VMInventoryTable rows={vmRows} /> |
| 78 | + </AccordionItem> |
| 79 | + </section> |
| 80 | + |
| 81 | + <section class="py-16"> |
| 82 | + <h2 class="text-2xl font-bold text-center mb-10">Architecture Highlights</h2> |
| 83 | + <div class="grid grid-cols-1 md:grid-cols-2 gap-6 max-w-3xl mx-auto"> |
| 84 | + <div class="p-6 rounded-xl bg-white dark:bg-dark-surface border border-brand-grid dark:border-brand-navy"> |
| 85 | + <h3 class="font-semibold mb-2">Hybrid K8s + VM</h3> |
| 86 | + <p class="text-sm text-brand-gray dark:text-gray-400">RKE2 for dynamic ML workloads, strategic VMs for databases and services that don't benefit from orchestration</p> |
| 87 | + </div> |
| 88 | + <div class="p-6 rounded-xl bg-white dark:bg-dark-surface border border-brand-grid dark:border-brand-navy"> |
| 89 | + <h3 class="font-semibold mb-2">PostgreSQL as materialization engine</h3> |
| 90 | + <p class="text-sm text-brand-gray dark:text-gray-400">Catalog joins and derived computations happen in PostgreSQL, results export to Parquet for distribution</p> |
| 91 | + </div> |
| 92 | + <div class="p-6 rounded-xl bg-white dark:bg-dark-surface border border-brand-grid dark:border-brand-navy"> |
| 93 | + <h3 class="font-semibold mb-2">GPU compute</h3> |
| 94 | + <p class="text-sm text-brand-gray dark:text-gray-400">RTX A4000 (16 GB VRAM) for ML training and inference workloads</p> |
| 95 | + </div> |
| 96 | + <div class="p-6 rounded-xl bg-white dark:bg-dark-surface border border-brand-grid dark:border-brand-navy"> |
| 97 | + <h3 class="font-semibold mb-2">10G networking</h3> |
| 98 | + <p class="text-sm text-brand-gray dark:text-gray-400">2x10G LACP per node for high-bandwidth data movement between compute and storage</p> |
| 99 | + </div> |
| 100 | + </div> |
| 101 | + </section> |
| 102 | + |
| 103 | + <section class="py-16 max-w-3xl mx-auto"> |
| 104 | + <h2 class="text-2xl font-bold mb-6">Data Pipeline</h2> |
| 105 | + <p class="text-brand-gray dark:text-gray-400 leading-relaxed">PostgreSQL serves as the materialization engine where VAC joins and derived computations occur. Final ARD products are exported to Parquet for distribution and analysis. The pipeline manages approximately 32 GB of catalog data in PostgreSQL and 108 GB of spectral tiles in Parquet format.</p> |
| 106 | + </section> |
| 107 | + |
| 108 | + <section class="py-16 max-w-3xl mx-auto"> |
| 109 | + <h2 class="text-2xl font-bold mb-6">Governance and Operational Practices</h2> |
| 110 | + <p class="text-brand-gray dark:text-gray-400 leading-relaxed mb-4">Operationally, the cluster is managed under the same discipline the org applies to its research: documented, reproducible, and publicly reviewable. Specifics:</p> |
| 111 | + <ul class="space-y-3 text-brand-gray dark:text-gray-400"> |
| 112 | + <li><strong>Security baseline</strong> — working toward CIS Controls v8.1 Implementation Group 1 alignment, with documentation rewrites in progress</li> |
| 113 | + <li><strong>AI governance</strong> — model cards track intended use, data sources, evaluation results, and known limitations for the AI systems used across the org. NIST AI RMF alignment is tracked against the CIS-RAM method</li> |
| 114 | + <li><strong>Published templates</strong> — governance templates are maintained in the <a href="https://github.com/vintagedon/nist-ai-rmf-cookbook" target="_blank" rel="noopener" class="text-brand-steel hover:underline">NIST AI RMF Cookbook</a> for other small research orgs to adapt</li> |
| 115 | + <li><strong>Automation</strong> — Ansible-managed configuration, version-controlled infrastructure, passwordless-sudo fleet operations via a dedicated <code class="font-mono text-sm bg-brand-grid/50 dark:bg-dark-surface px-1 rounded">ansible01</code> identity</li> |
| 116 | + </ul> |
| 117 | + <p class="text-brand-gray dark:text-gray-400 leading-relaxed mt-4">None of this is certification; it's operational practice applied voluntarily at volunteer-organization scale.</p> |
| 118 | + </section> |
| 119 | + |
| 120 | + <div class="py-16 text-center"> |
| 121 | + <Button label="View Platform Repository" href="/projects/proxmox-astronomy-lab" variant="primary" /> |
| 122 | + </div> |
9 | 123 | </Container> |
10 | 124 | </PageLayout> |
0 commit comments