Files
docs/infra/portmap/index.html
T

3423 lines
67 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Single source of truth for the homelab">
<link rel="canonical" href="http://192.168.1.8:13080/infra/portmap/">
<link rel="prev" href="../proxmox-state/">
<link rel="next" href="../storage/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Port map - nuclide.systems docs</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#port-map-nuc-14-docker-stacks" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="nuclide.systems docs" class="md-header__button md-logo" aria-label="nuclide.systems docs" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
nuclide.systems docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Port map
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="blue" aria-hidden="true" type="radio" name="__palette" id="__palette_0">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="blue" aria-hidden="true" type="radio" name="__palette" id="__palette_1">
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../CHANGELOG/" class="md-tabs__link">
Changelog
</a>
</li>
<li class="md-tabs__item">
<a href="../../RESUME/" class="md-tabs__link">
Resume
</a>
</li>
<li class="md-tabs__item">
<a href="../../ct-inventory/" class="md-tabs__link">
CT inventory
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../proxmox-state/" class="md-tabs__link">
Infra
</a>
</li>
<li class="md-tabs__item">
<a href="../../services/homelab-architecture/" class="md-tabs__link">
Services
</a>
</li>
<li class="md-tabs__item">
<a href="../../security/data-leak-audit-comparison/" class="md-tabs__link">
Security & audits
</a>
</li>
<li class="md-tabs__item">
<a href="../../ideas/stack-ideas/" class="md-tabs__link">
Ideas
</a>
</li>
<li class="md-tabs__item">
<a href="../../history/traefik-migration/" class="md-tabs__link">
History
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="nuclide.systems docs" class="md-nav__button md-logo" aria-label="nuclide.systems docs" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
nuclide.systems docs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../CHANGELOG/" class="md-nav__link">
<span class="md-ellipsis">
Changelog
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../RESUME/" class="md-nav__link">
<span class="md-ellipsis">
Resume
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ct-inventory/" class="md-nav__link">
<span class="md-ellipsis">
CT inventory
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-ellipsis">
Infra
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Infra
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../proxmox-state/" class="md-nav__link">
<span class="md-ellipsis">
Proxmox state
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Port map
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Port map
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#port-scheme" class="md-nav__link">
<span class="md-ellipsis">
Port Scheme
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#monitoring-ct-109-ops-19216818" class="md-nav__link">
<span class="md-ellipsis">
Monitoring — CT 109 ops (192.168.1.8)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#infrastructure-1000010999" class="md-nav__link">
<span class="md-ellipsis">
Infrastructure (1000010999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#dev-ct-104-migrated-from-ct-111-2026-05-26" class="md-nav__link">
<span class="md-ellipsis">
Dev (CT 104 — migrated from CT 111 2026-05-26)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#security-auth-1100011999" class="md-nav__link">
<span class="md-ellipsis">
Security &amp; Auth (1100011999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#media-immich-1200012999" class="md-nav__link">
<span class="md-ellipsis">
Media Immich (1200012999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#media-downloads-arr-stack-1300013999" class="md-nav__link">
<span class="md-ellipsis">
Media Downloads / Arr Stack (1300013999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ai-stack-1400014999" class="md-nav__link">
<span class="md-ellipsis">
AI Stack (1400014999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#documents-1500015999" class="md-nav__link">
<span class="md-ellipsis">
Documents (1500015999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#automation-1600016999" class="md-nav__link">
<span class="md-ellipsis">
Automation (1600016999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#notes-bookmarks-1700017999" class="md-nav__link">
<span class="md-ellipsis">
Notes &amp; Bookmarks (1700017999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#devops-1800018999" class="md-nav__link">
<span class="md-ellipsis">
DevOps (1800018999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tracking-1900019999" class="md-nav__link">
<span class="md-ellipsis">
Tracking (1900019999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#storage-admin-2000020999" class="md-nav__link">
<span class="md-ellipsis">
Storage Admin (2000020999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#lxc-112-secrets-19216817-decommissioned-2026-05-26" class="md-nav__link">
<span class="md-ellipsis">
~~LXC 112 — secrets~~ (192.168.1.7) — DECOMMISSIONED 2026-05-26
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#lxc-113-db-19216816" class="md-nav__link">
<span class="md-ellipsis">
LXC 113 — db (192.168.1.6)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#lxc-111-dev-192168142-decommissioned-2026-05-26" class="md-nav__link">
<span class="md-ellipsis">
~~LXC 111 — Dev~~ (192.168.1.42) — DECOMMISSIONED 2026-05-26
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#qnap-ts-251d-1921681189" class="md-nav__link">
<span class="md-ellipsis">
QNAP TS-251D (192.168.1.189)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#external-services-not-on-nuc-docker" class="md-nav__link">
<span class="md-ellipsis">
External Services (Not on NUC Docker)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#zoraxy-public-routes-proxied-via-19216814" class="md-nav__link">
<span class="md-ellipsis">
Zoraxy Public Routes (proxied via 192.168.1.4)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#known-issues" class="md-nav__link">
<span class="md-ellipsis">
Known Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#oidc-client-registry-pocket-id-idnuclidesystems" class="md-nav__link">
<span class="md-ellipsis">
OIDC Client Registry (Pocket ID — id.nuclide.systems)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../storage/" class="md-nav__link">
<span class="md-ellipsis">
Storage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../volumes/" class="md-nav__link">
<span class="md-ellipsis">
Volumes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../docker-networks/" class="md-nav__link">
<span class="md-ellipsis">
Docker networks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../connection-hosts/" class="md-nav__link">
<span class="md-ellipsis">
Connection hosts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../proxmox-memory-audit/" class="md-nav__link">
<span class="md-ellipsis">
Memory audit
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
Services
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../services/homelab-architecture/" class="md-nav__link">
<span class="md-ellipsis">
Homelab architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/dev-environment/" class="md-nav__link">
<span class="md-ellipsis">
Dev environment (Coder + Gitea)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/mcp-gateway/" class="md-nav__link">
<span class="md-ellipsis">
MCP gateway
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/mcp-servers/" class="md-nav__link">
<span class="md-ellipsis">
MCP servers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/pocket-id/" class="md-nav__link">
<span class="md-ellipsis">
Pocket-ID (OIDC)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/backrest/" class="md-nav__link">
<span class="md-ellipsis">
Backrest (backups)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/databases/" class="md-nav__link">
<span class="md-ellipsis">
Databases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/secrets-manager/" class="md-nav__link">
<span class="md-ellipsis">
Secrets manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/comfyui/" class="md-nav__link">
<span class="md-ellipsis">
ComfyUI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/zoraxy/" class="md-nav__link">
<span class="md-ellipsis">
Zoraxy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/adguard-dns/" class="md-nav__link">
<span class="md-ellipsis">
AdGuard DNS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/cloud-gpu/" class="md-nav__link">
<span class="md-ellipsis">
Cloud GPU
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/arcane/" class="md-nav__link">
<span class="md-ellipsis">
Arcane
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/doc-ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Doc ingestion pipeline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/llm-benchmark/" class="md-nav__link">
<span class="md-ellipsis">
LLM benchmark
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Security & audits
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Security & audits
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../security/data-leak-audit-comparison/" class="md-nav__link">
<span class="md-ellipsis">
Comparison
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/data-leak-audit-2026-05-20-tr004-cloud-sandbox/" class="md-nav__link">
<span class="md-ellipsis">
2026-05-20 · cloud-sandbox breach
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/data-leak-audit-2026-05-21-tr004-artifacts/" class="md-nav__link">
<span class="md-ellipsis">
2026-05-21 · artifacts (clean)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/audit-claude-code-meta/" class="md-nav__link">
<span class="md-ellipsis">
Self-audit (Claude Code)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/transcripts/audit-chat-2026-05-21/" class="md-nav__link">
<span class="md-ellipsis">
Transcript (audit session)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Ideas
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Ideas
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../ideas/stack-ideas/" class="md-nav__link">
<span class="md-ellipsis">
Stack ideas
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-ellipsis">
History
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
History
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../history/traefik-migration/" class="md-nav__link">
<span class="md-ellipsis">
Traefik (abandoned 2026-05-16)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/traefik-migration-docker-labels/" class="md-nav__link">
<span class="md-ellipsis">
Traefik labels (abandoned)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/mcp-gateway-requirements/" class="md-nav__link">
<span class="md-ellipsis">
MCP gateway requirements (superseded)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/scrubbing-list-2026-05-17/" class="md-nav__link">
<span class="md-ellipsis">
Scrubbing list (2026-05-17)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/case-study/" class="md-nav__link">
<span class="md-ellipsis">
Case study
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#port-scheme" class="md-nav__link">
<span class="md-ellipsis">
Port Scheme
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#monitoring-ct-109-ops-19216818" class="md-nav__link">
<span class="md-ellipsis">
Monitoring — CT 109 ops (192.168.1.8)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#infrastructure-1000010999" class="md-nav__link">
<span class="md-ellipsis">
Infrastructure (1000010999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#dev-ct-104-migrated-from-ct-111-2026-05-26" class="md-nav__link">
<span class="md-ellipsis">
Dev (CT 104 — migrated from CT 111 2026-05-26)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#security-auth-1100011999" class="md-nav__link">
<span class="md-ellipsis">
Security &amp; Auth (1100011999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#media-immich-1200012999" class="md-nav__link">
<span class="md-ellipsis">
Media Immich (1200012999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#media-downloads-arr-stack-1300013999" class="md-nav__link">
<span class="md-ellipsis">
Media Downloads / Arr Stack (1300013999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ai-stack-1400014999" class="md-nav__link">
<span class="md-ellipsis">
AI Stack (1400014999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#documents-1500015999" class="md-nav__link">
<span class="md-ellipsis">
Documents (1500015999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#automation-1600016999" class="md-nav__link">
<span class="md-ellipsis">
Automation (1600016999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#notes-bookmarks-1700017999" class="md-nav__link">
<span class="md-ellipsis">
Notes &amp; Bookmarks (1700017999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#devops-1800018999" class="md-nav__link">
<span class="md-ellipsis">
DevOps (1800018999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tracking-1900019999" class="md-nav__link">
<span class="md-ellipsis">
Tracking (1900019999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#storage-admin-2000020999" class="md-nav__link">
<span class="md-ellipsis">
Storage Admin (2000020999)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#lxc-112-secrets-19216817-decommissioned-2026-05-26" class="md-nav__link">
<span class="md-ellipsis">
~~LXC 112 — secrets~~ (192.168.1.7) — DECOMMISSIONED 2026-05-26
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#lxc-113-db-19216816" class="md-nav__link">
<span class="md-ellipsis">
LXC 113 — db (192.168.1.6)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#lxc-111-dev-192168142-decommissioned-2026-05-26" class="md-nav__link">
<span class="md-ellipsis">
~~LXC 111 — Dev~~ (192.168.1.42) — DECOMMISSIONED 2026-05-26
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#qnap-ts-251d-1921681189" class="md-nav__link">
<span class="md-ellipsis">
QNAP TS-251D (192.168.1.189)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#external-services-not-on-nuc-docker" class="md-nav__link">
<span class="md-ellipsis">
External Services (Not on NUC Docker)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#zoraxy-public-routes-proxied-via-19216814" class="md-nav__link">
<span class="md-ellipsis">
Zoraxy Public Routes (proxied via 192.168.1.4)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#known-issues" class="md-nav__link">
<span class="md-ellipsis">
Known Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#oidc-client-registry-pocket-id-idnuclidesystems" class="md-nav__link">
<span class="md-ellipsis">
OIDC Client Registry (Pocket ID — id.nuclide.systems)
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="port-map-nuc-14-docker-stacks">Port Map — NUC 14 Docker Stacks<a class="headerlink" href="#port-map-nuc-14-docker-stacks" title="Permanent link">&para;</a></h1>
<blockquote>
<p><strong>Reverse proxy</strong>: <a href="http://192.168.1.4:8000">Zoraxy v3.3.2</a> on <code>192.168.1.4:8000</code> (LXC 108)
Wildcard cert <code>*.nuclide.systems</code> · source of truth: <a href="proxy/zoraxy/routes.json"><code>proxy/zoraxy/routes.json</code></a>
Manage routes: <code>uv run scripts/zoraxy_sync.py [--apply|--prune|--list]</code></p>
</blockquote>
<h2 id="port-scheme">Port Scheme<a class="headerlink" href="#port-scheme" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Range</th>
<th>Category</th>
</tr>
</thead>
<tbody>
<tr>
<td>3100</td>
<td>Loki (log aggregation)</td>
</tr>
<tr>
<td>9090</td>
<td>Prometheus (monitoring)</td>
</tr>
<tr>
<td>9091</td>
<td>Grafana (monitoring)</td>
</tr>
<tr>
<td>9100</td>
<td>node-exporter (host metrics)</td>
</tr>
<tr>
<td>12345</td>
<td>Alloy (log agent UI)</td>
</tr>
<tr>
<td>1000010999</td>
<td>Infrastructure</td>
</tr>
<tr>
<td>1100011999</td>
<td>Security &amp; Auth</td>
</tr>
<tr>
<td>1200012999</td>
<td>Media Immich</td>
</tr>
<tr>
<td>1300013999</td>
<td>Media Downloads / Arr</td>
</tr>
<tr>
<td>1400014999</td>
<td>AI Stack</td>
</tr>
<tr>
<td>1500015999</td>
<td>Documents</td>
</tr>
<tr>
<td>1600016999</td>
<td>Automation</td>
</tr>
<tr>
<td>1700017999</td>
<td>Notes &amp; Bookmarks</td>
</tr>
<tr>
<td>1800018999</td>
<td>DevOps / Image Gen</td>
</tr>
<tr>
<td>1900019999</td>
<td>Tracking</td>
</tr>
<tr>
<td>2000020999</td>
<td>Storage Admin</td>
</tr>
<tr>
<td>3000030999</td>
<td>VPN Control</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="monitoring-ct-109-ops-19216818">Monitoring — CT 109 ops (192.168.1.8)<a class="headerlink" href="#monitoring-ct-109-ops-19216818" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Port</th>
<th>Host</th>
<th>Service</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://192.168.1.8:9090">9090</a></td>
<td>CT 109</td>
<td>Prometheus</td>
<td>LAN only; 90d retention</td>
</tr>
<tr>
<td><a href="http://192.168.1.8:3000">3000</a></td>
<td>CT 109</td>
<td>Grafana</td>
<td>LAN only; admin/tapirnase</td>
</tr>
<tr>
<td><a href="http://192.168.1.8:3100">3100</a></td>
<td>CT 109</td>
<td>Loki</td>
<td>LAN only; 30d retention; log aggregation</td>
</tr>
<tr>
<td><a href="http://192.168.1.8:9221">9221</a></td>
<td>CT 109</td>
<td>pve-exporter</td>
<td>Proxmox VE metrics; auth: <code>monitor@pve!prometheus</code></td>
</tr>
<tr>
<td><a href="http://192.168.1.8:12345">12345</a></td>
<td>CT 109</td>
<td>Alloy (self)</td>
<td>agent UI; also runs on all other hosts at :12345</td>
</tr>
<tr>
<td><a href="http://192.168.1.8:4090">4090</a></td>
<td>CT 109</td>
<td>Wetty</td>
<td>LAN only (127.0.0.1); web SSH → jump-menu.sh on nuc</td>
</tr>
<tr>
<td><a href="http://192.168.1.8:10000">10000</a></td>
<td>CT 109</td>
<td>Homepage</td>
<td>LAN only (<code>ops.nuclide.lan:10000</code>); service dashboard; remote Docker via socket-proxy :2375 on CT 113, direct TCP on CT 104</td>
</tr>
<tr>
<td><a href="http://192.168.1.8:10001">10001</a></td>
<td>CT 109</td>
<td>Dozzle</td>
<td>LAN only; live log viewer; agents on all 7 Docker hosts</td>
</tr>
<tr>
<td>~~10002~~</td>
<td>~~CT 109~~</td>
<td>~~Arcane~~</td>
<td><strong>DECOMMISSIONED 2026-05-26</strong> — replaced by Portainer</td>
</tr>
<tr>
<td><a href="http://192.168.1.8:13080">13080</a></td>
<td>CT 109</td>
<td>docs-server</td>
<td>LAN only; mkdocs Material; auto-rebuilds from <code>fkrebs/docs</code> every 5 min — migrated from CT 111 2026-05-23</td>
</tr>
<tr>
<td><a href="http://192.168.1.8:8200">8200</a></td>
<td>CT 109</td>
<td>Infisical</td>
<td>LAN only; secrets manager; migrated from CT 112 2026-05-26; <code>http://secrets.nuclide.lan:8200</code></td>
</tr>
<tr>
<td><a href="http://192.168.1.8:11000">11000</a></td>
<td>CT 109</td>
<td>Pocket-ID</td>
<td><code>https://id.nuclide.systems</code>; OIDC IdP; migrated from CT 110 2026-05-26</td>
</tr>
<tr>
<td>9100</td>
<td>CT 109</td>
<td>node-exporter</td>
<td>host-network, self-scrape</td>
</tr>
<tr>
<td>9100</td>
<td>CT 104</td>
<td>node-exporter</td>
<td>standalone stack <code>/opt/stacks/monitoring/</code>; scraped by CT 109</td>
</tr>
</tbody>
</table>
<p>Scrape targets (CT 109 Prometheus): ~~<code>litellm</code> CT104:14000/metrics/~~ (<strong>SUNSET 2026-05-26</strong>), <code>node-ct104</code> :9100, <code>node-ct109</code> :9100, <code>home-assistant</code> 192.168.1.60:8123/api/prometheus (HA token), <code>prometheus</code> self, <code>walg</code> CT113:9100/textfile (WAL-G backup freshness, added 2026-05-23).</p>
<p><strong>Alloy (log agent)</strong>: deployed on all 12 hosts → ships to Loki at CT 109:3100.
- Docker hosts (CT 101/104/105/109/110/111/112/113): container at <code>/opt/stacks/alloy/</code>; reads Docker socket + journald
- Binary/systemd (CT 102/103/108 + nuc): <code>/etc/alloy/config.alloy</code>; reads journald only
- HA VM 100: Grafana Alloy add-on (wymangr/hassos-addons v0.0.8) — pushes metrics to CT 109 Prometheus remote_write + logs to Loki.</p>
<hr />
<h2 id="infrastructure-1000010999">Infrastructure (1000010999)<a class="headerlink" href="#infrastructure-1000010999" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Container</th>
<th>Public URL</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://192.168.1.40:10000">10000</a></td>
<td>Homepage</td>
<td><code>homepage</code></td>
<td></td>
<td><strong>DECOMMISSIONED 2026-05-23</strong> — compose renamed <code>.DECOMMISSIONED</code></td>
</tr>
<tr>
<td><a href="http://192.168.1.40:10001">10001</a></td>
<td>Dozzle</td>
<td><code>dozzle</code></td>
<td></td>
<td><strong>DECOMMISSIONED</strong> — moved to CT 109 2026-05-23</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:10002">10002</a></td>
<td>Arcane</td>
<td><code>arcane</code></td>
<td></td>
<td><strong>DECOMMISSIONED</strong> — moved to CT 109 2026-05-23</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:10003">10003</a></td>
<td>Gotify</td>
<td><code>gotify</code></td>
<td><a href="https://gotify.nuclide.systems">gotify.nuclide.systems</a></td>
<td>Push notifications</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:10004">10004</a></td>
<td>Garage S3 API</td>
<td><code>garage</code></td>
<td><a href="https://s3.nuclide.systems">s3.nuclide.systems</a></td>
<td>FIXED 2026-05-21: proxied by Zoraxy with ACME TLS. Garage API accessible at <code>https://s3.nuclide.systems</code>. Internal: <code>http://garage:3900</code></td>
</tr>
<tr>
<td>10005 (127.0.0.1 only)</td>
<td>Garage Admin</td>
<td><code>garage</code></td>
<td></td>
<td>localhost only</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="dev-ct-104-migrated-from-ct-111-2026-05-26">Dev (CT 104 — migrated from CT 111 2026-05-26)<a class="headerlink" href="#dev-ct-104-migrated-from-ct-111-2026-05-26" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Container</th>
<th>Public URL</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://192.168.1.40:3000">3000</a></td>
<td>Gitea</td>
<td><code>gitea</code></td>
<td><a href="https://git.nuclide.systems">git.nuclide.systems</a></td>
<td>Self-hosted Git; OIDC via Pocket-ID; Redis queue (<code>gitea_redis</code>)</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:222">222</a></td>
<td>Gitea SSH</td>
<td><code>gitea</code></td>
<td></td>
<td><code>ssh -p 222 git@git.nuclide.systems</code></td>
</tr>
<tr>
<td><a href="http://192.168.1.40:7080">7080</a></td>
<td>Coder</td>
<td><code>coder</code></td>
<td><a href="https://dev.nuclide.systems">dev.nuclide.systems</a></td>
<td>Workspace orchestrator; OIDC via Pocket-ID</td>
</tr>
<tr>
<td>(no port)</td>
<td>act-runner</td>
<td><code>act-runner</code></td>
<td></td>
<td>Gitea Actions runner (<code>ct104-runner</code>)</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:1025">1025</a></td>
<td>Proton Bridge SMTP</td>
<td><code>proton-bridge</code></td>
<td></td>
<td>LAN only; requires <code>docker exec -it proton-bridge /bin/bash</code> for initial login</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:1143">1143</a></td>
<td>Proton Bridge IMAP</td>
<td><code>proton-bridge</code></td>
<td></td>
<td>LAN only</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="security-auth-1100011999">Security &amp; Auth (1100011999)<a class="headerlink" href="#security-auth-1100011999" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Container</th>
<th>Public URL</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://192.168.1.40:11001">11001</a></td>
<td>Vaultwarden</td>
<td><code>vaultwarden</code></td>
<td><a href="https://vault.nuclide.systems">vault.nuclide.systems</a></td>
<td>Password manager · Pocket-ID OIDC client created 2026-05-21; auth flow not yet configured</td>
</tr>
</tbody>
</table>
<blockquote>
<p>Pocket-ID <strong>migrated from this CT to LXC 110</strong> on 2026-05-20, then <strong>to CT 109</strong> on 2026-05-26. See the <a href="#external-services-not-on-nuc-docker">External Services</a> table below.</p>
</blockquote>
<hr />
<h2 id="media-immich-1200012999">Media Immich (1200012999)<a class="headerlink" href="#media-immich-1200012999" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Container</th>
<th>Public URL</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://192.168.1.40:12000">12000</a></td>
<td>Immich</td>
<td><code>immich_server</code></td>
<td><a href="https://immich.nuclide.systems">immich.nuclide.systems</a></td>
<td>Photos/videos</td>
</tr>
<tr>
<td></td>
<td>Immich Power Tools</td>
<td><code>immich_power_tools</code></td>
<td><a href="https://immich-tools.nuclide.systems">immich-tools.nuclide.systems</a></td>
<td>Container-internal :3000, Zoraxy proxy</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="media-downloads-arr-stack-1300013999">Media Downloads / Arr Stack (1300013999)<a class="headerlink" href="#media-downloads-arr-stack-1300013999" title="Permanent link">&para;</a></h2>
<p>All arr-stack services run behind <code>vpn_gluetun</code> container network.</p>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Container</th>
<th>Public URL</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://192.168.1.40:13001">13001</a></td>
<td>RDTClient</td>
<td><code>rdtclient</code></td>
<td></td>
<td>LAN only</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:13002">13002</a></td>
<td>Prowlarr</td>
<td><code>prowlarr</code></td>
<td></td>
<td>LAN only</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:13003">13003</a></td>
<td>Audiobookshelf</td>
<td><code>audiobookshelf</code></td>
<td><a href="https://abs.nuclide.systems">abs.nuclide.systems</a></td>
<td></td>
</tr>
<tr>
<td><a href="http://192.168.1.40:13004">13004</a></td>
<td>ShelfArr</td>
<td><code>shelfarr</code></td>
<td></td>
<td>LAN only</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:13005">13005</a></td>
<td>Flaresolverr</td>
<td><code>flaresolverr</code></td>
<td></td>
<td>Internal only</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:30000">30000</a></td>
<td>Gluetun VPN control</td>
<td><code>vpn_gluetun</code></td>
<td></td>
<td>HTTP control API</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="ai-stack-1400014999">AI Stack (1400014999)<a class="headerlink" href="#ai-stack-1400014999" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Container</th>
<th>Public URL</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>~~14000~~</td>
<td>~~LiteLLM~~</td>
<td>~~<code>litellm</code>~~</td>
<td></td>
<td><strong>SUNSET 2026-05-26</strong> — service block commented out in <code>ai/docker-compose.yml</code>; replaced entirely by Bifrost</td>
</tr>
<tr>
<td>~~14001~~</td>
<td>~~LobeHub~~</td>
<td>~~<code>lobehub</code>~~</td>
<td></td>
<td><strong>DECOMMISSIONED 2026-05-26</strong> — compose renamed <code>.DECOMMISSIONED-lobehub-2026-05-26.yml</code>; replaced by Open WebUI</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:14002">14002</a></td>
<td>Open WebUI</td>
<td><code>open-webui</code></td>
<td><a href="https://chat.nuclide.systems">chat.nuclide.systems</a></td>
<td>Chat UI; stack <code>ai/open-webui.yml</code>; uses Qdrant + TEI for RAG</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:14003">14003</a></td>
<td>Bifrost</td>
<td><code>bifrost</code></td>
<td><a href="https://ai.nuclide.systems">ai.nuclide.systems</a></td>
<td>LLM gateway + MCP at <code>/mcp</code>; auth via <code>sk-bf-</code> VKs; stack <code>ai/bifrost/</code></td>
</tr>
<tr>
<td>~~8080~~</td>
<td>~~MCP Gateway~~</td>
<td>~~<code>mcp-gateway</code>~~</td>
<td></td>
<td><strong>DECOMMISSIONED 2026-05-26</strong> — compose renamed <code>.DECOMMISSIONED-2026-05-26</code>; MCP now at <code>https://ai.nuclide.systems/mcp</code> (Bifrost)</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:18002">18002</a></td>
<td>ComfyUI</td>
<td><code>comfyui</code></td>
<td></td>
<td>LAN only (Intel Arc iGPU, FLUX.1-schnell GGUF)</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:18003">18003</a></td>
<td>ComfyUI MCP</td>
<td><code>comfyui-mcp</code></td>
<td></td>
<td>FastMCP; reachable via gateway at <code>mcp.nuclide.systems/comfyui/mcp</code></td>
</tr>
<tr>
<td><a href="http://192.168.1.40:18005">18005</a></td>
<td>Docling MCP</td>
<td><code>docling-mcp</code></td>
<td></td>
<td>SAIA Docling PDF→Markdown; reachable via gateway</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:18007">18007</a></td>
<td>Kroki MCP</td>
<td><code>kroki-mcp</code></td>
<td></td>
<td>Diagram rendering; reachable via gateway</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:18009">18009</a></td>
<td>Speaches</td>
<td><code>speaches</code></td>
<td></td>
<td>TTS/STT; LAN only</td>
</tr>
<tr>
<td>~~18010~~</td>
<td>~~Shepard MCP~~</td>
<td>~~<code>shepard-mcp</code>~~</td>
<td></td>
<td><strong>DECOMMISSIONED 2026-05-21</strong> — replaced by native <code>https://shepard.nuclide.systems/v2/mcp</code> (streamable HTTP; gateway entry: <code>shepard</code>, auth via <code>${SHEPARD_API_KEY}</code>)</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:18011">18011</a></td>
<td>Upload-artifact MCP</td>
<td><code>upload-artifact-mcp</code></td>
<td></td>
<td>S3 chat-artifacts upload; reachable via gateway</td>
</tr>
<tr>
<td></td>
<td>SearXNG</td>
<td><code>searxng</code></td>
<td></td>
<td>Internal, <code>shared_backend</code>, used by LobeHub</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="documents-1500015999">Documents (1500015999)<a class="headerlink" href="#documents-1500015999" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Container</th>
<th>Public URL</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://192.168.1.40:15000">15000</a></td>
<td>Traccar HTTP</td>
<td><code>traccar</code></td>
<td><a href="https://traccar.nuclide.systems">traccar.nuclide.systems</a></td>
<td>GPS tracking UI</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:15001">15001</a></td>
<td>Traccar GPS</td>
<td><code>traccar</code></td>
<td></td>
<td>TCP+UDP watch protocol</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:15002">15002</a></td>
<td>Paperless AI</td>
<td><code>paperless-ai</code></td>
<td><a href="https://paperless-ai.nuclide.systems">paperless-ai.nuclide.systems</a></td>
<td>Internal-only Zoraxy policy</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:15003">15003</a></td>
<td>Paperless-ngx</td>
<td><code>paperless-ngx-webserver-1</code></td>
<td><a href="https://paperless.nuclide.systems">paperless.nuclide.systems</a></td>
<td>Internal-only Zoraxy policy</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="automation-1600016999">Automation (1600016999)<a class="headerlink" href="#automation-1600016999" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Container</th>
<th>Public URL</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://192.168.1.40:16000">16000</a></td>
<td>n8n</td>
<td><code>n8n</code></td>
<td><a href="https://n8n.nuclide.systems">n8n.nuclide.systems</a></td>
<td>Workflow automation</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="notes-bookmarks-1700017999">Notes &amp; Bookmarks (1700017999)<a class="headerlink" href="#notes-bookmarks-1700017999" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Container</th>
<th>Public URL</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://192.168.1.40:17000">17000</a></td>
<td>Memos</td>
<td><code>memos</code></td>
<td><a href="https://memos.nuclide.systems">memos.nuclide.systems</a></td>
<td>Notes</td>
</tr>
<tr>
<td><a href="http://192.168.1.40:17001">17001</a></td>
<td>Karakeep</td>
<td><code>karakeep</code></td>
<td><a href="https://hoarder.nuclide.systems">hoarder.nuclide.systems</a></td>
<td>Bookmarks</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="devops-1800018999">DevOps (1800018999)<a class="headerlink" href="#devops-1800018999" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Container</th>
<th>Public URL</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<!-- Daytona DECOMMISSIONED 2026-05-20; replaced by Coder on CT 111. Compose renamed *.DECOMMISSIONED-2026-05-20. -->
<p>| — | MCP servers (Gitea repos) | See AI Stack §18000 | — | <code>mcp-comfyui</code>, <code>mcp-docling</code>, <code>mcp-upload-artifact</code> at <code>git.nuclide.systems/fkrebs/</code> (<code>mcp-shepard</code> decommissioned) |</p>
<hr />
<h2 id="tracking-1900019999">Tracking (1900019999)<a class="headerlink" href="#tracking-1900019999" title="Permanent link">&para;</a></h2>
<p><em>Traccar moved to 1500015001 (Documents range). 1900019001 now free.</em></p>
<hr />
<h2 id="storage-admin-2000020999">Storage Admin (2000020999)<a class="headerlink" href="#storage-admin-2000020999" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Container</th>
<th>Public URL</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>20010 (127.0.0.1 only)</td>
<td>pgAdmin</td>
<td><code>pgadmin</code></td>
<td></td>
<td>shared-db pgAdmin, localhost only (CT 104)</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="lxc-112-secrets-19216817-decommissioned-2026-05-26">~~LXC 112 — secrets~~ (<code>192.168.1.7</code>) — <strong>DECOMMISSIONED 2026-05-26</strong><a class="headerlink" href="#lxc-112-secrets-19216817-decommissioned-2026-05-26" title="Permanent link">&para;</a></h2>
<p>Infisical migrated to CT 109 ops. Containers stopped; LXC pending removal.</p>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>~~8200~~</td>
<td>~~Infisical~~</td>
<td><strong>Moved to CT 109:8200</strong></td>
</tr>
</tbody>
</table>
<hr />
<h2 id="lxc-113-db-19216816">LXC 113 — db (<code>192.168.1.6</code>)<a class="headerlink" href="#lxc-113-db-19216816" title="Permanent link">&para;</a></h2>
<p>CT 113 is the dedicated postgres LXC. No public proxy routes — LAN access only.</p>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Container</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>5432</td>
<td>Postgres 17</td>
<td><code>postgres</code></td>
<td>LAN: <code>192.168.1.6:5432</code> — accepts app connections from all CTs</td>
</tr>
<tr>
<td>5050</td>
<td>pgAdmin 4</td>
<td><code>pgadmin</code></td>
<td>LAN only: <code>http://192.168.1.6:5050</code> — no Zoraxy route</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="lxc-111-dev-192168142-decommissioned-2026-05-26">~~LXC 111 — Dev~~ (<code>192.168.1.42</code>) — <strong>DECOMMISSIONED 2026-05-26</strong><a class="headerlink" href="#lxc-111-dev-192168142-decommissioned-2026-05-26" title="Permanent link">&para;</a></h2>
<p>All services migrated to CT 104. Containers stopped; LXC pending removal.</p>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>~~7080~~</td>
<td>~~Coder~~</td>
<td><strong>Moved to CT 104:7080</strong></td>
</tr>
<tr>
<td>~~3000~~</td>
<td>~~Gitea~~</td>
<td><strong>Moved to CT 104:3000</strong></td>
</tr>
<tr>
<td>~~222~~</td>
<td>~~Gitea SSH~~</td>
<td><strong>Moved to CT 104:222</strong></td>
</tr>
</tbody>
</table>
<hr />
<h2 id="qnap-ts-251d-1921681189">QNAP TS-251D (<code>192.168.1.189</code>)<a class="headerlink" href="#qnap-ts-251d-1921681189" title="Permanent link">&para;</a></h2>
<p>Celeron J4025, 2-core. Hosts Klipper natively (not Docker).</p>
<table>
<thead>
<tr>
<th>Port</th>
<th>Service</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>80</td>
<td>Mainsail</td>
<td>3D printer web UI</td>
</tr>
<tr>
<td>7125</td>
<td>Moonraker</td>
<td>Klipper API</td>
</tr>
</tbody>
</table>
<p>Config backed up daily to <code>git.nuclide.systems/fkrebs/klipper-config</code> via cron at 03:00 → covered offsite by Backrest <code>services/gitea</code> path.</p>
<hr />
<h2 id="external-services-not-on-nuc-docker">External Services (Not on NUC Docker)<a class="headerlink" href="#external-services-not-on-nuc-docker" title="Permanent link">&para;</a></h2>
<p>Zoraxy routes to these external backends:</p>
<table>
<thead>
<tr>
<th>Domain</th>
<th>Target</th>
<th>Host</th>
<th>Service</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://ha.nuclide.systems">ha.nuclide.systems</a></td>
<td><code>192.168.1.60:8123</code></td>
<td>Home Assistant VM 100</td>
<td>Home automation</td>
</tr>
<tr>
<td><a href="https://nc.nuclide.systems">nc.nuclide.systems</a></td>
<td><code>192.168.1.41:11000</code></td>
<td>Nextcloud LXC 105</td>
<td>Cloud storage</td>
</tr>
<tr>
<td><a href="https://ocpp.nuclide.systems">ocpp.nuclide.systems</a></td>
<td><code>192.168.1.60:8887</code></td>
<td>Home Assistant VM 100</td>
<td>EV charger OCPP</td>
</tr>
<tr>
<td><a href="https://shepard.nuclide.systems">shepard.nuclide.systems</a></td>
<td><code>192.168.1.49:80</code></td>
<td>Shepard LXC 101</td>
<td>Shepard</td>
</tr>
<tr>
<td><a href="https://shepard-api.nuclide.systems">shepard-api.nuclide.systems</a></td>
<td><code>192.168.1.49:8080</code></td>
<td>Shepard LXC 101</td>
<td>Shepard API</td>
</tr>
<tr>
<td><a href="https://id.nuclide.systems">id.nuclide.systems</a></td>
<td><code>192.168.1.8:11000</code></td>
<td>Ops CT 109</td>
<td>Pocket-ID OIDC IdP (migrated CT110→CT109 2026-05-26)</td>
</tr>
<tr>
<td><a href="https://git.nuclide.systems">git.nuclide.systems</a></td>
<td><code>192.168.1.40:3000</code></td>
<td>Docker CT 104</td>
<td>Gitea (migrated from CT 111 2026-05-26)</td>
</tr>
<tr>
<td><a href="https://dev.nuclide.systems">dev.nuclide.systems</a></td>
<td><code>192.168.1.40:7080</code></td>
<td>Docker CT 104</td>
<td>Coder (migrated from CT 111 2026-05-26)</td>
</tr>
<tr>
<td>Gitea SSH</td>
<td><code>192.168.1.40:222</code></td>
<td>Docker CT 104</td>
<td><code>ssh -p 222 git@git.nuclide.systems</code></td>
</tr>
</tbody>
</table>
<hr />
<h2 id="zoraxy-public-routes-proxied-via-19216814">Zoraxy Public Routes (proxied via <code>192.168.1.4</code>)<a class="headerlink" href="#zoraxy-public-routes-proxied-via-19216814" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Domain</th>
<th>Backend (NUC <code>192.168.1.40</code>)</th>
<th>Port</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://ai.nuclide.systems">ai.nuclide.systems</a></td>
<td>bifrost</td>
<td>14003</td>
</tr>
<tr>
<td><a href="https://chat.nuclide.systems">chat.nuclide.systems</a></td>
<td>open-webui</td>
<td>14002</td>
</tr>
<tr>
<td><a href="https://arcane.nuclide.systems">arcane.nuclide.systems</a></td>
<td>arcane on CT 109</td>
<td><strong>192.168.1.8</strong>:10002</td>
</tr>
<tr>
<td><a href="https://gotify.nuclide.systems">gotify.nuclide.systems</a></td>
<td>gotify</td>
<td>10003</td>
</tr>
<tr>
<td><a href="https://vault.nuclide.systems">vault.nuclide.systems</a></td>
<td>vaultwarden</td>
<td>11001</td>
</tr>
<tr>
<td><a href="https://immich.nuclide.systems">immich.nuclide.systems</a></td>
<td>immich_server</td>
<td>12000</td>
</tr>
<tr>
<td><a href="https://immich-tools.nuclide.systems">immich-tools.nuclide.systems</a></td>
<td>immich_power_tools</td>
<td>(container-internal)</td>
</tr>
<tr>
<td><a href="https://abs.nuclide.systems">abs.nuclide.systems</a></td>
<td>audiobookshelf</td>
<td>13003</td>
</tr>
<tr>
<td><a href="https://n8n.nuclide.systems">n8n.nuclide.systems</a></td>
<td>n8n</td>
<td>16000</td>
</tr>
<tr>
<td><a href="https://memos.nuclide.systems">memos.nuclide.systems</a></td>
<td>memos</td>
<td>17000</td>
</tr>
<tr>
<td><a href="https://hoarder.nuclide.systems">hoarder.nuclide.systems</a></td>
<td>karakeep</td>
<td>17001</td>
</tr>
<tr>
<td><a href="https://traccar.nuclide.systems">traccar.nuclide.systems</a></td>
<td>traccar</td>
<td>15000</td>
</tr>
<tr>
<td><a href="https://dozzle.nuclide.systems">dozzle.nuclide.systems</a></td>
<td>dozzle</td>
<td>10001</td>
</tr>
<tr>
<td><a href="https://s3.nuclide.systems">s3.nuclide.systems</a></td>
<td>garage</td>
<td>10004</td>
</tr>
</tbody>
</table>
<p><strong>Not publicly proxied</strong> (LAN / localhost only): pgadmin, paperless, paperless-ai, comfyui, comfyui-mcp, rdtclient, prowlarr, shelfarr, qdrant.</p>
<hr />
<h2 id="known-issues">Known Issues<a class="headerlink" href="#known-issues" title="Permanent link">&para;</a></h2>
<ul>
<li><strong><code>lobe-postgres</code> / <code>lobe-redis</code></strong>: host-port exposed (<code>0.0.0.0:5432/6379</code>) — firewall blocks external access but ideally restricted to localhost.</li>
</ul>
<hr />
<h2 id="oidc-client-registry-pocket-id-idnuclidesystems">OIDC Client Registry (Pocket ID — <code>id.nuclide.systems</code>)<a class="headerlink" href="#oidc-client-registry-pocket-id-idnuclidesystems" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Client ID</th>
<th>Name</th>
<th>Redirect URIs</th>
</tr>
</thead>
<tbody>
<tr>
<td>~~<code>e73bb7b9</code>~~</td>
<td>~~litellm~~</td>
<td><strong>DELETED 2026-05-26</strong> — LiteLLM sunset; Pocket-ID client removed from CT 110 DB</td>
</tr>
<tr>
<td>~~<code>26f3c26b</code>~~</td>
<td>~~lobehub~~</td>
<td><strong>DECOMMISSIONED 2026-05-26</strong> — LobeChat removed; Open WebUI OIDC not yet wired</td>
</tr>
<tr>
<td><code>81cf4ed0</code></td>
<td>arcane</td>
<td><code>https://arcane.nuclide.systems/auth/oidc/callback</code></td>
</tr>
<tr>
<td><code>33135ad4</code></td>
<td>n8n</td>
<td><code>https://n8n.nuclide.systems/auth/oidc/callback</code></td>
</tr>
<tr>
<td><code>9c91c18b</code></td>
<td>immich</td>
<td><code>https://immich.nuclide.systems/auth/login</code> + mobile</td>
</tr>
<tr>
<td><code>62bf4e0d</code></td>
<td>memos</td>
<td><code>https://memos.nuclide.systems/auth/callback</code></td>
</tr>
<tr>
<td><code>d92f82b0</code></td>
<td>karakeep</td>
<td><code>https://hoarder.nuclide.systems/api/auth/callback/custom</code></td>
</tr>
<tr>
<td><code>a14b8076</code></td>
<td>nextcloud</td>
<td><code>https://nc.nuclide.systems/apps/user_oidc/code</code></td>
</tr>
<tr>
<td><code>0aee4280</code></td>
<td>Coder</td>
<td><code>https://dev.nuclide.systems/api/v2/users/oidc/callback</code></td>
</tr>
<tr>
<td><code>9444609e</code></td>
<td>Gitea</td>
<td><code>https://git.nuclide.systems/user/oauth2/pocket-id/callback</code></td>
</tr>
<tr>
<td><code>38469e7e</code></td>
<td>Proxmox VE</td>
<td><code>https://192.168.1.20:8006</code></td>
</tr>
<tr>
<td>~~798a367f~~</td>
<td>~~daytona~~</td>
<td><strong>DECOMMISSIONED — remove from Pocket-ID</strong></td>
</tr>
<tr>
<td><code>cbbf20d5</code></td>
<td>Audiobookshelf</td>
<td><code>https://abs.nuclide.systems/…</code> + <code>*</code></td>
</tr>
<tr>
<td><code>d8733fcc</code></td>
<td>shelfarr</td>
<td><code>*</code></td>
</tr>
<tr>
<td><code>78c78998</code></td>
<td>Claude MCP</td>
<td><code>https://claude.ai/api/mcp/auth_callback</code> + <code>https://mcp.nuclide.systems/mcp/auth/callback</code></td>
</tr>
<tr>
<td><code>82ca2d53</code></td>
<td>nuc-ai</td>
<td>(empty) — used by spawned MCP servers</td>
</tr>
<tr>
<td><code>7fe1a14b</code></td>
<td>zoraxy</td>
<td>(empty)</td>
</tr>
<tr>
<td><code>af2f837b</code></td>
<td>mcp-auth</td>
<td>(empty) — legacy, unused</td>
</tr>
<tr>
<td>(new)</td>
<td>vaultwarden</td>
<td><code>https://vault.nuclide.systems/auth/callback</code></td>
</tr>
</tbody>
</table>
<p><strong>OIDC Endpoints</strong> (corrected 2026-05-17 — previously used wrong <code>/api/v1/oauth2/</code> path):
- Authorization: <code>https://id.nuclide.systems/authorize</code>
- Token: <code>https://id.nuclide.systems/api/oidc/token</code>
- Userinfo: <code>https://id.nuclide.systems/api/oidc/userinfo</code>
- Discovery: <code>https://id.nuclide.systems/.well-known/openid-configuration</code></p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.highlight", "search.suggest", "content.code.copy"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
</body>
</html>