Files
AzerothCore-RealmMaster/scripts/setup-server.sh
2025-10-03 17:07:45 -04:00

359 lines
13 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "$@"