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.
Config file
Section titled “Config file”DiscoPanel looks for config.yaml in these locations (in order):
- Path passed via
-configflag - Current working directory (
./) ./config//etc/discopanel/
If no config file is found, defaults are used.
Environment variables
Section titled “Environment variables”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:
DISCOPANEL_SERVER_PORT="8080"The sections that matter
Section titled “The sections that matter”Most installs only ever touch a few of these:
| Section | What it controls |
|---|---|
server | The port and address the panel’s web UI listens on. |
storage | Where server files, backups, and temp files live on disk. |
proxy | The Minecraft proxy - domain, ports, and TLS. See Proxy & Domains and HTTPS & Certificates. |
auth | Login: local accounts, self-registration, and OIDC providers. |
minecraft.global_config | Defaults applied to every new server. Each server’s Properties tab overrides these per server. |
module | Modules: the host port range they’re assigned from, and doctor_enabled to turn the built-in Doctor off. |
docker | Advanced: 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). |
All options
Section titled “All options”# 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 itselfserver: port: "8080" host: "0.0.0.0" read_header_timeout: 15 idle_timeout: 60 user_agent: "DiscoPanel/1.0 (github.com/discohaus/discopanel)"
# Database configurationdatabase: path: "./data/discopanel.db" max_connections: 25 max_idle_conns: 5 conn_max_lifetime: 300 auto_migrate: true # Apply pending migrations on startup
# Docker configurationdocker: 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 configurationstorage: data_dir: "./data" backup_dir: "./backups" temp_dir: "./tmp"
# Authentication configurationauth: 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 configurationupload: 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 configurationmodule: enabled: true port_range_min: 8100 port_range_max: 8199 doctor_enabled: true # Built-in Doctor module
# Proxy configuration - ENABLE THIS FOR MINECRAFT ROUTINGproxy: 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 defaultsminecraft: 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 configurationlogging: enabled: true file_path: "./data/discopanel.log" max_size: 10 max_backups: 5 max_age: 30 compress: true