add wizzard

This commit is contained in:
Deckard
2025-10-03 17:07:45 -04:00
parent bb64493d98
commit 71038930a7
2 changed files with 399 additions and 0 deletions

359
scripts/setup-server.sh Executable file
View File

@@ -0,0 +1,359 @@
#!/bin/bash
# ==============================================
# AzerothCore Server Setup Script
# ==============================================
# Interactive script to configure common server settings and generate deployment-ready environment files
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
NC='\033[0m' # No Color
# Function to print colored output
print_status() {
local status=$1
local message=$2
case $status in
"INFO")
echo -e "${BLUE} ${message}${NC}"
;;
"SUCCESS")
echo -e "${GREEN}${message}${NC}"
;;
"WARNING")
echo -e "${YELLOW}⚠️ ${message}${NC}"
;;
"ERROR")
echo -e "${RED}${message}${NC}"
;;
"HEADER")
echo -e "\n${MAGENTA}=== ${message} ===${NC}"
;;
"PROMPT")
echo -e "${YELLOW}🔧 ${message}${NC}"
;;
esac
}
# Function to validate IP address
validate_ip() {
local ip=$1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
return 0
else
return 1
fi
}
# Function to validate port number
validate_port() {
local port=$1
if [[ $port =~ ^[0-9]+$ ]] && [ $port -ge 1 ] && [ $port -le 65535 ]; then
return 0
else
return 1
fi
}
# Function to validate number
validate_number() {
local num=$1
if [[ $num =~ ^[0-9]+$ ]]; then
return 0
else
return 1
fi
}
# Function to prompt for input with validation
prompt_input() {
local prompt=$1
local default=$2
local validator=$3
local value=""
while true; do
if [ -n "$default" ]; then
read -p "$(echo -e "${YELLOW}🔧 ${prompt} [${default}]: ${NC}")" value
value=${value:-$default}
else
read -p "$(echo -e "${YELLOW}🔧 ${prompt}: ${NC}")" value
fi
if [ -z "$validator" ] || $validator "$value"; then
echo "$value"
return 0
else
print_status "ERROR" "Invalid input. Please try again."
fi
done
}
# Function to show deployment type info
show_deployment_info() {
local type=$1
case $type in
"local")
print_status "INFO" "Local Development Setup:"
echo " - Server accessible only on this machine"
echo " - Server address: 127.0.0.1"
echo " - Storage: ./storage (local directory)"
echo " - Perfect for development and testing"
;;
"lan")
print_status "INFO" "LAN Server Setup:"
echo " - Server accessible on local network"
echo " - Requires your machine's LAN IP address"
echo " - Storage: configurable"
echo " - Good for home networks or office environments"
;;
"public")
print_status "INFO" "Public Server Setup:"
echo " - Server accessible from the internet"
echo " - Requires public IP or domain name"
echo " - Requires port forwarding configuration"
echo " - Storage: recommended to use persistent storage"
;;
esac
echo ""
}
# Main configuration function
main() {
print_status "HEADER" "AZEROTHCORE SERVER SETUP"
echo "This script will help you configure your AzerothCore server for deployment."
echo "It will create customized environment files based on your configuration."
echo ""
# Check if we're in the right directory
if [ ! -f "docker-compose-azerothcore-database.env" ] || [ ! -f "docker-compose-azerothcore-services.env" ]; then
print_status "ERROR" "Environment files not found. Please run this script from the acore-compose directory."
exit 1
fi
# Deployment type selection
print_status "HEADER" "DEPLOYMENT TYPE"
echo "Select your deployment type:"
echo "1) Local Development (single machine)"
echo "2) LAN Server (local network)"
echo "3) Public Server (internet accessible)"
echo ""
while true; do
read -p "$(echo -e "${YELLOW}🔧 Select deployment type [1-3]: ${NC}")" deploy_type
case $deploy_type in
1)
DEPLOYMENT_TYPE="local"
show_deployment_info "local"
break
;;
2)
DEPLOYMENT_TYPE="lan"
show_deployment_info "lan"
break
;;
3)
DEPLOYMENT_TYPE="public"
show_deployment_info "public"
break
;;
*)
print_status "ERROR" "Please select 1, 2, or 3"
;;
esac
done
# Server configuration
print_status "HEADER" "SERVER CONFIGURATION"
# Server address configuration
if [ "$DEPLOYMENT_TYPE" = "local" ]; then
SERVER_ADDRESS="127.0.0.1"
print_status "INFO" "Server address set to: $SERVER_ADDRESS"
else
if [ "$DEPLOYMENT_TYPE" = "lan" ]; then
# Try to detect LAN IP
LAN_IP=$(ip route get 1.1.1.1 2>/dev/null | head -1 | awk '{print $7}' || echo "")
if [ -n "$LAN_IP" ]; then
SERVER_ADDRESS=$(prompt_input "Enter server IP address" "$LAN_IP" validate_ip)
else
SERVER_ADDRESS=$(prompt_input "Enter server IP address (e.g., 192.168.1.100)" "" validate_ip)
fi
else
# Public server
SERVER_ADDRESS=$(prompt_input "Enter server address (IP or domain)" "your-domain.com" "")
fi
fi
# Port configuration
REALM_PORT=$(prompt_input "Enter client connection port" "8215" validate_port)
AUTH_EXTERNAL_PORT=$(prompt_input "Enter auth server port" "3784" validate_port)
SOAP_EXTERNAL_PORT=$(prompt_input "Enter SOAP API port" "7778" validate_port)
MYSQL_EXTERNAL_PORT=$(prompt_input "Enter MySQL external port" "64306" validate_port)
# Database configuration
print_status "HEADER" "DATABASE CONFIGURATION"
MYSQL_ROOT_PASSWORD=$(prompt_input "Enter MySQL root password" "azerothcore123" "")
# Storage configuration
print_status "HEADER" "STORAGE CONFIGURATION"
if [ "$DEPLOYMENT_TYPE" = "local" ]; then
STORAGE_ROOT="./storage"
print_status "INFO" "Storage path set to: $STORAGE_ROOT"
else
echo "Storage options:"
echo "1) ./storage (local directory)"
echo "2) /nfs/containers (NFS mount)"
echo "3) Custom path"
while true; do
read -p "$(echo -e "${YELLOW}🔧 Select storage option [1-3]: ${NC}")" storage_option
case $storage_option in
1)
STORAGE_ROOT="./storage"
break
;;
2)
STORAGE_ROOT="/nfs/containers"
break
;;
3)
STORAGE_ROOT=$(prompt_input "Enter custom storage path" "/mnt/azerothcore-data" "")
break
;;
*)
print_status "ERROR" "Please select 1, 2, or 3"
;;
esac
done
fi
# Backup configuration
print_status "HEADER" "BACKUP CONFIGURATION"
BACKUP_RETENTION_DAYS=$(prompt_input "Days to keep daily backups" "3" validate_number)
BACKUP_RETENTION_HOURS=$(prompt_input "Hours to keep hourly backups" "6" validate_number)
BACKUP_DAILY_TIME=$(prompt_input "Daily backup time (24h format, e.g., 09 for 9 AM)" "09" "")
# Optional: Timezone
TIMEZONE=$(prompt_input "Server timezone" "UTC" "")
# Summary
print_status "HEADER" "CONFIGURATION SUMMARY"
echo "Deployment Type: $DEPLOYMENT_TYPE"
echo "Server Address: $SERVER_ADDRESS"
echo "Client Port: $REALM_PORT"
echo "Auth Port: $AUTH_EXTERNAL_PORT"
echo "SOAP Port: $SOAP_EXTERNAL_PORT"
echo "MySQL Port: $MYSQL_EXTERNAL_PORT"
echo "Storage Path: $STORAGE_ROOT"
echo "Daily Backup Time: ${BACKUP_DAILY_TIME}:00 UTC"
echo "Backup Retention: ${BACKUP_RETENTION_DAYS} days, ${BACKUP_RETENTION_HOURS} hours"
echo ""
# Confirmation
while true; do
read -p "$(echo -e "${YELLOW}🔧 Proceed with this configuration? [y/N]: ${NC}")" confirm
case $confirm in
[Yy]*)
break
;;
[Nn]*|"")
print_status "INFO" "Configuration cancelled"
exit 0
;;
*)
print_status "ERROR" "Please answer y or n"
;;
esac
done
# Create custom environment files
print_status "HEADER" "CREATING ENVIRONMENT FILES"
# Create custom database environment file
print_status "INFO" "Creating custom database environment file..."
cp docker-compose-azerothcore-database.env docker-compose-azerothcore-database-custom.env
# Substitute values in database env file using a different delimiter
sed -i "s#STORAGE_ROOT=.*#STORAGE_ROOT=${STORAGE_ROOT}#" docker-compose-azerothcore-database-custom.env
sed -i "s#MYSQL_ROOT_PASSWORD=.*#MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}#" docker-compose-azerothcore-database-custom.env
sed -i "s#MYSQL_EXTERNAL_PORT=.*#MYSQL_EXTERNAL_PORT=${MYSQL_EXTERNAL_PORT}#" docker-compose-azerothcore-database-custom.env
sed -i "s#BACKUP_RETENTION_DAYS=.*#BACKUP_RETENTION_DAYS=${BACKUP_RETENTION_DAYS}#" docker-compose-azerothcore-database-custom.env
sed -i "s#BACKUP_RETENTION_HOURS=.*#BACKUP_RETENTION_HOURS=${BACKUP_RETENTION_HOURS}#" docker-compose-azerothcore-database-custom.env
sed -i "s#BACKUP_DAILY_TIME=.*#BACKUP_DAILY_TIME=${BACKUP_DAILY_TIME}#" docker-compose-azerothcore-database-custom.env
sed -i "s#TZ=.*#TZ=${TIMEZONE}#" docker-compose-azerothcore-database-custom.env
# Create custom services environment file
print_status "INFO" "Creating custom services environment file..."
cp docker-compose-azerothcore-services.env docker-compose-azerothcore-services-custom.env
# Substitute values in services env file using a different delimiter
sed -i "s#STORAGE_ROOT=.*#STORAGE_ROOT=${STORAGE_ROOT}#" docker-compose-azerothcore-services-custom.env
sed -i "s#MYSQL_ROOT_PASSWORD=.*#MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}#" docker-compose-azerothcore-services-custom.env
sed -i "s#AUTH_EXTERNAL_PORT=.*#AUTH_EXTERNAL_PORT=${AUTH_EXTERNAL_PORT}#" docker-compose-azerothcore-services-custom.env
sed -i "s#WORLD_EXTERNAL_PORT=.*#WORLD_EXTERNAL_PORT=${REALM_PORT}#" docker-compose-azerothcore-services-custom.env
sed -i "s#SOAP_EXTERNAL_PORT=.*#SOAP_EXTERNAL_PORT=${SOAP_EXTERNAL_PORT}#" docker-compose-azerothcore-services-custom.env
sed -i "s#SERVER_ADDRESS=.*#SERVER_ADDRESS=${SERVER_ADDRESS}#" docker-compose-azerothcore-services-custom.env
sed -i "s#REALM_PORT=.*#REALM_PORT=${REALM_PORT}#" docker-compose-azerothcore-services-custom.env
# Create custom tools environment file
print_status "INFO" "Creating custom tools environment file..."
cp docker-compose-azerothcore-tools.env docker-compose-azerothcore-tools-custom.env
# Substitute values in tools env file using a different delimiter
sed -i "s#STORAGE_ROOT=.*#STORAGE_ROOT=${STORAGE_ROOT}#" docker-compose-azerothcore-tools-custom.env
print_status "SUCCESS" "Custom environment files created:"
echo " - docker-compose-azerothcore-database-custom.env"
echo " - docker-compose-azerothcore-services-custom.env"
echo " - docker-compose-azerothcore-tools-custom.env"
echo ""
# Deployment instructions
print_status "HEADER" "DEPLOYMENT INSTRUCTIONS"
echo "To deploy your server with the custom configuration:"
echo ""
echo "1. Deploy database layer:"
echo " docker compose --env-file docker-compose-azerothcore-database-custom.env -f docker-compose-azerothcore-database.yml up -d"
echo ""
echo "2. Deploy services layer:"
echo " docker compose --env-file docker-compose-azerothcore-services-custom.env -f docker-compose-azerothcore-services.yml up -d"
echo ""
echo "3. Deploy tools layer (optional):"
echo " docker compose --env-file docker-compose-azerothcore-tools-custom.env -f docker-compose-azerothcore-tools.yml up -d"
echo ""
if [ "$DEPLOYMENT_TYPE" != "local" ]; then
print_status "WARNING" "Additional configuration required for ${DEPLOYMENT_TYPE} deployment:"
echo " - Ensure firewall allows traffic on configured ports"
if [ "$DEPLOYMENT_TYPE" = "public" ]; then
echo " - Configure port forwarding on your router:"
echo " - ${REALM_PORT} (client connections)"
echo " - ${AUTH_EXTERNAL_PORT} (auth server)"
echo " - ${SOAP_EXTERNAL_PORT} (SOAP API)"
fi
echo ""
fi
# Client configuration
print_status "HEADER" "CLIENT CONFIGURATION"
echo "Configure your WoW 3.3.5a client by editing realmlist.wtf:"
if [ "$REALM_PORT" = "8215" ]; then
echo " set realmlist ${SERVER_ADDRESS}"
else
echo " set realmlist ${SERVER_ADDRESS} ${REALM_PORT}"
fi
echo ""
print_status "SUCCESS" "🎉 Server setup complete!"
print_status "INFO" "Your custom environment files are ready for deployment."
}
# Run main function
main "$@"