Add MailHog email testing and improve services.yaml configuration
This commit adds comprehensive email testing support and improves the Homepage dashboard configuration logic: MailHog Email Testing: - Add MailHog service with configurable SMTP and Web UI ports - Configure MailHog ports in config.sh with defaults (1025 SMTP, 8025 Web) - Add port conflict checking for MailHog ports - Use environment variables for MailHog ports in docker-compose.yml Enhanced Homepage Configuration: - Improve update_services_yaml() function to handle Production and Local tabs separately - Add local IP address configuration prompt for Homepage Local tab - Support custom local network IPs (e.g., Tailscale) for local service access - Add comprehensive port-based URL mappings for all services in Local tab - Include MailHog in both Production and Local service mappings Configuration Improvements: - Add local_ip parameter to update_services_yaml function - Display MailHog information in port summary and next steps - Update completion message with Homepage Local tab configuration info These changes enable developers to test email functionality locally and provide better support for accessing services via local network IPs.
This commit is contained in:
parent
73b0e31847
commit
bffb2dd74d
141
config.sh
141
config.sh
@ -272,6 +272,8 @@ initialize_available_ports() {
|
|||||||
["REDIS_EXPORTER_PORT"]=9121
|
["REDIS_EXPORTER_PORT"]=9121
|
||||||
["ALERTMANAGER_PORT"]=9093
|
["ALERTMANAGER_PORT"]=9093
|
||||||
["GOTIFY_PORT"]=8889
|
["GOTIFY_PORT"]=8889
|
||||||
|
["MAILHOG_SMTP_PORT"]=1025
|
||||||
|
["MAILHOG_WEB_PORT"]=8025
|
||||||
)
|
)
|
||||||
|
|
||||||
# Find available ports for each service
|
# Find available ports for each service
|
||||||
@ -353,6 +355,10 @@ REDIS_EXPORTER_PORT=${REDIS_EXPORTER_PORT:-9121}
|
|||||||
ALERTMANAGER_PORT=${ALERTMANAGER_PORT:-9093}
|
ALERTMANAGER_PORT=${ALERTMANAGER_PORT:-9093}
|
||||||
GOTIFY_PORT=${GOTIFY_PORT:-8889}
|
GOTIFY_PORT=${GOTIFY_PORT:-8889}
|
||||||
|
|
||||||
|
# MailHog Email Testing Ports
|
||||||
|
MAILHOG_SMTP_PORT=${MAILHOG_SMTP_PORT:-1025}
|
||||||
|
MAILHOG_WEB_PORT=${MAILHOG_WEB_PORT:-8025}
|
||||||
|
|
||||||
# Domain Configuration
|
# Domain Configuration
|
||||||
BASE_DOMAIN=https://changeme.org
|
BASE_DOMAIN=https://changeme.org
|
||||||
DOMAIN=changeme.org
|
DOMAIN=changeme.org
|
||||||
@ -467,6 +473,10 @@ EOL
|
|||||||
echo "Redis Exporter: ${REDIS_EXPORTER_PORT:-9121}"
|
echo "Redis Exporter: ${REDIS_EXPORTER_PORT:-9121}"
|
||||||
echo "Alertmanager: ${ALERTMANAGER_PORT:-9093}"
|
echo "Alertmanager: ${ALERTMANAGER_PORT:-9093}"
|
||||||
echo "Gotify: ${GOTIFY_PORT:-8889}"
|
echo "Gotify: ${GOTIFY_PORT:-8889}"
|
||||||
|
echo ""
|
||||||
|
echo "=== Email Testing ==="
|
||||||
|
echo "MailHog SMTP: ${MAILHOG_SMTP_PORT:-1025}"
|
||||||
|
echo "MailHog Web: ${MAILHOG_WEB_PORT:-8025}"
|
||||||
echo "================================"
|
echo "================================"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -502,6 +512,7 @@ update_mkdocs_yml() {
|
|||||||
# Function to update service URLs in services.yaml
|
# Function to update service URLs in services.yaml
|
||||||
update_services_yaml() {
|
update_services_yaml() {
|
||||||
local new_domain=$1
|
local new_domain=$1
|
||||||
|
local local_ip=${2:-"localhost"} # Optional parameter for local IP address
|
||||||
|
|
||||||
if [ ! -f "$SERVICES_YAML" ]; then
|
if [ ! -f "$SERVICES_YAML" ]; then
|
||||||
echo "Warning: services.yaml not found at $SERVICES_YAML"
|
echo "Warning: services.yaml not found at $SERVICES_YAML"
|
||||||
@ -516,17 +527,19 @@ update_services_yaml() {
|
|||||||
cp "$SERVICES_YAML" "$backup_file"
|
cp "$SERVICES_YAML" "$backup_file"
|
||||||
echo "Created backup of services.yaml at $backup_file"
|
echo "Created backup of services.yaml at $backup_file"
|
||||||
|
|
||||||
# Define service name to subdomain mapping
|
# Load environment variables to get port numbers
|
||||||
|
load_env_vars
|
||||||
|
|
||||||
|
# Define service name to subdomain mapping for Production tab
|
||||||
# This approach is URL-agnostic - it doesn't matter what the current URLs are
|
# This approach is URL-agnostic - it doesn't matter what the current URLs are
|
||||||
declare -A service_mappings=(
|
declare -A production_mappings=(
|
||||||
["Code Server"]="code.$new_domain"
|
["Code Server"]="code.$new_domain"
|
||||||
["Listmonk"]="listmonk.$new_domain"
|
["Listmonk"]="listmonk.$new_domain"
|
||||||
["NocoDB"]="db.$new_domain"
|
["NocoDB"]="db.$new_domain"
|
||||||
["Map Server"]="map.$new_domain"
|
|
||||||
["Influence"]="influence.$new_domain"
|
|
||||||
["Main Site"]="$new_domain"
|
["Main Site"]="$new_domain"
|
||||||
["MkDocs (Live)"]="docs.$new_domain"
|
["MkDocs (Live)"]="docs.$new_domain"
|
||||||
["Mini QR"]="qr.$new_domain"
|
["Mini QR"]="qr.$new_domain"
|
||||||
|
["MailHog"]="mail.$new_domain"
|
||||||
["n8n"]="n8n.$new_domain"
|
["n8n"]="n8n.$new_domain"
|
||||||
["Gitea"]="git.$new_domain"
|
["Gitea"]="git.$new_domain"
|
||||||
["Prometheus"]="prometheus.$new_domain"
|
["Prometheus"]="prometheus.$new_domain"
|
||||||
@ -536,18 +549,46 @@ update_services_yaml() {
|
|||||||
["cAdvisor"]="cadvisor.$new_domain"
|
["cAdvisor"]="cadvisor.$new_domain"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Process each service mapping
|
# Define service name to local URL mapping for Local tab
|
||||||
for service_name in "${!service_mappings[@]}"; do
|
declare -A local_mappings=(
|
||||||
local target_url="https://${service_mappings[$service_name]}"
|
["Code Server"]="$local_ip:${CODE_SERVER_PORT:-8888}"
|
||||||
|
["NocoDB"]="$local_ip:${NOCODB_PORT:-8090}"
|
||||||
|
["Homepage"]="$local_ip:${HOMEPAGE_PORT:-3010}"
|
||||||
|
["Main Site"]="$local_ip:${MKDOCS_SITE_SERVER_PORT:-4001}"
|
||||||
|
["MkDocs (Live)"]="$local_ip:${MKDOCS_PORT:-4000}"
|
||||||
|
["Mini QR"]="$local_ip:${MINI_QR_PORT:-8089}"
|
||||||
|
["Listmonk"]="$local_ip:${LISTMONK_PORT:-9001}"
|
||||||
|
["MailHog"]="$local_ip:${MAILHOG_WEB_PORT:-8025}"
|
||||||
|
["n8n"]="$local_ip:${N8N_PORT:-5678}"
|
||||||
|
["Gitea"]="$local_ip:${GITEA_WEB_PORT:-3030}"
|
||||||
|
["Prometheus"]="$local_ip:${PROMETHEUS_PORT:-9090}"
|
||||||
|
["Grafana"]="$local_ip:${GRAFANA_PORT:-3001}"
|
||||||
|
["Alertmanager"]="$local_ip:${ALERTMANAGER_PORT:-9093}"
|
||||||
|
["Gotify"]="$local_ip:${GOTIFY_PORT:-8889}"
|
||||||
|
["cAdvisor"]="$local_ip:${CADVISOR_PORT:-8080}"
|
||||||
|
["Node Exporter"]="$local_ip:${NODE_EXPORTER_PORT:-9100}/metrics"
|
||||||
|
["Redis Exporter"]="$local_ip:${REDIS_EXPORTER_PORT:-9121}/metrics"
|
||||||
|
)
|
||||||
|
|
||||||
# Use awk to find and update the href for each specific service
|
# Update Production URLs
|
||||||
# This finds the service by name and updates its href regardless of current URL
|
echo "Updating Production tab URLs..."
|
||||||
|
for service_name in "${!production_mappings[@]}"; do
|
||||||
|
local target_url="https://${production_mappings[$service_name]}"
|
||||||
|
|
||||||
|
# Use awk to find and update the href for Production services only
|
||||||
awk -v service="$service_name" -v new_url="$target_url" '
|
awk -v service="$service_name" -v new_url="$target_url" '
|
||||||
BEGIN { in_service = 0 }
|
BEGIN {
|
||||||
|
in_production = 0
|
||||||
|
in_service = 0
|
||||||
|
}
|
||||||
|
|
||||||
# Check if we found the service name
|
# Track if we are in Production section
|
||||||
/- [^:]+:/ {
|
/^- Production/ { in_production = 1; in_service = 0 }
|
||||||
if ($0 ~ ("- " service ":")) {
|
/^- Local/ { in_production = 0; in_service = 0 }
|
||||||
|
|
||||||
|
# Check if we found the service name in Production section
|
||||||
|
in_production && /^ - [^:]+:/ {
|
||||||
|
if ($0 ~ (" - " service ":")) {
|
||||||
in_service = 1
|
in_service = 1
|
||||||
} else {
|
} else {
|
||||||
in_service = 0
|
in_service = 0
|
||||||
@ -555,7 +596,7 @@ update_services_yaml() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# If we are in the target service and find href line, update it
|
# If we are in the target service and find href line, update it
|
||||||
in_service && /href:/ {
|
in_production && in_service && /href:/ {
|
||||||
gsub(/href: "[^"]*"/, "href: \"" new_url "\"")
|
gsub(/href: "[^"]*"/, "href: \"" new_url "\"")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -563,13 +604,51 @@ update_services_yaml() {
|
|||||||
{ print }
|
{ print }
|
||||||
' "$SERVICES_YAML" > "${SERVICES_YAML}.tmp"
|
' "$SERVICES_YAML" > "${SERVICES_YAML}.tmp"
|
||||||
|
|
||||||
# Replace the original file with the updated version
|
|
||||||
mv "${SERVICES_YAML}.tmp" "$SERVICES_YAML"
|
mv "${SERVICES_YAML}.tmp" "$SERVICES_YAML"
|
||||||
|
echo " ✓ Production: $service_name -> $target_url"
|
||||||
echo " ✓ Updated $service_name -> $target_url"
|
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "✅ All service URLs updated to use domain: $new_domain"
|
# Update Local URLs
|
||||||
|
echo "Updating Local tab URLs..."
|
||||||
|
for service_name in "${!local_mappings[@]}"; do
|
||||||
|
local target_url="http://${local_mappings[$service_name]}"
|
||||||
|
|
||||||
|
# Use awk to find and update the href for Local services only
|
||||||
|
awk -v service="$service_name" -v new_url="$target_url" '
|
||||||
|
BEGIN {
|
||||||
|
in_local = 0
|
||||||
|
in_service = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Track if we are in Local section
|
||||||
|
/^- Local/ { in_local = 1; in_service = 0 }
|
||||||
|
/^- Production/ { in_local = 0; in_service = 0 }
|
||||||
|
|
||||||
|
# Check if we found the service name in Local section
|
||||||
|
in_local && /^ - [^:]+:/ {
|
||||||
|
if ($0 ~ (" - " service ":")) {
|
||||||
|
in_service = 1
|
||||||
|
} else {
|
||||||
|
in_service = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# If we are in the target service and find href line, update it
|
||||||
|
in_local && in_service && /href:/ {
|
||||||
|
gsub(/href: "[^"]*"/, "href: \"" new_url "\"")
|
||||||
|
}
|
||||||
|
|
||||||
|
# Print the line (modified or not)
|
||||||
|
{ print }
|
||||||
|
' "$SERVICES_YAML" > "${SERVICES_YAML}.tmp"
|
||||||
|
|
||||||
|
mv "${SERVICES_YAML}.tmp" "$SERVICES_YAML"
|
||||||
|
echo " ✓ Local: $service_name -> $target_url"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✅ All service URLs updated:"
|
||||||
|
echo " - Production tab: $new_domain"
|
||||||
|
echo " - Local tab: $local_ip"
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -997,6 +1076,8 @@ check_port_conflicts() {
|
|||||||
"REDIS_EXPORTER_PORT"
|
"REDIS_EXPORTER_PORT"
|
||||||
"ALERTMANAGER_PORT"
|
"ALERTMANAGER_PORT"
|
||||||
"GOTIFY_PORT"
|
"GOTIFY_PORT"
|
||||||
|
"MAILHOG_SMTP_PORT"
|
||||||
|
"MAILHOG_WEB_PORT"
|
||||||
)
|
)
|
||||||
|
|
||||||
for var in "${port_vars[@]}"; do
|
for var in "${port_vars[@]}"; do
|
||||||
@ -1209,6 +1290,7 @@ fi
|
|||||||
update_env_instance_config "$instance_identifier"
|
update_env_instance_config "$instance_identifier"
|
||||||
|
|
||||||
# Domain configuration
|
# Domain configuration
|
||||||
|
echo -e "\n---- Domain Configuration ----"
|
||||||
read -p "Enter your domain name (without protocol, e.g., example.com): " domain_name
|
read -p "Enter your domain name (without protocol, e.g., example.com): " domain_name
|
||||||
|
|
||||||
if [ -z "$domain_name" ]; then
|
if [ -z "$domain_name" ]; then
|
||||||
@ -1216,6 +1298,20 @@ if [ -z "$domain_name" ]; then
|
|||||||
domain_name="changeme.org"
|
domain_name="changeme.org"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Local IP configuration for Homepage Local tab
|
||||||
|
echo -e "\n---- Local Network Configuration ----"
|
||||||
|
echo "For the Homepage dashboard, you can configure the Local tab to use a specific"
|
||||||
|
echo "IP address for accessing services on your local network (e.g., Tailscale IP)."
|
||||||
|
echo ""
|
||||||
|
read -p "Enter local IP address [default: localhost]: " local_ip
|
||||||
|
|
||||||
|
if [ -z "$local_ip" ]; then
|
||||||
|
local_ip="localhost"
|
||||||
|
echo "Using default: localhost"
|
||||||
|
else
|
||||||
|
echo "Using local IP: $local_ip"
|
||||||
|
fi
|
||||||
|
|
||||||
echo -e "\nUpdating domain settings in .env file..."
|
echo -e "\nUpdating domain settings in .env file..."
|
||||||
|
|
||||||
# Update main domain settings
|
# Update main domain settings
|
||||||
@ -1293,7 +1389,7 @@ update_mkdocs_yml "$domain_name"
|
|||||||
|
|
||||||
# Update service URLs in services.yaml
|
# Update service URLs in services.yaml
|
||||||
echo -e "\nUpdating service URLs in services.yaml..."
|
echo -e "\nUpdating service URLs in services.yaml..."
|
||||||
update_services_yaml "$domain_name"
|
update_services_yaml "$domain_name" "$local_ip"
|
||||||
|
|
||||||
# Update the login URL in main.html
|
# Update the login URL in main.html
|
||||||
echo -e "\nUpdating login URL in main.html..."
|
echo -e "\nUpdating login URL in main.html..."
|
||||||
@ -1380,6 +1476,7 @@ echo -e "\n✅ Configuration completed successfully!"
|
|||||||
echo "Your .env file has been configured with:"
|
echo "Your .env file has been configured with:"
|
||||||
echo "- Instance ID: $instance_identifier"
|
echo "- Instance ID: $instance_identifier"
|
||||||
echo "- Domain: $domain_name"
|
echo "- Domain: $domain_name"
|
||||||
|
echo "- Local IP: $local_ip (for Homepage Local tab)"
|
||||||
echo "- Cookie Domain: .$domain_name"
|
echo "- Cookie Domain: .$domain_name"
|
||||||
echo "- Allowed Origins: https://map.$domain_name,http://localhost:3000"
|
echo "- Allowed Origins: https://map.$domain_name,http://localhost:3000"
|
||||||
echo "- Map .env updated with domain settings"
|
echo "- Map .env updated with domain settings"
|
||||||
@ -1390,7 +1487,9 @@ echo "- Grafana Admin Password: Generated (see .env file)"
|
|||||||
echo "- Gotify Admin Password: Generated (see .env file)"
|
echo "- Gotify Admin Password: Generated (see .env file)"
|
||||||
echo "- Centralized services: Redis, Prometheus, Grafana"
|
echo "- Centralized services: Redis, Prometheus, Grafana"
|
||||||
echo "- Monitoring services: cAdvisor, Node Exporter, Redis Exporter, Alertmanager, Gotify"
|
echo "- Monitoring services: cAdvisor, Node Exporter, Redis Exporter, Alertmanager, Gotify"
|
||||||
|
echo "- Email testing: MailHog"
|
||||||
echo "- Tunnel configuration updated at: $TUNNEL_CONFIG_FILE"
|
echo "- Tunnel configuration updated at: $TUNNEL_CONFIG_FILE"
|
||||||
|
echo "- Homepage services.yaml configured with Production and Local tabs"
|
||||||
echo -e "\nYour .env file is located at: $ENV_FILE"
|
echo -e "\nYour .env file is located at: $ENV_FILE"
|
||||||
echo "A backup of your original .env file was created before modifications."
|
echo "A backup of your original .env file was created before modifications."
|
||||||
|
|
||||||
@ -1421,6 +1520,10 @@ echo ""
|
|||||||
echo " Centralized Services:"
|
echo " Centralized Services:"
|
||||||
echo " - Redis: http://localhost:${REDIS_PORT:-6379}"
|
echo " - Redis: http://localhost:${REDIS_PORT:-6379}"
|
||||||
echo ""
|
echo ""
|
||||||
|
echo " Email Testing:"
|
||||||
|
echo " - MailHog Web UI: http://localhost:${MAILHOG_WEB_PORT:-8025}"
|
||||||
|
echo " - MailHog SMTP: localhost:${MAILHOG_SMTP_PORT:-1025}"
|
||||||
|
echo ""
|
||||||
echo " Monitoring Services (optional monitoring profile):"
|
echo " Monitoring Services (optional monitoring profile):"
|
||||||
echo " - Prometheus: http://localhost:${PROMETHEUS_PORT:-9090}"
|
echo " - Prometheus: http://localhost:${PROMETHEUS_PORT:-9090}"
|
||||||
echo " - Grafana: http://localhost:${GRAFANA_PORT:-3001}"
|
echo " - Grafana: http://localhost:${GRAFANA_PORT:-3001}"
|
||||||
|
|||||||
@ -413,8 +413,8 @@ services:
|
|||||||
image: mailhog/mailhog:latest
|
image: mailhog/mailhog:latest
|
||||||
container_name: mailhog-changemaker
|
container_name: mailhog-changemaker
|
||||||
ports:
|
ports:
|
||||||
- "1025:1025" # SMTP server
|
- "${MAILHOG_SMTP_PORT:-1025}:1025" # SMTP server
|
||||||
- "8025:8025" # Web UI
|
- "${MAILHOG_WEB_PORT:-8025}:8025" # Web UI
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
networks:
|
networks:
|
||||||
- changemaker-lite
|
- changemaker-lite
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user