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.

This page covers the panel’s own settings. For per-server settings like server.properties, memory, mod loaders and modpacks, use each server’s Properties tab in the UI. The guides on server software, modpacks and performance cover those.

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"

Most installs only ever touch a few of these:

SectionWhat it controls
serverThe port and address the panel’s web UI listens on.
storageWhere server files, backups, and temp files live on disk.
proxyThe Minecraft proxy - domain, ports, and TLS. See Proxy & Domains and HTTPS & Certificates.
authLogin: local accounts, self-registration, and OIDC providers.
minecraft.global_configDefaults applied to every new server. Each server’s Properties tab overrides these per server.
moduleModules: the host port range they’re assigned from, and doctor_enabled to turn the built-in Doctor off.
dockerAdvanced: the Docker socket, container labels, runtime_image to pull server images from your own registry mirror, and agent_url if servers need a specific address to reach the panel for live telemetry (it’s auto-detected otherwise).
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_header_timeout: 15
idle_timeout: 60
user_agent: "DiscoPanel/1.0 (github.com/discohaus/discopanel)"
# Database configuration
database:
path: "./data/discopanel.db"
max_connections: 25
max_idle_conns: 5
conn_max_lifetime: 300
auto_migrate: true # Apply pending migrations on startup
# Docker configuration
docker:
host: "unix:///var/run/docker.sock"
version: ""
network_name: "discopanel-network"
runtime_image: "" # Overrides the runtime image repo, default ghcr.io/discohaus/discoruntime
agent_url: "" # Panel URL for container telemetry, auto detected when empty
dns: "" # Custom DNS server for containers (empty = docker default)
sync_interval: 5 # Seconds between docker state sync
# Can be configure like labels: {"your.label.key": "your_label_value", "other.label.key": "other_label_value"}
# or
# labels:
# your.label.key: "your_label_value"
# other.label.key: "other_label_value"
labels: '{ }'
# Storage configuration
storage:
data_dir: "./data"
backup_dir: "./backups"
temp_dir: "./tmp"
# 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"})
reject_unmapped: false # Deny login when no group maps to a role
required_claim: "" # Claim required to log in, ie "groups"
required_values: [] # Values required in that claim (any match allows login)
extra_claims_url: "" # Endpoint queried for additional claims like userinfo
extra_claims_key: "" # JSON key holding the claim list in that response
extra_claims_name: "" # Claim name the fetched values are merged under
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
doctor_enabled: true # Built-in Doctor module
# Proxy configuration - ENABLE THIS FOR MINECRAFT ROUTING
proxy:
enabled: true
public_ip: "" # Public address for hostname suggestions
base_url: "" # Base domain seed, saved network settings win
listen_port: 25565 # First run default listener port (can also use 443)
port_range_min: 25565
trusted_edge: false # For external proxy headers: X-Forwarded-Proto / X-Forwarded-For
# Optional TLS for the panel ui
# tls:
# certificates:
# - cert_file: /etc/discopanel/certs/example.com.crt
# key_file: /etc/discopanel/certs/example.com.key
# 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
initMemory: "1G"
maxMemory: "1G"
tz: "UTC"
enableJmx: false
jmxHost: ""
enableAgent: true # DiscoPanel telemetry agent attached to server JVM
useAikarFlags: false
useMeowiceFlags: false
useFlareFlags: false
useSimdFlags: false
useZgcFlags: false # Use generational ZGC instead of G1
jvmOpts: ""
jvmXxOpts: ""
jvmDdOpts: ""
extraArgs: ""
# Server Configuration
eula: "TRUE"
forceProvision: false # Forces reprovision on next start then clears
motd: ""
offlineMotd: "" # MOTD line shown while server is offline
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
stopServerAnnounceDelay: 0
stopDuration: 60
# Custom Resource Pack
resourcePack: ""
resourcePackSha1: ""
resourcePackEnforce: false
# Whitelist
enableWhitelist: false
whitelist: ""
overrideWhitelist: false
# RCON
enableRcon: true
rconPassword: "" # MUST be changed for security
rconPort: 25575
broadcastRconToOps: false
rconCmdsStartup: ""
rconCmdsOnConnect: ""
rconCmdsFirstConnect: ""
rconCmdsOnDisconnect: ""
rconCmdsLastDisconnect: ""
# Auto-Pause
enableAutopause: false # Requires the server to be behind the DiscoPanel proxy
autopauseTimeoutEst: 3600
autopauseTimeoutInit: 600
# Auto-Stop
enableAutostop: false
autostopTimeoutEst: 3600 # Timers restart on autopause
autostopTimeoutInit: 1800
# Proxy (requires proxy enabled)
enableWakeOnConnect: false # Joining a stopped server starts it up
enableOfflineStatus: false # Answer status pings while server is stopped
enableProxyProtocol: false # Send PROXY protocol v2 headers to server
proxyPreserveHostname: false # Forward original client hostname to server
# Forge Configuration
forgeVersion: ""
forgeInstaller: ""
forgeInstallerUrl: ""
# CurseForge Configuration
cfApiKey: ""
cfPageUrl: ""
cfSlug: ""
cfFileId: ""
cfModpackZip: ""
cfExcludeMods: ""
cfForceIncludeMods: ""
# Modrinth Configuration
modrinthModpack: ""
modrinthModpackVersionType: "release"
modrinthVersion: ""
modrinthLoader: ""
modrinthExcludeFiles: ""
modrinthForceIncludeFiles: ""
modrinthProjects: ""
modrinthDownloadDependencies: "none"
modrinthProjectsDefaultVersionType: "release"
# 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: ""
# Management Server
managementServerEnabled: false # Enable management server interface
managementServerHost: "0.0.0.0" # Host address for management server
managementServerPort: 0 # Port for management server
managementServerSecret: "" # Shared secret for management server auth
managementServerTlsEnabled: false # Enable TLS for management server
managementServerTlsKeystore: "" # Path to TLS keystore
managementServerTlsKeystorePassword: "" # Password for TLS keystore
managementServerAllowedOrigins: "" # Allowed CORS origins for management server
# Ops / Admins
ops: ""
# Additional Whitelist Options
enforceWhitelist: false
# Doctor
doctorEnabled: true # Doctor watches this server and reports findings
doctorMode: "repair" # Repair crashes or observe and report only
doctorInstallDeps: true # Doctor may download missing mod dependencies
# Logging configuration
logging:
enabled: true
file_path: "./data/discopanel.log"
max_size: 10
max_backups: 5
max_age: 30
compress: true