Setup Guide
This guide walks through a complete Zander deployment from scratch — database, web platform, Discord bot, and Minecraft plugins. Follow the steps in order; each step builds on the previous one.
Prerequisites
| Requirement | Version |
|---|---|
| Node.js | 20.x or later |
| npm | 8.5.0 or later |
| MySQL | 8.x or later |
| Minecraft server | Paper/Spigot 1.19+ (for game server plugins), Velocity (for proxy) |
1. Set Up the Database
-
Create a new MySQL database:
CREATE DATABASE zander CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -
Run the initialisation script to create the base schema:
mysql -u <user> -p zander < dbinit.sql -
Run all migration scripts in order from the
migration/directory:# Run each file in numeric order, e.g.:
mysql -u <user> -p zander < migration/001_initial.sql
mysql -u <user> -p zander < migration/002_....sql
# ... -
(Optional) If you are using LuckPerms, configure a separate read connection in
.envunderLUCKPERMS_URL. -
(Optional) If you are using QuickShop for the shop directory, configure
QUICKSHOP_URLin.env.
2. Configure the Web Platform
-
Copy the example files:
cp .env.example .env
cp config.json.example config.json -
Edit
.envand set at minimum:Variable Value siteAddressYour public URL, e.g. https://example.comsessionCookieSecretA random string of 32+ characters DATABASE_URLMySQL connection string apiKeyYour chosen API key (shared with all plugins) discordAPIKeyYour Discord bot token discordClientIdYour Discord application client ID discordClientSecretYour Discord application client secret -
Edit
config.jsonand fill in:siteConfiguration.siteUrlandsiteNamediscord.guildId- Discord webhook URLs under
discord.webhooks - Discord channel and role IDs as required
-
Review
features.jsonand disable any features you do not need.
3. Set Up the Discord Bot
-
In the Discord Developer Portal:
- Create a new application.
- Under Bot, enable Message Content Intent, Server Members Intent, and Presence Intent.
- Copy the bot token into
discordAPIKeyin.env. - Under OAuth2, copy the client ID and secret into
discordClientIdanddiscordClientSecret.
-
Invite the bot to your guild with the required permissions (at minimum:
Manage Roles,Manage Channels,Moderate Members,Ban Members,Send Messages,Embed Links). -
Set
discord.guildIdinconfig.jsonto your server's ID.
4. Install and Start zander-web
npm install
npm run build # runs migrations and generates Prisma client
npm run dev # development mode (auto-reload)
# OR
npm run prod # production mode
The application starts on the port defined by PORT in .env (default 8080).
In production, run the app behind a reverse proxy (nginx, Caddy) with HTTPS. See Deployment.
5. Install Minecraft Plugins
Place the plugin JARs in the appropriate plugins/ directories:
| Plugin JAR | Server type |
|---|---|
zander-addon.jar | Each Paper/Spigot game server |
zander-auth.jar | Dedicated auth Paper/Spigot server |
zander-hub.jar | Hub Paper/Spigot server (+ PremiumVanish + ProtocolLib) |
zander-velocity.jar | Velocity proxy |
Start each server once to generate the default config.yml, then stop it and update:
BaseAPIURL: "https://example.com/api"
APIKey: "your-api-key"
The APIKey must exactly match apiKey in .env.
6. Verify the Connection
- Start
zander-weband confirm it is accessible at your configuredsiteAddress. - Start your Minecraft server(s) with the plugins installed.
- Log in to Minecraft — the plugin should successfully call the session API.
- Check the audit logs in the dashboard (
/dashboard/logs) to confirm API calls are being received.