Compare commits
No commits in common. "39e926bb6cb49988bfcde7897b70a0b4ee8802bf" and "18607e990248e8727696f01e5b274c2e3946dbfd" have entirely different histories.
39e926bb6c
...
18607e9902
4 changed files with 2 additions and 1014 deletions
|
|
@ -1,11 +0,0 @@
|
|||
name: build-and-deploy
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
jobs:
|
||||
build:
|
||||
runs-on: docker
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- run: docker build --platform linux/arm64 -t localhost/siriusdevops-site:latest .
|
||||
- run: docker compose -f /opt/siriusdevops/services/docker-compose.yml up -d --force-recreate siriusdevops-site
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
FROM nginx:alpine
|
||||
COPY index.html /usr/share/nginx/html/index.html
|
||||
EXPOSE 80
|
||||
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:80/ || exit 1
|
||||
2
README.md
Normal file
2
README.md
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
# siriusdevops
|
||||
|
||||
999
index.html
999
index.html
|
|
@ -1,999 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Sirius DevOps — Cloud Infrastructure Engineering</title>
|
||||
<meta name="description" content="Production cloud infrastructure engineering — Kubernetes clusters, AI/ML platforms, GitOps pipelines, and database fleets. I build and manage infrastructure so your team ships features.">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root {
|
||||
--bg: #09090b;
|
||||
--surface: #0f0f12;
|
||||
--surface-raised: #16161a;
|
||||
--border: #1e1e24;
|
||||
--border-light: rgba(255,255,255,0.06);
|
||||
--text: #c8c8d0;
|
||||
--text-heading: #e8e8ed;
|
||||
--text-muted: #6b6b7b;
|
||||
--text-faint: #44445a;
|
||||
--accent: #d4882a;
|
||||
--accent-dim: rgba(212,136,42,0.12);
|
||||
--green: #3fb950;
|
||||
--green-dim: rgba(63,185,80,0.12);
|
||||
--red: #f85149;
|
||||
}
|
||||
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
html {
|
||||
background: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: 'Space Grotesk', system-ui, sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
body {
|
||||
max-width: 1120px;
|
||||
margin: 0 auto;
|
||||
padding: 0 32px;
|
||||
}
|
||||
|
||||
/* ─── Header ─── */
|
||||
header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 28px 0;
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.logo {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
color: var(--text-heading);
|
||||
letter-spacing: -0.2px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.logo .star {
|
||||
color: var(--accent);
|
||||
font-size: 16px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
header nav { display: flex; gap: 32px; }
|
||||
|
||||
header nav a {
|
||||
color: var(--text-muted);
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
transition: color 0.15s;
|
||||
}
|
||||
header nav a:hover { color: var(--text-heading); }
|
||||
|
||||
/* ─── Hero ─── */
|
||||
.hero {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 48px;
|
||||
padding: 80px 0 64px;
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
.hero-left { padding-top: 8px; }
|
||||
|
||||
.hero-subtitle {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 11px;
|
||||
color: var(--accent);
|
||||
letter-spacing: 0.8px;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
|
||||
.hero h1 {
|
||||
font-size: clamp(28px, 4vw, 44px);
|
||||
font-weight: 700;
|
||||
line-height: 1.08;
|
||||
letter-spacing: -1.2px;
|
||||
color: var(--text-heading);
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.hero h1 .accent-word {
|
||||
color: var(--accent);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.hero-description {
|
||||
font-size: 16px;
|
||||
line-height: 1.65;
|
||||
color: var(--text-muted);
|
||||
max-width: 480px;
|
||||
margin-bottom: 28px;
|
||||
}
|
||||
|
||||
.hero-description strong {
|
||||
color: var(--text);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.hero-cta {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 10px 20px;
|
||||
background: var(--accent);
|
||||
color: #09090b;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
border-radius: 6px;
|
||||
text-decoration: none;
|
||||
transition: background 0.15s, transform 0.1s;
|
||||
}
|
||||
.btn-primary:hover { background: #e0963a; transform: translateY(-1px); }
|
||||
|
||||
.btn-ghost {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 10px 20px;
|
||||
background: rgba(255,255,255,0.03);
|
||||
color: var(--text);
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
border-radius: 6px;
|
||||
border: 1px solid var(--border);
|
||||
text-decoration: none;
|
||||
transition: background 0.15s, border-color 0.15s;
|
||||
}
|
||||
.btn-ghost:hover { background: rgba(255,255,255,0.05); border-color: var(--text-faint); }
|
||||
|
||||
/* Trust bar */
|
||||
.trust-bar {
|
||||
display: flex;
|
||||
gap: 32px;
|
||||
flex-wrap: wrap;
|
||||
padding-top: 20px;
|
||||
border-top: 1px solid var(--border-light);
|
||||
}
|
||||
|
||||
.trust-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
}
|
||||
|
||||
.trust-value {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
color: var(--text-heading);
|
||||
letter-spacing: -0.3px;
|
||||
}
|
||||
|
||||
.trust-label {
|
||||
font-size: 11px;
|
||||
color: var(--text-faint);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
/* ─── Terminal (hero right) ─── */
|
||||
.terminal {
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 12.5px;
|
||||
line-height: 1.7;
|
||||
}
|
||||
|
||||
.terminal-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 10px 14px;
|
||||
background: var(--surface-raised);
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.terminal-dot {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 50%;
|
||||
background: var(--border);
|
||||
}
|
||||
.terminal-dot.red { background: #f85149; }
|
||||
.terminal-dot.yellow { background: #d4882a; }
|
||||
.terminal-dot.green { background: #3fb950; }
|
||||
|
||||
.terminal-title {
|
||||
font-size: 11px;
|
||||
color: var(--text-faint);
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.terminal-body {
|
||||
padding: 16px;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.terminal-body .prompt { color: var(--accent); }
|
||||
.terminal-body .cmd { color: var(--text-heading); }
|
||||
.terminal-body .flag { color: var(--green); }
|
||||
.terminal-body .value { color: var(--text); }
|
||||
.terminal-body .dim { color: var(--text-faint); }
|
||||
.terminal-body .status-ok { color: var(--green); }
|
||||
|
||||
/* Blinking cursor */
|
||||
.cursor-blink {
|
||||
display: inline-block;
|
||||
width: 7px;
|
||||
height: 14px;
|
||||
background: var(--accent);
|
||||
vertical-align: text-bottom;
|
||||
animation: blink 1s step-end infinite;
|
||||
margin-left: 2px;
|
||||
}
|
||||
|
||||
@keyframes blink {
|
||||
0%, 100% { opacity: 1; }
|
||||
50% { opacity: 0; }
|
||||
}
|
||||
|
||||
/* ─── Section dividers ─── */
|
||||
.section-divider {
|
||||
border-top: 1px solid var(--border);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* ─── Section headings ─── */
|
||||
.section-overline {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 11px;
|
||||
color: var(--accent);
|
||||
letter-spacing: 1px;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.section-title {
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
letter-spacing: -0.4px;
|
||||
color: var(--text-heading);
|
||||
margin-bottom: 48px;
|
||||
}
|
||||
|
||||
/* ─── Tech Stack (numbered list) ─── */
|
||||
.tech-stack {
|
||||
padding: 80px 0;
|
||||
}
|
||||
|
||||
.stack-list {
|
||||
list-style: none;
|
||||
counter-reset: stack;
|
||||
}
|
||||
|
||||
.stack-item {
|
||||
counter-increment: stack;
|
||||
display: grid;
|
||||
grid-template-columns: 32px 1fr;
|
||||
gap: 0 24px;
|
||||
padding: 24px 0;
|
||||
border-bottom: 1px solid var(--border-light);
|
||||
}
|
||||
|
||||
.stack-item:first-child { border-top: 1px solid var(--border-light); }
|
||||
|
||||
.stack-num {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 12px;
|
||||
color: var(--text-faint);
|
||||
padding-top: 2px;
|
||||
}
|
||||
|
||||
.stack-content h3 {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: var(--text-heading);
|
||||
margin-bottom: 6px;
|
||||
letter-spacing: -0.2px;
|
||||
}
|
||||
|
||||
.stack-content p {
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
color: var(--text-muted);
|
||||
max-width: 640px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.stack-content .tags {
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.tag {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 11px;
|
||||
color: var(--text-faint);
|
||||
background: rgba(255,255,255,0.03);
|
||||
padding: 3px 8px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid rgba(255,255,255,0.04);
|
||||
}
|
||||
|
||||
/* ─── Selected Work ─── */
|
||||
.selected-work {
|
||||
padding: 0 0 80px;
|
||||
}
|
||||
|
||||
.work-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.work-card {
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
padding: 24px;
|
||||
transition: border-color 0.2s;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.work-card:hover { border-color: var(--text-faint); }
|
||||
|
||||
.work-card.featured {
|
||||
grid-column: 1 / -1;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 24px;
|
||||
align-items: start;
|
||||
background: linear-gradient(135deg, var(--surface) 0%, rgba(212,136,42,0.03) 100%);
|
||||
border-color: rgba(212,136,42,0.15);
|
||||
}
|
||||
|
||||
.work-card.featured:hover { border-color: rgba(212,136,42,0.3); }
|
||||
|
||||
.work-card-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.work-status {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 50%;
|
||||
background: var(--green);
|
||||
box-shadow: 0 0 6px rgba(63,185,80,0.4);
|
||||
}
|
||||
|
||||
.work-name {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 12px;
|
||||
color: var(--text-heading);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.work-env {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 10px;
|
||||
color: var(--text-faint);
|
||||
margin-left: auto;
|
||||
background: var(--green-dim);
|
||||
padding: 2px 6px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.work-desc {
|
||||
font-size: 13px;
|
||||
line-height: 1.55;
|
||||
color: var(--text-muted);
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.work-meta {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 11px;
|
||||
color: var(--text-faint);
|
||||
display: flex;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.work-stages {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.work-stage {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 11px;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.work-stage .stage-dot {
|
||||
width: 5px;
|
||||
height: 5px;
|
||||
border-radius: 50%;
|
||||
background: var(--green);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
/* ─── Services ─── */
|
||||
.services {
|
||||
padding: 0 0 80px;
|
||||
}
|
||||
|
||||
.services-list {
|
||||
list-style: none;
|
||||
counter-reset: svc;
|
||||
}
|
||||
|
||||
.svc-item {
|
||||
counter-increment: svc;
|
||||
display: grid;
|
||||
grid-template-columns: 32px 1fr;
|
||||
gap: 0 24px;
|
||||
padding: 24px 0;
|
||||
border-bottom: 1px solid var(--border-light);
|
||||
}
|
||||
|
||||
.svc-item:first-child { border-top: 1px solid var(--border-light); }
|
||||
|
||||
.svc-num {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 12px;
|
||||
color: var(--text-faint);
|
||||
padding-top: 2px;
|
||||
}
|
||||
|
||||
.svc-content h3 {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: var(--text-heading);
|
||||
margin-bottom: 6px;
|
||||
letter-spacing: -0.2px;
|
||||
}
|
||||
|
||||
.svc-content p {
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
color: var(--text-muted);
|
||||
max-width: 640px;
|
||||
}
|
||||
|
||||
/* ─── Contact ─── */
|
||||
.contact {
|
||||
padding: 0 0 80px;
|
||||
display: grid;
|
||||
grid-template-columns: 1.2fr 1fr;
|
||||
gap: 48px;
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
.contact-text h2 {
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
letter-spacing: -0.4px;
|
||||
color: var(--text-heading);
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.contact-text p {
|
||||
font-size: 15px;
|
||||
line-height: 1.6;
|
||||
color: var(--text-muted);
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.contact-links {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.contact-panel {
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
padding: 24px;
|
||||
}
|
||||
|
||||
.contact-panel h3 {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
color: var(--text-heading);
|
||||
margin-bottom: 16px;
|
||||
letter-spacing: -0.1px;
|
||||
}
|
||||
|
||||
.contact-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 10px 0;
|
||||
border-bottom: 1px solid var(--border-light);
|
||||
}
|
||||
|
||||
.contact-row:last-child { border-bottom: none; }
|
||||
|
||||
.contact-row .label {
|
||||
font-size: 13px;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.contact-row .value {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 12px;
|
||||
color: var(--text);
|
||||
text-decoration: none;
|
||||
transition: color 0.15s;
|
||||
}
|
||||
.contact-row .value:hover { color: var(--accent); }
|
||||
|
||||
/* ─── Footer ─── */
|
||||
footer {
|
||||
padding: 24px 0;
|
||||
border-top: 1px solid var(--border);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
footer .brand {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 12px;
|
||||
color: var(--text-faint);
|
||||
}
|
||||
|
||||
footer .links { display: flex; gap: 24px; }
|
||||
|
||||
footer .links a {
|
||||
color: var(--text-faint);
|
||||
text-decoration: none;
|
||||
font-size: 13px;
|
||||
transition: color 0.15s;
|
||||
}
|
||||
footer .links a:hover { color: var(--text-muted); }
|
||||
|
||||
/* ─── Responsive ─── */
|
||||
@media (max-width: 800px) {
|
||||
body { padding: 0 20px; }
|
||||
|
||||
header { padding: 20px 0; }
|
||||
header nav { gap: 20px; }
|
||||
|
||||
.hero {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 32px;
|
||||
padding: 48px 0 40px;
|
||||
}
|
||||
|
||||
.tech-stack, .services { padding: 48px 0; }
|
||||
|
||||
.work-grid { grid-template-columns: 1fr; }
|
||||
|
||||
.work-card.featured {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.contact {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 24px;
|
||||
padding: 0 0 48px;
|
||||
}
|
||||
|
||||
.stack-item { grid-template-columns: 24px 1fr; gap: 0 16px; }
|
||||
.svc-item { grid-template-columns: 24px 1fr; gap: 0 16px; }
|
||||
|
||||
.trust-bar { gap: 24px; }
|
||||
}
|
||||
|
||||
@media (max-width: 520px) {
|
||||
header { flex-direction: column; align-items: flex-start; gap: 12px; }
|
||||
|
||||
.hero h1 { letter-spacing: -0.8px; }
|
||||
|
||||
.hero-cta { flex-direction: column; align-items: flex-start; }
|
||||
.btn-primary, .btn-ghost { width: 100%; justify-content: center; }
|
||||
|
||||
.work-meta { flex-direction: column; gap: 4px; }
|
||||
|
||||
footer { flex-direction: column; gap: 12px; align-items: flex-start; }
|
||||
|
||||
.trust-bar { gap: 20px; }
|
||||
.trust-value { font-size: 14px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- ─── Header ─── -->
|
||||
<header>
|
||||
<div class="logo"><span class="star">★</span> siriusdevops.com</div>
|
||||
<nav>
|
||||
<a href="#stack">Tech Stack</a>
|
||||
<a href="#work">Selected Work</a>
|
||||
<a href="#services">Services</a>
|
||||
<a href="#contact">Contact</a>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<!-- ─── Hero ─── -->
|
||||
<section class="hero">
|
||||
<div class="hero-left">
|
||||
<div class="hero-subtitle">Cloud Infrastructure Engineering</div>
|
||||
<h1>I build infrastructure<br>that <span class="accent-word">stays out of the way.</span></h1>
|
||||
<p class="hero-description">
|
||||
Solo infrastructure engineer for teams who'd rather ship features than debug cluster networking. <strong>Production clusters, AI inference platforms, GitOps pipelines, hardened databases.</strong> Everything versioned, everything automated.
|
||||
</p>
|
||||
<div class="hero-cta">
|
||||
<a href="#contact" class="btn-primary">Get in touch</a>
|
||||
<a href="#work" class="btn-ghost">See what's running</a>
|
||||
</div>
|
||||
<div class="trust-bar">
|
||||
<div class="trust-item">
|
||||
<span class="trust-value">100+ days</span>
|
||||
<span class="trust-label">Continuous uptime</span>
|
||||
</div>
|
||||
<div class="trust-item">
|
||||
<span class="trust-value">24/7</span>
|
||||
<span class="trust-label">Always running</span>
|
||||
</div>
|
||||
<div class="trust-item">
|
||||
<span class="trust-value">Multi-region</span>
|
||||
<span class="trust-label">Cluster topology</span>
|
||||
</div>
|
||||
<div class="trust-item">
|
||||
<span class="trust-value">GPU-accelerated</span>
|
||||
<span class="trust-label">Inference ready</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="terminal" aria-label="Terminal showing cluster status">
|
||||
<div class="terminal-bar">
|
||||
<span class="terminal-dot red"></span>
|
||||
<span class="terminal-dot yellow"></span>
|
||||
<span class="terminal-dot green"></span>
|
||||
<span class="terminal-title">kubectl — production</span>
|
||||
</div>
|
||||
<div class="terminal-body">
|
||||
<div><span class="prompt">%</span> <span class="cmd">kubectl</span> <span class="flag">get nodes</span></div>
|
||||
<div><span class="value">NAME</span> <span class="dim">STATUS</span> <span class="dim">ROLES</span> <span class="dim">AGE</span></div>
|
||||
<div><span class="value">prod-pool-1-7xk2</span> <span class="status-ok">Ready</span> <span class="dim">general</span> <span class="dim">142d</span></div>
|
||||
<div><span class="value">prod-pool-2-m9z1</span> <span class="status-ok">Ready</span> <span class="dim">general</span> <span class="dim">142d</span></div>
|
||||
<div><span class="value">gpu-pool-a3f8</span> <span class="status-ok">Ready</span> <span class="dim">gpu</span> <span class="dim">89d</span></div>
|
||||
<div><span class="value">gpu-pool-b2k1</span> <span class="status-ok">Ready</span> <span class="dim">gpu</span> <span class="dim">89d</span></div>
|
||||
<br>
|
||||
<div><span class="prompt">%</span> <span class="cmd">flux</span> <span class="flag">get kustomizations</span></div>
|
||||
<div><span class="value">NAME</span> <span class="dim">READY</span> <span class="dim">MESSAGE</span> <span class="dim">AGE</span></div>
|
||||
<div><span class="value">infra</span> <span class="status-ok">True</span> <span class="dim">reconciled successfully</span> <span class="dim">2m</span></div>
|
||||
<div><span class="value">apps</span> <span class="status-ok">True</span> <span class="dim">reconciled successfully</span> <span class="dim">2m</span></div>
|
||||
<br>
|
||||
<div><span class="prompt">%</span> <span class="cursor-blink"></span></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="section-divider" role="separator"></div>
|
||||
|
||||
<!-- ─── Tech Stack ─── -->
|
||||
<section class="tech-stack" id="stack">
|
||||
<div class="section-overline">Tech Stack</div>
|
||||
<h2 class="section-title">Technologies I work with daily</h2>
|
||||
|
||||
<ol class="stack-list">
|
||||
<li class="stack-item">
|
||||
<span class="stack-num">01</span>
|
||||
<div class="stack-content">
|
||||
<h3>Orchestration & Clusters</h3>
|
||||
<p>Multi-region Kubernetes, auto-provisioning node pools, workload identity federation. Clusters designed to run reliably from day one.</p>
|
||||
<div class="tags">
|
||||
<span class="tag">Kubernetes</span>
|
||||
<span class="tag">GKE Autopilot</span>
|
||||
<span class="tag">kubeadm</span>
|
||||
<span class="tag">Multi-cluster</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="stack-item">
|
||||
<span class="stack-num">02</span>
|
||||
<div class="stack-content">
|
||||
<h3>CI/CD & GitOps</h3>
|
||||
<p>Every commit propagates to cluster — auditable, repeatable, fast. Automated dependency updates, zero-downtime rollouts, instant rollback if something breaks.</p>
|
||||
<div class="tags">
|
||||
<span class="tag">GitHub Actions</span>
|
||||
<span class="tag">Flux CD</span>
|
||||
<span class="tag">Zero-downtime</span>
|
||||
<span class="tag">Auto-rollout</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="stack-item">
|
||||
<span class="stack-num">03</span>
|
||||
<div class="stack-content">
|
||||
<h3>AI/ML Infrastructure</h3>
|
||||
<p>GPU-accelerated serving with scale-to-zero autoscaling, model routing, multi-tenant isolation, and cost tracking. From lightweight dispatch to heavy inference.</p>
|
||||
<div class="tags">
|
||||
<span class="tag">GPU Serving</span>
|
||||
<span class="tag">vLLM</span>
|
||||
<span class="tag">Model Routing</span>
|
||||
<span class="tag">Scale-to-Zero</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="stack-item">
|
||||
<span class="stack-num">04</span>
|
||||
<div class="stack-content">
|
||||
<h3>Data & Storage</h3>
|
||||
<p>High-availability PostgreSQL with automated backups, point-in-time recovery, and connection pooling. Time-series databases and message queues for event-driven architectures.</p>
|
||||
<div class="tags">
|
||||
<span class="tag">PostgreSQL</span>
|
||||
<span class="tag">CNPG</span>
|
||||
<span class="tag">PgBouncer</span>
|
||||
<span class="tag">Time-series</span>
|
||||
<span class="tag">Message Queues</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="stack-item">
|
||||
<span class="stack-num">05</span>
|
||||
<div class="stack-content">
|
||||
<h3>Networking & Security</h3>
|
||||
<p>Network segmentation, mTLS, encrypted secrets with KMS unsealing, and CIS benchmark compliance. Defense in depth applied by default.</p>
|
||||
<div class="tags">
|
||||
<span class="tag">Cilium</span>
|
||||
<span class="tag">Gateway API</span>
|
||||
<span class="tag">mTLS</span>
|
||||
<span class="tag">Encrypted Secrets</span>
|
||||
<span class="tag">KMS</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="stack-item">
|
||||
<span class="stack-num">06</span>
|
||||
<div class="stack-content">
|
||||
<h3>Observability</h3>
|
||||
<p>Prometheus metrics, Grafana dashboards, structured logging, and alerting pipelines that notify before you notice. Full traceability from symptom to root cause.</p>
|
||||
<div class="tags">
|
||||
<span class="tag">Prometheus</span>
|
||||
<span class="tag">Grafana</span>
|
||||
<span class="tag">Structured Logging</span>
|
||||
<span class="tag">Alerting</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="stack-item">
|
||||
<span class="stack-num">07</span>
|
||||
<div class="stack-content">
|
||||
<h3>Infrastructure as Code</h3>
|
||||
<p>Declarative configurations with strict separation between provisioning and application manifests. Two-repo discipline — infrastructure and apps never mix.</p>
|
||||
<div class="tags">
|
||||
<span class="tag">Terraform</span>
|
||||
<span class="tag">Kustomize</span>
|
||||
<span class="tag">Declarative</span>
|
||||
<span class="tag">Two-repo discipline</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<div class="section-divider" role="separator"></div>
|
||||
|
||||
<!-- ─── Selected Work ─── -->
|
||||
<section class="selected-work" id="work">
|
||||
<div class="section-overline">Selected Work</div>
|
||||
<h2 class="section-title">Systems that are actually running</h2>
|
||||
<p style="max-width: 680px; font-size: 14px; line-height: 1.6; color: var(--text-muted); margin-bottom: 32px;">
|
||||
Not portfolio pieces or demos. Production systems processing real data, serving real workloads, running 24/7.
|
||||
</p>
|
||||
|
||||
<!-- Featured: News Intelligence Pipeline -->
|
||||
<div class="work-card featured" style="margin-bottom: 16px; cursor: default;">
|
||||
<div>
|
||||
<div class="work-card-header">
|
||||
<span class="work-status"></span>
|
||||
<span class="work-name">Autonomous news intelligence pipeline</span>
|
||||
<span class="work-env">production</span>
|
||||
</div>
|
||||
<p class="work-desc">
|
||||
Full autonomous pipeline: scrapes news sources continuously, runs LLM-based analysis on GPU, and pushes trading signals to messaging platforms in real time. Monitors financial markets with algorithmic strategies.
|
||||
</p>
|
||||
<div class="work-meta">
|
||||
<span>100+ sources</span>
|
||||
<span>LLM analysis</span>
|
||||
<span>real-time alerts</span>
|
||||
<span>4-stage pipeline</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="work-stages">
|
||||
<div class="work-stage"><span class="stage-dot"></span> Ingestion — Scraping + dedup</div>
|
||||
<div class="work-stage"><span class="stage-dot"></span> Analysis — LLM on GPU</div>
|
||||
<div class="work-stage"><span class="stage-dot"></span> Storage — PostgreSQL + API</div>
|
||||
<div class="work-stage"><span class="stage-dot"></span> Delivery — Real-time alerts</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="work-grid">
|
||||
<div class="work-card" style="cursor: default;">
|
||||
<div class="work-card-header">
|
||||
<span class="work-status"></span>
|
||||
<span class="work-name">Multi-agent AI orchestration platform</span>
|
||||
<span class="work-env">production</span>
|
||||
</div>
|
||||
<p class="work-desc">Specialist agent teams coordinated through kanban-driven task decomposition. Persistent memory, autonomous coding, research, and operations — infrastructure managed by the very agents it runs.</p>
|
||||
<div class="work-meta">
|
||||
<span>multi-agent</span>
|
||||
<span>kanban-driven</span>
|
||||
<span>self-operating</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="work-card" style="cursor: default;">
|
||||
<div class="work-card-header">
|
||||
<span class="work-status"></span>
|
||||
<span class="work-name">Real-time financial data infrastructure</span>
|
||||
<span class="work-env">production</span>
|
||||
</div>
|
||||
<p class="work-desc">Market data feeds, whale tracking, position scanners, and trading signal pipelines. Low-latency infrastructure running continuously on dedicated clusters with high-availability databases.</p>
|
||||
<div class="work-meta">
|
||||
<span>hundreds of feeds</span>
|
||||
<span>24/7</span>
|
||||
<span>low-latency</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="work-card" style="cursor: default;">
|
||||
<div class="work-card-header">
|
||||
<span class="work-status"></span>
|
||||
<span class="work-name">Managed cloud infrastructure</span>
|
||||
<span class="work-env">multi-region</span>
|
||||
</div>
|
||||
<p class="work-desc">Production clusters, high-availability databases, and GitOps deployments across multiple workloads. Terraform provisioning, automated rollouts, and continuous monitoring.</p>
|
||||
<div class="work-meta">
|
||||
<span>multi-cluster</span>
|
||||
<span>GitOps</span>
|
||||
<span>100+ day uptime</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="work-card" style="cursor: default;">
|
||||
<div class="work-card-header">
|
||||
<span class="work-status"></span>
|
||||
<span class="work-name">Private AI inference platform</span>
|
||||
<span class="work-env">production</span>
|
||||
</div>
|
||||
<p class="work-desc">GPU-accelerated serving with autoscaling, model routing, and cost tracking. Fully isolated environments with multi-tenant support and scale-to-zero for cost efficiency.</p>
|
||||
<div class="work-meta">
|
||||
<span>GPU-accelerated</span>
|
||||
<span>scale-to-zero</span>
|
||||
<span>multi-tenant</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="section-divider" role="separator"></div>
|
||||
|
||||
<!-- ─── Services ─── -->
|
||||
<section class="services" id="services">
|
||||
<div class="section-overline">Services</div>
|
||||
<h2 class="section-title">What I deliver</h2>
|
||||
|
||||
<ol class="services-list">
|
||||
<li class="svc-item">
|
||||
<span class="svc-num">01</span>
|
||||
<div class="svc-content">
|
||||
<h3>End-to-end infrastructure design and management</h3>
|
||||
<p>Production clusters designed from scratch, provisioned with IaC, and managed with GitOps. Automated builds, zero-downtime updates, encrypted secrets, and monitoring that alerts before you notice. I operate what I build.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="svc-item">
|
||||
<span class="svc-num">02</span>
|
||||
<div class="svc-content">
|
||||
<h3>AI/ML platform deployment and scaling</h3>
|
||||
<p>GPU-accelerated inference platforms with autoscaling, model routing, multi-tenant isolation, and cost controls. From prototype to production — your models, your data, fully isolated.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="svc-item">
|
||||
<span class="svc-num">03</span>
|
||||
<div class="svc-content">
|
||||
<h3>Autonomous agent system architecture</h3>
|
||||
<p>Multi-agent systems with specialist teams, shared orchestration, persistent memory, and versioned operations. Agents that plan, research, code, review, and execute — with full traceability.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="svc-item">
|
||||
<span class="svc-num">04</span>
|
||||
<div class="svc-content">
|
||||
<h3>CI/CD and GitOps implementation</h3>
|
||||
<p>Automated pipelines from commit to cluster. Dependency updates, zero-downtime rollouts, instant rollback, and auditable history. No click-ops, no manual deployments.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="svc-item">
|
||||
<span class="svc-num">05</span>
|
||||
<div class="svc-content">
|
||||
<h3>Security audits and hardening</h3>
|
||||
<p>Network segmentation, non-root containers, encrypted secrets, mTLS, CIS benchmarks, and vulnerability scanning. Defense in depth applied systematically, not retrofitted after an incident.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<div class="section-divider" role="separator"></div>
|
||||
|
||||
<!-- ─── Contact ─── -->
|
||||
<section class="contact" id="contact">
|
||||
<div class="contact-text">
|
||||
<h2>Available for consulting and contracts</h2>
|
||||
<p>Whether you need a production cluster designed from scratch, an existing setup hardened for security, or an autonomous intelligence system built for your domain — reach out. I work remotely and communicate in code reviews and commit messages.</p>
|
||||
<div class="contact-links">
|
||||
<a href="mailto:sirius@siriusdevops.com" class="btn-primary">Email me</a>
|
||||
<a href="https://github.com/sirius0xdev" target="_blank" rel="noopener" class="btn-ghost">GitHub</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="contact-panel">
|
||||
<h3>Quick reference</h3>
|
||||
<div class="contact-row">
|
||||
<span class="label">Email</span>
|
||||
<a href="mailto:sirius@siriusdevops.com" class="value">sirius@siriusdevops.com</a>
|
||||
</div>
|
||||
<div class="contact-row">
|
||||
<span class="label">GitHub</span>
|
||||
<a href="https://github.com/sirius0xdev" target="_blank" rel="noopener" class="value">sirius0xdev</a>
|
||||
</div>
|
||||
<div class="contact-row">
|
||||
<span class="label">Availability</span>
|
||||
<span class="value">Available for new projects</span>
|
||||
</div>
|
||||
<div class="contact-row">
|
||||
<span class="label">Location</span>
|
||||
<span class="value">Remote / Async-first</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ─── Footer ─── -->
|
||||
<footer>
|
||||
<div class="brand">siriusdevops.com</div>
|
||||
<div class="links">
|
||||
<a href="https://github.com/sirius0xdev">GitHub</a>
|
||||
<a href="mailto:sirius@siriusdevops.com">Email</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
<!-- ci trigger 1783449910 -->
|
||||
Loading…
Add table
Reference in a new issue