From 63b2ae8fe0f41d48676d889a1e3169fb2a12d7bf Mon Sep 17 00:00:00 2001 From: Kelin Date: Sun, 8 Feb 2026 15:13:44 -0500 Subject: [PATCH] Update multi-server deployment docs for simplified architecture Changes: - Remove references to local Traefik on additional servers - Update architecture diagram to show direct port exposure - Clarify that additional servers are 'headless' (no local reverse proxy) - Update traffic flow to show direct routing from core to services - Update performance metrics (50MB vs 100MB, 2min vs 5-10min deployment) - Rename 'Remote Server' to 'Additional Server' for consistency The docs now accurately reflect the current simplified architecture where additional servers only run Sablier and expose ports directly. --- docs/multi-server-deployment.md | 75 ++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/docs/multi-server-deployment.md b/docs/multi-server-deployment.md index 39f057a..a23bf7e 100644 --- a/docs/multi-server-deployment.md +++ b/docs/multi-server-deployment.md @@ -4,11 +4,11 @@ This guide explains the **current multi-server architecture** where: - **Core Server**: Handles external traffic (ports 80/443); runs DuckDNS, Traefik (multi-provider), Authelia -- **Remote Servers**: Run their own Traefik (local-only) and Sablier (local containers) -- **No Docker API**: Servers communicate via HTTP/HTTPS; no TLS Docker API connections needed +- **Additional Servers**: Run Sablier (lazy loading) with direct port exposure; no local Traefik +- **Manual Routing**: Core Traefik routes to IP:PORT combinations via YAML configuration files - **Independent Management**: Each server manages its own containers with lazy loading -> **Note**: This document describes the current simplified architecture. For the legacy centralized Sablier approach, see the git history. +> **Note**: This document describes the current simplified architecture. Additional servers are "headless" - they expose ports directly without local reverse proxy. ## Architecture Diagram @@ -31,12 +31,16 @@ This guide explains the **current multi-server architecture** where: 80/443 │ │ │ ▼ ▼ ▼ ┌─────────────────────────────────────────┐ - │ REMOTE SERVER (e.g., Pi) │ - │ ┌──────────┐ ┌──────────┐ ┌───────┐ │ - │ │ Traefik │ │ Sablier │ │ Media │ │ - │ │ (local) │ │ (local) │ │ Apps │ │ - │ └──────────┘ └──────────┘ └───────┘ │ - └─────────────────────────────────────────┘ + │ ADDITIONAL SERVER (e.g., Pi) │ + │ ┌──────────┐ ┌───────┐ ┌──────────┐ │ + │ │ Sablier │ │ Media │ │ Exposed │ │ + │ │ (lazy │ │ Apps │ │ Ports │ │ + │ │ loading) │ │ │ │ 5001, │ │ + │ └──────────┘ └───────┘ │ 8085... │ │ + └────────────────────────────┼──────────┘ + │ + Direct port access + (no local reverse proxy) ``` # Deployment Process @@ -44,10 +48,10 @@ This guide explains the **current multi-server architecture** where: ## Step 1: Deploy Core Server On the core server, run `ez-homelab.sh` -* Use Option 1 to Install Prerequesites +* Use Option 1 to Install Prerequisites * Then Option 2 to Deploy Core Server -This deploys: DuckDNS, Traefik(core), Authelia, Dashboards & Infrastructure +This deploys: DuckDNS, Traefik(core), Authelia, Dashboards & Infrastructure From Dockge you can start/stop any of the stacks or containers. @@ -55,16 +59,20 @@ From Dockge you can start/stop any of the stacks or containers. - Forward ports 80 & 443 from your router - Only this server requires port forwarding -## Step 2: Deploy Remote Server +## Step 2: Deploy Additional Server -On the remote server, run `ez-homelab.sh` -* Use Option 1 to Install Prerequesites -* Then Option 3 to Deploy Remote Server +On the additional server, run `ez-homelab.sh` +* Use Option 1 to Install Prerequisites +* Then Option 3 to Deploy Additional Server -This deploys: Traefik(local), Dashboards & Infrastructure +This deploys: Sablier (lazy loading), Dashboards & Infrastructure From Dockge you can start/stop any of the stacks or containers. +**No Port Forwarding Required**: +- Services are accessed through core server +- Additional servers are "headless" - no external ports needed + ## How It Works ### Traffic Flow @@ -72,27 +80,34 @@ From Dockge you can start/stop any of the stacks or containers. 1. **User accesses** `https://sonarr.yourdomain.duckdns.org` 2. **Core Traefik** receives request: - Checks Authelia for authentication (SSO) - - Routes to remote server: `http://192.168.1.100:8989` -3. **Remote Traefik** receives forwarded request: - - Discovers service is stopped (lazy loaded) - - Forwards to local Sablier -4. **Remote Sablier**: - - Starts Sonarr container - - Shows loading page - - Redirects to service when ready -5. **Service responds** through the chain back to user + - Routes to additional server: `http://192.168.1.100:8989` (via YAML config) +3. **Additional server** receives direct HTTP request: + - Service container receives request on exposed port + - If stopped, Sablier starts the container + - Shows loading page while container starts +4. **Service responds** directly back to core Traefik, then to user + +### Service Registration + +When you deploy an additional server: +1. Services are deployed with exposed ports (no Traefik labels) +2. Core server creates YAML route files pointing to IP:PORT +3. Core Traefik loads routes automatically +4. Services become accessible at `https://servicename.hostname.yourdomain.duckdns.org` ### Key Benefits -- **Independent Management**: Each server controls its own containers +- **Simplified Architecture**: No local Traefik on additional servers +- **Direct Port Access**: Services expose ports directly (no reverse proxy overhead) - **Centralized Access**: All services accessed through one domain - **Unified SSO**: Authelia on core server protects all services -- **Local Lazy Loading**: Sablier manages containers on the same server +- **Local Lazy Loading**: Sablier manages containers on each server independently ## Performance Considerations -- **Latency**: One additional hop (core → remote) adds minimal latency -- **Resource Usage**: Each server runs lightweight Traefik + Sablier (~100MB combined) -- **Scalability**: Can add unlimited remote servers without complexity +- **Latency**: Direct routing (core → service) minimizes hops +- **Resource Usage**: Additional servers run only Sablier (~50MB) - no Traefik needed +- **Scalability**: Can add unlimited additional servers without complexity - **Network**: Internal 1Gbps+ recommended between servers +- **Deployment Speed**: Additional servers deploy in ~2 minutes (vs 5-10 with local Traefik)