minecraft-server/docs/migrations/lands-to-landclaim.md
s8n-ru 0dad38e02e Initial commit: racked.ru Minecraft server config snapshot
Captures live config state of nullstone Purpur 1.21.11 server:
- docker-compose.yml (itzg/minecraft-server image, MODRINTH_PROJECTS + PLUGINS lists)
- All plugin configs under live-server/plugins/ (no DBs, no jars, no world data)
- Server core: bukkit.yml, spigot.yml, purpur.yml, paper-global.yml, paper-world-defaults.yml, server.properties

Excluded via .gitignore:
- World data (world/, world_nether/, world_the_end/, auth_limbo/)
- Sensitive: AuthMe DB (password hashes), Lands DB, CoreProtect DB, Essentials userdata
- Jars (auto-fetched), logs, caches, .paper-remapped
2026-04-30 18:33:38 +01:00

544 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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.

# Migration Plan: Lands v7.21.3 → LandClaimPlugin
**Target:** LandClaimPlugin (Modrinth, MIT, by AyoSynk)
**Date Planned:** [TBD - Player Agreement]
**Server:** Purpur 1.21.10 on nullstone (Debian 13)
**World:** Preserved intact. Only plugin data wiped.
**Grace Period:** 48 hours after migration
**Rollback Window:** 7 days (Lands DB archived)
---
## 0. Current State
### Lands v7.21.3 on Nullstone
- **JAR:** `Lands-7.21.3.jar` (2.9MB, paid plugin from IncrediblePlugins)
- **Database:** SQLite `database_v2.db` (168KB)
- **Cached players:** 43
- **Active lands (from event log):**
- `K'land` / `JellyLand` — block placements, deleted 2025-05-30 for INACTIVITY
- `Portal` — bank deposits (500 → 1000 → 2000), deleted 2025-09-11 for INACTIVITY
- `HighCaillou` — deposit 10
- `HIVE` — deposit 10,000
- `Headquarters` — recurring deposits (20 → 40 per cycle)
- `batcave` / `batcave1` — recurring deposits (10 per cycle)
- `MyLawn` — deposits
- `Jessie` — deleted 2025-12-09
- `TheArchitect` — deposits
- **Economy:** Lands Bank is active — players deposit money into land banks. Economy integration via Vault/EssentialsX.
- **Nations:** Config present but `enabled: false` — never used.
- **Features in use:** Basic land claiming, bank deposits, roles, events logging. No nations, no wars.
- **Dependencies:** Vault (economy bridge), EssentialsX (economy backend)
- **Data to lose:** All claim boundaries, land bank balances, member lists, role assignments for each land.
### Target: LandClaimPlugin
- **License:** MIT (free, open-source)
- **Compatibility:** 1.21.x — Paper, Purpur, Spigot confirmed
- **Claim Model:** Chunk-based (16x16), single claim profile per player
- **Permissions:** Tiered flag system (Owner → Member → Public)
- **Features:** In-game map, warps, alliances, auto-claim while walking, PvP blocking
- **No:** Nations, wars, web portal, land bank — these are Lands-specific features we don't use anyway.
---
## 1. Pre-Migration (Phase 0 — 48h before)
### 1.1 Backup Everything
```bash
ssh user@192.168.0.100
# Create backup directory
mkdir -p /opt/backups/lands-migration-$(date +%Y%m%d)
# Full server backup (running state — consistent snapshot via docker exec for world)
tar czf /opt/backups/lands-migration-$(date +%Y%m%d)/minecraft-plugins.tar.gz \
-C /opt/docker/minecraft plugins/
# Lands-specific backup (the important part for rollback)
tar czf /opt/backups/lands-migration-$(date +%Y%m%d)/lands-complete.tar.gz \
-C /opt/docker/minecraft/plugins \
Lands Lands-7.21.3.jar
# Also grab the SQLite DB separately (small, critical)
cp /opt/docker/minecraft/plugins/Lands/Data/database_v2.db \
/opt/backups/lands-migration-$(date +%Y%m%d)/
# Verify
ls -lh /opt/backups/lands-migration-$(date +%Y%m%d)/
```
### 1.2 Player Communication
**Discord announcement:**
```
📢 LAND SYSTEM CHANGE — Vote Required
We're replacing Lands (paid, complex, heavy) with LandClaimPlugin (free, simple, chunk-based).
What changes:
✅ New claiming system (/claim instead of /lands GUI)
✅ Chunk-based (16x16 blocks) — easier to see your borders
✅ Free claims, no economy cost during grace period
✅ Same world, same builds — only plugin data wiped
⚠️ ALL EXISTING CLAIMS WILL BE RESET
⚠️ Land bank balances will NOT carry over
🎁 48-hour grace period — free unlimited re-claiming
Timeline:
- Vote opens now (48h to respond)
- If approved, migration happens on [DATE]
- ~5 min downtime during swap
- 48h grace period to rebuild your claims
Land bank balances note: Current Lands bank deposits will NOT transfer.
The new system doesn't use land banks. This economy cost is going away.
Reply with 👍 to approve or 👎 to reject. Questions below.
```
**In-game MOTD (during announcement):**
```
§6⚠ Land system upgrade vote in Discord! §fReply in #announcements.
§7Migration may reset all claims. 48h grace period to re-claim.
```
### 1.3 Download New Plugin
```bash
# Get the compatible version for 1.21.10 / Purpur
# Check: https://modrinth.com/plugin/landclaimplugin/versions
# Need a build that supports 1.21.10 (currently latest covers 1.21.x)
# Download (replace with actual URL when ready)
wget -O /tmp/LandClaimPlugin.jar "https://cdn.modrinth.com/data/[...]/LandClaimPlugin-[version].jar"
# Quick validation
file /tmp/LandClaimPlugin.jar
# Should report: Java archive data (JAR)
```
---
## 2. Migration Execution (Phase 1 — Server Downtime)
### 2.1 Stop Server
```bash
ssh user@192.168.0.100
cd /opt/docker/minecraft
# Stop the container
docker compose down
# Wait for clean shutdown (saves world, closes DBs)
# Verify: docker ps | grep minecraft-mc (should be empty)
```
### 2.2 Remove Lands Completely
```bash
cd /opt/docker/minecraft/plugins
# Remove JAR
rm -f Lands-7.21.3.jar
# Remove entire data directory (claims, bank, roles, language, configs, logs)
rm -rf Lands/
# Verify it's gone
ls -la Lands* Lands/
# Should return: No such file or directory
```
### 2.3 Install LandClaimPlugin
```bash
# Move downloaded JAR to plugins
mv /tmp/LandClaimPlugin.jar /opt/docker/minecraft/plugins/LandClaimPlugin.jar
chown user:user /opt/docker/minecraft/plugins/LandClaimPlugin.jar
chmod 644 /opt/docker/minecraft/plugins/LandClaimPlugin.jar
# Verify
ls -la /opt/docker/minecraft/plugins/LandClaimPlugin.jar
```
### 2.4 Start Server (Config Generation Boot)
```bash
cd /opt/docker/minecraft
docker compose up -d
# Watch for plugin load
docker logs -f minecraft-mc
# Look for LandClaimPlugin startup messages
# Let it run for 2-3 minutes to generate default config
# It will create /opt/docker/minecraft/plugins/LandClaimPlugin/ with config.yml + data/
# Wait until you see: "Server running. /help for help. /stop to quit." or similar
# Stop again for config editing
docker compose down
```
### 2.5 Configure LandClaimPlugin
```bash
# Edit the generated config
nano /opt/docker/minecraft/plugins/LandClaimPlugin/config.yml
```
**Critical config changes recommended:**
```yaml
# --- CLAIM SETTINGS ---
# Start generous to reduce player friction
claims:
max-per-player: 50 # High limit — reduce later (default might be 5-10)
max-size-chunks: 125 # Per-claim size cap (reasonable = ~2000x2000 area)
auto-claim-enabled: true # Claim chunks as you walk through them
require-adjacent: false # Allow scattered claims (like Lands did)
diagonal-enabled: true
# --- ECONOMY ---
# DISABLE during grace period
economy:
enabled: false # Free claims for now
cost-per-chunk: 0 # 0 = no charge
# --- PROTECTION FLAGS ---
protection:
block-break: OWNER # Only claim owner can break
block-place: OWNER
entity-damage: OWNER
animal-kill: MEMBER # Allow members to hunt/kill
item-pickup: OWNER
item-drop: OWNER
door-toggle: PUBLIC # Friendly to visitors
container-access: MEMBER # Chests restricted to members
redstone-use: PUBLIC # Allow public redstone (doors, farms)
vehicle-use: MEMBER
pvp-inside-claim: false # No PvP inside claimed land (safe zones)
tnt: false # Block TNT
creeper-explosion: true # Keep creeper grief (it's survival, part of the game)
piston-cross-boundary: false # Prevent pistons pushing across claim edges
# --- VISUAL HELPERS ---
visuals:
claim-borders: true # Particle borders on join/claim
border-particle: flame # Or barrier, end_rod
in-game-map: true # Show claim overlay
# --- WARPS ---
warps:
enabled: true
per-claim-max: 5 # Reasonable limit per claim
```
### 2.6 Clean Up Plugin Dependencies
```bash
# LuckPerms — remove old Lands permissions
# Open LuckPerms web editor or use RCON
# Remove all perms matching: lands.*
docker exec minecraft-mc luckperms editor
# In the web editor, search "lands" and delete matching nodes
# Then add new perms if needed:
# /lp group default permission set "landclaim.claim.max.<number>" 50
# TAB plugin — check for Lands placeholders
grep -r "lands" /opt/docker/minecraft/plugins/TAB/ 2>/dev/null
# If found, remove/replace with LandClaim equivalents
# DiscordSRV — no direct LandClaim integration exists
# Console channel will still log /claim commands via the console
# Later: set up n8n webhook for automated claim notifications
```
---
## 3. Go Live (Phase 2 — Grace Period Begins)
### 3.1 Start Server
```bash
ssh user@192.168.0.100
cd /opt/docker/minecraft
docker compose up -d
# Verify
docker logs minecraft-mc | tail -30
# Confirm:
# - World loads (all 3 dimensions)
# - LandClaimPlugin enabled without errors
# - EssentialsX, DiscordSRV, all plugins load cleanly
# - RCON on port 25575
# - Port 25565 accepting connections
```
### 3.2 Update MOTD
```bash
# In docker-compose.yml, update the MOTD line:
# MOTD: "§a✓ New land system live! §e/claim§f to protect. 48h grace period."
docker compose restart
```
### 3.3 Discord & In-Game Announcement
```
DISCORD:
🟢 Land system is LIVE! Use /claim to protect your builds.
📍 Your old Lands claims are gone — time to rebuild!
⏰ 48-hour grace period: free, unlimited claiming.
📖 How to claim:
1. Stand in the chunk you want to claim
2. Run /claim add
3. Walk and auto-claim is enabled
4. View your claims: /claim map
Questions? Ask in #support.
```
```bash
# In-game broadcast
ssh user@192.168.0.100 "docker exec minecraft-mc rcon-cli say '§a✓ New land system live! Use /claim to protect. 48h free claiming!'"
```
---
## 4. Post-Migration Monitoring (Phase 3)
| Time | Action |
|------|--------|
| T+1h | Check logs for LandClaimPlugin errors. Verify claim borders work. Test /claim add in-game. |
| T+6h | Monitor Discord for player issues. Check if any players report missing builds (grief while unclaimed). |
| T+12h | Verify claim data directory is growing (new claims being made). Run `/claim list` to see top claimers. |
| T+24h | Backup new LandClaimPlugin data directory. Check for any claim conflicts between players. |
| T+48h | Grace period ends. Optionally enable economy (`economy.enabled: true`, `cost-per-chunk: 10`). Announce enforcement start. |
| T+7d | If no issues, consider deleting the Lands backup or moving to cold storage. |
---
## 5. Risk Matrix
| Risk | Likelihood | Impact | Mitigation |
|------|-----------|--------|------------|
| LandClaimPlugin incompatible with Purpur 1.21.10 | Low | High | Test on dev clone first. Modrinth shows Purpur 1.21.x supported. |
| Players lose critical builds during grace period | Medium | High | Admins patrol during first 6h. /claim add for abandoned bases. Consider temporary WorldGuard protection on major builds. |
| Land bank money loss causes player anger | Medium | Medium | Document clearly that bank balances don't carry over. This is a one-time wipe. Future economy-free system means no more deposits. |
| Auto-claim causes accidental claims | Low | Low | Players can `/claim remove` instantly. Admin can fix abuse. |
| Claim boundary disputes | Medium | Low | Admin tool `/claim admin unclaim <player>`, `/claim admin transfer` for dispute resolution. |
| TAB/LuckPerms broken by old Lands hooks | Low | Low | These just display empty placeholders. Not server-breaking. Fix in TAB config + LuckPerms web editor. |
---
## 6. Rollback Plan
If LandClaimPlugin causes critical issues or players revolt:
```bash
# 1. Stop server
docker compose -f /opt/docker/minecraft/docker-compose.yml down
# 2. Remove new plugin
rm -f /opt/docker/minecraft/plugins/LandClaimPlugin.jar
rm -rf /opt/docker/minecraft/plugins/LandClaimPlugin/
# 3. Restore Lands from backup
cd /opt/docker/minecraft/plugins
tar xzf /opt/backups/lands-migration-*/lands-complete.tar.gz
# 4. Verify Lands files restored
ls -la Lands-7.21.3.jar Lands/
# 5. Start server
docker compose -f /opt/docker/minecraft/docker-compose.yml up -d
# 6. Verify
rcon-cli say "§cLand system reverted to Lands. Claims restored."
```
---
## 7. Suggestions / Future Improvements
1. **Claim decay for inactive players:** If someone hasn't logged on in 60+ days, auto-unclaim their land. Prevents dead claims on buildable land. Can be automated with a cron + RCON script.
2. **Claim dashboard:** Bash script that RCONs `/claim list`, formats it, and posts to admin Discord channel weekly.
3. **Bluemap/Dynmap integration:** If LandClaimPlugin supports layer overlays on a web map, players can see claims from a browser, not just in-game.
4. **Economy-free by design:** LandClaimPlugin keeps claiming free and simple. Consider keeping it that way. The economy cost was a friction point for new players who wanted to build but had no money yet.
5. **Admin mediation tools:** The plugin has admin commands (`/claim admin`). Make sure moderators know:
- `/claim list` — view all claims
- `/claim admin unclaim <player>` — remove a player's claims
- `/claim admin transfer <from> <to>` — move a claim between players
6. **Backup script update:** Edit `/opt/docker/backup.sh` to include LandClaimPlugin in the daily backup (currently only backs up Minecraft world + configs, not plugin-specific data).
---
## 8. Files in This Repo
| Path | Description |
|------|-------------|
| `config/` | All server config files (pulled live from nullstone) |
| `config/plugins/Lands-config.yml` | Current Lands config — reference before removal |
| `config/plugins/Lands-*.yml` | All Lands sub-configs — roles, nations, wars, events, levels |
| `docker-compose.yml` | Live container definition from nullstone |
| `README.md` | Server documentation, plugin inventory, ops |
| `docs/migrations/lands-to-landclaim.md` | This migration plan |
| `scripts/` | Migration + operational scripts (below) |
---
## 9. Migration Helper Script
Place in `scripts/migrate-lands-to-landclaim.sh`:
```bash
#!/usr/bin/env bash
# migrate-lands-to-landclaim.sh
# Run on nullstone as root. Performs the full Lands → LandClaimPlugin migration.
set -euo pipefail
BACKUP_DIR="/opt/backups/lands-migration-$(date +%Y%m%d_%H%M%S)"
MC_DIR="/opt/docker/minecraft"
PLUGIN_DIR="$MC_DIR/plugins"
log() { echo "[$(date '+%H:%M:%S')] $*"; }
# --- Pre-checks ---
log "Checking prerequisites..."
# Is server running?
if docker ps --format '{{.Names}}' | grep -q '^minecraft-mc$'; then
log "Server is running. Stop it first: cd $MC_DIR && docker compose down"
exit 1
fi
# Backup directory
mkdir -p "$BACKUP_DIR"
log "Backup directory: $BACKUP_DIR"
# --- Step 1: Backup Lands ---
log "Backing up Lands plugin..."
if [ -f "$PLUGIN_DIR/Lands-7.21.3.jar" ]; then
cp "$PLUGIN_DIR/Lands-7.21.3.jar" "$BACKUP_DIR/"
cp -r "$PLUGIN_DIR/Lands" "$BACKUP_DIR/"
log "Lands JAR + data backed up"
else
log "WARNING: Lands-7.21.3.jar not found at $PLUGIN_DIR"
log "Plugin may already be removed or installed at different version"
exit 1
fi
# --- Step 2: Remove Lands ---
log "Removing Lands plugin..."
rm -f "$PLUGIN_DIR/Lands-7.21.3.jar"
rm -rf "$PLUGIN_DIR/Lands/"
log "Lands removed"
# --- Step 3: Install LandClaimPlugin ---
log "Installing LandClaimPlugin..."
LCP_JAR="$PLUGIN_DIR/LandClaimPlugin.jar"
# Check if JAR already exists
if [ -f "$LCP_JAR" ]; then
log "LandClaimPlugin.jar already exists at $LCP_JAR"
else
log "ERROR: LandClaimPlugin.jar not found at $LCP_JAR"
log "Download it first: wget -O $LCP_JAR <modrinth-url>"
log "Rolling back..."
cp "$BACKUP_DIR/Lands-7.21.3.jar" "$PLUGIN_DIR/"
cp -r "$BACKUP_DIR/Lands" "$PLUGIN_DIR/"
exit 1
fi
chown user:user "$LCP_JAR"
log "LandClaimPlugin installed"
# --- Step 4: Start server for config generation ---
log "Starting server to generate config..."
cd "$MC_DIR"
docker compose up -d
log "Waiting 90 seconds for config generation..."
sleep 90
# Check if the plugin loaded
if docker logs minecraft-mc 2>&1 | grep -qi "landclaim"; then
log "LandClaimPlugin loaded successfully"
else
log "WARNING: No LandClaimPlugin messages in logs"
docker logs minecraft-mc | tail -20
fi
# --- Step 5: Stop for config edit ---
log "Stopping server..."
docker compose down
log "Server stopped. Now edit:"
log " $PLUGIN_DIR/LandClaimPlugin/config.yml"
log ""
log "Recommended changes:"
log " - claims.max-per-player: 50"
log " - claims.auto-claim-enabled: true"
log " - economy.enabled: false (for grace period)"
log " - visuals.claim-borders: true"
log ""
log "When done, start: cd $MC_DIR && docker compose up -d"
log "Grace period begins. Announce to players."
log ""
log "=== Migration complete ==="
```
---
*Version: 1.0*
*Author: veilor.uk Infrastructure*
*Created: 2026-04-24*
---
## 10. Execution Log — Completed 2026-04-24 01:21 BST
### What Actually Happened
| Step | Result | Details |
|------|--------|---------|
| Backup | ✅ PASSED | Full plugins backup: 446MB. Lands-specific: 2.6MB. SQLite DB: 168KB |
| Server stop | ✅ PASSED | Clean shutdown via `docker compose down`. World saved. |
| Remove Lands | ✅ PASSED | `Lands-7.21.3.jar` deleted. `plugins/Lands/` directory removed entirely. SQLite DB backed up before removal. |
| Download LandClaimPlugin | ✅ PASSED | v2.0.4 from Modrinth (supports Paper/Purpur 1.21.41.21.11). SHA256: `48562c17ec59c35eb7c3529b84763d026679d0782ffd2dc7dc53169af41be688` |
| Install plugin | ✅ PASSED | JAR placed at `plugins/LandClaimPlugin.jar` (4.2MB). Ownership: `user:user`. |
| First boot (config gen) | ✅ PASSED | Plugin loaded cleanly. Remapper took 1,459ms. SQLite DB created at `plugins/LandClaimPlugin/PlayerData/database.db` (77KB). Config + locales + menus generated. |
| Custom config applied | ✅ PASSED | Config replaced via `docker cp`. Key changes verified: `chunkClaimLimit: 50`, `autoClaimDefault: true`, `blockWorld: []`, `autoUnclaimDefault: true`. All map integrations disabled. |
| Restart | ✅ PASSED | Server restarted. LandClaimPlugin 2.0.4 loaded. 0 claims (expected). Status: healthy. |
| Lands verification | ✅ PASSED | Zero `Lands*` files remain in `/data/plugins/`. No stale data anywhere. |
| Lands event log captured | ✅ | From backup: 43 cached players. Active land names before wipe: K'land, JellyLand (deleted), Portal (deleted), HighCaillou, HIVE, Headquarters, batcave, MyLawn, TheArchitect. Nations: disabled. Wars: none. |
### Server State Post-Migration
- **Running:** ✅ Health check passing
- **Plugins loaded:** 24 (Lands removed, LandClaimPlugin 2.0.4 added — net 1 swap)
- **Claims:** 0 (clean slate)
- **World:** ✅ Preserved intact (all 3 dimensions)
- **Land bank balances:** WIPE COMPLETE — not transferable to new system
- **Backup location:** `/opt/backups/lands-migration-20260424/`
- `all-plugins.tar.gz` (446MB) — full plugin archive
- `lands-complete.tar.gz` (2.6MB) — Lands JAR + all data
- `database_v2.db` (168KB) — raw SQLite for emergency restore
- `config.yml` — pre-migration Lands config
### Post-Migration TODO
1. [ ] Announce migration complete in Discord + in-game MOTD
2. [ ] Monitor logs for first 2h — watch for claim-related errors
3. [ ] At 48h: announce grace period ending, optionally enable economy
4. [ ] At 7d: delete Lands backup or move to cold storage
5. [ ] Update `/opt/docker/backup.sh` to include LandClaimPlugin data in daily backups
### Notes During Execution
- Lands had accumulated ~43 players in cache across 9 named lands
- Two lands were deleted for INACTIVITY (JellyLand 2025-05-30, Portal 2025-09-11) — confirms the cleanup system was working
- Land bank deposits ranged from $10 to $10,000 (HIVE). These balances are NOT recoverable in the new system — it doesn't use land banks at all. This is a feature, not a loss: the new system is simpler and economy-free by default.
- LandClaimPlugin had two startup warnings:
1. `NullPointerException: serverConnectionMethod is null` — minor, plugin continues loading
2. `You are running an unsupported server version!` — cosmetic, plugin works fine on Purpur 1.21.10
- Both warnings are non-fatal and don't affect functionality.
---
*Migration executed: 2026-04-24 01:21 BST*
*Migration duration: ~10 minutes (stop → swap → restart)*
*Server: nullstone (192.168.0.100)*
*Operator: veilor.uk*