1) can work for my.domain.com/sub-path, 2) adding new setting, does not OVER-WRITE existing
This commit is contained in:
parent
36c94ea50b
commit
3e1c955c81
16
.env.sample
16
.env.sample
@ -60,26 +60,16 @@ PROXY_SSH_PORT=13076 # Remote port for SSH proxy (default 130
|
|||||||
# This section is used when FRP=false
|
# This section is used when FRP=false
|
||||||
|
|
||||||
# Deployment Name
|
# Deployment Name
|
||||||
DEPLOY_NAME=itl-pt # Unique name for this deployment
|
#DEPLOY_NAME=itl-pt # Unique name for this deployment
|
||||||
|
|
||||||
# Local Folder Path (this is where pnpm run build outputs)
|
|
||||||
# From point of view of deploy/
|
|
||||||
#LOCAL_FOLDER=../out/ # Path to source files for deployment
|
|
||||||
|
|
||||||
# Destination path for host or docker volume folder deployment
|
# Destination path for host or docker volume folder deployment
|
||||||
DEST_PATH=/ # Destination path on target server
|
DEST_PATH=/ # Destination path on target server
|
||||||
|
|
||||||
# List of paths to exclude from cleaning during deployment/restore operations (relative to DEST_PATH)
|
|
||||||
# Use format: EXCEPT_LIST="path/to/file1,path/to/folder1,path/to/file2"
|
|
||||||
# The paths should be relative to DEST_PATH (no leading slash needed)
|
|
||||||
# Example: EXCEPT_LIST="config/database.json,logs,cache,tmp/session.txt"
|
|
||||||
#EXCEPT_LIST="app-pub/demos, demos" # Comma-separated list of paths to exclude from cleanup
|
|
||||||
|
|
||||||
# Docker volume deployment settings (set to true to use volume instead of host folder)
|
# Docker volume deployment settings (set to true to use volume instead of host folder)
|
||||||
USE_DOCKER_VOLUME=true # Set to true to use Docker volume, false for host folder
|
#USE_DOCKER_VOLUME=true # Set to true to use Docker volume, false for host folder
|
||||||
|
|
||||||
# Docker volume name (only used if USE_DOCKER_VOLUME=true)
|
# Docker volume name (only used if USE_DOCKER_VOLUME=true)
|
||||||
DOCKER_VOLUME_NAME=itl-pt_html # Name of Docker volume to use
|
#DOCKER_VOLUME_NAME=itl-pt_html # Name of Docker volume to use
|
||||||
|
|
||||||
# Target Application Service information (on the target server)
|
# Target Application Service information (on the target server)
|
||||||
TARGET_SERVICE_NAME=your-app-service # Name of the Docker container running the application service
|
TARGET_SERVICE_NAME=your-app-service # Name of the Docker container running the application service
|
||||||
|
|||||||
@ -356,7 +356,38 @@
|
|||||||
1. Using a different end marker for the heredoc (EOF_HEREDOC instead of EOF) to avoid conflicts
|
1. Using a different end marker for the heredoc (EOF_HEREDOC instead of EOF) to avoid conflicts
|
||||||
2. Using single quotes around the heredoc (<< 'EOF_HEREDOC') which prevents shell expansion and should avoid the extra escaping
|
2. Using single quotes around the heredoc (<< 'EOF_HEREDOC') which prevents shell expansion and should avoid the extra escaping
|
||||||
|
|
||||||
|
- I have a `.env.development` as partial
|
||||||
|
```
|
||||||
|
...
|
||||||
|
# === Domain Configuration ===
|
||||||
|
DOMAIN_NAME=event.cgu.org.hk/api # production
|
||||||
|
...
|
||||||
|
# Target Application Service information (on the target server)
|
||||||
|
TARGET_SERVICE_NAME=cgu-rust-be # Name of the Docker container running the application service
|
||||||
|
TARGET_SERVICE_PORT=8787 # Port the application service is listening on
|
||||||
|
...
|
||||||
|
```
|
||||||
|
- Extend the current script which can handle `event.cgu.org.hk/api` sub-path pointing to another contianer name TARGET_SERVICE_NAME, with corresponding port TARGET_SERVICE_PORT at traefik. As well, i aim this new setting applying into existing traefik container which does not overwrite the old setting, old setting should still exist.
|
||||||
|
- Result -- implemented the sub-path routing functionality
|
||||||
|
1. Sub-path detection: The function now detects when DOMAIN_NAME contains a path (like event.cgu.org.hk/api) and splits it into domain and path parts
|
||||||
|
|
||||||
|
2. Dual routing support:
|
||||||
|
- For domains with sub-paths: Uses Host(\${domain_part}\`) && PathPrefix(\`${path_part}\) rules
|
||||||
|
- For regular domains: Uses the standard Host(\${DOMAIN_NAME}\) rule
|
||||||
|
|
||||||
|
3. Path stripping middleware: When using sub-path routing, I added a strip prefix middleware to remove the path prefix before forwarding to the backend service, ensuring the application receives clean requests
|
||||||
|
|
||||||
|
4. Non-overwriting configuration:
|
||||||
|
- Each configuration is saved as a unique file named app-service-{TARGET_SERVICE_NAME}.yml
|
||||||
|
- Multiple configurations can coexist in the /etc/traefik/config directory
|
||||||
|
- Traefik automatically picks up all .yml files in this directory
|
||||||
|
|
||||||
|
5. Backward compatibility: The function still works for regular domain routing when no sub-path is present
|
||||||
|
|
||||||
|
This implementation allows you to have multiple services configured with different paths on the same domain (e.g., event.cgu.org.hk/api and event.cgu.org.hk/admin), and all configurations will coexist in the same Traefik container without overwriting each other.
|
||||||
|
|
||||||
- Todo
|
- Todo
|
||||||
- NOT yet full test,
|
- NOT yet full test,
|
||||||
- just test as
|
- tested as
|
||||||
- new empty ubuntu 24.04 and docker ver 28, create new traefik, exiting App
|
- new empty ubuntu 24.04 and docker ver 28, create new traefik, exiting App
|
||||||
|
- exiting App non-connected to 'traefik-public' network
|
||||||
@ -52,3 +52,6 @@
|
|||||||
|
|
||||||
## Run this System
|
## Run this System
|
||||||
- `./auto-sys-deploy.sh setup-rvs-prxy`
|
- `./auto-sys-deploy.sh setup-rvs-prxy`
|
||||||
|
- will apply the new `.env` setting to into traefik
|
||||||
|
- null traefik before, create new and apply those new setting
|
||||||
|
- OR already existing traefik, keep all old setting, then apply new setting
|
||||||
|
|||||||
@ -35,9 +35,7 @@ SSH_KEY_FILE_NAME=""
|
|||||||
SSH_KEY_PATH=""
|
SSH_KEY_PATH=""
|
||||||
LOCAL_FOLDER="../out/"
|
LOCAL_FOLDER="../out/"
|
||||||
DEST_PATH="/"
|
DEST_PATH="/"
|
||||||
#EXCEPT_LIST=""
|
#USE_DOCKER_VOLUME="false"
|
||||||
USE_DOCKER_VOLUME="false"
|
|
||||||
DOCKER_VOLUME_NAME=""
|
|
||||||
DEBUG="false"
|
DEBUG="false"
|
||||||
TARGET_SERVICE_NAME=""
|
TARGET_SERVICE_NAME=""
|
||||||
TARGET_SERVICE_PORT=""
|
TARGET_SERVICE_PORT=""
|
||||||
@ -1097,8 +1095,48 @@ configure_traefik_on_target() {
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Check if DOMAIN_NAME contains a sub-path (like event.cgu.org.hk/api)
|
||||||
|
local domain_part
|
||||||
|
local path_part
|
||||||
|
if [[ "$DOMAIN_NAME" == *"/"* ]]; then
|
||||||
|
# Extract domain and path parts
|
||||||
|
domain_part=$(echo "$DOMAIN_NAME" | cut -d'/' -f1)
|
||||||
|
path_part="/$(echo "$DOMAIN_NAME" | cut -d'/' -f2-)"
|
||||||
|
log_info "Detected sub-path configuration: domain=$domain_part, path=$path_part"
|
||||||
|
else
|
||||||
|
domain_part="$DOMAIN_NAME"
|
||||||
|
path_part=""
|
||||||
|
fi
|
||||||
|
|
||||||
# Create dynamic configuration file for the service inside the volume
|
# Create dynamic configuration file for the service inside the volume
|
||||||
local temp_config="/tmp/app-service-$$.yml"
|
local temp_config="/tmp/app-service-$$.yml"
|
||||||
|
|
||||||
|
if [ -n "$path_part" ]; then
|
||||||
|
# Configure for sub-path routing
|
||||||
|
cat > "$temp_config" << EOF
|
||||||
|
http:
|
||||||
|
routers:
|
||||||
|
${TARGET_SERVICE_NAME}-router:
|
||||||
|
rule: 'Host(\`${domain_part}\`) && PathPrefix(\`${path_part}\`)'
|
||||||
|
service: ${TARGET_SERVICE_NAME}-service
|
||||||
|
tls:
|
||||||
|
certResolver: letsencrypt
|
||||||
|
middlewares:
|
||||||
|
- ${TARGET_SERVICE_NAME}-strip-prefix
|
||||||
|
middlewares:
|
||||||
|
${TARGET_SERVICE_NAME}-strip-prefix:
|
||||||
|
stripPrefix:
|
||||||
|
prefixes:
|
||||||
|
- ${path_part}
|
||||||
|
services:
|
||||||
|
${TARGET_SERVICE_NAME}-service:
|
||||||
|
loadBalancer:
|
||||||
|
servers:
|
||||||
|
- url: 'http://${TARGET_SERVICE_NAME}:${TARGET_SERVICE_PORT}'
|
||||||
|
passHostHeader: true
|
||||||
|
EOF
|
||||||
|
else
|
||||||
|
# Configure for root domain routing
|
||||||
cat > "$temp_config" << EOF
|
cat > "$temp_config" << EOF
|
||||||
http:
|
http:
|
||||||
routers:
|
routers:
|
||||||
@ -1114,13 +1152,17 @@ http:
|
|||||||
- url: 'http://${TARGET_SERVICE_NAME}:${TARGET_SERVICE_PORT}'
|
- url: 'http://${TARGET_SERVICE_NAME}:${TARGET_SERVICE_PORT}'
|
||||||
passHostHeader: true
|
passHostHeader: true
|
||||||
EOF
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
# Upload the configuration to target server
|
# Upload the configuration to target server
|
||||||
scp_upload "$temp_config" "/tmp/app-service.yml"
|
scp_upload "$temp_config" "/tmp/app-service.yml"
|
||||||
rm -f "$temp_config"
|
rm -f "$temp_config"
|
||||||
|
|
||||||
|
# Generate a unique configuration file name based on the service name to avoid overwrites
|
||||||
|
local config_file_name="app-service-${TARGET_SERVICE_NAME}.yml"
|
||||||
|
|
||||||
# Copy the configuration file into the volume using a temporary container
|
# Copy the configuration file into the volume using a temporary container
|
||||||
ssh_exec "docker run --rm -v ${THIS_INSTANCE}-traefik_data:/etc/traefik -v /tmp:/tmp alpine:latest sh -c 'cp /tmp/app-service.yml /etc/traefik/config/app-service.yml'"
|
ssh_exec "docker run --rm -v ${THIS_INSTANCE}-traefik_data:/etc/traefik -v /tmp:/tmp alpine:latest sh -c \"cp /tmp/app-service.yml /etc/traefik/config/$config_file_name\""
|
||||||
|
|
||||||
# Connect the traefik container to the traefik-public network to ensure communication
|
# Connect the traefik container to the traefik-public network to ensure communication
|
||||||
ssh_exec "docker network connect traefik-public traefik 2>/dev/null || true"
|
ssh_exec "docker network connect traefik-public traefik 2>/dev/null || true"
|
||||||
@ -1129,6 +1171,13 @@ EOF
|
|||||||
ssh_exec "docker restart traefik"
|
ssh_exec "docker restart traefik"
|
||||||
|
|
||||||
log_info "Traefik configured to route traffic to Application Service"
|
log_info "Traefik configured to route traffic to Application Service"
|
||||||
|
|
||||||
|
# Show success message based on configuration type
|
||||||
|
if [ -n "$path_part" ]; then
|
||||||
|
log_info "Service will be accessible at: https://$domain_part$path_part"
|
||||||
|
else
|
||||||
|
log_info "Service will be accessible at: https://$DOMAIN_NAME"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to check if Application Service is running on target server (Traefik Mode)
|
# Function to check if Application Service is running on target server (Traefik Mode)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user