Host community servers for STAR WARS Battlefront II (2017) using KYBER with Docker on Windows — bypassing common NTFS permission issues (like Activation64.dll errors) by using native Linux volumes.
Tip
New: Easy Asset Ingestion Script! 🚀 We've added a PowerShell tool that automates the complex task of creating Docker volumes and transferring your game files, mods, and plugins with a simple drag-and-drop interface. Jump to Script Setup.
Quick Links:
- 🚀 Asset Importer Script
- Full Guide (below)
- Official KYBER Docs
- KYBER Discord (for support/questions)
- Automated Ingestion: New script handles Linux-native volume creation and file syncing for you.
- Windows Optimized: Step-by-step setup using Docker Desktop + WSL2.
- Error Prevention: Avoids common pitfalls like NTFS mounts and
Activation64.dllpermission errors. - Scalable: Supports mods, plugins, Kyber Module, and multiple server instances.
- Docker-Compose: Example configs included (
docker-compose.yml,.envtemplates)
- Windows 10/11 with Virtualization enabled in BIOS
- Docker Desktop (WSL 2 backend)
- ~180 GB free space temporarily
- KYBER CLI + valid EA/Kyber credentials
This guide allows you to host a Kyber V2 dedicated server on Windows using Docker Desktop bypassing NTFS permission issues by utilizing native Linux volumes without manually setting up a full Linux distribution.
-
Ensure Virtualization is enabled in your BIOS/UEFI.
- Restart your PC and repeatedly tap the key to enter BIOS setup (usually Delete, F2, or F10 — watch the boot screen for the hint).
- Find and turn on the virtualization option (look in Advanced, CPU, or Security menu; it's called Intel VT-x, AMD-V, SVM Mode, or similar — change from Disabled to Enabled).
- Save & exit (usually F10 → Yes), let it reboot — virtualization is now active (check in Task Manager → Performance tab if you want to confirm).
- Can't find it? Google "[your motherboard model] enable virtualization"
-
Enable WSL and Virtual Machine Platform via PowerShell (Admin):
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
-
Install Docker Desktop and ensure it is set to use the WSL 2 engine.
Battlefront II requires ~90GB of space. Because this guide uses Docker Volumes to bypass NTFS errors, you may temporarily need ~180GB (90GB for the download + 90GB for the Volume).
By default, Docker Desktop stores its virtual disk (where volumes live) on your C: drive. If your C: drive is small, move the disk image to a larger drive:
- Open Docker Desktop Settings.
- Navigate to
Resources>Advanced. - Under Disk image location, click
Browseand select a folder on a secondary drive. - Click
Apply. Docker will move your existing data and volumes to the new location.
- Download the Kyber CLI from the Kyber Prerequisites Docs.
- Run the following to link your accounts and generate tokens:
kyber_cli get_token(Save this token. This will be used later asKYBER_TOKEN=<token>)kyber_cli get_ea_token(To verify game ownership)
Caution
EA PASSWORD SPECIAL CHARACTERS WARNING
If your EA password contains special characters (!, @, #, $, %, ^, &, *, etc.), your server will likely fail to start.
Symptoms: Server hangs or fails at the start_server command in logs, even when everything else appears correct.
An error occurred. Please try again later.
AnyhowException(license request failed: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <error code="INVALID_PASSWORD"/>
Solution: Change your EA password to use ONLY:
- Uppercase letters (A-Z)
- Lowercase letters (a-z)
- Numbers (0-9)
Download the game files using the Kyber_CLI.
- Run the download:
kyber_cli download_game -p "C:\Path\To\Game" -t <your_ea_token>- Once the progress reaches 100%, you can cancel the process.
Note: You may want to change the download path if your
C:\drive has limited space.
Alternative: Reuse your existing Battlefront II installation (Recommended if already downloaded the game and it's unmodified)
If you already have Star Wars Battlefront II installed locally (Steam, EA App/Origin, etc.), you can copy directly from there instead of downloading ~90 GB again. However, any modifications to the game files may negatively effect server hosting. If you're unsure it may be better to download a fresh copy.
- Locate your game install folder:
- Steam: Right-click game in library → Manage → Browse local files
- EA App/Origin: Right-click game → Locate installed files Typical paths:
C:\Program Files (x86)\Steam\steamapps\common\STAR WARS Battlefront IIC:\Program Files\EA Games\STAR WARS Battlefront II
The Challenge: Directly mounting Windows folders into Docker causes Activation64.dll errors due to NTFS permission limitations. The Solution: We must move all game files into native Linux Docker Volumes.
-
Download the Script:
- Direct Download: Download all files as ZIP extract into a folder.
- Or clone this repo:
git clone https://github.com/Geeknasty/KYBER-Windows-Hosting-Guide.git
-
Run it:
Method 1 (Simplest - Just Double-Click):
- Double-click the
import-assets.batfile - That's it! The script will launch automatically.
Method 2 (Right-click method):
- Right-click the
import-assets.batfile - Select Open or Run as administrator
- Double-click the
-
Follow the interactive prompts:
- Select what you want to import (Game Files, Mods, Plugins, or Modules)
- Drag and drop your files/folders into the terminal
- Choose or create a Docker volume name
- Wait for the import to complete
Tip
Understanding Docker Volume Names:
When the script asks for a volume name, you choose the name yourself. The script will automatically create the volume if it doesn't exist yet.
Recommended Naming Convention: Use descriptive names that indicate what's stored inside:
- Game files:
swbf2_gamefilesorswbf2_data_vanilla - Mods:
swbf2_mods_hvvchaosorswbf2_mods_reinforcement - Plugins:
swbf2_plugins_hvvplaygroundorswbf2_plugins_custom - Kyber Module:
kyber_module_ver10
Example workflow:
Script: "Enter target volume name:"
You type: swbf2_gamefiles
Script: "Volume doesn't exist. Creating swbf2_gamefiles..."Later in your .env files, you'll reference these exact names. Good naming now saves confusion later!
Important
Create an empty_data volume for servers without mods/plugins:
If you plan to run vanilla servers (no mods or plugins), create an empty volume now:
- Open PowerShell
- Run:
docker volume create empty_data
You'll reference this in your .env files later for servers that don't use mods or plugins.
If you prefer using the CLI manually, follow these steps:
🔍 Manual Docker Commands(Click to expand)
-
Create the volumes:
docker volume create swbf2_data docker volume create empty_data # Example volume for beta ver/10 kyber-module docker volume create kyber_module_ver10# Create mod/plugin volumes as needed: # Example volume for hvv chaos mods docker volume create swbf2_mods_hvv_chaos # Example volume for hvvplayground plugin docker volume create swbf2_plugin_hvvplayground
-
Ingest via Rsync (Game files, Plugins, and Kyber Module):
docker run --rm -v "C:\Path\To\Game:/source" -v swbf2_data:/dest alpine sh -c "apk add --no-cache rsync && rsync -ah --info=progress2 /source/ /dest/"
Note: This may take some time to finish. Depending on the size of data.
This works identically for:
- Game files
- Plugin .kbplugin files (place them in a folder, ingest the folder)
- Kyber Module folder (e.g,
"-v C:\ProgramData\Kyber\Module:/source") -> (e.g,-v kyber_module_ver10:/dest)
-
Ingest via Tar (Mods):
docker run --rm -v "C:\Path\To\Your\ExportedMods\HVV_CHAOS_MODS.tar:/archive.tar" -v swbf2_mods_hvv_chaos:/dest alpine sh -c "tar -xf /archive.tar -C /dest"
Note: This command is different because we need to extract the modcollection.tar into our docker volume.
To ingest the game files into our docker volume we just need to select Option 4 in the Importer Script (then wait for the ~90GB to copy). However, for Mods, Plugins, and Modules. Some extra steps required:
-
In the Kyber Launcher: Options -> Export Collection TAR.
-
Run the Importer Script, select Option 1, and drag the
modcollection.tarfile into the window and press enter. -
Target a volume (e.g.,
swbf2_mods_hvvchaos).
-
Clone Plugin Examples.
-
Zip your chosen plugin (ensure
.jsonis at the root). -
Rename the file extension from
.zipto.kbplugin. -
Ensure the filename matches the plugin name (e.g.,
HVVPlayground.kbplugin) for consistent loading. -
Run the Importer Script, select Option 2, and drag the
<PluginName>.kbpluginfile into the window -
Target a volume (e.g.,
swbf2_plugin_hvvplayground).
- In Kyber Launcher: Settings -> Accounts & Updates.
- Set Target Service to
kyber-moduleand Release Channel tover/beta10. - Join any server to trigger the update.
- Locate the files at
C:\ProgramData\Kyber\Module\. - Run the Importer Script, select Option 3, and drag the
Kyber.dllfile into the window. - The script will ask if you want to switch to the parent
Modulefolder—choose Y. - Target a volume (e.g.,
kyber_module_ver10).
If you do not want to use docker-compose you can use docker run to set env variables and mount volumes to container paths as shown in Dedicated-Server Config Docs
Example docker run method to launch a dedicated Kyber server.
docker run `
-e MAXIMA_CREDENTIALS='<EA-Username>:<password>' `
-e KYBER_TOKEN=<token> `
-e KYBER_SERVER_NAME='<server-name>' `
-e KYBER_SERVER_MAX_PLAYERS=40 `
-e KYBER_MAP_ROTATION='<base64-encoded‐map‐rotation>' `
-e KYBER_MOD_FOLDER=/mnt/battlefront/mods `
-v "<swbf2_data_volume>:/mnt/battlefront" `
-v "<swbf2_mods_gamemode_volume>:/mnt/battlefront/mods" `
-v "./logs/:/root/.local/share/maxima/wine/prefix/drive_c/users/root/AppData/Roaming/ArmchairDevelopers/Kyber/Logs/" `
-it `
ghcr.io/armchairdevelopers/kyber-server:latestTip
The docker run command above is intended to be used with Powershell.
I've also included an example Windows batch file of the docker run command. See example-docker-run.bat
Note
Use -d for detached (background) mode. Remove -it and add -d to run in the background.
Logs will be output to the ./logs/ folder in the same location as your script.
If you would like to control your KYBER servers with YAML configuration files, continue with docker-compose
To deploy the server we will use docker-compose. This will require a docker-compose.yml and a few .env files. We will use the docker-compose.yml as a reusable template, secrets.env to store tokens, and <ServerName>.env to store individual server settings and environment variables. See the Dedicated-Server Config Docs for a list of environment variables.
Tip
Where to Create These Files:
Create a dedicated folder for your server configuration (e.g., C:\KyberServers or C:\Users\YourName\Documents\KyberServers).
Inside this folder, you'll create:
docker-compose.yml(universal template - one file for all servers)secrets.env(your tokens/credentials - shared across servers)- Individual
.envfiles for each server/gamemode (e.g.,hvvchaos.env,vanilla.env)
Example folder structure:
C:\KyberServers\
├── docker-compose.yml
├── secrets.env
├── hvvchaos.env
├── vanilla.env
└── logs\
├── hvvchaos_server\
└── vanilla_server\
Important: Use a text editor like Notepad, Notepad++, or VS Code to edit these files.
- Create a file named
docker-compose.ymlin your project directory. It acts as a universal template. This file is used to start the server. Server logs will be output in the same directory as this file.
Note
What to Edit in docker-compose.yml:
For most users, you only need to change the volume names at the bottom of the file to match the volumes you created earlier.
Find this section at the bottom:
volumes:
swbf2_data: # ← Change this to your game files volume name
external: true
kyber_module_ver10: # ← Change this to your Kyber module volume name
external: trueLeave these alone (they pull from your .env files):
kyber_mods:
external: true
name: ${MOD_VOLUME:-empty_data}
kyber_plugins:
external: true
name: ${PLUGIN_VOLUME:-empty_data}services:
kyber-server:
image: ghcr.io/armchairdevelopers/kyber-server:latest
container_name: ${CONTAINER_NAME:-kyber_server}
env_file:
- secrets.env
network_mode: "host"
privileged: true
command: ["--module-branch=ver/beta10", "--module-path=/root/.local/share/kyber/module"]
environment:
- KYBER_SERVER_NAME=${SERVER_NAME:-}
- KYBER_SERVER_PASSWORD=${SERVER_PASSWORD:-}
- KYBER_SERVER_MAX_PLAYERS=${SERVER_MAX_PLAYERS:-}
- KYBER_MAP_ROTATION=${SERVER_MAP_ROTATION:-}
- KYBER_SERVER_DESCRIPTION=${SERVER_DESCRIPTION:-}
- KYBER_MODULE_CHANNEL=ver/beta10
- KYBER_LOG_LEVEL=info
# Short-form variables: Only passed to container if defined in .env
- KYBER_MOD_FOLDER
- KYBER_SERVER_PLUGINS_PATH
volumes:
- swbf2_data:/mnt/battlefront
- kyber_mods:/mnt/battlefront/mods
- kyber_plugins:/mnt/plugins
# Mounting ver/10 Kyber.dll
- kyber_module_ver10:/root/.local/share/kyber/module/
# Mount the server logs (will output in same directory as docker-compose.yml /Logs/)
- ./logs/${CONTAINER_NAME}:/root/.local/share/maxima/wine/prefix/drive_c/users/root/AppData/Roaming/ArmchairDevelopers/Kyber/Logs/
restart: unless-stopped
volumes:
swbf2_data:
external: true
kyber_module_ver10:
external: true
kyber_mods:
external: true
name: ${MOD_VOLUME:-empty_data}
kyber_plugins:
external: true
name: ${PLUGIN_VOLUME:-empty_data}- Create
secrets.envin the same directory as yourdocker-compose.yml. This keeps your<token>and<EA-Username>:<password>separate and organized. We will loadsecrets.envautomatically by listing it in ourdocker-compose.yml.
Important
Editing Placeholder Values:
When filling in the .env files:
- Remove the
<and>symbols around placeholders - Keep single quotes
'around values that contain spaces or special characters - Replace
<token>exactly - no brackets left behind
Examples:
# WRONG - Don't do this:
KYBER_TOKEN=<abc123xyz>
MAXIMA_CREDENTIALS=email:password
# CORRECT - Do this:
KYBER_TOKEN=abc123xyz
MAXIMA_CREDENTIALS='email:password'Why the quotes?
MAXIMA_CREDENTIALS='email:password'- Quotes ensure the colon:isn't misinterpretedSERVER_NAME='My Cool Server'- Quotes preserve spacesKYBER_TOKEN=abc123- No quotes needed (no spaces or special characters)
Use kyber_cli get_token to get your KYBER_TOKEN value.
# secrets.env
# Secret Stuff
KYBER_TOKEN=abc123xyz456
MAXIMA_CREDENTIALS='your-email@example.com:YourPassword123'Caution
Remember: If your EA password has special characters (!, @, #, etc.), the server may fail to start. See the warning in Prerequisites Section 3.
- Now in the same directory as your
docker-compose.ymlwe can create files for individual servers or gamemodes named<ServerName>.env(e.g.,hvvchaos.env,hvv6v6.env,coopBFPlusXL.env. etc) This keeps your different game mode settings organized.
📸 VIEW SCREENSHOT: How to get your base64-encoded‐map‐rotation string (Click to expand) 🚨
Explanation: In the Kyber Launcher → Host Tab → Export → Copy To Clipboard the base64 string.
Paste it into your.envfile wrapped in single quotes like this:
SERVER_MAP_ROTATION='WyJzdXBfZ2Vvbm9zaXMiLCJzdXBfY2FzY2FkZSJd'
Example 1: Server with mods and plugins
# hvvchaos.env
# Server Settings
COMPOSE_PROJECT_NAME=hvvchaos
CONTAINER_NAME=hvvchaos_server
SERVER_NAME='HVV Chaos Playground'
SERVER_MAX_PLAYERS=40
SERVER_DESCRIPTION='A longer UTF-8 description (≤256 characters) for server rules or links.'
SERVER_MAP_ROTATION='WyJzdXBfZ2Vvbm9zaXMiLCJzdXBfY2FzY2FkZSJd'
# Pick which Mods and Plugins you want (use your volume names from Step 2)
MOD_VOLUME=swbf2_mods_hvv_chaos
PLUGIN_VOLUME=swbf2_plugins_hvvplayground
# Copy these 2 lines into all .env files that use mods/plugins
KYBER_MOD_FOLDER=/mnt/battlefront/mods
KYBER_SERVER_PLUGINS_PATH=/mnt/pluginsExample 2: Vanilla server (no mods or plugins)
# vanilla.env
# Server Settings
COMPOSE_PROJECT_NAME=vanillahvv
CONTAINER_NAME=vanillahvv_server
SERVER_NAME='Vanilla HvV Server'
SERVER_MAX_PLAYERS=12
SERVER_DESCRIPTION='Vanilla HvV Map Rotation Test Server'
SERVER_MAP_ROTATION='WyJob3RoX2hlcm9fdnNfdmlsbGFpbiJd'
SERVER_PASSWORD=1234
# For vanilla servers with no mods/plugins, use empty_data
MOD_VOLUME=empty_data
PLUGIN_VOLUME=empty_data
# Optional: Comment these out or leave them - they're ignored when using empty_data
# KYBER_MOD_FOLDER=/mnt/battlefront/mods
# KYBER_SERVER_PLUGINS_PATH=/mnt/pluginsRun the server by specifying only the per-server/gamemode .env file (secrets.env loads automatically via docker-compose.yml):
- Open PowerShell (or Command Prompt) in your server folder
- Run the command for your server:
docker-compose --env-file hvvchaos.env up -dNote
Use -d for detached (background) mode. Remove -d to see logs directly in the terminal.
Checking Container Status:
Option 1: Docker Desktop (Easiest for beginners)
- Open Docker Desktop
- Click "Containers" in the left sidebar
- Find your container (e.g.,
hvvchaos_server) - Status should eventually show "Running" with a green dot
Option 2: Command Line
docker psLook for your container name - it should show "Up" status.
Logs help you verify the server started correctly and troubleshoot issues.
Option 1: Docker Desktop (Recommended for beginners)
- Open Docker Desktop → Containers
- Click on your container name
- Click the "Logs" tab
- Scroll to see recent activity
Option 2: Log Files
Check the logs/ folder created next to your docker-compose.yml file:
C:\KyberServers\logs\hvvchaos_server\Tip
What Healthy Logs Look Like:
✅ Good signs:
- Logs show progression past
start_servercommand - You see "Server started" or similar messages
- Server appears in Kyber Launcher → Host tab → "Your Hosted Servers"
- No repeated errors or crash loops
DISPLAYenvironment variable warnings- Wine display/headless errors
❌ Problem signs:
- Stuck at or failing right after
start_servercommand - Repeated crash/restart loops
- Authentication errors: license request failed:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <error code="INVALID_PASSWORD"/>
📸 VIEW SCREENSHOTS: Healthy logs vs. Problem logs (Click to expand)
In Kyber Launcher:
- Open Kyber Launcher
- Go to the "Host" tab
- Look in "Your Hosted Servers" section
- Your server should appear in the list
Warning
Server fails or hangs at start_server command:
This is the most common failure point. Usually caused by:
- EA password with special characters → See Prerequisites Section 3
- Incorrect KYBER_TOKEN → Regenerate with
kyber_cli get_tokenand copy exactly - Typo in credentials → Double-check
secrets.envfor copy/paste errors - Wrong volume names → Verify volume names in
docker-compose.ymlmatch your created volumes
How to fix:
- Stop the server:
docker compose down - Fix the issue in your
.envfiles - Restart:
docker-compose --env-file yourserver.env up -d
Use Docker Desktop Container tab
or
# Stop and remove container
docker compose --env-file yourserver.env down
# Stop but keep container (can restart later)
docker compose --env-file yourserver.env stopTo run different gamemodes/servers simultaneously:
docker-compose --env-file hvvchaos.env up -d
docker-compose --env-file vanilla.env up -d
Each server will have its own container, logs folder, and appear separately in the Kyber Launcher.
Tip
For your first server, start simple:
- Create a vanilla server (no mods/plugins) using
empty_datavolumes - Use a simple 2-3 map rotation
- Verify it works and appears in Kyber Launcher
- Once successful, create additional servers with mods/plugins
This isolates any configuration issues and builds your confidence!
- The
.examplefiles in this repository serve as templates. - Copy them and remove the
.examplesuffix:
cp secrets.env.example secrets.env
cp vanilla.env.example vanilla.env- Fill in your actual values (remember to remove
< >brackets!) - The
.gitignorefile prevents committing your real.envfiles with credentials.
- Official KYBER Documentation
- KYBER Discord Community - Get help from the community
- Docker Desktop Documentation
- Report issues with this guide
This project is licensed under the MIT License - see the LICENSE file for details.










