11 KiB
11 KiB
Generic Reverse Proxy Architecture
Overview
This document describes a generic reverse proxy architecture that enables internal services to be accessible via public domains. The architecture uses FRP (Fast Reverse Proxy) for tunneling and Traefik for HTTP/HTTPS routing with automatic certificate management.
Architecture Block Diagram
+-------------------+ SSH Commands +-------------------+
| Local Host | ------------------> | Proxy Server |
| | | |
| +-------------+ | FRP Tunnel | +-------------+ |
| | Application | | ------------------> | | FRPS | |
| | Service | | | | (Server) | |<--- Public IPs
| | | | | | | | Port: 16999
| +-------------+ | | +-------------+ |
| | | |
| +-------------+ | FRP Client | +-------------+ |
| | FRPC | | ------------------> | | Traefik | |<--- Domains
| | (Client) | | | | (Router) | | HTTPS/TLS
| | | | | | | |
| +-------------+ | | +-------------+ |
| | | |
| +-------------+ | | +-------------+ |
| | Docker | | | | Docker | |
| | Container | | | | Container | |
| +-------------+ | | +-------------+ |
+-------------------+ +-------------------+
| |
| |
+------------------ Volumes ------------------+
| rad-git-sshd-itl-frpc-<instance> |
+-------------------------------------------+
Architecture Components
Core Components
- FRP (Fast Reverse Proxy): Handles TCP/UDP tunneling between internal and external networks
- FRPS (FRP Server): Runs on the public-facing server
- FRPC (FRP Client): Runs on internal service hosts
- Traefik: HTTP/HTTPS router with automatic Let's Encrypt certificate management
- Docker & Docker Compose: Container orchestration and deployment
- SSH: Secure communication for remote configuration management
Supporting Elements
- Configuration Storage: Docker volumes for persistent configuration
- DNS Management: Domain-to-IP mapping for public access
- Certificate Management: Automatic SSL/TLS certificate provisioning and renewal
Prerequisites
- FRP (Fast Reverse Proxy) service with frpc and frps
- Traefik reverse proxy
- Docker and Docker Compose installed
- SSH key for remote server access
- Environment variable for configuration source (DOWNLOAD_SOURCE)
- User permissions for Docker commands
- Authentication keys for secure access
Parameters
Required Parameters
- Instance Name: Unique identifier for the service instance (alphanumeric, hyphens, underscores only)
- Application Port(s): Internal port(s) where the service is listening
- Domain Name: Public domain for Traefik routing rules
- FRP Server Address: Public IP address of the FRP server
- FRP Server Port: Port for FRP communication (default 16999)
Optional Parameters
- Docker Network: Network for container isolation (default uses Docker bridge)
- Proxy Ports: Custom remote ports for external access (defaults: TCP ports matching internal ports)
- Service Type: Protocol specification (TCP/UDP/HTTP/HTTPS)
Outcomes
- Public domain connectivity to internal service
- Secure encrypted tunnel between internal and external networks
- Automatic SSL/TLS certificates via Let's Encrypt
- Persistent configuration through Docker volumes
- Automated service discovery and routing
Architecture Flow
1. Configuration Phase
- User provides service parameters via interactive prompts or command-line
- System validates parameters and checks for existing configurations
- Generates appropriate FRP client configuration (frpc.toml)
- Persists configuration to Docker volumes for continuity
2. Deployment Phase
- Creates Docker container with FRP client
- Establishes connection to FRP server
- Sets up port forwarding rules
- Updates proxy server to recognize new instance
3. Routing Phase
- Traefik configuration updated with new routing rules
- Domain name routes to appropriate internal service
- Automatic SSL/TLS certificate provisioned
- Health checks and monitoring established
4. Management Phase
- Persistent configuration for service continuity
- Backup and recovery mechanisms
- Restart procedures for configuration changes
- Service status monitoring
Real-World Example: Using auto-sys-deploy.sh and update-compose-config.sh
Example: Deploying a New FRP Client Instance
Based on auto-sys-deploy.sh.md and update-compose-config.sh.md, here's a real-world example of the architecture in action:
Initial Setup
- Prerequisites: Docker, SSH key at
~/.ssh/itl-devs1,DOWNLOAD_SOURCEenvironment variable - Command:
./auto-sys-deploy.sh setup-frpc
Interactive Configuration (from auto-sys-deploy.sh)
-
Instance Name Selection:
- Default:
setup-frpc-$(date +%Y%m%d-%H%M%S) - User input:
my-app-instance-20231005-143000 - Validation: alphanumeric, hyphens, underscores only
- Default:
-
Docker Network Selection:
- Options: Select from existing networks, custom network, or default
- User input: Select network
bridgeor create custom - Outcome: Container runs on specific Docker network
-
FRP Server Configuration:
- Server Address:
192.168.1.100(example IP) - Server Port:
16999(default) - Validation: Ensure server is accessible
- Server Address:
-
Proxy Configuration:
- Rad Proxy (from auto-sys-deploy.sh):
- Local Port:
8776(default) - Remote Port:
8779(user input) - Name:
rad-my-app-instance-20231005-143000
- Local Port:
- SSH Proxy (from auto-sys-deploy.sh):
- Local Port:
22(default) - Remote Port:
13076(user input) - Name:
ssh-my-app-instance-20231005-143000
- Local Port:
- Web Proxy (from auto-sys-deploy.sh):
- Local Port:
80(default) - Remote Port:
13077(user input) - Name:
web-my-app-instance-20231005-143000
- Local Port:
- Rad Proxy (from auto-sys-deploy.sh):
-
Domain Configuration:
- Input:
myapp.example.com - Used for Traefik routing rules
- Input:
Configuration Generation (from auto-sys-deploy.sh)
The script generates frpc.toml with:
serverAddr = "192.168.1.100"
serverPort = 16999
[[proxies]]
name = "rad-my-app-instance-20231005-143000"
type = "tcp"
localPort = 8776
localIP = "rad-git-sshd-my-app-instance-20231005-143000"
remotePort = 8779
[[proxies]]
name = "ssh-my-app-instance-20231005-143000"
type = "tcp"
localPort = 22
localIP = "rad-git-sshd-my-app-instance-20231005-143000"
remotePort = 13076
[[proxies]]
name = "web-my-app-instance-20231005-143000"
type = "tcp"
localPort = 80
localIP = "rad-git-sshd-my-app-instance-20231005-143000"
remotePort = 13077
Container Deployment (from auto-sys-deploy.sh)
- Creates Docker volume:
rad-git-sshd-itl-frpc-my-app-instance-20231005-143000 - Starts container:
rad-git-sshd-frpc-my-app-instance-20231005-143000 - Uses image:
snowdreamtech/frpc:0.62.0-alpine3.21 - Mounts config volume:
/etc/frp
Proxy Server Configuration (from update-compose-config.sh)
The script updates docker-compose.app.yml with:
Ports Section:
ports:
# ... other ports ...
# my-app-instance-20231005-143000 Self-hosting ports ====
- "8779:8779/tcp"
- "13076:13076/tcp"
- "13077:13077/tcp"
# =========================
# ... other ports ...
Labels Section:
labels:
# ... other labels ...
# my-app-instance-20231005-143000 Self-hosting labels ====
- "traefik.http.routers.frps-my-app-instance-20231005-143000-http.entrypoints=web"
- "traefik.http.routers.frps-my-app-instance-20231005-143000-http.rule=Host(`myapp.example.com`)"
- "traefik.http.routers.frps-my-app-instance-20231005-143000-http.service=frps-my-app-instance-20231005-143000"
- "traefik.http.routers.frps-my-app-instance-20231005-143000-http.middlewares=http2https@file"
- "traefik.http.routers.frps-my-app-instance-20231005-143000-https.entrypoints=websecure"
- "traefik.http.routers.frps-my-app-instance-20231005-143000-https.rule=Host(`myapp.example.com`)"
- "traefik.http.routers.frps-my-app-instance-20231005-143000-https.service=frps-my-app-instance-20231005-143000"
- "traefik.http.routers.frps-my-app-instance-20231005-143000-https.tls=true"
- "traefik.http.routers.frps-my-app-instance-20231005-143000-https.tls.certresolver=letsencrypt"
- "traefik.http.routers.frps-my-app-instance-20231005-143000-https.tls.domains[0].main=myapp.example.com"
- "traefik.http.services.frps-my-app-instance-20231005-143000.loadbalancer.server.port=13077"
# =========================
# ... other labels ...
Backup and Service Restart (from update-compose-config.sh)
- Creates backup:
docker-compose.app.yml.backup_YYYYMMDD_HHMMSS - Restarts service with:
./stop.sh && ./start.sh - Verifies deployment with:
docker logs --tail 50 frps_frps_1
Extensibility Points
Protocol Support
- TCP/UDP: Native FRP support for any TCP/UDP based service
- HTTP/HTTPS: Enhanced routing via Traefik with automatic certificates
- Custom Protocols: Extensible architecture for proprietary protocols
Service Types
- Web Applications: HTTP/HTTPS routing with domain-based access
- Database Services: Secure TCP tunneling for database connections
- SSH Services: Encrypted access to internal SSH servers
- API Services: Secure API endpoint exposure
Scaling Options
- Load Balancing: Multiple instances behind single domain
- Geographic Distribution: Multiple proxy servers in different regions
- Protocol Multiplexing: Multiple services through single tunnel
Security Considerations
- Encrypted tunnels between internal and external networks
- Access control through SSH keys and authentication
- Firewall isolation of internal services
- Automatic certificate management for HTTPS
- Docker container isolation
Maintenance Requirements
- Regular backup of configuration files
- Certificate renewal monitoring
- Connection health monitoring
- Log aggregation and analysis
- Docker image updates
Generic Application Examples
Web Application Deployment
- Parameters: Instance name, internal web port (80/443), domain name
- Outcome: Public website accessible via configured domain
Database Access
- Parameters: Instance name, internal database port, restricted domain
- Outcome: Secure external access to internal database
Custom Service Exposure
- Parameters: Instance name, custom application port, specific domain
- Outcome: External access to internal custom service