From 2068fa20721065f3dd0d991cc681c001eea33252 Mon Sep 17 00:00:00 2001 From: Shawn Date: Sun, 17 May 2026 23:37:12 -0400 Subject: [PATCH] =?UTF-8?q?Expand:=20full=20service=20catalog=20=E2=80=94?= =?UTF-8?q?=2016=20public=20+=2010=20internal=20+=2017=20LXC=20inventory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 79 ++++++-- index.html | 514 +++++++++++++++++------------------------------------ 2 files changed, 230 insertions(+), 363 deletions(-) diff --git a/README.md b/README.md index 13476dc..f15db99 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Ourpad β€” Project Directory -A living index of self-hosted projects, tools, and infrastructure powering the Ourpad home lab. +A living index of self-hosted projects, tools, and infrastructure powering the Ourpad home lab β€” 2 Proxmox nodes, 17 LXCs, 30+ services. ## Projects @@ -13,27 +13,74 @@ A living index of self-hosted projects, tools, and infrastructure powering the O | [Hermes Agent](https://github.com/NousResearch/hermes-agent) | Python, AI/ML | 🟒 Active | | [Obsidian Vault](https://obsidian.md) | Obsidian, Markdown, Dataview | 🟒 Active | -## Services +## Public Services (via `*.ourpad.casa`) -- **Gitea** β€” Self-hosted Git at [gitea.ourpad.casa](https://gitea.ourpad.casa) -- **Pass Vault** β€” Web-based secret manager at [pass.ourpad.casa](https://pass.ourpad.casa) -- **Proxmox VE** β€” 2-node cluster (192.168.0.144 + 192.168.0.110) -- **NPMplus** β€” Reverse proxy for `*.ourpad.casa` subdomains -- **Deluge** β€” Torrent client (media stack) -- **Jellyfin** β€” Media streaming server -- **Sonarr + Radarr** β€” TV & movie automation -- **Tailscale** β€” Mesh VPN (2 nodes) +| Service | URL | Description | +|---|---|---| +| Gitea | [gitea.ourpad.casa](https://gitea.ourpad.casa) | Self-hosted Git β€” repos, issues, CI | +| Pass Vault | [pass.ourpad.casa](https://pass.ourpad.casa) | Web-based secret management | +| Project Directory | [projects.ourpad.casa](https://projects.ourpad.casa) | This page | +| Heimdall Dashboard | [dashboard.ourpad.casa](https://dashboard.ourpad.casa) | Service landing page | +| Sonarr | [sonarr.ourpad.casa](https://sonarr.ourpad.casa) | TV show automation | +| Radarr | [radarr.ourpad.casa](https://radarr.ourpad.casa) | Movie automation | +| Jellyseerr | [jellyseerr.ourpad.casa](https://jellyseerr.ourpad.casa) | Media requests | +| Deluge | [deluge.ourpad.casa](https://deluge.ourpad.casa) | Torrent client | +| Jellyfin | [jellyfin.ourpad.casa](https://jellyfin.ourpad.casa) | Media streaming | +| Obsidian LiveSync | [obsidian.ourpad.casa](https://obsidian.ourpad.casa) | CouchDB sync server | +| Inventree | [inventory.ourpad.casa](https://inventory.ourpad.casa) | Inventory management | +| NPMplus | [npmplus.ourpad.casa](https://npmplus.ourpad.casa) | Reverse proxy admin | +| Proxmox Admin | [admin.ourpad.casa](https://admin.ourpad.casa) | VE management UI | +| Proxmox Media | [media.ourpad.casa](https://media.ourpad.casa) | Secondary VE host | +| RustDesk | [rustdesk.ourpad.casa](https://rustdesk.ourpad.casa) | Remote desktop relay | +| Canteen App | [canteen.ourpad.casa](https://canteen.ourpad.casa) | Asset tracker (WIP) | + +## Internal Services (Tailscale / internal only) + +| Service | Location | Notes | +|---|---|---| +| Prowlarr | CT 104 (192.168.0.225) | Indexer aggregator | +| Readarr | CT 108 (192.168.0.193) | Book management | +| Configarr | CT 107 (192.168.0.238) | Config sync | +| Unpackerr | CT 114 (192.168.0.119) | RAR extraction | +| Element Synapse | CT 112 (192.168.0.220) | Matrix server | +| Portainer | CT 100:9443 | Docker management | +| Hermes WebUI | CT 102:8787 | Agent dashboard | +| Deskbrid | CT 102 (local) | Desktop automation | +| Cloudflare DDNS | CT 105 (192.168.0.110) | Dynamic DNS updater | +| Tailscale | Mesh VPN | 2 nodes | ## Infrastructure -- **Primary Proxmox** (192.168.0.144): Docker LXC, arr stack, NAS -- **Secondary Proxmox** (192.168.0.110): NPMplus, Jellyfin, Cloudflare DDNS -- **NAS**: 3.6TB ext4 at `/mnt/nas`, bind-mounted into LXCs -- **Domain**: `ourpad.casa` via Cloudflare +| Component | Details | +|---|---| +| Primary Proxmox | 192.168.0.144 β€” VE 8.4, 31GB RAM, 14 LXCs | +| Secondary Proxmox | 192.168.0.110 β€” NPMplus, Jellyfin, DDNS | +| NAS Storage | 3.6TB ext4 at /mnt/nas, bind-mounted into LXCs | +| Docker LXC | CT 100 (192.168.0.223) β€” Gitea, Portainer, LiveSync, Nginx | +| Networking | Cloudflare DNS + proxy (68.202.6.107) β†’ NPMplus (192.168.0.115) | +| VPN | Tailscale mesh β€” oplabs + pixel-9a | -## Deployment +## LXC Inventory -This page is served as a static site from the Docker LXC (CT 100) behind NPMplus at `projects.ourpad.casa`. Updates are pushed to this repo and deployed automatically. +| CT ID | Name | Host | IP | Service | +|---|---|---|---|---| +| 100 | docker | pve | 192.168.0.223 | Docker β€” Gitea, Portainer, LiveSync, Nginx | +| 101 | debian | pve | β€” | Debian utility | +| 102 | hermes | pve | 100.89.190.113 | Hermes Agent host | +| 103 | sonarr | pve | 192.168.0.178 | Sonarr | +| 104 | prowlarr | pve | 192.168.0.225 | Prowlarr | +| 105 | radarr | pve | 192.168.0.123 | Radarr | +| 106 | jellyseerr | pve | 192.168.0.229 | Jellyseerr | +| 107 | configarr | pve | 192.168.0.238 | Configarr | +| 108 | readarr | pve | 192.168.0.193 | Readarr | +| 109 | deluge | pve | 192.168.0.243 | Deluge | +| 112 | elementsynapse | pve | 192.168.0.220 | Matrix | +| 114 | unpackerr | pve | 192.168.0.119 | Unpackerr | +| 115 | heimdall-dashboard | pve | 192.168.0.213 | Dashboard | +| 116 | inventree | pve | 192.168.0.132 | Inventory | +| 102 | npmplus | 192.168.0.110 | 192.168.0.115 | Reverse proxy | +| 104 | jellyfin | 192.168.0.110 | 192.168.0.125 | Media server | +| 105 | cloudflare-ddns | 192.168.0.110 | β€” | Dynamic DNS | --- diff --git a/index.html b/index.html index da4bfc3..3667f20 100644 --- a/index.html +++ b/index.html @@ -15,17 +15,12 @@ --gray-50: #fafafa; --link-blue: #0072f5; --focus-blue: hsla(212, 100%, 48%, 1); - --dev-blue: #0a72ef; - --preview-pink: #de1d8d; - --ship-red: #ff5b4f; --badge-bg: #ebf5ff; --badge-text: #0068d6; --ring: rgba(0,0,0,0.08) 0px 0px 0px 1px; --card-shadow: rgba(0,0,0,0.08) 0px 0px 0px 1px, rgba(0,0,0,0.04) 0px 2px 2px, rgba(0,0,0,0.04) 0px 8px 8px -8px, #fafafa 0px 0px 0px 1px; } - * { margin: 0; padding: 0; box-sizing: border-box; } - body { font-family: 'Geist', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; font-feature-settings: 'liga'; @@ -34,230 +29,68 @@ line-height: 1.5; -webkit-font-smoothing: antialiased; } - - /* Nav */ nav { - position: sticky; - top: 0; - background: var(--white); - box-shadow: var(--ring); - padding: 0 24px; - height: 56px; - display: flex; - align-items: center; - justify-content: space-between; - z-index: 100; - } - .nav-brand { - font-size: 18px; - font-weight: 600; - letter-spacing: -0.36px; - color: var(--black); - text-decoration: none; - } - .nav-links { - display: flex; - gap: 24px; - align-items: center; - } - .nav-links a { - font-size: 14px; - font-weight: 500; - color: var(--gray-600); - text-decoration: none; - transition: color 0.15s; + position: sticky; top: 0; background: var(--white); + box-shadow: var(--ring); padding: 0 24px; height: 56px; + display: flex; align-items: center; justify-content: space-between; z-index: 100; } + .nav-brand { font-size: 18px; font-weight: 600; letter-spacing: -0.36px; color: var(--black); text-decoration: none; } + .nav-links { display: flex; gap: 24px; align-items: center; } + .nav-links a { font-size: 14px; font-weight: 500; color: var(--gray-600); text-decoration: none; transition: color 0.15s; } .nav-links a:hover { color: var(--black); } - - /* Hero */ - .hero { - text-align: center; - padding: 120px 24px 80px; - } - .hero h1 { - font-size: 48px; - font-weight: 600; - line-height: 1.0; - letter-spacing: -2.4px; - color: var(--black); - margin-bottom: 16px; - } - .hero p { - font-size: 20px; - font-weight: 400; - line-height: 1.8; - color: var(--gray-600); - max-width: 560px; - margin: 0 auto; - } - - /* Section */ - .section { - max-width: 1200px; - margin: 0 auto; - padding: 0 24px 80px; - } - .section-header { - display: flex; - align-items: center; - gap: 8px; - margin-bottom: 32px; - } - .section-header h2 { - font-size: 32px; - font-weight: 600; - letter-spacing: -1.28px; - color: var(--black); - } - .section-header .badge { - display: inline-flex; - align-items: center; - background: var(--badge-bg); - color: var(--badge-text); - font-size: 12px; - font-weight: 500; - padding: 0 10px; - height: 24px; - border-radius: 9999px; - } - - /* Grid */ - .grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); - gap: 16px; - } - - /* Card */ + .hero { text-align: center; padding: 100px 24px 64px; } + .hero h1 { font-size: 48px; font-weight: 600; line-height: 1.0; letter-spacing: -2.4px; margin-bottom: 16px; } + .hero p { font-size: 20px; font-weight: 400; line-height: 1.8; color: var(--gray-600); max-width: 560px; margin: 0 auto; } + .section { max-width: 1200px; margin: 0 auto; padding: 0 24px 64px; } + .section-header { display: flex; align-items: center; gap: 8px; margin-bottom: 32px; } + .section-header h2 { font-size: 28px; font-weight: 600; letter-spacing: -1.12px; } + .section-header .badge { display: inline-flex; align-items: center; background: var(--badge-bg); color: var(--badge-text); font-size: 12px; font-weight: 500; padding: 0 10px; height: 24px; border-radius: 9999px; } + .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 16px; } + .grid-4 { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 12px; } .card { - background: var(--white); - box-shadow: var(--card-shadow); - border-radius: 8px; - padding: 24px; - text-decoration: none; - color: inherit; - transition: box-shadow 0.2s, transform 0.15s; - display: flex; - flex-direction: column; - gap: 12px; - } - .card:hover { - box-shadow: rgba(0,0,0,0.12) 0px 0px 0px 1px, rgba(0,0,0,0.06) 0px 2px 4px, rgba(0,0,0,0.04) 0px 12px 12px -8px, #fafafa 0px 0px 0px 1px; - transform: translateY(-1px); + background: var(--white); box-shadow: var(--card-shadow); border-radius: 8px; + padding: 24px; text-decoration: none; color: inherit; + transition: box-shadow 0.2s, transform 0.15s; display: flex; flex-direction: column; gap: 12px; } + .card:hover { box-shadow: rgba(0,0,0,0.12) 0px 0px 0px 1px, rgba(0,0,0,0.06) 0px 2px 4px, rgba(0,0,0,0.04) 0px 12px 12px -8px, #fafafa 0px 0px 0px 1px; transform: translateY(-1px); } + .card.nolink { pointer-events: none; } /* but still show hover */ + .card.nolink:hover { transform: none; box-shadow: var(--card-shadow); } + .card-header { display: flex; align-items: center; gap: 10px; } + .card-icon { width: 36px; height: 36px; border-radius: 6px; display: flex; align-items: center; justify-content: center; font-size: 18px; flex-shrink: 0; } + .card-title { font-size: 18px; font-weight: 600; letter-spacing: -0.36px; } + .card-desc { font-size: 13px; font-weight: 400; color: var(--gray-600); line-height: 1.6; } + .card-meta { display: flex; gap: 6px; flex-wrap: wrap; margin-top: auto; } + .tag { font-family: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, monospace; font-size: 10px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.3px; color: var(--gray-400); padding: 2px 8px; background: var(--gray-50); border-radius: 4px; } + .tag.active { background: #ecfdf5; color: #065f46; } + .tag.wip { background: #fef3c7; color: #92400e; } + .tag.internal { background: #f3e8ff; color: #7c3aed; } - .card-header { - display: flex; - align-items: center; - gap: 10px; - } - .card-icon { - width: 36px; - height: 36px; - border-radius: 6px; - display: flex; - align-items: center; - justify-content: center; - font-size: 18px; - flex-shrink: 0; - } - .card-title { - font-size: 20px; - font-weight: 600; - letter-spacing: -0.4px; - color: var(--black); - } - .card-desc { - font-size: 14px; - font-weight: 400; - color: var(--gray-600); - line-height: 1.6; - } - .card-meta { - display: flex; - gap: 8px; - flex-wrap: wrap; - margin-top: auto; - } - .tag { - font-family: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, monospace; - font-size: 11px; - font-weight: 500; - text-transform: uppercase; - letter-spacing: 0.5px; - color: var(--gray-400); - padding: 2px 8px; - background: var(--gray-50); - border-radius: 4px; - } - .tag.active { - background: #ecfdf5; - color: #065f46; - } - .tag.wip { - background: #fef3c7; - color: #92400e; + /* Service mini-card */ + .svc-card { + display: flex; align-items: center; gap: 12px; padding: 14px 18px; + background: var(--white); box-shadow: var(--ring); border-radius: 8px; + text-decoration: none; transition: box-shadow 0.15s; } + .svc-card:hover { box-shadow: rgba(0,0,0,0.15) 0px 0px 0px 1px, rgba(0,0,0,0.04) 0px 2px 4px; } + .svc-icon { font-size: 20px; flex-shrink: 0; } + .svc-name { font-size: 14px; font-weight: 500; color: var(--black); } + .svc-desc { font-size: 12px; color: var(--gray-400); margin-top: 1px; } + .svc-internal { opacity: 0.7; } + .svc-internal:hover { opacity: 1; } - /* Links section */ - .links-section { - background: var(--gray-50); - padding: 80px 24px; - box-shadow: rgba(0,0,0,0.04) 0px -1px 0px 0px; - } - .links-grid { - max-width: 1200px; - margin: 0 auto; - display: grid; - grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); - gap: 12px; - } - .link-card { - display: flex; - align-items: center; - gap: 12px; - padding: 16px 20px; - background: var(--white); - box-shadow: var(--ring); - border-radius: 8px; - text-decoration: none; - transition: box-shadow 0.15s; - } - .link-card:hover { - box-shadow: rgba(0,0,0,0.15) 0px 0px 0px 1px, rgba(0,0,0,0.04) 0px 2px 4px; - } - .link-card .lc-icon { - font-size: 20px; - flex-shrink: 0; - } - .link-card .lc-text { - font-size: 14px; - font-weight: 500; - color: var(--black); - } - .link-card .lc-sub { - font-size: 12px; - color: var(--gray-400); - } + .alt-bg { background: var(--gray-50); padding: 64px 24px; box-shadow: rgba(0,0,0,0.04) 0px -1px 0px 0px, rgba(0,0,0,0.04) 0px 1px 0px 0px; } + .alt-bg .section { padding-bottom: 0; } + .alt-bg + .alt-bg { box-shadow: rgba(0,0,0,0.04) 0px 1px 0px 0px; padding-top: 48px; } - /* Footer */ - footer { - text-align: center; - padding: 32px 24px; - font-size: 13px; - color: var(--gray-400); - } - footer a { - color: var(--link-blue); - text-decoration: none; - } + footer { text-align: center; padding: 32px 24px; font-size: 13px; color: var(--gray-400); } + footer a { color: var(--link-blue); text-decoration: none; } @media (max-width: 768px) { - .hero { padding: 64px 24px 48px; } - .hero h1 { font-size: 36px; letter-spacing: -1.8px; } + .hero { padding: 48px 24px 40px; } + .hero h1 { font-size: 32px; letter-spacing: -1.6px; } .hero p { font-size: 16px; } - .grid { grid-template-columns: 1fr; } - .section-header h2 { font-size: 24px; } + .grid, .grid-4 { grid-template-columns: 1fr; } + .section-header h2 { font-size: 22px; } .nav-links { display: none; } } @@ -269,183 +102,170 @@

Projects & Services

-

Self-hosted tools and infrastructure powering the Ourpad home lab β€” built with open source, deployed on Proxmox.

+

Self-hosted tools and infrastructure powering the Ourpad home lab β€” 2 Proxmox nodes, 16 LXCs, 30+ services.

+
-
-

Projects

- 6 -
+

Projects

6
- -
-
πŸ”
- Pass Vault -
-

Browser-based password manager β€” GPG-encrypted pass store with dark-themed web UI, mobile responsive, systemd service.

-
- FastAPI - pass - active -
+
πŸ”
Pass Vault
+

Browser-based password manager β€” GPG-encrypted pass store with dark-themed web UI. Mobile responsive, systemd service.

+
FastAPIpassactive
- -
-
πŸ“
- Canteen Asset Tracker -
+
πŸ“
Canteen Asset Tracker

Mobile webapp for tracking canteen assets β€” machine-id scanning, OCR, GPS check-ins, geofences, CSV export.

-
- FastAPI - SQLite - Vanilla JS - in progress -
+
FastAPISQLitein progress
- -
-
🌐
- Canteen Web App -
-

Full-stack canteen management frontend β€” login, navigation, asset CRUD, and reporting interface.

-
- Frontend - in progress -
+
🌐
Canteen Web App
+

Full-stack frontend for canteen management β€” login, navigation, asset CRUD, and reporting interface.

+
Frontendin progress
- -
-
πŸ“‚
- Project Directory -
+
πŸ“‚
Project Directory

This page β€” a living index of all Ourpad projects, services, and infrastructure. Served via NPMplus.

-
- HTML/CSS - Static - active -
+
HTML/CSSactive
- -
-
πŸ€–
- Hermes Agent -
-

AI agent framework powering this setup β€” profiles, cron jobs, kanban boards, MCP tools, and multi-model delegation.

-
- Python - AI/ML - active -
+
πŸ€–
Hermes Agent
+

AI agent framework β€” 3 profiles, cron jobs, kanban boards, MCP tools, multi-model delegation. The brain of the lab.

+
PythonAI/MLactive
- -
-
πŸ“
- Obsidian Vault -
-

Knowledge management system — three-layer vault (Inbox→Notes→Archive), LLM Wiki, daily notes, and automated review.

-
- Obsidian - Markdown - Dataview - active -
+
πŸ“
Obsidian Vault
+

Knowledge management β€” three-layer vault (Inbox β†’ Notes β†’ Archive), LLM Wiki, daily notes, automated reviews.

+
ObsidianDataviewactive
- -