Want to create an intense, collaborative Minecraft experience? This guide walks through setting up a hardcore server where players share health and every point of damage matters. Perfect for speedrun challenges or just adding stakes to your survival gameplay.

What We’re Building

A Minecraft Fabric server with:

  • Shared health pool across all players
  • Comprehensive damage logging with detailed tracking
  • Milestone tracking (Iron, Nether, Fortress, End, Dragon)
  • Run persistence - save and compare attempts
  • Spectator mode on death for dramatic endings
  • Damage leaderboards to see who took the most hits

This setup is inspired by hardcore speedrun servers but works great for any group that wants high-stakes collaborative survival.

Prerequisites

What You’ll Need:

  • Ubuntu Server 22.04+ (or any Linux distribution)
  • Java 21 (for Minecraft 1.21.10+)
  • 4GB+ RAM (recommended)
  • Basic terminal knowledge

My Setup:

I’m running this on a Proxmox LXC container with:

  • 4GB RAM allocated
  • Ubuntu 22.04 template
  • Network bridge for external access

Part 1: Server Installation

Install Java 21

# Update system
sudo apt update && sudo apt upgrade -y

# Install Java 21
sudo apt install openjdk-21-jdk -y

# Verify installation
java -version

You should see something like openjdk version "21.0.x".

Download Fabric Server

# Create server directory
mkdir -p /opt/minecraft/server
cd /opt/minecraft/server

# Download Fabric installer (check https://fabricmc.net/use/server/ for latest version)
wget https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.1/fabric-installer-1.0.1.jar

# Install Fabric server for Minecraft 1.21.10
java -jar fabric-installer-1.0.1.jar server -mcversion 1.21.10 -downloadMinecraft

Initial Server Configuration

# Accept EULA
echo "eula=true" > eula.txt

# Create server.properties with basic settings
cat > server.properties << 'EOF'
server-port=25565
gamemode=survival
difficulty=hard
hardcore=true
max-players=10
view-distance=12
simulation-distance=8
motd=Hardcore Shared Health Server
enable-command-block=false
spawn-protection=0
max-world-size=29999984
EOF

First Boot Test

# Start server to generate world
java -Xmx3G -Xms3G -jar fabric-server-launch.jar nogui

Wait for “Done!” then type stop to shut it down gracefully.

Part 2: Installing Mods

Download Required Mods

# Create mods directory
mkdir -p /opt/minecraft/server/mods
cd /opt/minecraft/server/mods

# Download Fabric API (required dependency)
# Check https://modrinth.com/mod/fabric-api for the latest 1.21.10 compatible version
wget https://cdn.modrinth.com/data/P7dR8mSH/versions/[FABRIC_API_VERSION]/fabric-api-[VERSION].jar

# Download Shared Health mod
# From https://modrinth.com/mod/sharedhealth
wget https://cdn.modrinth.com/data/xzHWwh0L/versions/[SHAREDHEALTH_VERSION]/sharedhealth-[VERSION].jar

# Download DamageLogger mod
# From https://github.com/DerkieH/DamageLoggerMod/releases
wget https://github.com/DerkieH/DamageLoggerMod/releases/download/1.3.9/damagelogger-1.3.9.jar

Version Notes:

  • DamageLogger 1.3.9 is confirmed compatible with Minecraft 1.21.10
  • Shared Health supports 1.21.10-1.21.11
  • Always grab the latest Fabric API for your Minecraft version

Verify Mod Installation

# List mods
ls -lh /opt/minecraft/server/mods

# You should see:
# - fabric-api-*.jar
# - sharedhealth-*.jar  
# - damagelogger-1.3.9.jar

Create Data Directory for DamageLogger

# DamageLogger saves run data here
mkdir -p /opt/minecraft/server/splits
chmod 755 /opt/minecraft/server/splits

Part 3: Mod Configuration

Shared Health Configuration

Shared Health uses Minecraft’s native gamerule system. Configure after starting the server:

# Start server
java -Xmx3G -Xms3G -jar fabric-server-launch.jar nogui

In the server console:

# Enable shared health (default: true)
/gamerule shareHealth true

# Enable shared hunger (default: true)
/gamerule shareHunger true

How it works:

  • All players share a single health pool
  • All players share a single hunger bar
  • Damage to one player affects everyone
  • Eating food benefits everyone

DamageLogger Configuration

DamageLogger works out of the box with no configuration needed. It automatically:

  • Logs all damage events to chat with color coding
  • Tracks milestones via advancements
  • Maintains a damage leaderboard per run
  • Saves completed/failed runs to JSON
  • Displays split times on sidebar scoreboard

Key Features:

Damage Logging:

  • Color-coded messages: [Damage] player took X damage
  • Anti-spam cooldowns (longer for DoT sources)
  • Ignores /kill commands

Milestone Tracking:

  • IRON: First iron smelted
  • NETHER: Enter the Nether
  • FORT: Find Nether Fortress
  • BLAZE: Obtain Blaze Rod
  • END: Enter the End
  • DRAGON: Kill Ender Dragon

Run End Conditions:

  • FAILED: First real player death → everyone to spectator mode
  • COMPLETED: Ender Dragon killed

Part 4: Systemd Service Setup

Create a systemd service for automatic startup and management:

sudo nano /etc/systemd/system/minecraft.service

Paste this configuration:

[Unit]
Description=Minecraft Hardcore Server
After=network.target

[Service]
Type=simple
User=minecraft
WorkingDirectory=/opt/minecraft/server
ExecStart=/usr/bin/java -Xmx3G -Xms3G -jar fabric-server-launch.jar nogui
Restart=on-failure
RestartSec=10

# Graceful shutdown
ExecStop=/bin/sh -c 'echo "stop" > /run/minecraft.stdin'
StandardInput=file:/run/minecraft.stdin
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Create minecraft user:

# Create dedicated user
sudo useradd -r -m -U -d /opt/minecraft -s /bin/bash minecraft

# Set ownership
sudo chown -R minecraft:minecraft /opt/minecraft

# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable minecraft
sudo systemctl start minecraft

Manage the server:

# Check status
sudo systemctl status minecraft

# View logs
sudo journalctl -u minecraft -f

# Stop server
sudo systemctl stop minecraft

# Restart server
sudo systemctl restart minecraft

Part 5: Understanding the Gameplay

How Shared Health Works

When you have 3 players online:

  1. Total health pool: 60 HP (20 HP × 3 players)
  2. Player A takes 5 damage: Everyone loses ~1.67 HP
  3. Player B eats: Everyone gains health
  4. One player dies: Run fails, everyone becomes spectator

This creates intense cooperation - careless players affect everyone.

The Run Flow

Start:

  • Server boots
  • New run begins automatically
  • Sidebar shows milestone targets based on best previous run

During Run:

  • Damage logged in chat with color coding
  • Damage leaderboard tracks who’s taking hits
  • Milestones announced when reached
  • Split times show delta vs best run

Run Failure (First Death):

  1. Death detected
  2. All players forced to respawn (bypasses Game Over screen)
  3. All players switched to Spectator mode
  4. Everyone teleported to death location
  5. 5-second “pin” at death spot
  6. Dramatic broadcast: “RUN FAILED - HH:MM:SS”
  7. Top 5 damage leaderboard displayed
  8. Run saved to /opt/minecraft/server/splits/runs.json

Run Completion (Dragon Kill):

  1. Ender Dragon dies
  2. Broadcast: “RUN COMPLETED - HH:MM:SS”
  3. Damage leaderboard shown
  4. Run saved to JSON
  5. No spectator mode (it’s a victory!)

Scoreboard Display

The sidebar shows:

ALLIANCE SPLITS
━━━━━━━━━━━━━━
⚪ IRON
⚪ NETHER  
⚪ FORT
⚪ BLAZE
⚪ END
⚪ DRAGON

As milestones are hit:

ALLIANCE SPLITS
━━━━━━━━━━━━━━
✓ IRON (+00:00:12)
✓ NETHER (-00:00:05)
⚪ FORT
⚪ BLAZE
⚪ END
⚪ DRAGON

Green = completed + = slower than best - = faster than best (NEW PB!)

Part 6: Backups and Run Data

Backup Strategy

#!/bin/bash
# /opt/minecraft/backup.sh

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/opt/minecraft/backups"
SERVER_DIR="/opt/minecraft/server"

# Create backup directory
mkdir -p $BACKUP_DIR

# Stop server
sudo systemctl stop minecraft

# Backup world and run data
tar -czf $BACKUP_DIR/server_$DATE.tar.gz \
    -C $SERVER_DIR \
    world world_nether world_the_end splits

# Start server
sudo systemctl start minecraft

# Keep only last 7 backups
cd $BACKUP_DIR
ls -t | tail -n +8 | xargs -r rm

Make it executable and schedule:

chmod +x /opt/minecraft/backup.sh

# Add to crontab (daily at 4 AM)
sudo crontab -e
0 4 * * * /opt/minecraft/backup.sh

Analyzing Run Data

Run data is saved to /opt/minecraft/server/splits/runs.json:

{
  "runs": [
    {
      "id": "run_20250121_143052",
      "outcome": "FAILED",
      "duration": "01:23:45",
      "splits": {
        "IRON": "00:02:15",
        "NETHER": "00:15:30",
        "FORT": "00:25:00"
      },
      "damageLeaderboard": [
        {"player": "Steve", "damage": 45.5},
        {"player": "Alex", "damage": 32.0}
      ]
    }
  ]
}

You can parse this with jq:

# Show all completed runs
jq '.runs[] | select(.outcome == "COMPLETED")' splits/runs.json

# Show best NETHER split time
jq -r '.runs[].splits.NETHER' splits/runs.json | sort | head -1

# Show total runs
jq '.runs | length' splits/runs.json

Part 7: Troubleshooting

Server Won’t Start

Check Java version:

java -version
# Should show Java 21

Check logs:

sudo journalctl -u minecraft -n 100 --no-pager

Common issues:

  • Port 25565 already in use: sudo lsof -i :25565
  • Insufficient memory: Increase -Xmx value
  • Missing Fabric API: Required for both mods

Mods Not Loading

Verify mod files:

ls -lh /opt/minecraft/server/mods

Check each .jar file:

  • Fabric API: Must match Minecraft version exactly
  • Shared Health: Should show 1.21.10 compatibility
  • DamageLogger: Version 1.3.9 for 1.21.10

Check server logs:

tail -f /opt/minecraft/server/logs/latest.log

Look for:

[Fabric] Loading mods...
[Fabric] - sharedhealth 
[Fabric] - damagelogger

Shared Health Not Working

Verify gamerules:

# In server console
/gamerule shareHealth
/gamerule shareHunger

Both should return true.

Test it:

  1. Have two players join
  2. One player takes damage
  3. Both players should lose health proportionally

Splits Not Saving

Check directory permissions:

ls -ld /opt/minecraft/server/splits
# Should be owned by minecraft user with write access

sudo chown -R minecraft:minecraft /opt/minecraft/server/splits
sudo chmod -R 755 /opt/minecraft/server/splits

Check disk space:

df -h /opt/minecraft

Performance Issues

Optimize Java flags:

# For 4GB RAM server
java -Xmx3G -Xms3G \
  -XX:+UseG1GC \
  -XX:+ParallelRefProcEnabled \
  -XX:MaxGCPauseMillis=200 \
  -XX:+UnlockExperimentalVMOptions \
  -XX:+DisableExplicitGC \
  -XX:G1NewSizePercent=30 \
  -XX:G1MaxNewSizePercent=40 \
  -XX:G1HeapRegionSize=8M \
  -jar fabric-server-launch.jar nogui

Monitor performance:

# CPU and memory
htop

# Server TPS
# In-game: /forge tps

Part 8: Advanced Customization

World Reset Script

For speedrun practice, you might want quick world resets:

#!/bin/bash
# /opt/minecraft/reset-world.sh

echo "Stopping server..."
sudo systemctl stop minecraft

echo "Backing up old world..."
cd /opt/minecraft/server
tar -czf "world_backup_$(date +%Y%m%d_%H%M%S).tar.gz" world world_nether world_the_end

echo "Removing world files..."
rm -rf world world_nether world_the_end

echo "Starting server (new world will generate)..."
sudo systemctl start minecraft

echo "World reset complete!"

Custom MOTD

Update your server.properties:

motd=§c§lHARDCORE§r§7 | Shared Health Challenge\n§e1.21.10§7 | speedrun.homehosted.org

Colors:

  • §c = red
  • §e = yellow
  • §7 = gray
  • §l = bold
  • §r = reset

Whitelist for Practice Sessions

# Enable whitelist
echo "white-list=true" >> server.properties

# Add players (in server console)
/whitelist add PlayerName
/whitelist add AnotherPlayer

# Or via command line
echo "whitelist add PlayerName" | sudo -u minecraft java -jar fabric-server-launch.jar

Conclusion

You now have a fully functional hardcore Minecraft server with:

✅ Shared health mechanics across all players
✅ Comprehensive damage tracking and leaderboards
✅ Milestone/split tracking for speedruns
✅ Automatic run persistence to JSON
✅ Dramatic death sequences
✅ Systemd service for easy management

This setup creates incredible tension and cooperation. Every decision matters when one player’s mistake can end the run for everyone.

What’s Next?

Some ideas to enhance your server:

  1. Add more mods: Consider VoiceChat mod for better coordination
  2. Stream integration: Parse run data for overlays
  3. Leaderboard website: Display historical runs and stats
  4. Custom challenges: Set speedrun goals (beat Dragon in under 30 minutes)
  5. Tournament mode: Track multiple teams competing

Resources

Have you set up a similar server? Found better configurations? I’d love to hear about it - reach out via GitHub!