A Flask control panel for running Nuclear Option dedicated servers. The recommended hosting path is Linux x86_64 with Docker. macOS is useful for development and Docker syntax checks. Windows process hosting is kept as a legacy/local option.
The panel binds to 127.0.0.1 by default. Do not put the Flask panel directly on the public internet.
- Linux server: use Docker. This is the intended public hosting path.
- macOS: run the panel locally for development, or use Docker Desktop for dry-runs/build checks.
- Windows: use the legacy launchers for local/process hosting.
Public game hosting still needs normal game-server networking: forward/open the game UDP port and query UDP port. Keep the panel HTTP port and command TCP port private unless you have a VPN, Zero Trust tunnel, or hardened reverse proxy in front of them.
Use a current Debian/Ubuntu x86_64 host with Docker Engine and the Docker Compose plugin.
cp .env.example .envEdit .env before the first hosted start:
PANEL_BOOTSTRAP_USERNAME=owner
PANEL_BOOTSTRAP_PASSWORD=replace-with-a-long-random-password
SERVER_NAME=Public Server 1
GAME_PORT=7777
QUERY_PORT=7778
COMMAND_PORT=7779
ENABLE_COMMAND_PORT=false
Build the images:
docker compose -f docker/compose/base.yml -f docker/compose/linux.yml buildInstall or update the game files into the persistent server volume:
docker compose -f docker/compose/base.yml -f docker/compose/linux.yml run --rm nuclear-option-server updateStart the panel:
docker compose -f docker/compose/base.yml -f docker/compose/linux.yml up -d panelStart the example game server:
docker compose -f docker/compose/base.yml -f docker/compose/linux.yml --profile servers up -d nuclear-option-serverOpen the panel from the host or through your private admin path:
http://127.0.0.1:5000
Useful Linux Docker commands:
docker compose -f docker/compose/base.yml -f docker/compose/linux.yml logs --tail=200 panel
docker compose -f docker/compose/base.yml -f docker/compose/linux.yml logs --tail=200 nuclear-option-server
docker compose -f docker/compose/base.yml -f docker/compose/linux.yml run --rm nuclear-option-server update
docker compose -f docker/compose/base.yml -f docker/compose/linux.yml downMore detail: Linux Docker Quickstart.
macOS can run the panel UI and tests. It cannot natively validate NuclearOptionServer.x86_64; real server validation needs Linux x86_64.
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python -m pip install -e .
python -m server_panel.appOpen:
http://127.0.0.1:5000
With Docker Desktop on macOS, you can still check Compose and build paths:
docker compose -f docker/compose/base.yml -f docker/compose/macos.yml config --quiet
SKIP_STEAMCMD=true docker compose -f docker/compose/base.yml -f docker/compose/macos.yml build nuclear-option-server
docker build -f docker/panel/Dockerfile -t nuclear-option-panel:local .Dry-run validation:
scripts/validate_docker_server.sh --dry-run --platform linux/amd64
scripts/validate_nuclear_option_linux_server.sh --dry-runMore detail: macOS Docker Validation.
Windows process hosting is still available for local/legacy use. For public hosted servers, prefer Linux Docker.
Install Python 3, then run one of the launchers from the repository root:
start-panel.bat
or:
.\Start-Panel.ps1The launchers self-elevate for firewall rule automation, install Python dependencies, set PYTHONPATH to src, and start:
python -m server_panel.appOpen:
http://127.0.0.1:5000
On first run the panel creates a bootstrap owner account and forces a password change. For hosted use, set PANEL_BOOTSTRAP_USERNAME and PANEL_BOOTSTRAP_PASSWORD before the first start. The Docker path reads these from .env.
Real validation should be done on Linux x86_64 with network access to SteamCMD:
./scripts/validate_nuclear_option_linux_server.sh --verbose --no-cache
./scripts/validate_docker_server.sh --platform linux/amd64 --verbose --no-cacheReports are written under:
data/validation/
Related docs:
python -m pip install -r requirements-dev.txt
python -m pip install -e .
python -m pytest
ruff check src tests
ruff format --check src tests
bandit -q -c pyproject.toml -r src/server_panel/config src/server_panel/runtime src/server_panel/security src/server_panel/services src/server_panel/storageCurrent local validation notes are in Testing Status.
src/server_panel/: panel source packagedocker/panel/Dockerfile: panel imagedocker/nuclear-option-server/: dedicated server imagedocker/compose/base.yml: base Compose stackdocker/compose/linux.yml: Linux hosting overlaydocker/compose/macos.yml: macOS validation overlayscripts/: validation scriptsdocs/: deeper docs and investigation notes