Files
docs/services/zoraxy/index.html
T

2291 lines
43 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/services/zoraxy/">
<link rel="prev" href="../comfyui/">
<link rel="next" href="../adguard-dns/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Zoraxy - 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="#zoraxy-reverse-proxy" 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">
Zoraxy
</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">
<a href="../../infra/proxmox-state/" class="md-tabs__link">
Infra
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../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--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<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="false">
<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="../../infra/proxmox-state/" class="md-nav__link">
<span class="md-ellipsis">
Proxmox state
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/portmap/" class="md-nav__link">
<span class="md-ellipsis">
Port map
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/storage/" class="md-nav__link">
<span class="md-ellipsis">
Storage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/volumes/" class="md-nav__link">
<span class="md-ellipsis">
Volumes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/docker-networks/" class="md-nav__link">
<span class="md-ellipsis">
Docker networks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/connection-hosts/" class="md-nav__link">
<span class="md-ellipsis">
Connection hosts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/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--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
<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="true">
<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="../homelab-architecture/" class="md-nav__link">
<span class="md-ellipsis">
Homelab architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dev-environment/" class="md-nav__link">
<span class="md-ellipsis">
Dev environment (Coder + Gitea)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mcp-gateway/" class="md-nav__link">
<span class="md-ellipsis">
MCP gateway
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mcp-servers/" class="md-nav__link">
<span class="md-ellipsis">
MCP servers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../pocket-id/" class="md-nav__link">
<span class="md-ellipsis">
Pocket-ID (OIDC)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../backrest/" class="md-nav__link">
<span class="md-ellipsis">
Backrest (backups)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../databases/" class="md-nav__link">
<span class="md-ellipsis">
Databases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../secrets-manager/" class="md-nav__link">
<span class="md-ellipsis">
Secrets manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../comfyui/" class="md-nav__link">
<span class="md-ellipsis">
ComfyUI
</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">
Zoraxy
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Zoraxy
</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="#current-route-table" class="md-nav__link">
<span class="md-ellipsis">
Current route table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#admin-ui" class="md-nav__link">
<span class="md-ellipsis">
Admin UI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#adding-a-new-route" class="md-nav__link">
<span class="md-ellipsis">
Adding a new route
</span>
</a>
<nav class="md-nav" aria-label="Adding a new route">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#via-admin-ui" class="md-nav__link">
<span class="md-ellipsis">
Via admin UI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#via-json-preferred-for-scripted-changes" class="md-nav__link">
<span class="md-ellipsis">
Via JSON (preferred for scripted changes)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#backup-restore" class="md-nav__link">
<span class="md-ellipsis">
Backup / restore
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#decommissioned-routes" class="md-nav__link">
<span class="md-ellipsis">
Decommissioned routes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#auth-posture" class="md-nav__link">
<span class="md-ellipsis">
Auth posture
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../adguard-dns/" class="md-nav__link">
<span class="md-ellipsis">
AdGuard DNS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cloud-gpu/" class="md-nav__link">
<span class="md-ellipsis">
Cloud GPU
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../arcane/" class="md-nav__link">
<span class="md-ellipsis">
Arcane
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../doc-ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Doc ingestion pipeline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../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="#current-route-table" class="md-nav__link">
<span class="md-ellipsis">
Current route table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#admin-ui" class="md-nav__link">
<span class="md-ellipsis">
Admin UI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#adding-a-new-route" class="md-nav__link">
<span class="md-ellipsis">
Adding a new route
</span>
</a>
<nav class="md-nav" aria-label="Adding a new route">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#via-admin-ui" class="md-nav__link">
<span class="md-ellipsis">
Via admin UI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#via-json-preferred-for-scripted-changes" class="md-nav__link">
<span class="md-ellipsis">
Via JSON (preferred for scripted changes)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#backup-restore" class="md-nav__link">
<span class="md-ellipsis">
Backup / restore
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#decommissioned-routes" class="md-nav__link">
<span class="md-ellipsis">
Decommissioned routes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#auth-posture" class="md-nav__link">
<span class="md-ellipsis">
Auth posture
</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="zoraxy-reverse-proxy">Zoraxy Reverse Proxy<a class="headerlink" href="#zoraxy-reverse-proxy" title="Permanent link">&para;</a></h1>
<blockquote>
<p>Zoraxy is a Go-based reverse proxy + ACME daemon running as a <strong>systemd service</strong> on <strong>LXC 108</strong> (<code>zoraxy</code>, 192.168.1.4). Config lives in JSON files at <code>/opt/zoraxy/conf/proxy/</code>. Changes take effect after <code>systemctl restart zoraxy</code>.</p>
</blockquote>
<h2 id="current-route-table">Current route table<a class="headerlink" href="#current-route-table" title="Permanent link">&para;</a></h2>
<p>Audited 2026-05-23; updated 2026-05-26 (mcp.nuclide.systems removed, ai/chat backends swapped, arcane.nuclide.systems removed). 20 active public routes have:
- <code>EnableAutoHTTPS: true</code> — Zoraxy requests LE certs for <code>*.nuclide.systems</code>
- <code>EnableWebsocketCustomHeaders: true</code> — preserves WS upgrade headers through the proxy
- <code>DisableHopByHopHeaderRemoval: true</code> — keeps hop-by-hop headers intact for upstream</p>
<p><code>SkipWebSocketOriginCheck</code> is enabled on routes that use WebSocket heavily (n8n, Coder, Gotify, Immich, abs, ai, chat, ha, nc, ocpp, s3, shepard*). Disabled on git, hoarder, id, memos (not needed).</p>
<table>
<thead>
<tr>
<th>Domain</th>
<th>Upstream</th>
<th style="text-align: center;">SkipWSOrigin</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>abs.nuclide.systems</td>
<td>192.168.1.40:13003</td>
<td style="text-align: center;"></td>
<td>Audiobookshelf</td>
</tr>
<tr>
<td>ai.nuclide.systems</td>
<td>192.168.1.40:14003</td>
<td style="text-align: center;"></td>
<td>Bifrost LLM gateway (LiteLLM decommissioned 2026-05-26)</td>
</tr>
<tr>
<td>~~arcane.nuclide.systems~~</td>
<td>~~192.168.1.8:10002~~</td>
<td style="text-align: center;"></td>
<td><strong>DECOMMISSIONED 2026-05-26</strong> — replaced by Portainer</td>
</tr>
<tr>
<td>chat.nuclide.systems</td>
<td>192.168.1.40:14002</td>
<td style="text-align: center;"></td>
<td>Open WebUI (LobeChat decommissioned 2026-05-26)</td>
</tr>
<tr>
<td>dev.nuclide.systems</td>
<td>192.168.1.40:7080</td>
<td style="text-align: center;"></td>
<td>Coder (CT 104; migrated from CT 111 2026-05-26)</td>
</tr>
<tr>
<td>git.nuclide.systems</td>
<td>192.168.1.40:3000</td>
<td style="text-align: center;"></td>
<td>Gitea (CT 104; migrated from CT 111 2026-05-26)</td>
</tr>
<tr>
<td>gotify.nuclide.systems</td>
<td>192.168.1.40:10003</td>
<td style="text-align: center;"></td>
<td>Gotify push notifications</td>
</tr>
<tr>
<td>ha.nuclide.systems</td>
<td>192.168.1.60:8123</td>
<td style="text-align: center;"></td>
<td>Home Assistant (VM 100)</td>
</tr>
<tr>
<td>hoarder.nuclide.systems</td>
<td>192.168.1.40:17001</td>
<td style="text-align: center;"></td>
<td>Karakeep bookmarks</td>
</tr>
<tr>
<td>id.nuclide.systems</td>
<td>192.168.1.8:11000</td>
<td style="text-align: center;"></td>
<td>Pocket-ID OIDC (CT 109; migrated from CT 110 2026-05-26)</td>
</tr>
<tr>
<td>immich.nuclide.systems</td>
<td>192.168.1.40:12000</td>
<td style="text-align: center;"></td>
<td>Immich photos</td>
</tr>
<tr>
<td>~~mcp.nuclide.systems~~</td>
<td>~~192.168.1.40:8080~~</td>
<td style="text-align: center;"></td>
<td><strong>DECOMMISSIONED 2026-05-26</strong> — mcp-gateway removed; MCP now at <code>https://ai.nuclide.systems/mcp</code> (Bifrost)</td>
</tr>
<tr>
<td>memos.nuclide.systems</td>
<td>192.168.1.40:17000</td>
<td style="text-align: center;"></td>
<td>Memos notes</td>
</tr>
<tr>
<td>n8n.nuclide.systems</td>
<td>192.168.1.40:16000</td>
<td style="text-align: center;"></td>
<td>n8n workflows</td>
</tr>
<tr>
<td>nc.nuclide.systems</td>
<td>192.168.1.41:11000</td>
<td style="text-align: center;"></td>
<td>Nextcloud AIO (CT 105)</td>
</tr>
<tr>
<td>ocpp.nuclide.systems</td>
<td>192.168.1.60:8887</td>
<td style="text-align: center;"></td>
<td>OCPP charger endpoint (HAOS)</td>
</tr>
<tr>
<td>s3.nuclide.systems</td>
<td>192.168.1.40:10004</td>
<td style="text-align: center;"></td>
<td>Garage S3 (web endpoint)</td>
</tr>
<tr>
<td>shepard.nuclide.systems</td>
<td>192.168.1.49:80</td>
<td style="text-align: center;"></td>
<td>Shepard frontend (CT 101)</td>
</tr>
<tr>
<td>shepard-api.nuclide.systems</td>
<td>192.168.1.49:8080</td>
<td style="text-align: center;"></td>
<td>Shepard API (CT 101)</td>
</tr>
<tr>
<td>shepard-auth.nuclide.systems</td>
<td>192.168.1.49:8082</td>
<td style="text-align: center;"></td>
<td>Shepard auth (CT 101)</td>
</tr>
<tr>
<td>traccar.nuclide.systems</td>
<td>192.168.1.40:15000</td>
<td style="text-align: center;"></td>
<td>Traccar GPS</td>
</tr>
<tr>
<td>vault.nuclide.systems</td>
<td>192.168.1.40:11001</td>
<td style="text-align: center;"></td>
<td>Vaultwarden</td>
</tr>
</tbody>
</table>
<p><strong>Intentionally LAN-only (no Zoraxy route)</strong>: Dozzle (:10001), Homarr (:7575), Wetty (:4090), docs-server (:13080), paperless (:15003), paperless-ai (:15002), immich-tools. <code>immich-tools.nuclide.systems</code> is listed in portmap but route has not been created — defer until needed.</p>
<p><code>root.config</code> — ProxyType=0 internal dashboard fallback (127.0.0.1:5487), no ACME.</p>
<h2 id="admin-ui">Admin UI<a class="headerlink" href="#admin-ui" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>http://192.168.1.4:8000
</code></pre></div>
<p>Zoraxy runs with <code>-noauth=true</code> — no login required on the LAN.</p>
<h2 id="adding-a-new-route">Adding a new route<a class="headerlink" href="#adding-a-new-route" title="Permanent link">&para;</a></h2>
<h3 id="via-admin-ui">Via admin UI<a class="headerlink" href="#via-admin-ui" title="Permanent link">&para;</a></h3>
<ol>
<li><strong>Reverse Proxy → Create Proxy Rules → New Proxy Rule</strong></li>
<li>Enter the domain, set the upstream IP:port</li>
<li><strong>TLS → Enable Auto HTTPS</strong> — tick it</li>
<li><strong>Header Rewrite Rules</strong> → enable <strong>Disable Hop-by-Hop Removal</strong> and <strong>WebSocket Custom Headers</strong></li>
<li>Save, allow 12 minutes for LE cert issuance</li>
</ol>
<h3 id="via-json-preferred-for-scripted-changes">Via JSON (preferred for scripted changes)<a class="headerlink" href="#via-json-preferred-for-scripted-changes" title="Permanent link">&para;</a></h3>
<p>Config files live at <code>/opt/zoraxy/conf/proxy/&lt;domain&gt;.config</code> on CT 108.</p>
<p>Minimum template for a new public route:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="p">{</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="w"> </span><span class="nt">&quot;ProxyType&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="w"> </span><span class="nt">&quot;RootOrMatchingDomain&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;example.nuclide.systems&quot;</span><span class="p">,</span>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span><span class="nt">&quot;ActiveOrigins&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span><span class="nt">&quot;OriginIpOrDomain&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;192.168.1.40:PORT&quot;</span><span class="p">,</span><span class="w"> </span><span class="nt">&quot;Weight&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">}],</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="w"> </span><span class="nt">&quot;TlsOptions&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nt">&quot;EnableAutoHTTPS&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">},</span>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="w"> </span><span class="nt">&quot;HeaderRewriteRules&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nt">&quot;DisableHopByHopHeaderRemoval&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">},</span>
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="w"> </span><span class="nt">&quot;EnableWebsocketCustomHeaders&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="w"> </span><span class="nt">&quot;AccessFilterUUID&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;default&quot;</span>
<a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="p">}</span>
</code></pre></div>
<p>After editing, restart Zoraxy:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>ssh<span class="w"> </span>root@192.168.1.4<span class="w"> </span><span class="s1">&#39;systemctl restart zoraxy&#39;</span>
</code></pre></div>
<h2 id="backup-restore">Backup / restore<a class="headerlink" href="#backup-restore" title="Permanent link">&para;</a></h2>
<p>All configs are backed up at <code>/tmp/zoraxy-backup-2026-05-21/</code> on CT 108 (22 files from the 2026-05-21 audit). To restore a single route:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>ssh<span class="w"> </span>root@192.168.1.4<span class="w"> </span><span class="s1">&#39;cp /tmp/zoraxy-backup-2026-05-21/&lt;domain&gt;.config /opt/zoraxy/conf/proxy/ &amp;&amp; systemctl restart zoraxy&#39;</span>
</code></pre></div>
<h2 id="decommissioned-routes">Decommissioned routes<a class="headerlink" href="#decommissioned-routes" title="Permanent link">&para;</a></h2>
<p><code>.DECOMMISSIONED-*</code> files in <code>/opt/zoraxy/conf/proxy/</code> are ignored by Zoraxy. Current:
- <code>daytona.nuclide.systems.config.DECOMMISSIONED-2026-05-20</code>
- <code>id.daytona.nuclide.systems.config.DECOMMISSIONED-2026-05-20</code>
- <code>mcp.nuclide.systems.config</code> — removed 2026-05-26 (mcp-gateway decommissioned; MCP now via Bifrost at <code>ai.nuclide.systems/mcp</code>)
- <code>arcane.nuclide.systems.config</code> — removed 2026-05-26 (Arcane decommissioned; replaced by Portainer at <code>http://192.168.1.8:9000</code> LAN-only)</p>
<h2 id="auth-posture">Auth posture<a class="headerlink" href="#auth-posture" title="Permanent link">&para;</a></h2>
<p>No routes have <code>ForwardAuthURL</code> set (no Tinyauth/auth middleware). Pocket-ID (<code>id.nuclide.systems</code>) is the OIDC IdP; apps that require auth implement it themselves (Open WebUI, Coder, Gitea, Nextcloud). Public-facing routes like <code>ha.nuclide.systems</code> and <code>ocpp.nuclide.systems</code> have no proxy-level auth — upstream apps handle it.</p>
<p><strong>Pending</strong>: Tinyauth or similar on unauthenticated-but-sensitive routes (gotify). Planned for CT 109 deployment.</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>