Skip to content

Configuration

DiscoPanel can be configured via a YAML config file, environment variables, or both. Environment variables take precedence over the config file.

For Minecraft server-specific configuration (server.properties, JVM flags, mod loader settings, etc.), see the itzg/minecraft-server docs.

DiscoPanel looks for config.yaml in these locations (in order):

  1. Path passed via -config flag
  2. Current working directory (./)
  3. ./config/
  4. /etc/discopanel/

If no config file is found, defaults are used.

Every config option can be set via an environment variable with the DISCOPANEL_ prefix. Nested keys are separated by underscores:

server:
port: "8080"

is equivalent to:

Terminal window
DISCOPANEL_SERVER_PORT="8080"
config.example.yaml
# DiscoPanel Configuration File
# This file contains all configuration options for DiscoPanel
#
# These can all be set via env, like we do in our docker compose example(s). For example:
#
# server:
# port: "8080"
#
# - is the same as -
#
# DISCOPANEL_SERVER_PORT="8080"
# Server configuration for the DiscoPanel application itself
server:
port: "8080"
host: "0.0.0.0"
read_timeout: 15
write_timeout: 15
idle_timeout: 60
user_agent: "DiscoPanel/1.0 (github.com/nickheyer/discopanel)"
# Database configuration
database:
path: "./data/discopanel.db"
max_connections: 25
max_idle_conns: 5
conn_max_lifetime: 300
# Docker configuration
docker:
host: "unix:///var/run/docker.sock"
version: ""
network_name: "discopanel-network"
registry_url: ""
sync_interval: 5 # Seconds between docker state sync
# Storage configuration
storage:
data_dir: "./data"
backup_dir: "./backups"
temp_dir: "./tmp"
max_upload_size: 524288000 # 500MB in bytes
# Authentication configuration
auth:
session_timeout: 86400 # default: 24 hours
anonymous_access: false # Allow unauthenticated access
jwt_secret: "" # Leave empty to auto-generate
# Local authentication (login via discopanel web ui)
local:
enabled: true # Enable local
allow_registration: false # Allow new users to register themselves via login
# OIDC authentication (login via OIDC-compliant provider, ie: keycloak, authelia, authentik, etc.)
oidc:
enabled: false
issuer_uri: "" # OIDC Provider url (ie: http://authelia.local:9091, http://localhost:8180/realms/discopanel, etc.)
client_id: "" # Client ID registered with your OIDC (like "discopanel")
client_secret: "" # Client secret registered with your OIDC
redirect_url: "" # Where OIDC sends users after login (ie: "http://localhost:8080/api/v1/auth/oidc/callback")
scopes: ["openid", "profile", "email"]
role_claim: "groups" # The token claim that contains the user's groups (usually "groups")
role_mapping: {} # Mapping to groups if they arent the same name as discopanels (ie: {"my-admins": "admin", "my-users": "user"})
skip_tls_verify: false # Skip TLS certificate verification (for self-signed certs)
# Upload configuration
upload:
session_ttl: 240 # Upload session time-to-live in minutes (default: 4 hours)
default_chunk_size: 5242880 # 5MB default chunk size (client can override)
max_chunk_size: 10485760 # 10MB max chunk size (server enforced)
max_upload_size: 0 # Max total upload size in bytes (0 = unlimited)
# Module configuration
module:
enabled: true
port_range_min: 8100
port_range_max: 8199
# Proxy configuration - ENABLE THIS FOR MINECRAFT ROUTING
proxy:
enabled: true
base_url: "mc.example.com" # Your domain for Minecraft servers
listen_port: 25565 # Primary port to listen on (can also use 443)
listen_ports: [25565] # Multiple ports to listen on (listen_port will be added if not present)
port_range_min: 25565
port_range_max: 25665
# Example usage:
# With proxy enabled and base_url set to "mc.example.com":
# - Server named "survival" → Connect via: survival.mc.example.com:25565
# - Server named "creative" → Connect via: creative.mc.example.com:25565
# - Server named "modded" → Connect via: modded.mc.example.com:25565
#
# All servers use the same port (25565) and are routed based on hostname!
#
# DNS Setup Required:
# Add a wildcard DNS record: *.mc.example.com → Your server's IP
# Or add individual A records for each server subdomain
# Minecraft server global configuration defaults
minecraft:
reset_global: false
global_config: # Specifying any of these settings will override the global config default when it is first made, or existing if `reset_global` is `true`
# JVM Configuration
uid: 1000
gid: 1000
memory: "1G"
initMemory: "1G"
maxMemory: "1G"
tz: "UTC"
enableRollingLogs: false
enableJmx: false
jmxHost: ""
useAikarFlags: false
useMeowiceFlags: false
useMeowiceGraalvmFlags: true
jvmOpts: ""
jvmXxOpts: ""
jvmDdOpts: ""
extraArgs: ""
logTimestamp: false
# Server Configuration
type: "VANILLA"
eula: "TRUE"
version: "LATEST"
motd: ""
difficulty: "easy"
icon: ""
overrideIcon: false
maxPlayers: 20
maxWorldSize: 0
allowNether: true
announcePlayerAchievements: true
enableCommandBlock: false
forceGamemode: false
generateStructures: true
hardcore: false
snooperEnabled: true
maxBuildHeight: 256
spawnAnimals: true
spawnMonsters: true
spawnNpcs: true
spawnProtection: 0
viewDistance: 0
seed: ""
mode: "survival"
pvp: true
levelType: "minecraft:default"
generatorSettings: ""
level: "world"
onlineMode: true
allowFlight: false
serverName: ""
serverPort: 0
playerIdleTimeout: 0
syncChunkWrites: false
enableStatus: false
entityBroadcastRangePercentage: 0
functionPermissionLevel: 0
networkCompressionThreshold: 0
opPermissionLevel: 0
preventProxyConnections: false
useNativeTransport: false
simulationDistance: 0
execDirectly: false
stopServerAnnounceDelay: 0
proxy: ""
console: true
gui: true
stopDuration: 60
setupOnly: false
useFlareFlags: false
useSimdFlags: false
# Custom Resource Pack
resourcePack: ""
resourcePackSha1: ""
resourcePackEnforce: false
# Whitelist
enableWhitelist: false
whitelist: ""
whitelistFile: ""
overrideWhitelist: false
# RCON
enableRcon: true
rconPassword: "" # MUST be changed for security
rconPort: 25575
broadcastRconToOps: false
rconCmdsStartup: ""
rconCmdsOnConnect: ""
rconCmdsFirstConnect: ""
rconCmdsOnDisconnect: ""
rconCmdsLastDisconnect: ""
# Auto-Pause
enableAutopause: false
autopauseTimeoutEst: 3600
autopauseTimeoutInit: 600
autopauseTimeoutKn: 120
autopausePeriod: 10
autopauseKnockInterface: "eth0"
debugAutopause: false
# Auto-Stop
enableAutostop: false
autostopTimeoutEst: 3600
autostopTimeoutInit: 1800
autostopPeriod: 10
debugAutostop: false
# Forge Configuration
forgeVersion: ""
forgeInstaller: ""
forgeInstallerUrl: ""
# CurseForge Configuration
cfApiKey: ""
cfApiKeyFile: ""
cfPageUrl: ""
cfSlug: ""
cfFileId: ""
cfModpackZip: ""
cfFilenameMatcher: ""
cfExcludeIncludeFile: ""
cfExcludeMods: ""
cfForceIncludeMods: ""
cfForceSynchronize: false
cfSetLevelFrom: ""
cfParallelDownloads: 4
cfOverridesSkipExisting: false
cfForceReinstallModloader: false
# Modrinth Configuration
modrinthModpack: ""
modrinthModpackVersionType: "release"
modrinthVersion: ""
modrinthLoader: ""
modrinthIgnoreMissingFiles: ""
modrinthExcludeFiles: ""
modrinthForceIncludeFiles: ""
modrinthForceSynchronize: false
modrinthDefaultExcludeIncludes: ""
modrinthOverridesExclusions: ""
modrinthProjects: ""
modrinthDownloadDependencies: "none"
modrinthProjectsDefaultVersionType: "release"
versionFromModrinthProjects: false
# Custom Server Configuration
customServer: ""
customJarExec: ""
# Query Protocol Configuration
enableQuery: false
queryPort: 25565
# Advanced Server Properties
serverPropertiesEscapeUnicode: false
acceptsTransfers: false
broadcastConsoleToOps: true
bugReportLink: ""
enforceSecureProfile: true
hideOnlinePlayers: false
logIps: true
maxChainedNeighborUpdates: 1000000
pauseWhenEmptySeconds: 0
rateLimit: 0
regionFileCompression: "deflate"
resourcePackId: ""
resourcePackPrompt: ""
statusHeartbeatInterval: 0
customServerProperties: ""
# Ops / Admins
userApiProvider: "playerdb"
ops: ""
opsFile: ""
existingOpsFile: "SYNC_FILE_MERGE_LIST"
# Additional Whitelist Options
existingWhitelistFile: "SYNC_FILE_MERGE_LIST"
enforceWhitelist: false
# Logging configuration
logging:
enabled: true
file_path: "./data/discopanel.log"
max_size: 10
max_backups: 5
max_age: 30
compress: true