diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 760d3bb4..388a5fea 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,6 +1,4 @@ -# This is a basic workflow to help you get started with Actions - -name: Build and publish non-multiarch branches/tags +name: Build and Publish on: push: @@ -16,8 +14,6 @@ on: - "[0-9]+.[0-9]+.[0-9]+-openj9-nightly" - "[0-9]+.[0-9]+.[0-9]+-adopt11" - "[0-9]+.[0-9]+.[0-9]+-adopt13" - pull_request: - branches: [ master ] jobs: build: @@ -33,7 +29,7 @@ jobs: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASSWORD }} tag_with_ref: true - tag_with_sha: true + tag_with_sha: false cache_froms: itzg/minecraft-server:latest add_git_labels: true push: true diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 00000000..94d19913 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,19 @@ +name: Validate PR + +on: + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Build Docker image + uses: docker/build-push-action@v1.1.0 + with: + tag_with_sha: true + cache_froms: itzg/minecraft-server:latest + push: false diff --git a/README.md b/README.md index 0f5d1b93..b17fcece 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,13 @@ [![Docker Stars](https://img.shields.io/docker/stars/itzg/minecraft-server.svg?maxAge=2592000)](https://hub.docker.com/r/itzg/minecraft-server/) [![GitHub Issues](https://img.shields.io/github/issues-raw/itzg/docker-minecraft-server.svg)](https://github.com/itzg/docker-minecraft-server/issues) [![Discord](https://img.shields.io/discord/660567679458869252)](https://discord.gg/DXfKpjB) +[![Build and Publish](https://github.com/itzg/docker-minecraft-server/workflows/Build%20and%20Publish/badge.svg)](https://github.com/itzg/docker-minecraft-server/actions) [![](https://img.shields.io/badge/Donate-Buy%20me%20a%20coffee-orange.svg)](https://www.buymeacoffee.com/itzg) This docker image provides a Minecraft Server that will automatically download the latest stable version at startup. You can also run/upgrade to any specific version or the latest snapshot. See the _Versions_ section below for more information. -[![Click for more docs](https://i.imgur.com/jS02ebD.png)](https://github.com/itzg/docker-minecraft-server/blob/master/README.md) - -[Full docs available in Github](https://github.com/itzg/docker-minecraft-server/blob/master/README.md) - To simply use the latest stable version, run docker run -d -p 25565:25565 --name mc itzg/minecraft-server @@ -179,11 +176,13 @@ You can also query the container's health in a script friendly way: healthy ``` -## Autopause +## Autopause (experimental) ### Description -> There are various bug reports on [Mojang](https://bugs.mojang.com) about high CPU usage of servers with newer versions, even with few or no clients connected (e.g. [this one](https://bugs.mojang.com/browse/MC-149018), in fact the functionality is based on [this comment in the thread](https://bugs.mojang.com/browse/MC-149018?focusedCommentId=593606&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-593606)). +> EXPERIMENTAL: this feature only works with default bridge networking using official Docker distributions. Host networking and container management software, such as Portainer, and NAS solutions do not seem to provide compatible networking. + +There are various bug reports on [Mojang](https://bugs.mojang.com) about high CPU usage of servers with newer versions, even with few or no clients connected (e.g. [this one](https://bugs.mojang.com/browse/MC-149018), in fact the functionality is based on [this comment in the thread](https://bugs.mojang.com/browse/MC-149018?focusedCommentId=593606&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-593606)). An autopause functionality has been added to this image to monitor whether clients are connected to the server. If for a specified time no client is connected, the Java process is stopped. When knocking on the server port (e.g. by the ingame Multiplayer server overview), the process is resumed. The experience for the client does not change. @@ -193,7 +192,7 @@ From the server's point of view, the pausing causes a single tick to take as lon On startup the `server.properties` file is checked and, if applicable, a warning is printed to the terminal. When the server is created (no data available in the persistent directory), the properties file is created with the Watchdog disabled. -The autopause functionality is not compatible with docker's host network_mode, as the `knockd` utility cannot properly listen for connections in that mode. +A starting, example compose file has been provided in [examples/docker-compose-autopause.yml](examples/docker-compose-autopause.yml). ### Enabling Autopause @@ -204,13 +203,13 @@ Enable the Autopause functionality by setting: ``` There are 4 more environment variables that define the behaviour: -* `AUTOPAUSE_TIMEOUT_EST`, default `3600` (seconds) +* `AUTOPAUSE_TIMEOUT_EST`, default `3600` (seconds) describes the time between the last client disconnect and the pausing of the process (read as timeout established) -* `AUTOPAUSE_TIMEOUT_INIT`, default `600` (seconds) +* `AUTOPAUSE_TIMEOUT_INIT`, default `600` (seconds) describes the time between server start and the pausing of the process, when no client connects inbetween (read as timeout initialized) -* `AUTOPAUSE_TIMEOUT_KN`, default `120` (seconds) +* `AUTOPAUSE_TIMEOUT_KN`, default `120` (seconds) describes the time between knocking of the port (e.g. by the main menu ping) and the pausing of the process, when no client connects inbetween (read as timeout knocked) -* `AUTOPAUSE_PERIOD`, default `10` (seconds) +* `AUTOPAUSE_PERIOD`, default `10` (seconds) describes period of the daemonized state machine, that handles the pausing of the process (resuming is done independently) ## Deployment Templates and Examples @@ -397,13 +396,6 @@ If you are hosting your own copy of Bukkit/Spigot you can override the download You can build spigot from source by adding `-e BUILD_FROM_SOURCE=true` -**NOTE: to avoid pegging the CPU when running Spigot,** you will need to -pass `--noconsole` at the very end of the command line and not use `-it`. For example, - - docker run -d -v /path/on/host:/data \ - -e TYPE=SPIGOT \ - -p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server --noconsole - You can install Bukkit plugins in two ways... ### Using the /data volume @@ -455,13 +447,6 @@ but you can also choose to run a specific build with `-e PAPERBUILD=205`. -e TYPE=PAPER \ -p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server -**NOTE: to avoid pegging the CPU when running PaperSpigot,** you will need to -pass `--noconsole` at the very end of the command line and not use `-it`. For example, - - docker run -d -v /path/on/host:/data \ - -e TYPE=PAPER \ - -p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server --noconsole - If you are hosting your own copy of PaperSpigot you can override the download URL with: - -e PAPER_DOWNLOAD_URL= @@ -762,9 +747,13 @@ The server name (e.g. for bungeecord) can be set like: ### Server port -The server port can be set like: +> **WARNING:** only change this value if you know what you're doing. It is only needed when using host networking and it is rare that host networking should be used. Use `-p` port mappings instead. - docker run -d -e SERVER_PORT=25565 ... +If you must, the server port can be set like: + + docker run -d -e SERVER_PORT=25566 ... + +**however**, be sure to change your port mapping accordingly and be prepared for some features to break. ### Difficulty @@ -1067,9 +1056,21 @@ Allows users to use flight on your server while in Survival mode, if they have a ### Other server property mappings -Environment Variable | Server Property ----------------------|----------------- -PLAYER_IDLE_TIMEOUT | player-idle-timeout +| Environment Variable | Server Property | +| --------------------------------- | --------------------------------- | +| PLAYER_IDLE_TIMEOUT | player-idle-timeout | +| BROADCAST_CONSOLE_TO_OPS | broadcast-console-to-ops | +| BROADCAST_RCON_TO_OPS | broadcast-rcon-to-ops | +| ENABLE_JMX | enable-jmx-monitoring | +| SYNC_CHUNK_WRITES | sync-chunk-writes | +| ENABLE_STATUS | enable-status | +| ENTITY_BROADCAST_RANGE_PERCENTAGE | entity-broadcast-range-percentage | +| FUNCTION_PERMISSION_LEVEL | function-permission-level | +| NETWORK_COMPRESSION_THRESHOLD | network-compression-threshold | +| OP_PERMISSION_LEVEL | op-permission-level | +| PREVENT_PROXY_CONNECTIONS | prevent-proxy-connections | +| USE_NATIVE_TRANSPORT | use-native-transport | +| ENFORCE_WHITELIST | enforce-whitelist | ## Miscellaneous Options @@ -1136,8 +1137,7 @@ a companion squid proxy by setting the equivalent of ### Using "noconsole" option -Some older versions of Spigot required `--noconsole` to be passed when detaching stdin. You can -pass that at the end of `docker run` after the image name or set `-e CONSOLE=FALSE`. +Some older versions (pre-1.14) of Spigot required `--noconsole` to be passed when detaching stdin, which can be done by setting `-e CONSOLE=FALSE`. ### Explicitly disable GUI @@ -1148,6 +1148,6 @@ disable that by passing `-e GUI=FALSE`. To run this image on a RaspberryPi 3 B+, 4, or newer, use the image tag - itzg/minecraft-server:armv7 + itzg/minecraft-server:multiarch > NOTE: you may need to lower the memory allocation, such as `-e MEMORY=750m` diff --git a/docker-compose.yml b/docker-compose.yml index a9c0e57b..fd270191 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,19 +10,7 @@ services: - "mc:/data" environment: EULA: "TRUE" - CONSOLE: "false" - ENABLE_RCON: "true" - RCON_PASSWORD: "testing" - RCON_PORT: 28016 restart: always - rcon: - image: itzg/rcon - ports: - - "4326:4326" - - "4327:4327" - volumes: - - "rcon:/opt/rcon-web-admin/db" volumes: - mc: - rcon: + mc: {} \ No newline at end of file diff --git a/examples/docker-compose-autopause.yml b/examples/docker-compose-autopause.yml new file mode 100644 index 00000000..f7d1bf92 --- /dev/null +++ b/examples/docker-compose-autopause.yml @@ -0,0 +1,18 @@ +version: '3.8' + +services: + minecraft: + image: itzg/minecraft-server + ports: + - "25565:25565" + volumes: + - "mc:/data" + environment: + EULA: "TRUE" + ENABLE_AUTOPAUSE: "TRUE" + OVERRIDE_SERVER_PROPERTIES: "TRUE" + MAX_TICK_TIME: "-1" + restart: always + +volumes: + mc: {} diff --git a/examples/docker-compose-paper.yml b/examples/docker-compose-paper.yml index befdcad9..d01c3e10 100644 --- a/examples/docker-compose-paper.yml +++ b/examples/docker-compose-paper.yml @@ -7,11 +7,12 @@ services: EULA: "true" TYPE: PAPER VERSION: 1.9.4 - command: --noconsole + # needed for Paper versions before 1.14 + CONSOLE: "false" ports: - 25565:25565 volumes: - mc-paper:/data volumes: - mc-paper: \ No newline at end of file + mc-paper: diff --git a/server.properties b/server.properties index 340ba9df..eb8ee229 100644 --- a/server.properties +++ b/server.properties @@ -37,3 +37,15 @@ motd=A Minecraft Server powered by Docker generator-settings= rcon.password= max-world-size=29999984 +broadcast-console-to-ops=true +broadcast-rcon-to-ops=true +enable-jmx-monitoring=false +sync-chunk-writes=true +enable-status=true +entity-broadcast-range-percentage=100 +function-permission-level=2 +network-compression-threshold=256 +op-permission-level=4 +prevent-proxy-connections=false +use-native-transport=true +enforce-whitelist=false diff --git a/start-configuration b/start-configuration index fcf724c3..6e546134 100644 --- a/start-configuration +++ b/start-configuration @@ -126,7 +126,8 @@ case "${TYPE^^}" in *) log "Invalid type: '$TYPE'" - log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTB, CURSEFORGE, SPONGEVANILLA" + log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTBA, CURSEFORGE, SPONGEVANILLA," + log " CUSTOM, CURSE_INSTANCE, MAGMA, MOHIST, CATSERVER" exit 1 ;; diff --git a/start-finalSetup01World b/start-finalSetup01World index 31a6e156..1cb3bfff 100644 --- a/start-finalSetup01World +++ b/start-finalSetup01World @@ -5,7 +5,7 @@ set -e isDebugging && set -x if [ $TYPE = "FEED-THE-BEAST" ]; then - worldDest=$FTB_BASE_DIR/$LEVEL + worldDest=$FTB_DIR/$LEVEL else worldDest=/data/$LEVEL fi diff --git a/start-finalSetup04ServerProperties b/start-finalSetup04ServerProperties index e77ea8a1..9f2bad70 100644 --- a/start-finalSetup04ServerProperties +++ b/start-finalSetup04ServerProperties @@ -77,6 +77,18 @@ function customizeServerProps { setServerProp "resource-pack" "$RESOURCE_PACK" setServerProp "resource-pack-sha1" "$RESOURCE_PACK_SHA1" setServerProp "player-idle-timeout" "$PLAYER_IDLE_TIMEOUT" + setServerProp "broadcast-console-to-ops" "$BROADCAST_CONSOLE_TO_OPS" + setServerProp "broadcast-rcon-to-ops" "$BROADCAST_RCON_TO_OPS" + setServerProp "enable-jmx-monitoring" "$ENABLE_JMX" + setServerProp "sync-chunk-writes" "$SYNC_CHUNK_WRITES" + setServerProp "enable-status" "$ENABLE_STATUS" + setServerProp "entity-broadcast-range-percentage" "$ENTITY_BROADCAST_RANGE_PERCENTAGE" + setServerProp "function-permission-level" "$FUNCTION_PERMISSION_LEVEL" + setServerProp "network-compression-threshold" "$NETWORK_COMPRESSION_THRESHOLD" + setServerProp "op-permission-level" "$OP_PERMISSION_LEVEL" + setServerProp "prevent-proxy-connections" "$PREVENT_PROXY_CONNECTIONS" + setServerProp "use-native-transport" "$USE_NATIVE_TRANSPORT" + setServerProp "enforce-whitelist" "$ENFORCE_WHITELIST" if [ -n "$DIFFICULTY" ]; then case $DIFFICULTY in diff --git a/start-minecraftFinalSetup b/start-minecraftFinalSetup index 0143f3e7..c4ee79e2 100644 --- a/start-minecraftFinalSetup +++ b/start-minecraftFinalSetup @@ -190,6 +190,10 @@ elif [[ ${TYPE} == "CURSEFORGE" ]]; then cp -f /data/white-list.txt ${FTB_DIR}/ fi + if [ ! -e "${FTB_DIR}/server-icon.png" -a -e /data/server-icon.png ]; then + cp -f /data/server-icon.png ${FTB_DIR}/ + fi + cp -f /data/eula.txt "${FTB_DIR}/" cat > "${FTB_DIR}/settings-local.sh" <