Compare commits

...

39 Commits

Author SHA1 Message Date
Geoff Bourne
966c74cd08 Auto-merging via docker-versions-create 2020-07-04 14:57:07 -05:00
Geoff Bourne
3a03156cb3 ci: Adjust pr workflow name 2020-07-04 14:55:45 -05:00
orblazer
b3780186f8 Add some missing properties in env variables (#574) 2020-07-04 14:52:35 -05:00
Kamaroth92
c4654e44d8 Move server-icon.png to FTB_DIR if exists (#573)
Co-authored-by: Tane Barriball <tanebarriball@gmail.com>
2020-07-04 09:08:37 -05:00
Kamaroth92
9c6047e3fc Updated worldDest to use FTB_DIR in order to deal with nested FTB modpacks (#571)
Co-authored-by: Tane Barriball <tanebarriball@gmail.com>
2020-07-01 18:48:41 -05:00
Geoff Bourne
260cc7d180 docs: added recommendation against using SERVER_PORT 2020-06-30 08:40:33 -05:00
Geoff Bourne
bbe930e552 ci: changed gh actions to avoid image push on PR 2020-06-28 12:22:00 -05:00
Geoff Bourne
a655fe860e docs: removed github readme link since Docker Hub docs are manual now 2020-06-28 12:17:07 -05:00
Geoff Bourne
ddf36aa879 docs: updated example compose file for paper to use proper CONSOLE setting 2020-06-28 09:37:55 -05:00
Geoff Bourne
34c31c561d docs: removed most mentions of noconsole since it only applies pre-1.14 2020-06-28 09:36:31 -05:00
Geoff Bourne
3cc7d00d71 docs: added example compose file for autopause
For #569
2020-06-28 09:34:26 -05:00
Geoff Bourne
ed214b1382 docs: updated image tag for running on RaspberryPi 2020-06-28 09:19:38 -05:00
Geoff Bourne
f8405e298c ci: removed tagging image with git SHA since it seemed like too many 2020-06-26 17:17:41 -05:00
Geoff Bourne
539159ba50 docs: simplified top-level example compose file
related to #518
2020-06-25 14:10:21 -05:00
Geoff Bourne
f2c9d2f905 Updated TYPE feedback when invalid choice given
For #561
2020-06-23 17:27:21 -05:00
Geoff Bourne
1b11331881 misc: added github action badge 2020-06-20 16:06:28 -05:00
Geoff Bourne
b71afff29f misc: removed unused multiarch scripts 2020-06-20 16:05:46 -05:00
Geoff Bourne
b4c6950f95 ci: simplified main github action name 2020-06-20 16:01:27 -05:00
Geoff Bourne
d84b58dfd0 Auto-merging via docker-versions-create 2020-06-20 15:44:09 -05:00
Geoff Bourne
7aaf106ffe Auto-merging via docker-versions-create
# Conflicts:
#	.circleci/config.yml
2020-06-19 13:25:41 -05:00
Geoff Bourne
5f77902441 Auto-merging via docker-versions-create 2020-05-20 08:14:14 -05:00
Geoff Bourne
c200efc9c9 Auto-merging via docker-versions-create 2020-05-02 09:33:49 -05:00
Geoff Bourne
e924126a56 Auto-merging via docker-versions-create 2020-04-25 12:10:22 -05:00
Geoff Bourne
bbd3d3cfc1 Auto-merging via docker-versions-create 2020-04-17 21:28:25 -05:00
Geoff Bourne
d77c19c69b Auto-merging via docker-versions-create 2020-04-11 08:51:36 -05:00
Geoff Bourne
7ee77e4f47 Auto-merging via docker-versions-create 2020-04-10 11:08:41 -05:00
Geoff Bourne
84d0cff4c8 Auto-merging via docker-versions-create 2020-04-03 13:31:30 -05:00
Geoff Bourne
70519b9764 Auto-merging via docker-versions-create
# Conflicts:
#	README.md
#	start-minecraftFinalSetup
2020-04-03 13:28:27 -05:00
Geoff Bourne
4683ea496d Auto-merging via docker-versions-create 2020-04-02 17:47:30 -05:00
Geoff Bourne
0e3a82f9d3 Auto-merging via docker-versions-create 2020-03-30 08:31:53 -05:00
Geoff Bourne
d2554f2271 Auto-merging via docker-versions-create 2020-03-26 20:54:00 -05:00
Geoff Bourne
55e62371ac Auto-merging via docker-versions-create 2020-02-01 08:52:51 -06:00
Geoff Bourne
c9a5fcfac8 Auto-merging via docker-versions-create 2020-01-17 08:29:05 -06:00
Geoff Bourne
a1f8154d05 Auto-merging via docker-versions-create 2019-11-16 09:30:54 -06:00
Geoff Bourne
e5d0a9362a Auto-merging via docker-versions-create 2019-11-16 09:04:17 -06:00
Geoff Bourne
ca9c280b0b Merge branch 'master' into openj9 2019-11-16 09:01:17 -06:00
Geoff Bourne
6ef4e984c7 ci: disable cross-building arm-v7 image 2019-08-13 20:06:57 -05:00
Geoff Bourne
ea4f78346a ci: try cross-building arm-v7 image 2019-08-13 20:04:34 -05:00
Geoff Bourne
007f9426bf Switch to OpenJ9 base image (#360)
(cherry picked from commit 93197ffb77)
2019-08-10 18:56:36 -05:00
15 changed files with 159 additions and 110 deletions

25
.circleci/config.yml Normal file
View File

@@ -0,0 +1,25 @@
version: 2
jobs:
minecraft_server:
docker:
- image: circleci/buildpack-deps:stable
steps:
- checkout
- setup_remote_docker
- run:
name: Build image
command: docker build -t itzg/minecraft-server:${CIRCLE_BRANCH} .
# - run:
# name: Build arm v7 image
# command: docker build -t itzg/minecraft-server:${CIRCLE_BRANCH}-arm-v7 --platform linux/arm/v7 --build-arg ARCH=armv7 .
workflows:
version: 2
build:
jobs:
- minecraft_server:
filters:
branches:
ignore:
- armv7
- multiarch

View File

@@ -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

19
.github/workflows/pr.yml vendored Normal file
View File

@@ -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

View File

@@ -1,4 +1,4 @@
FROM openjdk:8u212-jre-alpine
FROM adoptopenjdk/openjdk8-openj9:alpine
LABEL maintainer "itzg"
@@ -67,7 +67,7 @@ COPY log4j2.xml /tmp/log4j2.xml
WORKDIR /data
ENV UID=1000 GID=1000 \
JVM_XX_OPTS="-XX:+UseG1GC" MEMORY="1G" \
MEMORY="1G" \
TYPE=VANILLA VERSION=LATEST FORGEVERSION=RECOMMENDED SPONGEBRANCH=STABLE SPONGEVERSION= FABRICVERSION=LATEST LEVEL=world \
PVP=true DIFFICULTY=easy ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
LEVEL_TYPE=DEFAULT SERVER_PORT=25565 ONLINE_MODE=TRUE SERVER_NAME="Dedicated Server" \

View File

@@ -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=<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
@@ -1108,6 +1109,14 @@ via a `JVM_XX_OPTS` environment variable.
For some cases, if e.g. after removing mods, it could be necessary to startup minecraft with an additional `-D` parameter like `-Dfml.queryResult=confirm`. To address this you can use the environment variable `JVM_DD_OPTS`, which builds the params from a given list of values separated by space, but without the `-D` prefix. To make things running under systems (e.g. Plesk), which doesn't allow `=` inside values, a `:` (colon) could be used instead. The upper example would look like this:
`JVM_DD_OPTS=fml.queryResult:confirm`, and will be converted to `-Dfml.queryResult=confirm`.
The container uses [OpenJ9](https://www.eclipse.org/openj9/docs) and a couple of J9 options are
simplified by environment variables:
- `-e TUNE_VIRTUALIZED=TRUE` : enables the option to
[optimize for virtualized environments](https://www.eclipse.org/openj9/docs/xtunevirtualized/)
- `-e TUNE_NURSERY_SIZES=TRUE` : configures nursery sizes where the initial size is 50%
of the `MAX_MEMORY` and the max size is 80%.
### Enable Remote JMX for Profiling
To enable remote JMX, such as for profiling with VisualVM or JMC, add the environment variable `ENABLE_JMX=true` and add a port forwarding of TCP port 7091, such as:
@@ -1136,8 +1145,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 +1156,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`

View File

@@ -1,34 +0,0 @@
#!/bin/bash
# manually purge any pre-existing manifest list
# since docker manifest command lacks a "remove" operation
rm -rf ~/.docker/manifests/docker.io_itzg_minecraft-server-multiarch
export DOCKER_BUILDKIT=1
docker build --platform linux/arm64 -t itzg/minecraft-server:arm64 .
docker push itzg/minecraft-server:arm64
armv7tag=armv7-buildkit
armv7workDir=/tmp/armv7-$$
git worktree add $armv7workDir armv7
# sub-shell for build of armv7
(
cd $armv7workDir
docker build --platform linux/arm/v7 -t itzg/minecraft-server:$armv7tag .
docker push itzg/minecraft-server:$armv7tag
)
git worktree remove $armv7workDir
docker pull itzg/minecraft-server
# use the rpi build one for now since armv7-buildkit is giving ABI mismatch on curl
docker pull itzg/minecraft-server:armv7
docker manifest create itzg/minecraft-server:multiarch \
itzg/minecraft-server \
itzg/minecraft-server:armv7 \
itzg/minecraft-server:arm64
docker manifest inspect itzg/minecraft-server:multiarch
docker manifest push -p itzg/minecraft-server:multiarch

View File

@@ -1,18 +0,0 @@
#!/bin/bash
manifest="itzg/minecraft-server:multiarch"
for t in latest rpi3 aarch64; do
docker pull itzg/minecraft-server:$t
done
docker manifest create --amend ${manifest} \
itzg/minecraft-server:aarch64 \
itzg/minecraft-server:latest \
itzg/minecraft-server:rpi3
docker manifest annotate --os linux --arch amd64 ${manifest} itzg/minecraft-server:latest
docker manifest annotate --os linux --arch arm64 ${manifest} itzg/minecraft-server:aarch64
docker manifest annotate --os linux --arch arm --variant v7 ${manifest} itzg/minecraft-server:rpi3
docker manifest push ${manifest}

View File

@@ -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: {}

View File

@@ -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: {}

View File

@@ -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:
mc-paper:

View File

@@ -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

View File

@@ -129,7 +129,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
;;

View File

@@ -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

View File

@@ -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

View File

@@ -100,6 +100,23 @@ if [ -n "$JVM_DD_OPTS" ]; then
done
fi
if isTrue ${TUNE_VIRTUALIZED}; then
JVM_XX_OPTS="${JVM_XX_OPTS} -Xtune:virtualized"
fi
if isTrue ${TUNE_NURSERY_SIZES}; then
case ${MAX_MEMORY^^} in
*G)
MAX_MEMORY_MB=$(( ${MAX_MEMORY%?} * 1024 )) ;;
*M)
MAX_MEMORY_MB=${MAX_MEMORY%?} ;;
esac
NURSERY_MINIMUM=$(( ${MAX_MEMORY_MB} / 2 ))
NURSERY_MAXIMUM=$(( ${MAX_MEMORY_MB} * 4/5 ))
JVM_XX_OPTS="${JVM_XX_OPTS} -Xmns${NURSERY_MINIMUM}M -Xmnx${NURSERY_MAXIMUM}M"
fi
if isTrue ${ENABLE_JMX}; then
: ${JMX_HOST:=0.0.0.0}
: ${JMX_PORT:=7091}
@@ -190,6 +207,10 @@ elif [[ ${TYPE} == "FEED-THE-BEAST" ]]; 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" <<EOF