Skip to content

Getting_Started

Aorux01 edited this page Feb 18, 2026 · 3 revisions

Getting Started

Welcome to the Neodyme getting started guide! This page will walk you through installing and configuring your Fortnite backend server.

Prerequisites

Before you begin, make sure you have installed:

  • Node.js (version 16 or higher)
  • Git (to clone the repository)

Optional depending on your configuration:

  • MongoDB (if using databaseType=mongodb)
  • Redis (if using redisEnabled=true)

Quick Installation

Method 1: Batch File (Recommended for Windows)

# Simply double-click:
install_packages.bat    # Only required once
start.bat               # Start the server

Method 2: Command Line

npm install     # Only required once
node server.js

Server Configuration

The server is configured via the server.properties file. Below is a detailed explanation of all 20 configuration sections.


[1] Core Server Settings

port=3551                # Network port
version=1.2.3            # Backend version
apiVersion=1.3           # API version
customVersion=true       # Allow any client version to connect
fnVersion=3.50           # Required version when customVersion=false

[2] Debug & Logging

debug=true               # Enable debug output
debugRequests=false       # Log all incoming requests (verbose)
debugResponses=false      # Log all responses (very verbose)
debugIps=false            # Log client IP addresses

[3] Features & Plugins

plugins=true             # Enable the plugin system
autoShopRotation=true    # Enable automatic daily shop rotation

When plugins=true, the plugin system is enabled and plugins can be managed via the console:

/plugins list                                    # List loaded plugins
/plugins store list                              # Browse available plugins from the store
/plugins store install <plugin-id>               # Download, install and load a plugin
/plugins store update <plugin-id>                # Update an installed plugin

See plugin.md for the full plugin documentation.

[4] XMPP Chat Server

xmppEnable=true          # Enable XMPP for in-game chat
xmppPort=80              # XMPP server port
xmppDomain=prod.ol.epicgames.com

[5] Database Configuration

databaseType=json        # json | mongodb (sqlite, mysql, postgresql planned)
databasePath=data/       # Path or connection string
databaseLogging=false    # Log database queries
databaseBackup=true      # Enable automatic backups
databaseBackupInterval=60       # Backup interval (minutes)
databaseBackupExpiryDays=7      # Auto-delete old backups (0 = keep all)
getJsonSpacing=true      # Pretty-print JSON files
sqliteJournalMode=WAL    # SQLite journal mode

Database connection string examples:

# JSON (default, no setup required):
databaseType=json
databasePath=data/

# MongoDB:
databaseType=mongodb
databasePath=mongodb://localhost:27017/neodyme

See Database for detailed database documentation.

[6] Redis Cache (Optional)

redisEnabled=false       # Enable Redis caching
redisHost=127.0.0.1      # Redis hostname
redisPort=6379           # Redis port
redisPassword=           # Redis password (empty = no auth)

Redis can be used for token and profile caching, improving performance on high-traffic servers. Requires: npm install ioredis.

[7] Security & Protection

rateLimiting=true        # Enable rate limiting
corsEnable=true          # Enable CORS
compressionEnable=true   # Enable response compression
helmetEnable=true        # Enable Helmet security headers
trustProxy=true          # Trust reverse proxy (nginx, Cloudflare)
secureCookies=false      # Use secure cookies (auto-enabled with HTTPS)
limitBodySize=50mb       # Max body size for file uploads
limitRequestSize=1mb     # Max body size for API calls

See Security for detailed security documentation.

[8] Rate Limiting - Global

maxRequestsPerMinute=125         # Max requests per IP per minute
rateLimitWindowMinutes=1         # Time window

[9] Rate Limiting - Authentication

authMaxAttempts=5                # Max auth attempts per IP
authWindowMinutes=15             # Time window
authSkipSuccessfulRequests=false # Skip counting successful logins

[10] Rate Limiting - Expensive Operations

expensiveMaxRequests=10          # Max requests for heavy endpoints
expensiveWindowMinutes=5         # Time window

[11] Authentication & Tokens

accessTokenExpiryHours=8         # Access token lifetime
exchangeTokenExpiryMinutes=5     # Exchange token lifetime
refreshTokenExpiryDays=30        # Refresh token lifetime
bcryptWorkFactor=12              # Password hash rounds (12-14 recommended)
passwordMinLength=8              # Minimum password length
authTimingDelayMin=50            # Min auth delay in ms (anti-timing attack)
authTimingDelayMax=200           # Max auth delay in ms
tokenEncryptionEnabled=false     # Encrypt tokens at rest

[12] CSRF Token Settings

csrfTokenExpiryMinutes=60        # CSRF token lifetime
csrfSessionExpiryHours=24        # CSRF session cookie lifetime
csrfCleanupIntervalMinutes=60    # CSRF cleanup interval

[13] Web Token Settings

webAccessTokenExpiryHours=8      # Web access token lifetime
webRefreshTokenExpiryDays=30     # Web refresh token lifetime
webTokenCleanupIntervalMinutes=60 # Web token cleanup interval

[14] Creator Code Settings

creatorCodeCommissionPercent=1   # Commission % for creator codes (0-100)

[15] Web Interface

webInterface=true                # Enable the web dashboard

[16] Game Events

bEnableAllEvents=true            # Master switch for all events
bAllSTWEventsActivated=true      # Enable STW events

# Individual events (each has a toggle and optional start date)
bEnableGeodeEvent=false
bEnableCrackInTheSky=false
bEnableS4OddityPrecursor=false
bEnableS4OddityExecution=false
bEnableS5OddityPrecursor=false
bEnableS5OddityExecution=false
bEnableCubeLightning=false
bEnableBlockbusterRiskyEvent=false
bEnableCubeLake=false

[17] Profile Defaults

bGrantFoundersPacks=false        # Grant Founder's Pack to all players
bCompletedSeasonalQuests=false   # Mark seasonal quests as completed

[18] Game Server

gameServerHeartbeatInterval=30   # Heartbeat interval (seconds)
gameServerTimeout=120            # Timeout before offline (seconds)

[19] Maintenance Mode

maintenanceMode=false            # Enable maintenance mode
maintenanceMessage=The server is currently under maintenance. Please try again later.
maintenanceEstimatedDowntime=2025-10-27T15:00:00Z

[20] SSL / HTTPS

protocol=http                    # http or https
sslCertPath=config/ssl/cert.pem  # Path to SSL certificate
sslKeyPath=config/ssl/key.pem    # Path to SSL private key

When protocol=https, the server:

  1. Loads the SSL certificate and key from the specified paths
  2. Creates an HTTPS server
  3. Automatically enables secureCookies in memory

Place your SSL certificate and private key in config/ssl/. Changing protocol requires a server restart.


Content Configuration (config/ folder)

XP System (experience.json)

{
  "maxLevel": 100,
  "xpPerLevel": 80000,
  "bookXpPerLevel": 1,
  "bookXpRequiredForStar": 10,
  "xpRewards": {
    "kill": 300,
    "elimination": 300,
    "assist": 150,
    "revive": 500,
    "reboot": 800,
    "chestOpen": 125,
    "ammoBoxOpen": 75,
    "supplyDrop": 500,
    "medalBronze": 500,
    "medalSilver": 1000,
    "medalGold": 2000,
    "medalPunchcard": 14000,
    "win": 3000,
    "top10": 1000,
    "top25": 500,
    "survivalMinute": 170,
    "damageDealt": 1
  }
}

Shop System (shop.json)

{
  "shopRotationTime": "00:00",
  "shopChapterLimit": 5,
  "shopSeasonLimit": "REMIX",
  "shopExcludedItems": [],
  "shopCategories": {
    "daily": {
      "count": 6,
      "storefrontName": "BRDailyStorefront",
      "tileSize": "Small",
      "displayName": "Daily"
    },
    "featured": {
      "count": 8,
      "storefrontName": "BRWeeklyStorefront",
      "tileSize": "Normal",
      "displayName": "Featured"
    }
  }
}
  • shopRotationTime: Daily rotation time in UTC (format: "HH:MM")
  • shopChapterLimit: Maximum chapter number for shop items
  • shopSeasonLimit: Maximum season identifier for items
  • shopExcludedItems: Array of item IDs to exclude from rotation
  • shopCategories: Configure daily and featured sections (item count, storefront name, tile size)

Message of the Day (motd.json)

In-game news and announcements displayed on the lobby screen. Supports multilingual content for all keys:

{
  "contentItems": [
    {
      "contentId": "neodyme-welcome",
      "contentFields": {
        "title": { "en": "Welcome to Neodyme", "fr": "Bienvenue sur Neodyme" },
        "body": { "en": "Have a phenomenal gaming experience!" },
        "entryType": "Texte",
        "sortingPriority": 90,
        "hidden": false
      },
      "contentSchemaName": "MotdTextNewsWithVideo"
    }
  ]
}
  • entryType: "Texte" for text items, "Website" for website links with a button
  • sortingPriority: Higher values appear first in the lobby news feed
  • hidden: Set to true to hide an item without deleting it
  • contentSchemaName: MotdTextNewsWithVideo or MotdWebsiteNewsWithVideo

Game Servers (game-servers.json)

Regional configuration for game servers and matchmaking:

{
  "regions": {
    "EU": {
      "name": "Europe West",
      "ping_url": "https://ping-eu.neodyme.com/ping",
      "servers": [
        {
          "id": "eu-01",
          "ip": "127.0.0.1",
          "port": 7781,
          "gamemode": "BR_Solo",
          "max_players": 100,
          "status": "online"
        }
      ]
    }
  },
  "game_modes": {
    "BR_Solo": { "max_players": 100, "team_size": 1, "enabled": true },
    "BR_Duos": { "max_players": 100, "team_size": 2, "enabled": true },
    "BR_Squads": { "max_players": 100, "team_size": 4, "enabled": true }
  },
  "load_balancing": {
    "strategy": "lowest_ping_first",
    "fallback_region": "NAE"
  },
  "matchmaking_settings": {
    "queue_timeout_seconds": 300,
    "bot_fill_enabled": false,
    "min_players_to_start": 2
  }
}
  • Supported regions: NAW, NAE, EU, ASIA, OCE, BR, ME
  • status: "online" or "offline" to enable/disable a server
  • load_balancing.strategy: "lowest_ping_first" routes players to the nearest server
  • bot_fill_enabled: Fill empty slots with bots when true

First Startup

1. Download Neodyme

git clone https://github.com/Jeotique/Neodyme.git
cd Neodyme

2. Install dependencies

npm install

3. Configure the server

Edit server.properties. Critical changes for production:

# Generate random strings for these:
jwtSecret=your-long-random-string-here
gameServerSecret=another-unique-string-here

4. Start the server

# Windows:
start.bat

# Linux/Mac:
node server.js

5. Access the web interface

Open your browser and go to: http://localhost:3551

Register your first account through the web interface, then use the console command /admin set "YourUsername" admin to promote yourself.


Directory Structure

neodyme/
  config/                 # Configuration files (shop, xp, gameservers, ssl)
  data/                   # JSON database files (when using databaseType=json)
  plugins/                # Plugin directory (auto-populated by /plugins store install)
    my-plugin/            # Subdirectory plugin (recommended)
      index.js
      config.json
    MyPlugin.js           # Single-file plugin
  src/                    # Source code
    manager/              # Core managers (plugins, commands, shop, etc.)
    service/              # Services (logger, token, etc.)
  web/                    # Web interface files (HTML, CSS, JS)
  server.js               # Main entry point
  server.properties       # Server configuration

Common Troubleshooting

Server won't start

  • Verify Node.js version 16+: node --version
  • Check if port 3551 is available
  • Ensure dependencies installed: npm install
  • Check console for error messages

Database errors

  • JSON: Verify write permissions in data/ directory
  • MongoDB: Ensure MongoDB service is running at the configured connection string

Client connection issues

  • Verify server is accessible on the configured port
  • Check firewall settings
  • Set customVersion=true if using non-standard client versions

HTTPS not working

  • Verify protocol=https in server.properties
  • Check that cert.pem and key.pem exist in config/ssl/
  • Ensure certificate files are valid PEM format
  • Check console for SSL-related errors

Shop not rotating

  • Verify autoShopRotation=true in server.properties
  • Check shop.json exists with valid settings
  • Use /shop status to check rotation timing

Next Steps

Clone this wiki locally