From 16d8c65f0283ba19dff145d2b22929dddefcfaad Mon Sep 17 00:00:00 2001 From: jrodriiguezg Date: Sat, 15 Aug 2026 15:15:37 +0200 Subject: [PATCH] Subir archivos a "/" --- index.html | 358 ++++++++++++++++++++++++++++++-------------------- lab.css | 375 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 589 insertions(+), 144 deletions(-) create mode 100644 lab.css diff --git a/index.html b/index.html index 336d525..413cc70 100644 --- a/index.html +++ b/index.html @@ -3,179 +3,249 @@ - Juan Rodriguez Gil — Deployment & Infrastructure - + Lab — jrodriiguezg.link + - - + + - -
-
-

- Infrastructure
- that just works. -

-
-
-

- I design and deploy Linux and Docker-based stacks for teams that can't afford surprises in production. From a single service to a full AI pipeline. -

- Talk to me → -
+
+

/ lab

+

The hardware
behind the work.

+

+ This is the physical infrastructure I run at home. Every deployment, every stack, every test runs on these machines. No cloud dependency unless the project requires it. +

- -
+
- -
+ +
+
+
+ Primary Node +

HP EliteDesk 700 G4

+
+
+ + Online +
+
-
-

Services

-
-
-

Container Architecture

-

Translating complex application dependencies into clean, reproducible Docker Compose stacks. Every service isolated, every config versioned.

+
+
+

CPU

+

AMD PRO A10-8770E R7

+

10 Compute Cores — 4C + 6G

+
+
+

RAM

+

16 GB

+
+
+

OS

+

Debian 13 (Trixie)

+

Primary server

+
+
+ +
+

Storage

+
+
+
+ + + + + +
+

System

+

128 GB

+

SSD

-
-

AI & LLM Infrastructure

-

Private deployment of language models and RAG pipelines. Local Ollama setups, ChromaDB integration, and intelligent request routing.

+
+
+ + + + + +
+

Multimedia 1

+

1 TB

+

NVMe SSD

-
-

Linux Systems Engineering

-

Server setup, hardening, and long-term administration. Debian, RHEL, Ubuntu, Fedora.

+
+
+ + + + + +
+

Multimedia 2

+

512 GB

+

NVMe SSD

-
-

Infrastructure Audit

-

A deep review of your current deployment — finding the things that will hurt you before they do.

+
+
+ + + + + +
+

Backup & Data

+

4 TB

+

HDD

-
- -
-

Tools & Skills

-
-
-

Infrastructure

-

Docker · Docker Compose · Podman · Cloudflare · Nginx · Bash · Git · Python

-
-
-

Linux & Systems

-

Debian · RHEL · Ubuntu · Fedora · Windows Server · Windows administration

-
-
-

Networking

-

DNS · Reverse proxy · VPN · LAN/WAN · Cloudflare Tunnels · Firewall configuration

-
-
-

AI & Data

-

Ollama · ChromaDB · LlamaIndex · OpenWebUI · AnythingLLM · Jupyter · Python

-
-
-

Electronics & Hardware

-

Circuit design · Soldering · Arduino · ESP32 · Raspberry Pi · KiCad · FreeCAD

-
-
-

Business Software

-

Odoo ERP · Microsoft Excel · Office 365

-
-
-

Design & Documentation

-

Inkscape · Canva · Markdown · FreeCAD

-
-
-
- - - Home Lab -

Two Linux servers running 15+ self-hosted services. See the hardware and what's deployed on it.

- View the lab → -
- +
- - +
+
+

CPU

+

Broadcom BCM2711

+

Quad-core ARM Cortex-A72 @ 1.8 GHz

+
+
+

RAM

+

4 GB LPDDR4

+
+
+

OS

+

Debian 13 (Trixie)

+

Lightweight services & hardware integration

+
+
- + + +
+
+ +
+

HP EliteDesk 700 G4

+
+
+ Home Assistant + Home automation platform + hamaca.jrodriiguezg.link ↗ +
+
+ Jellyfin + Media server + jellyfin.jrodriiguezg.link ↗ +
+
+ Navidrome + Music streaming server + navidrome.jrodriiguezg.link ↗ +
+
+ Synapse + Matrix homeserver + macarron.jrodriiguezg.link ↗ +
+
+ Drawio + Diagram editor + drawio.jrodriiguezg.link ↗ +
+ +
+ Odoo + ERP (test instance) + jotarcloud.jrodriiguezg.link ↗ +
+
+ Kroki + Diagram rendering API + Internal +
+ + +
+ Element Web + Matrix web client + Internal +
+
+
+ +
+

Raspberry Pi 4B

+
+
+ Cloudflared + Cloudflare Tunnel — WAN exposure & public routing + Internal daemon +
+
+ Homarr + Dashboard for self-hosted services + hmrr.jrodriiguezg.link ↗ +
+
+ Gitea + Self-hosted Git service + Internal +
+
+ NPM + Nginx Proxy Manager — reverse proxy + Internal +
+
+ Adguard Home + DNS-level ad & tracker blocking + Internal +
+
+ Arcane + Network scanner + Internal +
+
+
+ +
+
- \ No newline at end of file + diff --git a/lab.css b/lab.css new file mode 100644 index 0000000..09e576d --- /dev/null +++ b/lab.css @@ -0,0 +1,375 @@ +:root { + --bg: #111111; + --surface: #181818; + --text: #e2e2e2; + --muted: #666; + --border: #242424; +} + +* { margin: 0; padding: 0; box-sizing: border-box; } +html { scroll-behavior: smooth; } + +body { + font-family: 'Inter', sans-serif; + background: var(--bg); + color: var(--text); + font-size: 1rem; + line-height: 1.7; + -webkit-font-smoothing: antialiased; +} + +/* ─── NAV ─── */ + +nav { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.8rem 4rem; + border-bottom: 1px solid var(--border); +} + +.nav-name { + font-size: 0.95rem; + font-weight: 500; + color: var(--text); + text-decoration: none; +} + +.nav-links { + display: flex; + gap: 2.5rem; +} + +.nav-links a { + font-size: 0.85rem; + color: var(--muted); + text-decoration: none; + transition: color 0.2s; +} + +.nav-links a:hover { color: var(--text); } +.nav-active { color: var(--text) !important; } + +/* ─── HEADER ─── */ + +.lab-header { + padding: 5rem 4rem 4rem; + border-bottom: 1px solid var(--border); + max-width: 640px; +} + +.eyebrow { + font-size: 0.75rem; + color: var(--muted); + letter-spacing: 0.08em; + text-transform: uppercase; + margin-bottom: 1.5rem; +} + +h1 { + font-size: clamp(2.4rem, 4vw, 3.5rem); + font-weight: 600; + line-height: 1.1; + letter-spacing: -0.03em; + margin-bottom: 1.5rem; +} + +h1 em { + font-style: italic; + font-weight: 300; +} + +.tagline { + font-size: 1rem; + color: var(--muted); + font-weight: 300; + line-height: 1.8; +} + +/* ─── MAIN CONTENT ─── */ + +.lab-content { + padding: 4rem; + display: flex; + flex-direction: column; + gap: 2rem; +} + +/* ─── NODE CARD ─── */ + +.node { + border: 1px solid var(--border); + border-radius: 6px; + overflow: hidden; +} + +.node-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + padding: 2rem 2.5rem; + border-bottom: 1px solid var(--border); + background: var(--surface); +} + +.node-label { + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--muted); + display: block; + margin-bottom: 0.4rem; +} + +.node-header h2 { + font-size: 1.3rem; + font-weight: 600; + letter-spacing: -0.02em; +} + +.node-status { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.8rem; + color: var(--muted); + padding-top: 0.2rem; +} + +.status-dot { + width: 7px; + height: 7px; + background: #4a4a4a; + border-radius: 50%; +} + +/* ─── SPECS ─── */ + +.node-specs { + display: grid; + grid-template-columns: repeat(3, 1fr); + border-bottom: 1px solid var(--border); +} + +.spec-group { + padding: 1.8rem 2.5rem; + border-right: 1px solid var(--border); +} + +.spec-group:last-child { border-right: none; } + +.spec-label { + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--muted); + margin-bottom: 0.5rem; +} + +.spec-value { + font-size: 1rem; + font-weight: 500; + margin-bottom: 0.2rem; +} + +.spec-sub { + font-size: 0.8rem; + color: var(--muted); + font-weight: 300; +} + +/* ─── STORAGE ─── */ + +.storage-section { + padding: 2rem 2.5rem; +} + +.storage-section .spec-label { + margin-bottom: 1.5rem; +} + +.storage-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 1rem; +} + +.disk { + background: var(--bg); + border: 1px solid var(--border); + border-radius: 4px; + padding: 1.5rem 1rem; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + gap: 0.4rem; +} + +.disk-icon { + width: 36px; + height: 36px; + color: var(--muted); + margin-bottom: 0.5rem; +} + +.disk-icon svg { width: 100%; height: 100%; } + +.disk-name { + font-size: 0.75rem; + color: var(--muted); + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.disk-size { + font-size: 1.3rem; + font-weight: 600; + letter-spacing: -0.02em; +} + +.disk-type { + font-size: 0.75rem; + color: var(--muted); + font-weight: 300; +} + +/* ─── SERVICES ─── */ + +.services-section { + border-top: 1px solid var(--border); + padding: 4rem; +} + +.services-inner { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 4rem; + align-items: start; +} + +.services-node-label { + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--muted); + margin-bottom: 1.5rem; + padding-bottom: 0.75rem; + border-bottom: 1px solid var(--border); +} + +.services-list { + display: flex; + flex-direction: column; +} + +.service-row { + display: grid; + grid-template-columns: 140px 1fr auto; + align-items: center; + gap: 1rem; + padding: 0.75rem 0; + border-bottom: 1px solid var(--border); + font-size: 0.875rem; +} + +.service-name { + font-weight: 500; + white-space: nowrap; +} + +.service-desc { + color: var(--muted); + font-weight: 300; + font-size: 0.82rem; +} + +.service-endpoint { + font-size: 0.78rem; + white-space: nowrap; + text-align: right; +} + +.service-endpoint.public { + color: var(--text); + text-decoration: none; + transition: opacity 0.2s; +} + +.service-endpoint.public:hover { opacity: 0.6; } + +.service-endpoint.internal { + color: var(--muted); +} + +/* ─── FOOTER ─── */ + +footer { + padding: 1.5rem 4rem; + border-top: 1px solid var(--border); + font-size: 0.8rem; + color: var(--muted); + display: flex; + justify-content: space-between; +} + +footer a { + color: var(--muted); + text-decoration: none; + transition: color 0.2s; +} + +footer a:hover { color: var(--text); } + +/* ─── TABLET ─── */ + +@media (max-width: 900px) { + nav { padding: 1.5rem 2rem; } + .lab-header { padding: 4rem 2rem 3rem; } + .lab-content { padding: 2rem; } + + .node-specs { grid-template-columns: repeat(2, 1fr); } + .spec-group:nth-child(2) { border-right: none; } + .spec-group:nth-child(3) { border-top: 1px solid var(--border); border-right: none; } + + .storage-grid { grid-template-columns: repeat(2, 1fr); } + + .services-section { padding: 2rem; } + .services-inner { grid-template-columns: 1fr; gap: 2.5rem; } + .service-row { grid-template-columns: 120px 1fr auto; } + + footer { padding: 1.5rem 2rem; } +} + +/* ─── MOBILE ─── */ + +@media (max-width: 520px) { + nav { padding: 1.2rem; } + .nav-links { gap: 1.2rem; } + + .lab-header { padding: 3rem 1.2rem 2.5rem; } + h1 { font-size: 2.2rem; } + + .lab-content { padding: 1.2rem; gap: 1.2rem; } + + .node-header { padding: 1.5rem; flex-direction: column; gap: 1rem; } + .node-specs { grid-template-columns: 1fr; } + .spec-group { + padding: 1.2rem 1.5rem; + border-right: none; + border-bottom: 1px solid var(--border); + } + .spec-group:last-child { border-bottom: none; } + + .storage-section { padding: 1.5rem; } + .storage-grid { grid-template-columns: repeat(2, 1fr); } + + .services-section { padding: 1.2rem; } + .service-row { + grid-template-columns: 1fr auto; + grid-template-rows: auto auto; + } + .service-desc { grid-column: 1 / -1; padding-bottom: 0.2rem; } + + footer { padding: 1.2rem; flex-direction: column; gap: 0.3rem; } +}