This commit introduces major enhancements to the module installation system, database management, and configuration handling for AzerothCore deployments. ## Module System Improvements ### Module SQL Staging & Installation - Refactor module SQL staging to properly handle AzerothCore's sql/ directory structure - Fix SQL staging path to use correct AzerothCore format (sql/custom/db_*/*) - Implement conditional module database importing based on enabled modules - Add support for both cpp-modules and lua-scripts module types - Handle rsync exit code 23 (permission warnings) gracefully during deployment ### Module Manifest & Automation - Add automated module manifest generation via GitHub Actions workflow - Implement Python-based module manifest updater with comprehensive validation - Add module dependency tracking and SQL file discovery - Support for blocked modules and module metadata management ## Database Management Enhancements ### Database Import System - Add db-guard container for continuous database health monitoring and verification - Implement conditional database import that skips when databases are current - Add backup restoration and SQL staging coordination - Support for Playerbots database (4th database) in all import operations - Add comprehensive database health checking and status reporting ### Database Configuration - Implement 10 new dbimport.conf settings from environment variables: - Database.Reconnect.Seconds/Attempts for connection reliability - Updates.AllowedModules for module auto-update control - Updates.Redundancy for data integrity checks - Worker/Synch thread settings for all three core databases - Auto-apply dbimport.conf settings via auto-post-install.sh - Add environment variable injection for db-import and db-guard containers ### Backup & Recovery - Fix backup scheduler to prevent immediate execution on container startup - Add backup status monitoring script with detailed reporting - Implement backup import/export utilities - Add database verification scripts for SQL update tracking ## User Import Directory - Add new import/ directory for user-provided database files and configurations - Support for custom SQL files, configuration overrides, and example templates - Automatic import of user-provided databases and configs during initialization - Documentation and examples for custom database imports ## Configuration & Environment - Eliminate CLIENT_DATA_VERSION warning by adding default value syntax - Improve CLIENT_DATA_VERSION documentation in .env.template - Add comprehensive database import settings to .env and .env.template - Update setup.sh to handle new configuration variables with proper defaults ## Monitoring & Debugging - Add status dashboard with Go-based terminal UI (statusdash.go) - Implement JSON status output (statusjson.sh) for programmatic access - Add comprehensive database health check script - Add repair-storage-permissions.sh utility for permission issues ## Testing & Documentation - Add Phase 1 integration test suite for module installation verification - Add comprehensive documentation for: - Database management (DATABASE_MANAGEMENT.md) - Module SQL analysis (AZEROTHCORE_MODULE_SQL_ANALYSIS.md) - Implementation mapping (IMPLEMENTATION_MAP.md) - SQL staging comparison and path coverage - Module assets and DBC file requirements - Update SCRIPTS.md, ADVANCED.md, and troubleshooting documentation - Update references from database-import/ to import/ directory ## Breaking Changes - Renamed database-import/ directory to import/ for clarity - Module SQL files now staged to AzerothCore-compatible paths - db-guard container now required for proper database lifecycle management ## Bug Fixes - Fix module SQL staging directory structure for AzerothCore compatibility - Handle rsync exit code 23 gracefully during deployments - Prevent backup from running immediately on container startup - Correct SQL staging paths for proper module installation
12 KiB
AzerothCore Module SQL Integration - Official Documentation Analysis
Date: 2025-11-16 Purpose: Compare official AzerothCore module documentation with our implementation
Official AzerothCore Module Installation Process
According to https://www.azerothcore.org/wiki/installing-a-module
Standard Installation Steps:
- Find Module - Browse AzerothCore Catalogue
- Clone/Download - Add module to
/modules/directory- ⚠️ Critical: Remove
-mastersuffix from directory name
- ⚠️ Critical: Remove
- Reconfigure CMake - Regenerate build files
- Verify module appears in CMake logs under "Modules configuration (static)"
- Recompile Core - Build with module included
- Automatic SQL Processing - "Your Worldserver will automatically run any SQL Queries provided by the Modules"
- Check README - Review for manual configuration steps
SQL Directory Structure Standards
Official Structure (from AzerothCore core)
data/sql/
├── create/ # Database create/drop files
├── base/ # Latest squashed update files
├── updates/ # Incremental update files
│ ├── db_world/
│ ├── db_characters/
│ └── db_auth/
└── custom/ # Custom user modifications
Module SQL Structure
According to documentation:
- Modules "can create base, updates and custom sql that will be automatically loaded in our db_assembler"
- Status: Documentation marked as "work in progress..."
- Reference: Check skeleton-module template for examples
Directory Naming Conventions
Research Findings
From GitHub PR #16157 (closed without merge):
Two competing conventions exist:
-
data/sql/db-world- Official standard (hyphen naming)- Used by: skeleton-module (recommended template)
- AzerothCore core uses:
data/sql/updates/db_world(underscore in core, hyphen in modules)
-
sql/world- Legacy convention (no db- prefix)- Used by: mod-eluna, mod-ah-bot, many older modules
- Not officially supported - PR to support this was closed
Community Decision: Favor standardization on data/sql/db-world over backward compatibility
DBUpdater Behavior
Automatic Updates
Configuration: worldserver.conf
AC_UPDATES_ENABLE_DATABASES = 7 # Enable all database autoupdates
How it works:
- Each database (auth, characters, world) has
version_db_xxxxtable - Tracks last applied update in format
YYYY_MM_DD_XX - Worldserver scans for new updates on startup
- Automatically applies SQL files in chronological order
File Naming Convention
Required format: YYYY_MM_DD_XX.sql
Examples:
2025_11_16_00.sql2025_11_16_01_module_name_description.sql
Critical Discovery: Module SQL Scanning
From our testing and official docs research:
AzerothCore's DBUpdater DOES NOT scan module directories automatically!
| What Official Docs Say | Reality |
|---|---|
| "Worldserver will automatically run any SQL Queries provided by the Modules" | ✅ TRUE - but only from CORE updates directory |
| SQL files in modules are "automatically loaded" | ❌ FALSE - modules must stage SQL to core directory |
The Truth:
- DBUpdater scans:
/azerothcore/data/sql/updates/db_world/(core directory) - DBUpdater does NOT scan:
/azerothcore/modules/*/data/sql/(module directories) - Modules compiled into the core have their SQL "baked in" during build
- Pre-built images require runtime staging (our discovery!)
Our Implementation vs. Official Process
Official Process (Build from Source)
1. Clone module to /modules/
2. Run CMake (detects module)
3. Compile core (module SQL gets integrated into build)
4. Deploy compiled binary
5. DBUpdater processes SQL from core updates directory
Result: Module SQL files get copied into core directory structure during build
Our Process (Pre-built Docker Images)
1. Download pre-built image (modules already compiled in)
2. Mount module repositories at runtime
3. ❌ Module SQL NOT in core updates directory
4. ✅ Runtime staging copies SQL to core updates directory
5. DBUpdater processes SQL from core updates directory
Result: Runtime staging replicates what build-time would have done
Gap Analysis
What We're Missing (vs. Standard Installation)
| Feature | Official Process | Our Implementation | Status |
|---|---|---|---|
| Module C++ code | Compiled into binary | ✅ Pre-compiled in image | ✅ COMPLETE |
| Module SQL discovery | CMake build process | ✅ Runtime scanning | ✅ COMPLETE |
| SQL file validation | Build warnings | ✅ Empty + security checks | ✅ ENHANCED |
| SQL naming format | Developer responsibility | ✅ Automatic timestamping | ✅ ENHANCED |
| SQL to core directory | Build-time copy | ✅ Runtime staging | ✅ COMPLETE |
| DBUpdater processing | Worldserver autoupdate | ✅ Worldserver autoupdate | ✅ COMPLETE |
| README instructions | Manual review needed | ⚠️ Not automated | ⚠️ GAP |
| Module .conf files | Manual deployment | ✅ Automated sync | ✅ COMPLETE |
Identified Gaps
1. README Processing
Official: "Always check the README file of the module to see if any manual steps are needed" Our Status: Manual - users must check README themselves Impact: LOW - Most modules don't require manual steps beyond SQL Recommendation: Document in user guide
2. Module Verification Command
Official: "Use .server debug command to verify all loaded modules"
Our Status: Not documented in deployment
Impact: LOW - Informational only
Recommendation: Add to post-deployment checklist
3. CMake Module Detection
Official: Check CMake logs for "Modules configuration (static)" Our Status: Not applicable - using pre-built images Impact: NONE - Only relevant for custom builds Recommendation: N/A
SQL Directory Scanning - Current vs. Potential
What We Currently Scan
for db_type in db-world db-characters db-auth; do
# Scans: /azerothcore/modules/*/data/sql/db-world/*.sql
# Direct directory only
done
Coverage:
- ✅ Standard location:
data/sql/db-world/ - ✅ Hyphen naming convention
- ❌ Underscore variant:
data/sql/db_world/ - ❌ Legacy locations:
sql/world/ - ❌ Subdirectories:
data/sql/base/,data/sql/updates/ - ❌ Custom directory:
data/sql/custom/
Should We Expand?
Arguments FOR expanding scan:
- Some modules use legacy
sql/world/structure - Some modules organize SQL in
base/andupdates/subdirectories - Better compatibility with diverse module authors
Arguments AGAINST expanding:
- Official AzerothCore rejected multi-path support (PR #16157 closed)
- Community prefers standardization over compatibility
- Adds complexity for edge cases
- May encourage non-standard module structure
Recommendation: Stay with current implementation
- Official standard is
data/sql/db-world/ - Non-compliant modules should be updated by authors
- Our implementation matches official recommendation
- Document expected structure in user guide
Module Configuration Files
Standard Module Configuration
Modules can include:
- Source:
conf/*.conf.distfiles - Deployment: Copied to worldserver config directory
- Our Implementation: ✅
manage-modules.shhandles this
Comparison with db_assembler
What is db_assembler?
Official tool for database setup during installation
- Runs during initial setup
- Processes base/ and updates/ directories
- Creates fresh database structure
Our Runtime Staging vs. db_assembler
| Feature | db_assembler | Our Runtime Staging |
|---|---|---|
| When runs | Installation time | Every deployment |
| Purpose | Initial DB setup | Module SQL updates |
| Processes | base/ + updates/ | Direct SQL files |
| Target | Fresh databases | Existing databases |
| Module awareness | Build-time | Runtime |
Key Difference: We handle the "module SQL updates" part that db_assembler doesn't cover for pre-built images
Validation Against Official Standards
✅ What We Do Correctly
- SQL File Naming: Automatic timestamp prefixing matches AzerothCore format
- Directory Structure: Scanning
data/sql/db-world/matches official standard - Database Types: Support db-world, db-characters, db-auth (official set)
- Autoupdate Integration: Files staged to location DBUpdater expects
- Module Prefix: Adding
MODULE_prefix prevents conflicts with core updates
✅ What We Do Better Than Standard
- SQL Validation: Empty file check + security scanning (not in standard process)
- Error Reporting: Detailed success/skip/fail counts
- Automatic Timestamping: No manual naming required
- Conflict Prevention: MODULE_ prefix ensures safe identification
⚠️ Potential Concerns
-
Multiple Deployments: Issue: Re-running deployment could create duplicate SQL files Mitigation: DBUpdater tracks applied updates in
version_db_xxxxtable Result: Duplicates are harmless - already-applied updates skipped -
Manual SQL Files: Issue: If user manually adds SQL to module directory Behavior: Will be staged on next deployment Result: Expected behavior - matches official "custom SQL" workflow
-
Module Updates: Issue: Git pull adds new SQL to module Behavior: New files staged on next deployment Result: Expected behavior - updates applied automatically
Missing Official Features
Not Implemented (Intentional)
- db_assembler integration - Not needed for pre-built images
- CMake module detection - Not applicable to Docker deployment
- Build-time SQL staging - Replaced by runtime staging
- Manual SQL execution - Replaced by DBUpdater autoupdate
Not Implemented (Gaps)
- README parsing - Manual review still required
- Module dependency checking - Not validated automatically
- SQL rollback support - No automatic downgrade path
- Version conflict detection - Relies on DBUpdater
Recommendations
Keep As-Is ✅
- Current directory scanning - Matches official standard
- Runtime staging approach - Necessary for pre-built images
- SQL validation - Better than standard
- Automatic timestamping - Convenience improvement
Document for Users 📝
- Expected module structure - Explain
data/sql/db-world/requirement - Deployment behavior - Clarify when SQL is staged and applied
- README review - Remind users to check module documentation
- Verification steps - Add
.server debugcommand to post-deploy checklist
Future Enhancements (Optional) 🔮
- README scanner - Parse common instruction formats
- SQL dependency detection - Warn about missing prerequisites
- Module health check - Verify SQL was applied successfully
- Staging log - Persistent record of staged files
Conclusion
Our Implementation is Sound ✅
Alignment with Official Process:
- ✅ Matches official SQL directory structure
- ✅ Integrates with official DBUpdater
- ✅ Follows official naming conventions
- ✅ Supports official database types
Advantages Over Standard Build Process:
- ✅ Works with pre-built Docker images
- ✅ Better SQL validation and security
- ✅ Automatic file naming
- ✅ Clear error reporting
No Critical Gaps Identified:
- All essential functionality present
- Missing features are either:
- Not applicable to Docker deployment
- Manual steps (README review)
- Nice-to-have enhancements
Validation Complete
Our runtime SQL staging implementation successfully replicates what the official build process does, while adding improvements for Docker-based deployments. No changes required to match official standards.