mirror of
https://github.com/uprightbass360/AzerothCore-RealmMaster.git
synced 2026-01-13 00:58:34 +00:00
Enhance status dashboard: atomic refresh, user metrics, default watch mode
This commit is contained in:
@@ -639,6 +639,12 @@ services:
|
|||||||
MAX_EXECUTION_TIME: ${PMA_MAX_EXECUTION_TIME:-600}
|
MAX_EXECUTION_TIME: ${PMA_MAX_EXECUTION_TIME:-600}
|
||||||
ports:
|
ports:
|
||||||
- "${PMA_EXTERNAL_PORT:-8081}:80"
|
- "${PMA_EXTERNAL_PORT:-8081}:80"
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "sh", "-c", "curl -fsS http://localhost:80/ || exit 1"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 40s
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
networks:
|
networks:
|
||||||
- azerothcore
|
- azerothcore
|
||||||
|
|||||||
76
deploy.sh
76
deploy.sh
@@ -148,6 +148,61 @@ modules_need_rebuild(){
|
|||||||
[[ -f "$sentinel" ]]
|
[[ -f "$sentinel" ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
determine_profile(){
|
||||||
|
if [ -n "$TARGET_PROFILE" ]; then
|
||||||
|
echo "$TARGET_PROFILE"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local module_playerbots
|
||||||
|
local playerbot_enabled
|
||||||
|
module_playerbots="$(read_env MODULE_PLAYERBOTS "0")"
|
||||||
|
playerbot_enabled="$(read_env PLAYERBOT_ENABLED "0")"
|
||||||
|
if [ "$module_playerbots" = "1" ] || [ "$playerbot_enabled" = "1" ]; then
|
||||||
|
echo "playerbots"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local compile_vars=(
|
||||||
|
MODULE_AOE_LOOT
|
||||||
|
MODULE_LEARN_SPELLS
|
||||||
|
MODULE_FIREWORKS
|
||||||
|
MODULE_INDIVIDUAL_PROGRESSION
|
||||||
|
MODULE_AHBOT
|
||||||
|
MODULE_AUTOBALANCE
|
||||||
|
MODULE_TRANSMOG
|
||||||
|
MODULE_NPC_BUFFER
|
||||||
|
MODULE_DYNAMIC_XP
|
||||||
|
MODULE_SOLO_LFG
|
||||||
|
MODULE_1V1_ARENA
|
||||||
|
MODULE_PHASED_DUELS
|
||||||
|
MODULE_BREAKING_NEWS
|
||||||
|
MODULE_BOSS_ANNOUNCER
|
||||||
|
MODULE_ACCOUNT_ACHIEVEMENTS
|
||||||
|
MODULE_AUTO_REVIVE
|
||||||
|
MODULE_GAIN_HONOR_GUARD
|
||||||
|
MODULE_TIME_IS_TIME
|
||||||
|
MODULE_POCKET_PORTAL
|
||||||
|
MODULE_RANDOM_ENCHANTS
|
||||||
|
MODULE_SOLOCRAFT
|
||||||
|
MODULE_PVP_TITLES
|
||||||
|
MODULE_NPC_BEASTMASTER
|
||||||
|
MODULE_NPC_ENCHANTER
|
||||||
|
MODULE_INSTANCE_RESET
|
||||||
|
MODULE_LEVEL_GRANT
|
||||||
|
)
|
||||||
|
|
||||||
|
local var
|
||||||
|
for var in "${compile_vars[@]}"; do
|
||||||
|
if [ "$(read_env "$var" "0")" = "1" ]; then
|
||||||
|
echo "modules"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "standard"
|
||||||
|
}
|
||||||
|
|
||||||
rebuild_source(){
|
rebuild_source(){
|
||||||
local src_dir="$1"
|
local src_dir="$1"
|
||||||
local compose_file="$src_dir/docker-compose.yml"
|
local compose_file="$src_dir/docker-compose.yml"
|
||||||
@@ -171,16 +226,6 @@ rebuild_source(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
tag_module_images(){
|
tag_module_images(){
|
||||||
local module_playerbots
|
|
||||||
local playerbot_enabled
|
|
||||||
module_playerbots="$(read_env MODULE_PLAYERBOTS "0")"
|
|
||||||
playerbot_enabled="$(read_env PLAYERBOT_ENABLED "0")"
|
|
||||||
|
|
||||||
if [ "$module_playerbots" = "1" ] || [ "$playerbot_enabled" = "1" ]; then
|
|
||||||
info "Playerbot mode detected; skipping module image tagging."
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
local source_world="acore/ac-wotlk-worldserver:master"
|
local source_world="acore/ac-wotlk-worldserver:master"
|
||||||
local source_auth="acore/ac-wotlk-authserver:master"
|
local source_auth="acore/ac-wotlk-authserver:master"
|
||||||
local target_world
|
local target_world
|
||||||
@@ -214,16 +259,21 @@ stage_runtime(){
|
|||||||
|
|
||||||
tail_world_logs(){
|
tail_world_logs(){
|
||||||
info "Tailing worldserver logs (Ctrl+C to stop)"
|
info "Tailing worldserver logs (Ctrl+C to stop)"
|
||||||
compose logs -f ac-worldserver
|
if ! docker logs --follow --tail "${WORLD_LOG_TAIL:-200}" ac-worldserver; then
|
||||||
|
warn "Worldserver logs unavailable; container may not be running."
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
main(){
|
main(){
|
||||||
show_deployment_header
|
show_deployment_header
|
||||||
|
|
||||||
local src_dir
|
local src_dir
|
||||||
|
local resolved_profile
|
||||||
show_step 1 5 "Setting up source repository"
|
show_step 1 5 "Setting up source repository"
|
||||||
src_dir="$(ensure_source_repo)"
|
src_dir="$(ensure_source_repo)"
|
||||||
|
|
||||||
|
resolved_profile="$(determine_profile)"
|
||||||
|
|
||||||
if [ "$KEEP_RUNNING" -ne 1 ]; then
|
if [ "$KEEP_RUNNING" -ne 1 ]; then
|
||||||
show_step 2 5 "Stopping runtime stack"
|
show_step 2 5 "Stopping runtime stack"
|
||||||
stop_runtime_stack
|
stop_runtime_stack
|
||||||
@@ -238,10 +288,12 @@ main(){
|
|||||||
else
|
else
|
||||||
show_step 4 5 "Building realm with modules (this may take 15-45 minutes)"
|
show_step 4 5 "Building realm with modules (this may take 15-45 minutes)"
|
||||||
rebuild_source "$src_dir"
|
rebuild_source "$src_dir"
|
||||||
tag_module_images
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
info "No module rebuild required."
|
info "No module rebuild required."
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$resolved_profile" = "modules" ]; then
|
||||||
tag_module_images
|
tag_module_images
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
58
status.sh
58
status.sh
@@ -11,13 +11,14 @@ cd "$PROJECT_DIR"
|
|||||||
|
|
||||||
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; BLUE='\033[0;34m'; NC='\033[0m'
|
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; BLUE='\033[0;34m'; NC='\033[0m'
|
||||||
|
|
||||||
WATCH_MODE=false
|
WATCH_MODE=true
|
||||||
LOG_LINES=5
|
LOG_LINES=5
|
||||||
SHOW_LOGS=false
|
SHOW_LOGS=false
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--watch|-w) WATCH_MODE=true; shift;;
|
--watch|-w) WATCH_MODE=true; shift;;
|
||||||
|
--once) WATCH_MODE=false; shift;;
|
||||||
--logs|-l) SHOW_LOGS=true; shift;;
|
--logs|-l) SHOW_LOGS=true; shift;;
|
||||||
--lines) LOG_LINES="$2"; shift 2;;
|
--lines) LOG_LINES="$2"; shift 2;;
|
||||||
-h|--help)
|
-h|--help)
|
||||||
@@ -25,7 +26,8 @@ while [[ $# -gt 0 ]]; do
|
|||||||
ac-compose realm status
|
ac-compose realm status
|
||||||
|
|
||||||
Usage: $0 [options]
|
Usage: $0 [options]
|
||||||
-w, --watch Continuously refresh every 3s
|
-w, --watch Continuously refresh every 3s (default)
|
||||||
|
--once Show a single snapshot then exit
|
||||||
-l, --logs Show trailing logs for each service
|
-l, --logs Show trailing logs for each service
|
||||||
--lines N Number of log lines when --logs is used (default 5)
|
--lines N Number of log lines when --logs is used (default 5)
|
||||||
EOF
|
EOF
|
||||||
@@ -195,6 +197,41 @@ module_summary(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
user_stats(){
|
||||||
|
if ! container_running "ac-mysql"; then
|
||||||
|
printf "USERS: %sDatabase offline%s\n" "$RED" "$NC"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local mysql_pw db_auth db_characters
|
||||||
|
mysql_pw="$(read_env MYSQL_ROOT_PASSWORD azerothcore123)"
|
||||||
|
db_auth="$(read_env DB_AUTH_NAME acore_auth)"
|
||||||
|
db_characters="$(read_env DB_CHARACTERS_NAME acore_characters)"
|
||||||
|
|
||||||
|
local exec_mysql
|
||||||
|
exec_mysql(){
|
||||||
|
local database="$1" query="$2"
|
||||||
|
docker exec ac-mysql mysql -N -B -u root -p"${mysql_pw}" "$database" -e "$query" 2>/dev/null | tail -n1
|
||||||
|
}
|
||||||
|
|
||||||
|
local account_total account_online character_total last_week
|
||||||
|
account_total="$(exec_mysql "$db_auth" "SELECT COUNT(*) FROM account;")"
|
||||||
|
account_online="$(exec_mysql "$db_auth" "SELECT COUNT(*) FROM account WHERE online = 1;")"
|
||||||
|
character_total="$(exec_mysql "$db_characters" "SELECT COUNT(*) FROM characters;")"
|
||||||
|
last_week="$(exec_mysql "$db_auth" "SELECT COUNT(*) FROM account WHERE last_login >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 7 DAY);")"
|
||||||
|
|
||||||
|
[[ -z "$account_total" ]] && account_total="0"
|
||||||
|
[[ -z "$account_online" ]] && account_online="0"
|
||||||
|
[[ -z "$character_total" ]] && character_total="0"
|
||||||
|
[[ -z "$last_week" ]] && last_week="0"
|
||||||
|
|
||||||
|
printf "USERS: Accounts %b%s%b | Online %b%s%b | Characters %b%s%b | Active 7d %b%s%b\n" \
|
||||||
|
"$GREEN" "$account_total" "$NC" \
|
||||||
|
"$YELLOW" "$account_online" "$NC" \
|
||||||
|
"$CYAN" "$character_total" "$NC" \
|
||||||
|
"$BLUE" "$last_week" "$NC"
|
||||||
|
}
|
||||||
|
|
||||||
ports_summary(){
|
ports_summary(){
|
||||||
local names=("Auth" "World" "SOAP" "MySQL" "phpMyAdmin" "Keira3")
|
local names=("Auth" "World" "SOAP" "MySQL" "phpMyAdmin" "Keira3")
|
||||||
local ports=("$AUTH_PORT" "$WORLD_PORT" "$SOAP_PORT" "$MYSQL_PORT" "$PMA_PORT" "$KEIRA_PORT")
|
local ports=("$AUTH_PORT" "$WORLD_PORT" "$SOAP_PORT" "$MYSQL_PORT" "$PMA_PORT" "$KEIRA_PORT")
|
||||||
@@ -223,8 +260,7 @@ show_realm_status_header(){
|
|||||||
echo -e "${BLUE}═══════════════════════════${NC}"
|
echo -e "${BLUE}═══════════════════════════${NC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
print_status(){
|
render_snapshot(){
|
||||||
clear 2>/dev/null || printf '\033[2J\033[H'
|
|
||||||
show_realm_status_header
|
show_realm_status_header
|
||||||
printf "\nTIME %s PROJECT %s\n\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$PROJECT_NAME"
|
printf "\nTIME %s PROJECT %s\n\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$PROJECT_NAME"
|
||||||
printf "%-20s %-28s %s\n" "SERVICE" "STATE" "IMAGE"
|
printf "%-20s %-28s %s\n" "SERVICE" "STATE" "IMAGE"
|
||||||
@@ -242,16 +278,26 @@ print_status(){
|
|||||||
print_service ac-keira3 "Keira3"
|
print_service ac-keira3 "Keira3"
|
||||||
echo ""
|
echo ""
|
||||||
module_summary
|
module_summary
|
||||||
|
user_stats
|
||||||
echo ""
|
echo ""
|
||||||
echo "$(ports_summary)"
|
echo "$(ports_summary)"
|
||||||
echo "$(network_summary)"
|
echo "$(network_summary)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
display_snapshot(){
|
||||||
|
local tmp
|
||||||
|
tmp="$(mktemp)"
|
||||||
|
render_snapshot >"$tmp"
|
||||||
|
clear 2>/dev/null || printf '\033[2J\033[H'
|
||||||
|
cat "$tmp"
|
||||||
|
rm -f "$tmp"
|
||||||
|
}
|
||||||
|
|
||||||
if [ "$WATCH_MODE" = true ]; then
|
if [ "$WATCH_MODE" = true ]; then
|
||||||
while true; do
|
while true; do
|
||||||
print_status
|
display_snapshot
|
||||||
sleep 3
|
sleep 3
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
print_status
|
display_snapshot
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user