SUPPORTED VERSIONS
1.8 - 26.1
1.8 - 26.1
FEATURES
COMMANDS
PERMISSIONS
REQUIREMENTS
COMPATIBILITY
YAML:
# How this server participates in maintenance:
# AUTO - detect it: proxy forwarding on -> BACKEND, otherwise STANDALONE
# STANDALONE - a single server with no proxy; commands take no <server> argument
# BACKEND - a server behind a Bungee/Velocity proxy; commands target a <server|all>
network-mode: AUTO
# This server's name (its maintenance scope). REQUIRED in BACKEND mode and must match the name
# the proxy registers for it. Optional in STANDALONE.
server-name: ""
# Durable storage - REQUIRED in every mode (the single source of truth shared by every node).
# Backed by HikariCP. The bundled driver speaks the MySQL wire protocol, so it works with both
# MySQL and MariaDB servers.
mysql:
host: "127.0.0.1" # database hostname or IP
port: 3306 # database port (MySQL/MariaDB default: 3306)
database: "minecraft" # schema/database name (must already exist)
username: "root" # login user (needs CREATE TABLE + read/write here)
password: "" # login password (leave blank if none)
use-ssl: false # set true to connect over TLS/SSL
driver-class: "org.mariadb.jdbc.Driver" # JDBC driver; the URL scheme (mysql/mariadb) is derived from it
# HikariCP connection pool. Times are in milliseconds; the defaults suit a small admin workload.
pool:
maximum-pool-size: 6 # max open connections
minimum-idle: 1 # idle connections kept ready
connection-timeout: 8000 # max wait to borrow a connection before failing (min 250)
idle-timeout: 600000 # close a connection after it sits idle this long (0 = never)
max-lifetime: 1800000 # retire a connection at this age (keep below the DB wait_timeout)
keepalive-time: 0 # ping idle connections this often to keep them alive (0 = off)
# Optional Redis pub/sub accelerator - propagates every change instantly to the other nodes.
# When disabled (or briefly unreachable) nodes still converge via the MySQL poll below.
redis:
enabled: false # set true to turn on instant Redis propagation
host: "127.0.0.1" # Redis hostname or IP
port: 6379 # Redis port (default: 6379)
username: "default" # Redis user; "default" = the built-in user (works on every Redis); set a custom ACL user only on Redis 6+
password: "" # Redis AUTH password (leave blank if none)
timeout-millis: 8000 # connect/socket timeout in milliseconds
sync-poll-interval-seconds: 5 # how often each node reconciles from MySQL (the Redis-off fallback)
# Command identity. First label of each list is the suggested one.
command:
name: "maintenance"
aliases: ["manu", "manutencao", "maint"]
permission: "maintenance.admin"
bypass-permission: "maintenance.bypass"
labels:
enable: ["on", "true", "enable"]
disable: ["off", "false", "disable"]
add: ["add", "adicionar"]
remove: ["rem", "remove", "remover"]
status: ["status", "list"]
help: ["help"]
reload: ["reload"]
enforcement:
deny-login: true # block non-whitelisted logins under maintenance
kick-on-change: true # kick non-whitelisted players when maintenance turns on
# Track whitelisted players by their Mojang UUID so a name change never drops them. Names are kept
# for display and still match, so this is safe to toggle anytime. false = name-only (legacy).
track-by-uuid: true
# Console commands run when this server enters/leaves maintenance. Write them without a leading "/".
commands:
on-enable: []
on-disable: []
# Force a maintenance MOTD onto the server list, overriding other MOTD plugins, while this server
# is in maintenance. Supports & and hex colors.
motd:
enabled: true
line-1: "&c&lMAINTENANCE"
line-2: "&7We will be right back!"
# Optional Discord webhook: announce when a server (or the whole network) enters/leaves maintenance.
# Sent exactly once, by the node where the command was run. {scope} = the affected server name, or
# 'network-label' below for global (all) maintenance.
discord:
enabled: false
webhook-url: ""
# Which transitions to announce (enable one, both, or neither).
notify:
on-enable: true # send when maintenance is turned ON
on-disable: true # send when maintenance is turned OFF
# Webhook identity (blank = keep the webhook's own defaults).
webhook:
username: "" # name shown as the message author
avatar-url: "" # avatar shown next to the message
network-label: "the network" # {scope} value for network-wide (all) maintenance
# A full, configurable embed per direction. Leave any field blank/empty to omit it.
# {scope} works in every text field (content, title, description, author, footer, fields).
embeds:
enable: # ===== maintenance STARTED =====
content: "" # plain text above the embed (e.g. a role ping like <@&ID>)
color: "#E74C3C" # left-bar color, #RRGGBB (red)
title: "Maintenance started"
title-url: "" # makes the title a clickable link
description: "**{scope}** is now under maintenance."
timestamp: true # show the current time at the bottom
author:
name: ""
url: ""
icon-url: "" # small icon left of the author name
thumbnail-url: "" # small image in the top-right corner
image-url: "" # large image at the bottom
footer:
text: "CosmicMaintenance"
icon-url: ""
fields: # add named entries; 'name' and 'value' are required, 'inline' optional
status:
name: "Status"
value: "We'll be back soon"
inline: false
disable: # ===== maintenance ENDED =====
content: ""
color: "#2ECC71" # green
title: "Maintenance ended"
title-url: ""
description: "**{scope}** is back online."
timestamp: true
author:
name: ""
url: ""
icon-url: ""
thumbnail-url: ""
image-url: ""
footer:
text: "CosmicMaintenance"
icon-url: ""
fields: {}
YAML:
# CosmicMaintenance messages. A missing/blank key (for your mode) stops startup.
# Colors: legacy '&' and hex (&#RRGGBB or <#RRGGBB>).
# Placeholders: {prefix} {cmd} {server} {player} {lp_prefix} {lp_suffix}
# Injected wherever you write {prefix} in a message below.
prefix: "&8[&bMaintenance&8]&r "
usage-proxy: "{prefix}&cUsage: &f/{cmd} <on|off|add|rem|status|help|reload> <server|all> [player]"
usage-standalone: "{prefix}&cUsage: &f/{cmd} <on|off|add|rem|status|help|reload> [player]"
no-permission: "{prefix}&cYou don't have permission to use this command."
server-not-found: "{prefix}&cThat server does not exist."
error-storage: "{prefix}&cA database error occurred — the change was not applied."
reloaded: "{prefix}&aCosmicMaintenance configuration reloaded."
already-enabled: "{prefix}&cMaintenance is already enabled for that server."
already-disabled: "{prefix}&cMaintenance is already disabled for that server."
# Help screen (/{cmd} help)
help:
- "&b&lMAINTENANCE &8» &7Commands"
- "&f/{cmd} on|off <server|all> &8- &7Toggle maintenance"
- "&f/{cmd} add|rem <player> <server|all> &8- &7Manage the whitelist"
- "&f/{cmd} status &8- &7Show the current state"
- "&f/{cmd} help &8- &7Show this help"
- "&f/{cmd} reload &8- &7Reload the configuration"
# Proxy/backend (with {server})
enabled-server: "{prefix}&eMaintenance for &f{server}&e has been &aenabled&e."
disabled-server: "{prefix}&eMaintenance for &f{server}&e has been &cdisabled&e."
enabled-all: "{prefix}&eMaintenance for &fthe whole network&e has been &aenabled&e."
disabled-all: "{prefix}&eMaintenance for &fthe whole network&e has been &cdisabled&e."
player-added: "{prefix}&aPlayer &f{player}&a added to the maintenance whitelist of &f{server}&a."
player-added-all: "{prefix}&aPlayer &f{player}&a added to the global maintenance whitelist."
player-removed: "{prefix}&ePlayer &f{player}&e removed from the maintenance whitelist of &f{server}&e."
player-removed-all: "{prefix}&ePlayer &f{player}&e removed from the global maintenance whitelist."
# Standalone (no {server})
enabled: "{prefix}&eMaintenance has been &aenabled&e."
disabled: "{prefix}&eMaintenance has been &cdisabled&e."
player-added-standalone: "{prefix}&aPlayer &f{player}&a added to the maintenance whitelist."
player-removed-standalone: "{prefix}&ePlayer &f{player}&e removed from the maintenance whitelist."
# Whitelist no-op feedback (optional — built-in English defaults apply if removed)
already-whitelisted: "{prefix}&ePlayer &f{player}&e is already whitelisted."
not-whitelisted: "{prefix}&ePlayer &f{player}&e is not whitelisted."
# Status (/{cmd} status)
status-header: "&b&lMAINTENANCE &8» &7Status"
status-server-active: "&f{server} &c● Under maintenance"
status-server-inactive: "&f{server} &a● Online"
status-standalone-active: "&c● The server is under maintenance"
status-standalone-inactive: "&a● The server is online"
status-player: "&8 ▪ {lp_prefix}&f{player}{lp_suffix}"
status-no-players: "&8 ▪ &7No players whitelisted"
# Kick screen (global maintenance or initial connection)
kick:
- "&c&lMAINTENANCE"
- ""
- "&7The server is currently under maintenance."
- "&7Please try again later."
- ""
- "&bdiscord.gg/yourserver"
# Denied switch (proxy)
switch-denied:
- "&cThat server is currently under maintenance."
