28 KiB
Quick Start
Step 1: First Time Setup (Reverse Proxy Instance)
When no configuration files exist, the script will setup the reverse proxy instance:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
The wizard will ask you (Reverse Proxy Instance settings only):
-
Deployment Mode:
- Traefik Mode (local reverse proxy)
- FRP Mode (remote proxy via tunnel)
-
For Traefik Mode:
- Traefik version (default: v3.6.9)
- Let's Encrypt email for SSL certificates
- Debug mode (optional)
-
For FRP Mode:
- FRP server address
- FRP server port (default: 16999)
- Instance name (optional)
What Happens:
- Creates
.env.rvs-prxywith reverse proxy settings - Deploys Traefik or FRP container
- No application service check (your app is not needed yet)
Configuration File Created:
.env.rvs-prxy- Reverse proxy instance configuration
Note: At this stage, only the reverse proxy instance is configured. No domain or application settings are needed yet.
Step 2: Setup Your First Domain
After the reverse proxy is running, run the script again to add your first domain:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
The wizard will ask you (Domain settings only):
- Domain name (e.g.,
app.example.com,sub.domain.org.hk) - Application service name (Docker container name)
- Application service port
(Select 1) Setup New Domain from the setup menu. Options 2) Setup Port Exposure and 3) Setup External Service Domain are covered in Step 4 and Step 5.)
What Happens:
- Checks if your application service is running
- Creates
.env-<domain>with domain settings - Configures domain in existing reverse proxy
Configuration File Created:
.env-<domain>- Domain-specific configuration (e.g.,.env-app-example-com)
Step 3: Add More Domains (Optional)
To add additional domains, create additional domain configuration files or run the wizard again:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
Each domain gets its own .env-<domain> file.
Step 4: Setup Port Exposure (Alternative to Domain-Based Routing)
Instead of using domain-based routing, you can expose host ports directly to connect to container ports. This is useful when you want to access services via http://<host-ip>:<port> without domain name routing:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
How It Works:
- Any access to the host on a specific port (e.g.,
18081) connects directly to a container's port - No domain name required - works with direct IP/port access
- Example:
http://this-host:18081→ connects to containerph-web-1003-nginx_cntrport80
Configuration File Required:
- Create
.env-port-<port>file (e.g.,.env-port-18081)
Example .env-port-18081:
HOST_PORT="18081"
CONTAINER_NAME="ph-web-1003-nginx_cntr"
CONTAINER_PORT="80"
What Happens:
- Checks if Traefik reverse proxy is running
- Checks if target container is running
- Creates port routing configuration in Traefik
- Exposes host port
18081to route to container port80 - Service accessible at:
http://<host-ip>:18081
Use Cases:
- Internal services that don't need domain-based routing
- Development/testing environments
- Services accessed via IP:port directly
- Multiple containers exposing different ports on the same host
Batch Processing:
You can setup multiple port exposures at once by creating multiple .env-port-* files:
.env-port-18081
.env-port-18082
.env-port-18083
The script will process all port configuration files in batch mode.
Step 5: Setup External Service Domain (Route a Domain to an External Web Service)
Use this mode when the upstream is not a local container on this host but an existing web service reached by URL (a hosted app, SaaS, or another server). No local container is required.
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
The wizard will ask you (External service settings only):
- Domain name, sub-path optional (e.g.,
box.example.comorbox.example.com/api) - External service URL (e.g.,
https://cornersendbox-impact-vms.lovable.app/)
What Happens:
- Checks if Traefik reverse proxy is running (Traefik mode only -- FRP is not supported for HTTP routing)
- Creates
.env-ext-<domain>with the domain and external URL - Writes a dynamic Traefik config that terminates TLS for the public domain and forwards to the external URL
- Obtains a Let's Encrypt certificate for the public domain
Configuration File Created:
.env-ext-<domain>- External service configuration (e.g.,.env-ext-box-example-com-api)
Example .env-ext-box-example-com-api:
DOMAIN_NAME="box.example.com/api"
EXTERNAL_URL="https://cornersendbox-impact-vms.lovable.app/"
Example output:
[INFO] Setup External Service Domain
[INFO] New external service domain has been configured: box.example.com/api
[INFO] Public URL: https://box.example.com/api
[INFO] Forwarding to: https://cornersendbox-impact-vms.lovable.app
Routing Semantics:
https://box.example.com/api/x→https://cornersendbox-impact-vms.lovable.app/x(public sub-path stripped, origin base path added)- The origin receives its own
Hostheader (passHostHeader: false), so the upstream must accept the request by its own hostname - Origin TLS is verified with the system trust store; no
insecureSkipVerifyis generated - Origin default port is
443forhttpsand80forhttpunless a port is present in the URL
Batch Processing:
Create multiple .env-ext-* files to publish several external services in one run:
.env-ext-box-example-com-api
.env-ext-demo-example-net
Troubleshooting:
- The script checks whether the external hostname resolves and only warns if it does not; note that Traefik resolves the name itself, inside its container
Alternative: Using Configuration Files Directly
For Reverse Proxy Setup:
- Create
.env.rvs-prxyfile with reverse proxy configuration - Run:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
For New Domain Setup:
The script supports flexible domain setup with automatic proxy mode detection:
-
With
.env-<domain>file (recommended):- Create
.env-<domain>file with domain configuration - Ensure reverse proxy is running (Traefik or FRP)
- Ensure your application service is running
- Run:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
- Create
-
Without
.env.rvs-prxyfile (auto-detection):- Create
.env-<domain>file with domain configuration - Ensure reverse proxy is running (script will auto-detect mode)
- Ensure your application service is running
- Run:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash - Script automatically detects running proxy (Traefik or FRP) and configures accordingly
- Create
-
Without any config files (interactive wizard):
- Ensure reverse proxy is running
- Run:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash - Script detects running proxy and starts wizard for domain settings
-
Batch processing (multiple domains):
- Create multiple
.env-<domain>files in the same directory - Ensure reverse proxy is running
- Ensure all application services are running
- Run:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash - Script automatically processes all
.env-<domain>files in batch mode - Example output:
[INFO] Found 3 domain config files, will process all in batch mode [INFO] ========================================= [INFO] Processing domain 1 of 3: .env-domain1-com [INFO] ========================================= [INFO] Setting up new domain: domain1.com ... [INFO] ========================================= [INFO] Processing domain 2 of 3: .env-domain2-com [INFO] ========================================= ... [INFO] Batch processing completed: 3 domain(s) processed
- Create multiple
For Port Exposure Setup:
The script supports port-based routing without domain names:
-
With
.env-port-<port>file:- Create
.env-port-<port>file (e.g.,.env-port-18081) - Ensure Traefik reverse proxy is running
- Ensure target container is running
- Run:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
- Create
-
Batch processing (multiple ports):
- Create multiple
.env-port-*files in the same directory - Ensure Traefik reverse proxy is running
- Ensure all target containers are running
- Run:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash - Script automatically processes all
.env-port-*files in batch mode - Example output:
[INFO] Found 2 port config files, will process all in batch mode [INFO] ========================================= [INFO] Processing port 1 of 2: .env-port-18081 [INFO] ========================================= [INFO] Setting up port exposure: Host port 18081 -> Container my-nginx:80 ... [INFO] ========================================= [INFO] Processing port 2 of 2: .env-port-18082 [INFO] ========================================= ...
- Create multiple
[INFO] Batch processing completed: 2 port(s) processed ```
For External Service Setup:
The script supports routing a domain to an external web service URL:
-
With
.env-ext-<domain>file:- Create
.env-ext-<domain>file with the domain and external URL - Ensure Traefik reverse proxy is running
- Run:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
- Create
-
Batch processing (multiple external services):
- Create multiple
.env-ext-*files in the same directory - Ensure Traefik reverse proxy is running
- Run:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash - Script automatically processes all
.env-ext-*files in batch mode - Example output:
[INFO] Found 2 external service config files, will process all in batch mode [INFO] ========================================= [INFO] Processing external service 1 of 2: .env-ext-box-example-com-api [INFO] ========================================= [INFO] Setting up external service domain: box.example.com/api ... [INFO] Batch processing completed: 2 external service(s) processed
- Create multiple
-
Mode precedence: if
.env-port-*files exist, the script runs port batch processing and skips domain and external service files (same precedence as before: port, then external service, then domain)
Step 6: Manage Existing Configurations (Optional)
To view and remove existing domain, external service or port configurations:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash -s -- --manage
What Happens:
- Lists all current domain configurations (
.env-<domain>files) - Lists all current external service configurations (
.env-ext-<domain>files) - Lists all current port configurations (
.env-port-<port>files) - Prompts you to select which configurations to remove (enter numbers separated by space)
- For domains: Removes the configuration file AND removes the routing config from Traefik
- For external services: Removes the configuration file AND removes the routing config from Traefik
- For ports: Removes the configuration file, removes the routing config from Traefik, removes the entry point, and recreates Traefik container without that port
Example Output:
=============================================
Reverse Proxy Configuration Manager
=============================================
Current Configurations:
Domains:
1. .env-app-example-com - app.example.com (my-app-container)
2. .env-api-test-com - api.test.com (api-service)
Ports:
3. .env-port-18081 - Host port 18081 -> nginx-container
4. .env-port-18082 - Host port 18082 -> api-container
External Services:
5. .env-ext-box-example-com-api - box.example.com/api -> https://cornersendbox-impact-vms.lovable.app
Select configurations to remove (enter numbers separated by space, or 'q' to quit): 1 5
[INFO] Removing: .env-app-example-com
[INFO] Removing domain config from Traefik: app.example.com
[INFO] Removed: .env-app-example-com
[INFO] Removing: .env-ext-box-example-com-api
[INFO] Removing external service config from Traefik: box.example.com/api
[INFO] Removed: .env-ext-box-example-com-api
Important Notes:
- Removing a port configuration will restart the Traefik container (brief downtime ~5 seconds)
- Domain and external service removal does not require Traefik restart (dynamic config removal)
- All changes are permanent and cannot be undone - make sure you want to remove before confirming
Step 7: Configure Extra Traefik Entrypoints (QUIC, Custom Ports, etc.)
Beyond the default entrypoints (web on :80, websecure on :443), you can add extra entrypoints such as HTTP/3 QUIC (UDP 443) or other custom protocols. Entrypoints are defined via command-line arguments to the Traefik container, so the container must be recreated to apply them.
Configuration Variable:
EXTRA_ENTRYPOINTSin.env.rvs-prxy(global proxy config) or per-domain.env-<domain>files- Format:
name=:port/protocol,name2=:port(comma-separated) - Protocol defaults to
tcpif omitted; use/udpfor UDP entrypoints - Example:
quic=:443/udpcreates entrypointquiclistening on UDP port 443 - Example:
quic=:443/udp, mqtt=:1883adds both QUIC and a custom TCP entrypoint on port 1883
Scenario A: First-Time Setup (Traefik Not Yet Created)
The wizard asks for extra entrypoints during the Traefik configuration step. You can also pre-configure them:
- Create
.env.rvs-prxywith the entrypoints setting:EXTRA_ENTRYPOINTS="quic=:443/udp" - Run the script as usual:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash - What happens:
- The docker-compose.yml generated by the script includes the extra entrypoints in the
command:section and their port mappings in theports:section - The Traefik container starts with
--entrypoints.quic.address=:443/udpand-p 443:443/udp - Both TCP and UDP on port 443 are now mapped (QUIC shares port 443 with HTTPS)
- The docker-compose.yml generated by the script includes the extra entrypoints in the
Scenario B: Running Traefik — Add New Extra Entrypoints
To add a new entrypoint (e.g., QUIC) to a Traefik container that is already running:
-
Set
EXTRA_ENTRYPOINTSin.env.rvs-prxy(proxy config) or in the per-domain.env-<domain>file:EXTRA_ENTRYPOINTS="quic=:443/udp"If the variable already has values, add the new one with a comma:
EXTRA_ENTRYPOINTS="quic=:443/udp, mqtt=:1883" -
Run the script:
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bashThe script detects the running Traefik container and checks if
EXTRA_ENTRYPOINTShas changed. -
What happens:
- The script calls
parse_extra_entrypoints()which parses the variable - It inspects the current Traefik container's command-line args
- If any extra entrypoints are missing from the running container, the script:
- Stops and removes the current Traefik container (data in
traefik_datavolume is preserved) - Recreates the container with all standard entrypoints plus the new extra entrypoints and their port mappings
- Stops and removes the current Traefik container (data in
- Brief downtime (~5 seconds) while the container is recreated
- Existing domain routing and port exposure configurations remain intact (they are stored in the volume)
- The script calls
-
Expected output (proxy setup mode —
deploy-rvs-prxy.sh):[INFO] Extra entrypoints changed, recreating Traefik container to apply... [INFO] Updating Traefik container... [INFO] Traefik container recreated with new entry pointsExpected output (domain setup mode —
.env-p2prly1-ivantito-com):[INFO] Loading domain config from .env-p2prly1-ivantito-com [INFO] Detected running Traefik reverse proxy [INFO] Extra entrypoints changed, recreating Traefik container to apply... [INFO] Checking if Application Service is running locally... ... [INFO] Traefik configured to route traffic to Application Service -
Verify the new entrypoint is active:
# Check container args for entrypoint definitions docker inspect traefik --format '{{range .Config.Cmd}}{{println .}}{{end}}' | grep entrypoints # Should show: --entrypoints.quic.address=:443/udp # Check port mappings (TCP and UDP on 443) docker port traefik # Should show: 443/tcp → 0.0.0.0:443 and 443/udp → 0.0.0.0:443
Scenario C: Running Traefik — Remove an Extra Entrypoint
- Edit
.env.rvs-prxyand remove the entrypoint fromEXTRA_ENTRYPOINTS - Run the script to trigger the recreation with the updated entrypoints (same as Scenario B steps 2-4)
Scenario D: Running Traefik — Add/Remove During Port Exposure Setup
When you use port exposure (--manage or .env-port-<port>), the add_traefik_entry_point() and manage_configurations() functions automatically preserve all EXTRA_ENTRYPOINTS. Extra entrypoints are re-injected whenever the Traefik container is recreated for port operations, so they are never lost.
No additional steps needed — extra entrypoints configured in .env.rvs-prxy are automatically preserved across all port management operations.
Important Notes:
- Recreating the Traefik container causes ~5 seconds of downtime
- The
traefik_datavolume (config files, SSL certificates, ACME data) is preserved across recreations EXTRA_ENTRYPOINTSadds entrypoints to the Traefik container's command-line args. When a domain config also has a UDP port inLOCAL_SERVICE_PORT(e.g.,80,4443/udp), the script automatically creates a Traefik UDP router in the domain config, so no manual routing setup is needed for that UDP port- For port-mapped entrypoints (like port-exposure), existing
--manageflows already handle adding/removing
Run this System
Using with curl (Remote Execution)
The script is designed to run directly via curl without any parameters:
# Basic usage - auto-detects mode
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
# Show help
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash -s -- --help
Note: The script automatically:
- Loads
.env.rvs-prxyconfiguration if it exists - Triggers interactive wizard if
.env.rvs-prxyis missing - Detects deployment mode (setup proxy or setup domain)
Re-running for Existing Domain
What happens if you run the script again for a domain that's already configured?
If you run the script for a domain that has already been added to the reverse proxy:
- Detection: The script detects the running proxy mode (Traefik or FRP) automatically
- Warning: Displays a warning message that configuration will be overwritten
- Update: The existing configuration is updated with the new settings
- Result: The domain configuration is updated (not duplicated)
Key Points:
- Safe to re-run: Running the script multiple times for the same domain is safe
- No .env required: Script auto-detects running proxy mode (Traefik or FRP)
- Configuration is updated, not duplicated: Each domain+service combination has a unique configuration
- No service interruption:
- Traefik: Dynamically loads updated configuration (no restart needed by default)
- FRP: Restarts FRP client container to apply new configuration
- Use case: Useful for updating application port changes or domain routing modifications
Example Scenario (Traefik Mode):
# First run - adds my.domain.com
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
# [INFO] Creating new configuration for domain my.domain.com
# Second run - updates my.domain.com (e.g., after port change)
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
# [INFO] Detected running Traefik reverse proxy
# [INFO] Setting up new domain: my.domain.com
# [INFO] New domain my.domain.com has been configured in Traefik
Example Scenario (FRP Mode):
# First run - adds my.domain.com
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
# [INFO] Creating new configuration for domain my.domain.com
# Second run - updates my.domain.com (e.g., after port change)
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
# [INFO] Detected running FRP client container: my-instance-frpc
# [INFO] Setting up new domain: my.domain.com
# [INFO] Generated remote port 12001 for domain my.domain.com
# [INFO] New domain my.domain.com has been configured in FRP tunnel
Script Behavior
Mode Selection
The script automatically detects the proxy mode from running containers:
# Auto-detects running proxy (Traefik or FRP)
curl -s "https://www.ivantito.com/app-pub/demos/test/deploy-rvs-prxy.sh" | bash
Manual override (optional): Set the FRP environment variable to force a specific mode:
# Force Traefik Mode (local reverse proxy on same server)
FRP=false ./deploy-rvs-prxy.sh
# Force FRP Mode (remote proxy via FRP tunnel)
FRP=true ./deploy-rvs-prxy.sh
Auto-detection behavior:
- If
traefikcontainer is running → Traefik mode (FRP=false) - If
*-frpccontainer is running → FRP mode (FRP=true) - If both are running → Traefik mode takes precedence
- If neither is running → Interactive wizard
Traefik Mode Operations (FRP=false)
Setup
./deploy-traefik.sh setup-rvs-prxy- Will apply the new
.env.rvs-prxysetting to Traefik- If no Traefik exists: create new and apply settings
- If Traefik already exists: keep all old settings, then apply new settings
- Pre-request checks:
- Ensure current user has permission to execute Docker commands
- Automatic deployment steps:
- Check if Application Service exists locally
- Create Traefik container locally (if not exists)
- Configure Traefik routing for the Application Service
- Display operation commands for future reference
- Will apply the new
Check Status
./deploy-traefik.sh status- Displays running status of Traefik container locally
- Displays running status of Application Service locally
View Logs
./deploy-traefik.sh logs- Shows last 50 lines of Traefik logs locally
FRP Mode Operations (FRP=true)
Setup
./deploy-traefik.sh setup-rvs-prxy- Will apply the new
.env.rvs-prxysetting to FRP client- If no FRPC exists: create new and apply settings
- If FRPC already exists: keep all old settings, then apply new settings
- Pre-request checks:
- Ensure current user has permission to execute Docker commands
- Ensure SSH key pairs exist for proxy server access
- Automatic deployment steps:
- Prompt for instance name (auto-detected from existing volumes)
- Prompt for internal service port
- Prompt for domain name
- Generate FRP client configuration (frpc.toml)
- Start Docker container with FRP client
- Update proxy server configuration
- Display container operation commands
- Will apply the new
Setup New Domain (FRP Mode)
When the FRP reverse proxy is already running, you can add new domains:
-
Prerequisites:
- FRP client container must be running (
${INSTANCE_NAME}-frpc) - Application service must be running locally
.env.rvs-prxyfile with reverse proxy configuration must exist.env-<domain>file with domain configuration (or use interactive wizard)
- FRP client container must be running (
-
Process:
- Run the script:
curl -s "<url>/deploy-rvs-prxy.sh" | bash - Script detects existing FRP proxy and domain config
- Validates FRP client container is running
- Validates application service is running
- Generates a new remote port for the domain
- Updates frpc.toml with new proxy configuration
- Restarts FRP client container to apply changes
- Updates proxy server configuration with domain routing
- Domain is now accessible via HTTPS
- Run the script:
-
Configuration Files:
.env.rvs-prxy- Reverse proxy instance configuration (containsINSTANCE_NAME,FRP_SERVER_ADDR, etc.).env-<domain>- Domain-specific configuration (containsDOMAIN_NAME,LOCAL_SERVICE_NAME,LOCAL_SERVICE_PORT)LOCAL_SERVICE_PORTsupports comma-separated ports with protocol:80or80,4443/udp- First TCP port is used for HTTPS routing; additional UDP ports get automatic Traefik UDP router config
-
What Happens:
- A new TCP proxy is added to frpc.toml for the domain's service
- A unique remote port is allocated for this domain
- Proxy server (FRPS) is updated to route the domain to the new tunnel port
- FRP client container is restarted to apply the new configuration
Environment Variable Priority
Configuration files are loaded in the following priority order:
.env.development(highest priority).env.production.env.rvs-prxy(default)
Files can be located in either the current working directory or the script directory.
Interactive Prompts
If environment variables are not set, the script will prompt for:
- Instance name (auto-suggests from existing instances)
- Internal service port (default: 3000)
- Domain name for routing
- Docker network selection
When the wizard runs for an existing proxy, the setup menu offers three options:
1) Setup New Domain- routes the domain to a local Docker container2) Setup Port Exposure- exposes a host port to a container port3) Setup External Service Domain- routes the domain to an external web service URL (asks for domain and URL only)
Container Management Commands
Traefik Container (Traefik Mode)
Entrypoints:
Default entrypoints are web (:80) and websecure (:443). See Step 7: Configure Extra Traefik Entrypoints for a complete guide on adding/removing extra entrypoints (QUIC, custom ports, etc.) during both first-time setup and on a running Traefik container.
# Start/run container
docker run -d --name traefik --restart=unless-stopped \
-p 80:80 -p 443:443 -p 127.0.0.1:8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v traefik_data:/etc/traefik traefik:latest
# Restart container
docker restart traefik
# Access container (as ubuntu user)
docker exec -it traefik /bin/sh
# Access container (as root)
docker exec -it -u root traefik /bin/sh
# View logs
docker logs --tail 50 traefik
# Inspect container
docker inspect traefik
# Remove container
docker rm -f traefik
# Access Traefik Dashboard (port from DASHBOARD_PORT, default 18080)
http://localhost:${DASHBOARD_PORT:-18080}/dashboard/
# Check docker-compose.yml used to create the container (preserved after each run)
cat /tmp/docker-compose.yml
# Complete removal (including data)
docker rm -f traefik
docker volume rm traefik_data
FRP Container (FRP Mode)
# Run container
docker run --restart=always -d \
[--network <NETWORK_NAME>] \
-v ${INSTANCE_NAME}-frpc:/etc/frp \
--name ${INSTANCE_NAME}-frpc \
snowdreamtech/frpc:0.62.0-alpine3.21
# Access container
docker exec -it ${INSTANCE_NAME}-frpc sh
# View logs
docker logs --tail 50 ${INSTANCE_NAME}-frpc
# Inspect container
docker inspect ${INSTANCE_NAME}-frpc
# Remove container
docker rm -f ${INSTANCE_NAME}-frpc
Configuration Notes
- Traefik Dynamic Loading: By default, Traefik does not restart after configuration updates (
RESTART_TRAEFIK=false). Traefik will dynamically load new configurations automatically. - Network Configuration: Application containers must be connected to the
traefik-publicnetwork for Traefik routing to work. - Sub-path Support: Domain names can include sub-paths (e.g.,
example.com/api) for path-based routing.