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.
-
-
-
-
-
-
-
-
{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
+
+
+
-
-
$ 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
+
$ |
-
+
- {/* Consider replacing with an actual image or a more maintainable diagram component */}
-
- {/* 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
+
+
+
+
+
+
+
+
+
+
-
-
-
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 storage Resource balancing Live migration Hardware passthrough
-
-
-
Zero Trust Security
-
Comprehensive security architecture with Cloudflare tunnels, network segmentation, and authentication at all service boundaries.
-
Cloudflare tunnels OPNsense firewall VLAN segmentation WireGuard VPN
-
-
-
-
PostgreSQL
-
Enterprise database cluster for application data storage with automated backups, replication, and performance optimization.
-
Automated backups Connection pooling Optimized for K8s Multi-app support
-
-
-
-
Monitoring Stack
-
Comprehensive monitoring with Prometheus, Grafana, and AlertManager for real-time visibility into all infrastructure components.
-
Prometheus metrics Grafana dashboards Automated alerts Historical data
-
+
+
+
Zero Trust Security
+
Comprehensive security architecture with Cloudflare tunnels, network segmentation, and authentication at all service boundaries.
+
Cloudflare tunnels OPNsense firewall VLAN segmentation WireGuard VPN
+
+
+
+
PostgreSQL
+
Enterprise database cluster for application data storage with automated backups, replication, and performance optimization.
+
Automated backups Connection pooling Optimized for K8s Multi-app support
+
+
+
+
Monitoring Stack
+
Comprehensive monitoring with Prometheus, Grafana, and AlertManager for real-time visibility into all infrastructure components.
+
Prometheus metrics Grafana dashboards Automated alerts Historical data
+
-
+