Installing Modpacks
Installing Modpacks
Complete guide to the 8-step installation process, egg switching, backup creation, file preservation, config merging, direct install, and all possible errors.
Before You Install
Installation Type Detection
The plugin reads .installed_modpack.json from the server root to determine the installation type:
| Type | Condition | Emoji | What Happens |
|---|---|---|---|
| Fresh | No tracking file found | 🟢 | Clean install — minimal cleanup |
| Update | Same modpack, different version | 🟠 | Choice: keep or delete configs |
| Change | Different modpack ID | 🔴 | Full cleanup + fresh install |
| Reinstall | Same modpack + same version | 🔵 | Reinstall current version |
Tracking File Structure
.installed_modpack.json requires 6 fields:
{
"provider": "modrinth",
"modpack_id": "abc123",
"modpack_name": "Create: Above and Beyond",
"version_id": "xyz789",
"version_name": "1.0.0",
"installed_at": "2024-01-01T12:00:00.000Z"
}
If any field is missing, the tracking file is considered invalid → treated as Fresh install.
Tracking File Reading
The plugin uses multiple DaemonFileRepository methods to read the file, with fallbacks:
getContent()→ primary methodgetFileContents()→ fallback- Additional API methods → further fallbacks
The 8-Step Installation Process
Step 1: Preserve (💾)
Important files are saved to memory before any deletion:
Root files preserved:
server.propertieseula.txtops.jsonbanned-players.jsonbanned-ips.jsonwhitelist.jsonusercache.json
Directories preserved (recursive):
/config/— Mod configuration files/plugins/— Plugin JARs and configs
Log: "[Modpack] Files preserved successfully"
Step 2: Backup (📦)
An automatic backup is created with a German-language name based on the installation type:
| Type | Example Backup Name |
|---|---|
| Fresh | "Modpack-Erstinstallation" |
| Update | "Modpack-Update" |
| Change | "Modpack-Wechsel" |
| Reinstall | "Modpack-Neuinstallation" |
- Backup count is managed — oldest deleted when limit reached
- Log: "[Modpack] Backup created" with backup name and server UUID
- On failure: Log error "[Modpack] Failed to create backup" — installation continues
Step 3: Delete (🗑️)
All server files are deleted except protected directories:
Protected (never deleted):
worlds— World dataplugins— Plugin directorylogs— Server logs
Log: "[Modpack] Files deleted successfully" On failure: Log error "[Modpack] Failed to delete server files"
Step 4: Download (⬇️)
- Server is killed (stopped forcefully)
- Egg switched to "Minecraft Modpack Installer"
- Variables set:
MODPACK_PROVIDER,MODPACK_ID,MODPACK_VERSION_ID - Server reinstalled — triggers the download
- Wait for download — max 300 seconds timeout
Log: "[Modpack] Switched to installer egg" Timeout warning: "[Modpack] Download timeout" with elapsed and max_wait
Step 5: Extract (📦→📂)
After download completes, extraction is monitored:
- File stability monitoring: Checks file sizes repeatedly
- 3 consecutive stable checks = decompression complete
- Dynamic timeout based on file stability
Log/timeout: "[Modpack] Decompression timeout" if stability never reached
Step 6: Restore (♻️)
Preserved files are restored to the server:
- Root files restored to their original locations
/config/and/plugins/conditionally restored:- If Update (keep configs): Skip /config/ and /plugins/ (they'll be merged in Step 7)
- If Change/Fresh/Update (delete): Restore everything
Log on failure: "[Modpack] Failed to restore important files"
Step 7: Merge (🔀)
Config files are intelligently merged, preserving your custom values while incorporating new structure:
Wait: Up to 45 seconds for mods/ and config/ directories to appear after extraction.
Config Merge Strategies
| Format | Extensions | Strategy |
|---|---|---|
| JSON | .json |
Recursive merge: new structure + old values |
| YAML | .yml, .yaml |
Key-level merge preserving comments |
| Properties | .properties, .cfg |
Key=value merge |
| TOML | .toml |
Section-based merge with header/comment preservation |
Log success: "[Modpack] Config file merged successfully" with file, old_size, merged_size Log warning: "[Modpack] Could not merge config file" with file and error
Plugin Config Merging
After root config merge, the plugin also merges /plugins/PluginName/ subdirectories:
- Scans each plugin's config directory
- Merges individual config files using the same format strategies
- Skips files where old or new content is empty
- Log: "[Modpack] Plugin config file merged successfully"
Step 8: Finalize (✅)
- Egg switched back to "Minecraft Modpack Runtime"
- Tracking file saved:
.installed_modpack.jsonwith all 6 fields - Installation complete
Log: "[Modpack] Switched to runtime egg" Log: "[Modpack] Installation completed successfully" with server UUID and elapsed time
Installation Actions Matrix
| Action | Fresh | Update (delete) | Update (keep) | Change |
|---|---|---|---|---|
| Create backup | ✓ | ✓ | ✓ | ✓ |
| Delete mods | — | ✓ | ✓ | ✓ |
| Delete configs | — | ✓ | — | ✓ |
| Merge mod configs | — | — | ✓ | — |
| Restore important files | — | ✓ | ✓ | ✓ |
Cross-Plugin Cleanup
When a modpack is installed or changed, the plugin automatically cleans up data from other plugins:
Game Mods Cleanup
- Dynamically resolves
Eranio\GameMods\Services\SafeCacheServiceandCacheKeyService - Clears
server_installed_modstable for the server - Flushes Game Mods cache
- Log: "Cleaned database mods for server {uuid}"
- Warning if class not found: "GameMods classes not found. Skipping cache cleanup."
Minecraft Plugins Cleanup
- Dynamically resolves
Eranio\MinecraftPlugins\Services\SafeCacheServiceandCacheKeyService - Clears
minecraft_installed_pluginstable for the server - Flushes Minecraft Plugins cache
- Log: "Cleaned database plugins for server {uuid}"
- Warning if class not found: "MinecraftPlugins classes not found. Skipping cache cleanup."
Table Not Found Handling
If a table doesn't exist (plugin not installed): "Table '{table}' does not exist. Skipping cleanup."
Post-Response Execution
The installation runs after the HTTP response via app()->terminating() callback. This prevents Livewire serialization errors and allows the progress widget to display immediately.
Progress Widget
During installation, a custom progress widget shows all 8 steps:
| Feature | Detail |
|---|---|
| Poll interval | 2 seconds |
| Step indicators | Arrow-shaped with clip-path CSS |
| Mobile responsive | Custom CSS for mobile visibility |
| Auto-redirect | Uses <img onerror> hack to trigger JavaScript redirect when complete |
| Session tracking | Delete step tracked in session to prevent double reload |
| Cache | Progress stored in cache with 10-minute TTL |
Translation Keys for Steps
| Step | Key |
|---|---|
| 1 | modpacks.ui.steps.preserve |
| 2 | modpacks.ui.steps.backup |
| 3 | modpacks.ui.steps.delete |
| 4 | modpacks.ui.steps.download |
| 5 | modpacks.ui.steps.extract |
| 6 | modpacks.ui.steps.restore |
| 7 | modpacks.ui.steps.merge |
| 8 | modpacks.ui.steps.finalize |
Complete Error Reference
Installation Start
| Notification | Cause |
|---|---|
| "Modpack installation started" | Success — installation beginning in background |
| "Modpack installation failed" | Could not start — check logs |
Backup Errors
| Log | Cause | Impact |
|---|---|---|
| "[Modpack] Failed to create backup" | Disk full, permissions, daemon error | Installation continues without backup |
Download Errors
| Log | Cause | Solution |
|---|---|---|
| "[Modpack] Download timeout" | 300s exceeded | Increase timeout, check server network, try smaller modpack |
| Egg switch failed | Installer egg missing | Check egg seeder ran successfully |
Extraction Errors
| Log | Cause | Solution |
|---|---|---|
| "[Modpack] Decompression timeout" | File stability never reached | Disk full, corrupted download, very large modpack |
Restore Errors
| Log | Cause | Solution |
|---|---|---|
| "[Modpack] Failed to restore important files" | File write failure | Check daemon permissions, disk space |
Merge Errors
| Log | Cause | Solution |
|---|---|---|
| "[Modpack] Could not merge config file" | Invalid format, parse error | Check config file syntax, merge manually |
| "[Modpack] Could not merge plugin config" | Plugin config corrupted | Delete and let plugin regenerate |
| Config dirs don't appear within 45s | Extraction incomplete | Check Step 5 completed, disk space |
Cross-Plugin Cleanup Errors
| Log | Cause | Impact |
|---|---|---|
| "Failed to clean database plugins or cache" | Plugin table missing or db error | Non-critical — old data may remain |
| "Failed to clean database mods or cache" | Game Mods not installed | Non-critical |
File Operation Errors
moveFileOrDirectory()— tries 5 rename methods with fallbackswriteFileToRepository()— tries 3 signature attempts for daemon compatibilityreadFileFromDaemon()— primary method + API fallback