diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000..efeec45 Binary files /dev/null and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000..c22f7b4 Binary files /dev/null and b/public/android-chrome-512x512.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..41de665 Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000..9e3c703 Binary files /dev/null and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000..4048abb Binary files /dev/null and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..35dac89 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/favicon.svg b/public/favicon.svg deleted file mode 100644 index f157bd1..0000000 --- a/public/favicon.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - diff --git a/src/components/Footer.astro b/src/components/Footer.astro index 31cb012..92311ad 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -23,14 +23,15 @@ const categories = [ { name: 'Docker Compose', path: '/resources/docker-compose' }, { name: 'Configuration Files', path: '/resources/config-files' }, { name: 'Infrastructure Code', path: '/resources/iac' }, - { name: 'Tutorials', path: '/resources/tutorials' } + { name: 'Tutorials', path: '/resources/tutorials' }, + { name: 'All Resources', path: '/resources' } // Added Resources link ] }, { title: 'Projects', links: [ { name: 'HomeLab Setup', path: '/homelab' }, - { name: 'Tech Stack', url: 'https://argobox.com/#services' }, + { name: 'Tech Stack', path: '/tech-stack' }, // Updated Tech Stack link { name: 'Github Repos', path: '/projects/github' }, { name: 'Live Services', path: '/projects/services' }, { name: 'Obsidian Templates', path: '/projects/obsidian' } @@ -47,12 +48,12 @@ const socialLinks = [ }, { name: 'Twitter', - url: 'https://twitter.com/yourusername', + url: 'https://www.x.com/danlaforce', // Updated Twitter URL icon: '' }, { name: 'LinkedIn', - url: 'https://linkedin.com/in/yourusername', + url: 'https://www.linkedin.com/in/danlaforce', // Updated LinkedIn URL icon: '' }, { diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 8ada813..a7e26fb 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -79,6 +79,9 @@ const { +<link rel="icon" type="image/x-icon" href="/favicon.ico" /> + <link rel="apple-touch-icon" href="/apple-touch-icon.png" /> + <link rel="manifest" href="/site.webmanifest" /> diff --git a/src/pages/homelab.astro b/src/pages/homelab.astro index 79cc4e2..8e63406 100644 --- a/src/pages/homelab.astro +++ b/src/pages/homelab.astro @@ -1,14 +1,455 @@ +align-items: center; + justify-content: center; + text-align: center; + position: relative; + overflow: hidden; + transition: all 0.3s ease; + } + + .diagram-node:hover { + transform: translateY(-5px); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2); + z-index: 10; + border-color: var(--primary, #3b82f6); + } + + .diagram-node::before { + content: ''; + position: absolute; + width: 150%; + height: 150%; + background: radial-gradient(circle, rgba(99, 102, 241, 0.3) 0%, transparent 70%); + opacity: 0; + transition: opacity 0.3s ease; + } + + .diagram-node:hover::before { + opacity: 1; + } + + .diagram-node.gateway { + grid-column: 1 / 2; + grid-row: 1 / 2; + border-color: var(--warning, #f59e0b); + } + + .diagram-node.firewall { + grid-column: 2 / 3; + grid-row: 1 / 2; + border-color: var(--error, #ef4444); + } + + .diagram-node.proxmox { + grid-column: 3 / 5; + grid-row: 1 / 2; + border-color: var(--primary, #3b82f6); + } + + .diagram-node.kubernetes { + grid-column: 2 / 4; + grid-row: 2 / 3; + border-color: var(--accent, #6366f1); + } + + .diagram-node.storage { + grid-column: 1 / 2; + grid-row: 2 / 3; + border-color: var(--success, #10b981); + } + + .diagram-node.monitoring { + grid-column: 4 / 5; + grid-row: 2 / 3; + border-color: var(--primary, #3b82f6); + } + + .diagram-node.services { + grid-column: 1 / 5; + grid-row: 3 / 4; + display: flex; + flex-direction: row; + justify-content: space-around; + flex-wrap: wrap; + background-color: rgba(15, 23, 42, 0.3); + } + + .service-icon { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + width: 80px; + height: 80px; + margin: 0.5rem; + transition: all 0.3s ease; + } + + .service-icon:hover { + transform: scale(1.1); + } + + .service-icon i { + font-size: 1.75rem; + margin-bottom: 0.5rem; + } + + .service-icon span { + font-size: 0.75rem; + color: var(--text-secondary); + } + + /* Connection lines for architecture diagram */ + .connection-line { + position: absolute; + background-color: var(--border, rgba(148, 163, 184, 0.1)); + transition: all 0.3s ease; + z-index: 5; + } + + .connection-line.horizontal { + height: 2px; + } + + .connection-line.vertical { + width: 2px; + } + + .connection-line.active { + background-color: var(--accent, #6366f1); + box-shadow: 0 0 10px var(--accent, #6366f1); + } + + /* Enhanced Service Items */ + .service-item { + position: relative; + overflow: hidden; + } + + .service-item::before { + content: ''; + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 0; + background: linear-gradient(90deg, var(--accent, #6366f1) 0%, transparent 100%); + opacity: 0.1; + transition: width 0.3s ease; + } + + .service-item.available:hover::before { + width: 100%; + } + + /* Enhanced Card Hover Effects */ + .tech-card { + position: relative; + overflow: hidden; + } + + .tech-card::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 3px; + background: linear-gradient(90deg, var(--primary, #3b82f6), var(--accent, #6366f1)); + transform: scaleX(0); + transform-origin: right; + transition: transform 0.5s ease; + } + + .tech-card:hover::after { + transform: scaleX(1); + transform-origin: left; + } + + /* Enhanced Project Cards */ + .project-card { + position: relative; + overflow: hidden; + } + + .project-card::before { + content: ''; + position: absolute; + top: -50px; + right: -50px; + width: 100px; + height: 100px; + background: linear-gradient(45deg, var(--primary, #3b82f6), var(--accent, #6366f1)); + transform: rotate(45deg); + opacity: 0; + transition: all 0.5s ease; + } + + .project-card:hover::before { + opacity: 0.15; + } + + /* Enhanced Dashboard Cards */ + .dashboard-preview.infrastructure { + background-image: linear-gradient(45deg, rgba(30, 41, 59, 0.7), rgba(15, 23, 42, 0.7)), url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNDAgMTIwIj48cmVjdCB4PSIxMCIgeT0iMTAiIHdpZHRoPSI1MCIgaGVpZ2h0PSIxMDAiIGZpbGw9IiMyNTYzZWIiIGZpbGwtb3BhY2l0eT0iMC4yIiByeD0iNSIvPjxyZWN0IHg9IjgwIiB5PSIxMCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iIzI1NjNlYiIgZmlsbC1vcGFjaXR5PSIwLjMiIHJ4PSI1Ii8+PHJlY3QgeD0iMTUwIiB5PSIxMCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iIzI1NjNlYiIgZmlsbC1vcGFjaXR5PSIwLjQiIHJ4PSI1Ii8+PC9zdmc+'); + } + + .dashboard-preview.kubernetes { + background-image: linear-gradient(45deg, rgba(30, 41, 59, 0.7), rgba(15, 23, 42, 0.7)), url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNDAgMTIwIj48Y2lyY2xlIGN4PSIxMjAiIGN5PSI2MCIgcj0iNDAiIGZpbGw9IiM2MzY2ZjEiIGZpbGwtb3BhY2l0eT0iMC4yIi8+PGNpcmNsZSBjeD0iNTAiIGN5PSI0MCIgcj0iMjAiIGZpbGw9IiM2MzY2ZjEiIGZpbGwtb3BhY2l0eT0iMC4zIi8+PGNpcmNsZSBjeD0iNTAiIGN5PSI5MCIgcj0iMjAiIGZpbGw9IiM2MzY2ZjEiIGZpbGwtb3BhY2l0eT0iMC4zIi8+PGNpcmNsZSBjeD0iMTkwIiBjeT0iNDAiIHI9IjIwIiBmaWxsPSIjNjM2NmYxIiBmaWxsLW9wYWNpdHk9IjAuMyIvPjxjaXJjbGUgY3g9IjE5MCIgY3k9IjkwIiByPSIyMCIgZmlsbD0iIzYzNjZmMSIgZmlsbC1vcGFjaXR5PSIwLjMiLz48bGluZSB4MT0iNTAiIHkxPSI0MCIgeDI9IjEyMCIgeTI9IjYwIiBzdHJva2U9IiM2MzY2ZjEiIHN0cm9rZS1vcGFjaXR5PSIwLjQiIHN0cm9rZS13aWR0aD0iMiIvPjxsaW5lIHgxPSI1MCIgeTE9IjkwIiB4Mj0iMTIwIiB5Mj0iNjAiIHN0cm9rZT0iIzYzNjZmMSIgc3Ryb2tlLW9wYWNpdHk9IjAuNCIgc3Ryb2tlLXdpZHRoPSIyIi8+PGxpbmUgeDE9IjE5MCIgeTE9IjQwIiB4Mj0iMTIwIiB5Mj0iNjAiIHN0cm9rZT0iIzYzNjZmMSIgc3Ryb2tlLW9wYWNpdHk9IjAuNCIgc3Ryb2tlLXdpZHRoPSIyIi8+PGxpbmUgeDE9IjE5MCIgeTE9IjkwIiB4Mj0iMTIwIiB5Mj0iNjAiIHN0cm9rZT0iIzYzNjZmMSIgc3Ryb2tlLW9wYWNpdHk9IjAuNCIgc3Ryb2tlLXdpZHRoPSIyIi8+PC9zdmc+'); + } + + .dashboard-preview.network { + background-image: linear-gradient(45deg, rgba(30, 41, 59, 0.7), rgba(15, 23, 42, 0.7)), url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNDAgMTIwIj48cGF0aCBkPSJNMTAgMTAgQzIzMCAxMCAyMzAgNTAgMTAgNTAgQzIzMCA1MCAyMzAgOTAgMTAgOTAgQzIzMCA5MCAyMzAgMTMwIDEwIDEzMCIgc3Ryb2tlPSIjMTBiOTgxIiBzdHJva2Utb3BhY2l0eT0iMC40IiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiLz48L3N2Zz4='); + } + + .dashboard-preview.services { + background-image: linear-gradient(45deg, rgba(30, 41, 59, 0.7), rgba(15, 23, 42, 0.7)), url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNDAgMTIwIj48cmVjdCB4PSIxMCIgeT0iMTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2VmNDQ0NCIgZmlsbC1vcGFjaXR5PSIwLjIiIHJ4PSI1Ii8+PHJlY3QgeD0iMTAiIHk9IjQwIiB3aWR0aD0iNzAiIGhlaWdodD0iMjAiIGZpbGw9IiNlZjQ0NDQiIGZpbGwtb3BhY2l0eT0iMC4zIiByeD0iNSIvPjxyZWN0IHg9IjEwIiB5PSI3MCIgd2lkdGg9IjMwIiBoZWlnaHQ9IjIwIiBmaWxsPSIjZWY0NDQ0IiBmaWxsLW9wYWNpdHk9IjAuNCIgcng9IjUiLz48cmVjdCB4PSIxMDAiIHk9IjEwIiB3aWR0aD0iODAiIGhlaWdodD0iMjAiIGZpbGw9IiM2MzY2ZjEiIGZpbGwtb3BhY2l0eT0iMC4yIiByeD0iNSIvPjxyZWN0IHg9IjEwMCIgeT0iNDAiIHdpZHRoPSI1MCIgaGVpZ2h0PSIyMCIgZmlsbD0iIzYzNjZmMSIgZmlsbC1vcGFjaXR5PSIwLjMiIHJ4PSI1Ii8+PHJlY3QgeD0iMTAwIiB5PSI3MCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSIyMCIgZmlsbD0iIzYzNjZmMSIgZmlsbC1vcGFjaXR5PSIwLjQiIHJ4PSI1Ii8+PC9zdmc+'); + } + + /* Enhanced Dashboard Overlay */ + .dashboard-overlay .overlay-icon { + transition: transform 0.3s ease; + } + + .dashboard-card:hover .overlay-icon { + transform: scale(1.2); + } + + /* Keep your existing responsive styles */ + @media (max-width: 1024px) { + .architecture-diagram { + grid-template-columns: repeat(2, 1fr); + grid-template-rows: repeat(6, auto); + gap: 1rem; + } + + .diagram-node.gateway { grid-column: 1 / 2; grid-row: 1 / 2; } + .diagram-node.firewall { grid-column: 2 / 3; grid-row: 1 / 2; } + .diagram-node.proxmox { grid-column: 1 / 3; grid-row: 2 / 3; } + .diagram-node.kubernetes { grid-column: 1 / 3; grid-row: 3 / 4; } + .diagram-node.storage { grid-column: 1 / 2; grid-row: 4 / 5; } + .diagram-node.monitoring { grid-column: 2 / 3; grid-row: 4 / 5; } + .diagram-node.services { grid-column: 1 / 3; grid-row: 5 / 6; } + } + + + --- -// src/pages/homelab.astro - Converted from static homelab.html +// src/pages/homelab.astro - Enhanced version import BaseLayout from '../layouts/BaseLayout.astro'; import Header from '../components/Header.astro'; import Footer from '../components/Footer.astro'; -const title = "Home Lab | Argobox - ArgoBox Tech Hub"; +const title = "Home Lab | ArgoBox - ArgoBox Tech Hub"; const description = "ArgoBox - A production-grade Kubernetes homelab for DevOps experimentation, infrastructure automation, and containerized application deployment."; -// Data for services (can be fetched or defined here) -// Example structure - replace with actual data source if needed +// Using your existing data structure const servicesData = { development: [ { name: "Gitea", description: "Self-hosted Git service", url: "https://git.argobox.com", status: "live", icon: "fas fa-code-branch", available: true }, @@ -24,7 +465,7 @@ const servicesData = { ], utilities: [ { name: "File Browser", description: "Web file manager", url: "https://files.argobox.com", status: "live", icon: "fas fa-folder-open", available: true }, - { name: "Vaultwarden", description: "Password manager", url: "https://vault.argobox.com", status: "live", icon: "fas fa-key", available: true }, + { name: "Vaultwarden", description: "Password manager", url: "#", status: "restricted", icon: "fas fa-key", available: false }, { name: "Homepage", description: "Service dashboard", url: "https://dash.argobox.com", status: "live", icon: "fas fa-tachometer-alt", available: true }, { name: "Uptime Kuma", description: "Status monitoring", url: "https://status.argobox.com", status: "live", icon: "fas fa-heartbeat", available: true }, ], @@ -36,35 +477,28 @@ const servicesData = { ] }; -// Data for projects (can be fetched or defined here) +// Use your existing project data const projectsData = [ - { title: "Ansible Playbooks", description: "Collection of playbooks for automating system configuration and application deployment.", icon: "fab fa-ansible", tech: ["Ansible", "YAML", "Jinja2"], url: "/resources/iac" }, // Link to relevant resource page + { title: "Ansible Playbooks", description: "Collection of playbooks for automating system configuration and application deployment.", icon: "fab fa-ansible", tech: ["Ansible", "YAML", "Jinja2"], url: "/resources/iac" }, { title: "Kubernetes Manifests", description: "YAML definitions for deploying various applications and services on Kubernetes.", icon: "fas fa-dharmachakra", tech: ["Kubernetes", "YAML", "Helm"], url: "/resources/kubernetes" }, - { title: "Monitoring Dashboards", description: "Grafana dashboards for visualizing infrastructure and application metrics.", icon: "fas fa-chart-line", tech: ["Grafana", "PromQL", "JSON"], url: "/resources/config-files" }, // Link to relevant resource page - { title: "Cloudflare Tunnel Setup", description: "Securely exposing home lab services to the internet using Cloudflare Tunnels.", icon: "fas fa-cloud", tech: ["Cloudflare", "Networking", "Security"], url: "/posts/cloudflare-tunnel-setup" } // Link to blog post + { title: "Monitoring Dashboards", description: "Grafana dashboards for visualizing infrastructure and application metrics.", icon: "fas fa-chart-line", tech: ["Grafana", "PromQL", "JSON"], url: "/resources/config-files" }, + { title: "Cloudflare Tunnel Setup", description: "Securely exposing home lab services to the internet using Cloudflare Tunnels.", icon: "fas fa-cloud", tech: ["Cloudflare", "Networking", "Security"], url: "/posts/cloudflare-tunnel-setup" } ]; -// Data for dashboards (can be fetched or defined here) +// Use your existing dashboards data const dashboardsData = [ { title: "Infrastructure Overview", description: "Key metrics for Proxmox hosts, network devices, and storage.", previewClass: "infrastructure", url: "https://dash.argobox.com/goto/...", icon: "fas fa-server" }, { title: "Kubernetes Cluster", description: "Detailed view of K3s cluster resources, node status, and pod health.", previewClass: "kubernetes", url: "https://dash.argobox.com/goto/...", icon: "fas fa-dharmachakra" }, { title: "Network Traffic", description: "Real-time and historical network usage, firewall logs, and connection tracking.", previewClass: "network", url: "https://dash.argobox.com/goto/...", icon: "fas fa-network-wired" }, { title: "Service Performance", description: "Application-specific metrics, request latency, and error rates.", previewClass: "services", url: "https://dash.argobox.com/goto/...", icon: "fas fa-cogs" } ]; - -// Data for contact form (if keeping it on this page) -// const contactInfo = { email: "daniel.laforce@argobox.com", /* other info */ }; - --- - {/* Add Font Awesome if not loaded globally by BaseLayout */} - {/* */}
- - +
@@ -76,42 +510,24 @@ const dashboardsData = [

A production-ready infrastructure platform for DevOps experimentation, distributed systems, and automating everything with code.

-
-
-
-
-
32+
-
CPU Cores
-
-
-
-
-
-
64GB
-
RAM
-
-
-
-
-
-
12TB
-
Storage
-
-
-
-
-
-
{Object.values(servicesData).flat().length}+
-
Services
-
-
+ + +
+
argobox:~$ ls -la /services | wc -l
+
{Object.values(servicesData).flat().length}+
+
argobox:~$ nproc --all
+
32+
+
argobox:~$ free -h | grep Mem | awk '{print $2}'
+
64GB
+
argobox:~$ df -h /data | grep /data | awk '{print $2}'
+
12TB
+
+ +
@@ -128,37 +546,37 @@ const dashboardsData = [
argobox ~ k8s-status
-
-
$ kubectl get nodes
-
NAME STATUS ROLES AGE VERSION
-
argobox Ready control-plane,master 154d v1.25.16+k3s1
-
argobox-lite Ready worker 154d v1.25.16+k3s1
-
 
-
$ kubectl get pods -A | grep Running | wc -l
-
32
-
 
-
$ uptime
-
14:30:25 up 154 days, 23:12, 1 user, load average: 0.22, 0.18, 0.15
-
 
-
$ ansible-playbook status.yml
-
PLAY [Check system status] *******************************************
-
TASK [Gathering Facts] **********************************************
-
ok: [argobox]
-
ok: [argobox-lite]
-
TASK [Check service status] *****************************************
-
ok: [argobox]
-
ok: [argobox-lite]
-
PLAY RECAP **********************************************************
-
argobox : ok=2 changed=0 unreachable=0 failed=0 skipped=0
-
argobox-lite: ok=2 changed=0 unreachable=0 failed=0 skipped=0
-
$ |
+
+
$ kubectl get nodes
+
NAME STATUS ROLES AGE VERSION
+
argobox Ready control-plane,master 154d v1.25.16+k3s1
+
argobox-lite Ready worker 154d v1.25.16+k3s1
+
 
+
$ kubectl get pods -A | grep Running | wc -l
+
32
+
 
+
$ uptime
+
14:30:25 up 154 days, 23:12, 1 user, load average: 0.22, 0.18, 0.15
+
 
+
$ ansible-playbook status.yml
+
PLAY [Check system status] *******************************************
+
TASK [Gathering Facts] **********************************************
+
ok: [argobox]
+
ok: [argobox-lite]
+
TASK [Check service status] *****************************************
+
ok: [argobox]
+
ok: [argobox-lite]
+
PLAY RECAP **********************************************************
+
argobox : ok=2 changed=0 unreachable=0 failed=0 skipped=0
+
argobox-lite: ok=2 changed=0 unreachable=0 failed=0 skipped=0
+
$ |
- +
@@ -167,31 +585,79 @@ const dashboardsData = [ Enterprise-grade network topology with redundancy, virtualization, and secure segmentation.

- {/* Consider replacing with an actual image or a more maintainable diagram component */} - ArgoBox Architecture Diagram - {/* Fallback or simplified diagram if image isn't available */} + + +
+
+
+
+
Internet Gateway
+
Multiple WAN connections with failover
+
+
+
+
OPNsense Firewall
+
Advanced security & traffic management
+
+
+
+
Proxmox Cluster
+
Virtualization platform with HA capabilities
+
+
+
+
ZFS Storage
+
RAID10 configuration with snapshots
+
+
+
+
Kubernetes (K3s)
+
Container orchestration across multiple nodes
+
+
+
+
Monitoring Stack
+
Prometheus, Grafana, & AlertManager
+
+
+
Git
+
Code
+
Media
+
Vault
+
Web
+
CI/CD
+
+ +
+
+ + +
+ ArgoBox Architecture Diagram +
+
-
-
-

Network Security

-

- Enterprise firewall with network segmentation using VLANs and strict access controls. Redundant routing with automatic failover between OPNsense and OpenWrt. -

-
-
-
-

Virtualization

-

- Proxmox virtualization platform with ZFS storage pools in RAID10 configuration. Optimized storage pools for VMs and containers with proper resource allocation. -

-
-
-
-

High Availability

-

- Full redundancy with failover routing, replicated storage, and resilient services. Automatic service recovery and load balancing across nodes. -

-
+
+
+

Network Security

+

+ Enterprise firewall with network segmentation using VLANs and strict access controls. Redundant routing with automatic failover between OPNsense and OpenWrt. +

+
+
+
+

Virtualization

+

+ Proxmox virtualization platform with ZFS storage pools in RAID10 configuration. Optimized storage pools for VMs and containers with proper resource allocation. +

+
+
+
+

High Availability

+

+ Full redundancy with failover routing, replicated storage, and resilient services. Automatic service recovery and load balancing across nodes. +

+
@@ -206,7 +672,6 @@ const dashboardsData = [

- {/* Data could be externalized */}

Kubernetes (K3s)

@@ -225,29 +690,29 @@ const dashboardsData = [

Enterprise-class virtualization platform running virtual machines and containers with ZFS storage backend for data integrity.

ZFS storageResource balancingLive migrationHardware passthrough
-
-
-

Zero Trust Security

-

Comprehensive security architecture with Cloudflare tunnels, network segmentation, and authentication at all service boundaries.

-
Cloudflare tunnelsOPNsense firewallVLAN segmentationWireGuard VPN
-
-
-
-

PostgreSQL

-

Enterprise database cluster for application data storage with automated backups, replication, and performance optimization.

-
Automated backupsConnection poolingOptimized for K8sMulti-app support
-
-
-
-

Monitoring Stack

-

Comprehensive monitoring with Prometheus, Grafana, and AlertManager for real-time visibility into all infrastructure components.

-
Prometheus metricsGrafana dashboardsAutomated alertsHistorical data
-
+
+
+

Zero Trust Security

+

Comprehensive security architecture with Cloudflare tunnels, network segmentation, and authentication at all service boundaries.

+
Cloudflare tunnelsOPNsense firewallVLAN segmentationWireGuard VPN
+
+
+
+

PostgreSQL

+

Enterprise database cluster for application data storage with automated backups, replication, and performance optimization.

+
Automated backupsConnection poolingOptimized for K8sMulti-app support
+
+
+
+

Monitoring Stack

+

Comprehensive monitoring with Prometheus, Grafana, and AlertManager for real-time visibility into all infrastructure components.

+
Prometheus metricsGrafana dashboardsAutomated alertsHistorical data
+
- +
@@ -262,7 +727,7 @@ const dashboardsData = [
{Object.entries(servicesData).map(([categoryKey, categoryServices]) => ( -
+

@@ -299,7 +765,7 @@ const dashboardsData = [

- +
@@ -310,7 +776,7 @@ const dashboardsData = [
- +
- - {/* Contact Section - Optional: Can be moved to a separate page */} - {/* -
-
-
-

Get In Touch

-

Have questions or want to collaborate? Reach out!

-
-
-
- - Add other contact items like LinkedIn, GitHub etc. -
-
-
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
-
-
-
- */} -