Compare commits

...

137 Commits

Author SHA1 Message Date
Geoff Bourne
79756d13fd mc: support CurseForge modpacks with LaunchServer.sh entry script 2018-09-30 14:39:37 -05:00
Geoff Bourne
44d2081b7b Merge pull request #253 from proudlytm/master
mc: set umask to 0002 and chmod g+w the /data folder
2018-09-27 08:25:29 -05:00
Maxim Ivanov
e8be7685e9 mc: set umask to 0002 and chmod g+w the /data folder
Do this to allow write access for groups that the minecraft user is in.

This commit also fixes an issue if a group is specified with $GID and it has
no write access in the mounted host volume.
2018-09-27 10:27:50 +03:00
Geoff Bourne
2d6316e6c3 mc: fix container stop handling 2018-09-20 19:57:01 -05:00
Geoff Bourne
009309966b Merge pull request #250 from proudlytm/master
README.md: Make it clearer how to override UID and GID.
2018-09-19 18:22:48 -05:00
Maxim Ivanov
d3e64ed56f README.md: Make it clearer how to override UID and GID. 2018-09-19 23:27:44 +03:00
Geoff Bourne
715d9be403 Merge pull request #249 from duaneg/master
mc: run FTB installer from correct location
2018-09-18 22:40:58 -05:00
Duane Griffin
ebe0a30c14 mc: run FTB installer from correct location
We have pushd'ed into the directory so do not prefix the shell script
with the directory name.
2018-09-19 11:27:34 +12:00
Geoff Bourne
c8eb0f5874 mc: enhance the WORLD option to allow for directory sources
#247
2018-09-11 20:38:54 -05:00
Geoff Bourne
90907f7b1e mc: allow for RWG world type
Fixes #246
2018-09-01 16:35:31 -05:00
Geoff Bourne
d898796672 Support Paper builds for 1.13 and fix 1.12.2/1.11.2 builds
Fixed #244
2018-08-25 18:16:47 -05:00
Geoff Bourne
ed32de76ca Merge pull request #243 from mattiaskagstrom/patch-1
unzip fails if a file already exists in the zip file.
2018-08-25 14:52:32 -05:00
Mattias Kågström
07fc31b401 unzip fails if a file already exists in the zip file.
Unzipping world
replace banned-ips.json? [y]es, [n]o, [A]ll, [N]one, [r]ename:

unzip: can't read standard input
2018-08-24 17:36:41 +02:00
Geoff Bourne
a0db92cb5e circleci: remove run test for now 2018-08-19 11:30:59 -05:00
Geoff Bourne
f33a94a6e2 circleci: allow a litte more time for mc test 2018-08-19 11:25:21 -05:00
Geoff Bourne
bab31f1198 circleci: allow more time and capture the log 2018-08-19 11:22:43 -05:00
Geoff Bourne
a5614ec03b Add testing of minecraft-server image in CircleCI 2018-08-19 11:18:08 -05:00
Geoff Bourne
70f49be4fc Merge branch 'master' of https://github.com/itzg/dockerfiles 2018-08-19 09:09:51 -05:00
Geoff Bourne
173f612d74 Add CircleCI 2 config 2018-08-19 09:09:21 -05:00
Geoff Bourne
ba4578f451 mc: check validity of downloaded bukkit/spigot jar
Fixes #242
2018-08-18 18:51:45 -05:00
Geoff Bourne
1c5e4b17bf mc: chown /data when it doesn't match $UID
Fixes #239
2018-08-18 16:56:45 -05:00
Geoff Bourne
f65548894f Merge pull request #241 from JanikBot/patch-2
Added warning if user doesn't use the server version of the modpack
2018-08-18 15:39:23 -05:00
Geoff Bourne
b910a7dbe5 mc: adjust FTB server pack check to look in subdirs 2018-08-18 15:38:27 -05:00
Janik Bussalb
1c24dc1def Added warning if user doesn't use the server version of the modpack 2018-08-14 17:45:51 +02:00
Geoff Bourne
d9c2f26506 mc: handle FTB style start script within CurseForge subdirs
mc: upgrade mc-server-runner to launch start scripts via bash
2018-08-12 17:25:16 -05:00
Geoff Bourne
7005f00df0 mc: avoid usermod when UID matches current user ID 2018-08-05 16:38:22 -05:00
Geoff Bourne
6ec6655280 mc: removing confusing mention of MAX_RAM
for #229
2018-07-30 21:52:04 -05:00
Geoff Bourne
848cd8b994 mc: restore UID and GID options
for #234
2018-07-30 21:49:43 -05:00
Geoff Bourne
8a26e73dab mc: add support for BUFFET level type
mc: fix some typos in spigot download messages
2018-07-29 13:41:00 -05:00
Geoff Bourne
f66e1ff103 mc: use apk's --no-cache option 2018-07-28 10:33:24 -05:00
Geoff Bourne
5215dd569a Merge pull request #235 from sumomoneko/max_tick_time
Fix typos in config file generation for max-tick-time setting.
2018-07-25 22:14:25 -05:00
sumomoneko
ab5fe2d076 Fix typos in config file generation for max-tick-time setting. 2018-07-24 15:13:47 +09:00
Geoff Bourne
92f577e788 mc: force latest forge to derive from 1.12.2 for now 2018-07-19 18:52:58 -05:00
Geoff Bourne
4c0d53ee92 mc: add diagnostic log at start to confirm user and /data details 2018-07-18 20:10:22 -05:00
Geoff Bourne
c8cc882a57 mc: support the Install.sh step of CurseForge modpacks within TYPE=FTB
fixes #180
2018-07-13 22:33:55 -05:00
Geoff Bourne
a95bfdb192 mc: apply INIT/MAX RAM settings into FTB local settings file
fixes #222
2018-07-13 16:35:56 -05:00
Geoff Bourne
2a1fba1b45 Merge pull request #224 from SConaway/patch-2
Attempt to remove /data/.verify_access
2018-07-05 20:46:28 -05:00
Geoff Bourne
a44d114176 Merge pull request #223 from SConaway/patch-1
Update MC Dockerfile
2018-07-05 20:45:32 -05:00
Geoff Bourne
cce473c676 Merge pull request #225 from SConaway/patch-3
Pin MC to latest 8-JRE
2018-07-05 20:37:48 -05:00
Steven Conaway
5fb09f57e3 Update Dockerfile 2018-07-05 15:11:51 -07:00
Steven Conaway
eeacdc1e20 Pin MC to latest 8-JRE 2018-07-05 10:15:19 -07:00
Steven Conaway
d0577a43fd Attempt to remove /data/.verify_access 2018-07-05 10:11:21 -07:00
Steven Conaway
e8b25d20a3 Update MC Dockerfiel 2018-07-04 17:57:18 -07:00
Geoff Bourne
4192bea3ab Consistently use curl instead of wget 2018-06-25 19:13:47 -05:00
Geoff Bourne
4ff14fbf61 Remove Dockerfile-raspberrypi since its maintained in a branch 2018-06-25 19:01:12 -05:00
Geoff Bourne
f0102119b6 Merge pull request #217 from Lemmons/better-ftb-startup
Allow existing world volume mount for FTB
2018-06-02 08:50:28 -05:00
Geoff Bourne
848e9e40e4 Merge pull request #216 from pcdevil/feat/add_snooper_argument
[mc] Add snooper enabled toggle
2018-05-20 06:54:16 -05:00
Attila Gonda
a12a258058 [mc] Clearify snooper config 2018-05-20 12:59:42 +02:00
Attila Gonda
bfa198de4e [mc] Add snooper enabled toggle 2018-05-20 01:07:16 +02:00
Geoff Bourne
04b4a3e8ca Adding RaspberryPi compatible dockerfile for reference 2018-05-19 17:48:20 -05:00
Geoff Bourne
f7d62474e8 Update mc-server-runner to allow for server to stop on its own 2018-05-19 17:34:03 -05:00
Geoff Bourne
5bf4a3fd1d Provide a kubernetes example 2018-05-18 16:21:44 -05:00
Geoff Bourne
35ec677446 [mc] Enable graceful shutdown on stop 2018-05-18 15:19:41 -05:00
Scott Lemmon
f4631703ca Allow existing world volume mount for FTB 2018-05-14 18:52:49 -07:00
Geoff Bourne
767fa4962b Merge pull request #215 from megaxlr/master
Remove obsolete jar location
2018-05-08 21:24:21 -05:00
MegaXLR
08ba471710 Remove obsolete jar location
Signed-off-by: MegaXLR <admin@megaxlr.net>
2018-05-08 14:27:00 +02:00
Geoff Bourne
d93f6bad16 mc: remove the need for entrypoint script to run as root 2018-04-25 20:57:57 -05:00
Geoff Bourne
488e478374 mc: use newest installed forge jar
fixes #211
2018-04-25 20:48:42 -05:00
Geoff Bourne
e2bf56938b mc: remove extraneous g flags on passwd file mod 2018-04-14 13:59:43 -05:00
Geoff Bourne
5267927c3f mc: compute default MOTD based on the given type and version 2018-04-14 13:52:46 -05:00
Geoff Bourne
1f04ca946c mc: fixed local var usage in deployPaper
fixes #209
2018-04-14 13:43:25 -05:00
Geoff Bourne
959bdeef54 mc: added allow-flight option 2018-04-14 13:01:34 -05:00
Geoff Bourne
2627317e03 mc: Download Bukkit and Spigot from getbukkit.org 2018-03-16 17:03:21 -05:00
Geoff Bourne
c288557188 mc: upgrade base image to java 8u151 2018-03-16 09:24:48 -05:00
Geoff Bourne
7f82d3098c [mc] For FTB skip ops and white-list when not configured
Fixes #203
2018-03-04 19:01:31 -06:00
Geoff Bourne
0a7a666904 Merge pull request #197 from TheLeftMoose/196-set-server-port
Fixes #196 makes it possible to add server port as a env.
2018-02-15 11:43:18 -06:00
Dennis Schwartz-Knap
7bbe2fd28d added server_port to default env 2018-02-15 18:04:22 +01:00
Dennis Schwartz-Knap
8857abdc05 updateing readme with info about server port env 2018-02-12 18:11:33 +01:00
Dennis Schwartz-Knap
423b45cb7b Fixes #196 makes it possible to add server port as a env. 2018-02-12 17:26:44 +01:00
Geoff Bourne
6ef6bc68c2 Merge pull request #195 from scones/patch-2
test for the correct files at the correct locations
2018-02-07 12:10:06 -06:00
Dirk Gustke
b8e996d3c4 typo 2018-02-06 23:55:44 +01:00
Dirk Gustke
345696227d test for the correct files at the correct locations 2018-02-06 21:21:23 +01:00
Geoff Bourne
66330af708 Merge pull request #194 from scones/patch-1
this somehow deleted the correctly modified properties file.
2018-02-03 09:44:08 -06:00
Dirk Gustke
3444d88e4d this somehow deleted the correctly modified properties file.
as this is just a redundant remnant, i removing this line is save and works better
2018-02-03 15:24:37 +01:00
Geoff Bourne
95416a799e Merge pull request #191 from scones/fix_properly_set_ftb_properties
Fix properly set ftb properties
2018-01-28 09:06:05 -06:00
Dirk Gustke
dc3c93becf fix_properly_set_ftb_properties - remove debugging information 2018-01-28 14:50:08 +01:00
Dirk Gustke
ce4b4ad208 fix_properly_set_ftb_properties - use correct variable 2018-01-28 14:48:50 +01:00
Dirk Gustke
7afa00b72c fix_properly_set_ftb_properties - use existing variables thus preventing override 2018-01-28 14:45:25 +01:00
Dirk Gustke
230b575983 fix_properly_set_ftb_properties - use a unified setter, set the correct file 2018-01-28 13:16:45 +01:00
Dirk Gustke
2f3e93c619 fix_properly_set_ftb_properties - revert disfunctional change 2018-01-28 13:15:41 +01:00
Geoff Bourne
59753d8310 Merge pull request #190 from scones/patch-1
making use of all the server properties magic in ftb packages ..
2018-01-27 12:38:23 -06:00
Dirk Gustke
4fb881a583 Update start-deployFTB 2018-01-27 15:33:50 +01:00
Dirk Gustke
e42e9ac489 making use of all the server properties magic in ftb packages .. 2018-01-27 15:06:09 +01:00
Geoff Bourne
f5f20f3563 [mc] For FTB add legacy java fixer option 2018-01-07 17:19:10 -06:00
Geoff Bourne
931c27a5ec Clarify discontinued images in top level README 2017-12-25 11:33:46 -06:00
Geoff Bourne
bc100163c2 [mc] Use image rather than build in example proxied compose file 2017-12-08 10:03:45 -06:00
Geoff Bourne
3a64e32184 [mc] Add PROXY env var option
For #177
2017-12-08 09:48:55 -06:00
Geoff Bourne
b9787182e6 Merge pull request #184 from BinaryShock/spongeIntegration
Sponge integration
2017-11-07 21:13:33 -06:00
Aitor Ramos Sasselli
7797bf23fb Added optional parameters on SpongeVanilla server 2017-11-06 09:52:26 +01:00
Aitor Ramos Sasselli
f347f30353 Added initial SpongeForge information to Readme 2017-11-05 22:41:11 +01:00
Aitor Ramos Sasselli
eb239bfdb7 Changes in master updated to this branch 2017-11-02 04:10:39 +01:00
Geoff Bourne
7047e565fc Merge pull request #183 from BinaryShock/minecraft-refactor
Code refactorization
2017-11-01 21:26:17 -05:00
Aitor Ramos Sasselli
f178c6c0a1 SpongeVanilla integration and JSON check fix 2017-11-01 22:06:05 +01:00
Aitor Ramos Sasselli
ee5a95baa8 Repaired some bugs from refactor 2017-11-01 06:42:44 +01:00
Aitor Ramos Sasselli
0c1c6d198c Repaired some bugs from refactor 2017-11-01 06:41:55 +01:00
Aitor Ramos Sasselli
a0e605814f Code refactorization 2017-10-28 10:04:52 +02:00
Geoff Bourne
518986d28e [mc] Added support for LEVEL_TYPE = RTG 2017-10-02 20:06:41 -05:00
Geoff Bourne
2357914b4c [es] Upgrade to 5.5.2 2017-09-24 19:17:38 -05:00
Geoff Bourne
e5a4428515 [mc] Install iputils and wget for FTB compat 2017-09-24 11:46:47 -05:00
Geoff Bourne
6b9033318b [mc] For FTB pass-thru custom mod URLs
for #155
2017-09-03 20:20:25 -05:00
Geoff Bourne
9ee907783d [mc] Added issues link 2017-09-02 12:29:50 -05:00
Geoff Bourne
463cc62b75 [mc] Check writability of /data
Document JVM_OPTS
For #176 and #177
2017-09-02 12:24:09 -05:00
Geoff Bourne
5afd98edd8 [es] Upgrade to 5.5.1 2017-08-12 13:58:39 -05:00
Geoff Bourne
8b9051d72e Merge pull request #174 from Rob5Underscores/master
Add support for a zip file of mod configs to be supplied!
2017-07-17 06:56:44 -05:00
Rob Weddell
d6392f3aa9 Add support for a zip file of mod configs to be supplied!
This was added such that Sponge servers are supported.
(For Sponge: TYPE=FORGE, MODPACK=[zip including sponge plugins and jar], MODCONFIG=[sponge configuration])
2017-07-17 11:48:23 +01:00
Geoff Bourne
fe808be91b Merge pull request #173 from opHASnoNAME/master
Set UID for ES_DEFAULT_USER to 1100, avoid conflicts with debian host…
2017-07-16 14:16:24 -05:00
Arne Riemann
2cab10e906 Forgot -u for UID 2017-07-16 16:09:28 +02:00
Geoff Bourne
7f39d1f22e [mc] Properly check empty json files to fix
For #162
2017-07-15 20:02:40 -05:00
Arne Riemann
a9184368c1 Set UID for ES_DEFAULT_USER to 1100, avoid conflicts with debian host systems 2017-07-15 06:38:36 +02:00
Geoff Bourne
caf2fc2ab6 [es] Correcting old-ADD tar file path 2017-07-13 09:09:10 -05:00
Geoff Bourne
5dd8141e5e Merge pull request #169 from manojsb/patch-1
Upgrade to ES 5.5.0
2017-07-13 08:53:42 -05:00
Geoff Bourne
2ff28675d4 [es] Adapt to new Dockerfile ADD behavior 2017-07-13 08:52:02 -05:00
Manoj Kumar
519bd986b5 Update Dockerfile
Updated to v5.5.0
2017-07-12 11:41:13 +05:30
Geoff Bourne
e41efba176 [es] Using NON_DATA in 3x1GB stack
For #165
2017-07-04 18:08:10 -05:00
Geoff Bourne
0502813496 [es] Add NON_DATA type
For #165
2017-07-04 18:06:08 -05:00
Geoff Bourne
932a6828f9 [mc] Auto fix pre 1.12 empty json
For #162
2017-07-03 14:20:12 -05:00
Geoff Bourne
d176ef3f6a Merge pull request #167 from lukascernydis/master
Added option REMOVE_OLD_MODS
2017-07-01 20:09:12 -05:00
Lukáš Černý
deb98268f6 Added option REMOVE_OLD_MODS 2017-07-02 01:32:24 +02:00
Geoff Bourne
e1531c3237 [mc] Switch to openjdk alpine base image 2017-06-29 19:45:51 -05:00
Geoff Bourne
47af45a430 Merge pull request #166 from macman31/patch-1
Fix typos in config file generation
2017-06-29 19:19:11 -05:00
ATMD
0195b42eea Fix regex to change gamemode value
The sed command `sed -i "/gamemode\s*=/ c gamemode=$MODE" $SERVER_PROPERTIES` matches all lines containing `gamemode=`.
This includes the line `force-gamemode` that is set it with `setServerProp "force-gamemode" "$FORCE_GAMEMODE"`
So basically the `force-gamemode` line is erased and the `gamemode=value` line is duplicated, and then the server cleans it up at start and deduplicates the `gamemode` line and create a new `force-gamemode` line with a default value.
This fix ensures that only the `gamemode=` line is modified when changing the gamemode value.
2017-06-29 21:53:26 +02:00
ATMD
f875af5cdb Delete repetition of spawn-npcs 2017-06-29 20:25:24 +02:00
ATMD
32a918b902 Fix typo SPAWN_ANIMIALS 2017-06-29 19:56:14 +02:00
Geoff Bourne
d09a56075f [es] Add an example minimal composition 2017-06-28 23:17:39 -05:00
Geoff Bourne
e261fae348 [es] Upgrade to 5.4.2 2017-06-21 19:06:13 -05:00
Geoff Bourne
5b8668d73f [mc] Add dinnerbone's mcstatus and use it for HEALTHCHECK
Part of #159
2017-06-11 11:03:00 -05:00
Geoff Bourne
123292b56b Merge pull request #156 from dirkcjelli/mc_fixes
minecraft-server: Fixed FORGEVERSION case, add support for BIOMESOP
Fixes #139
2017-06-07 21:00:39 -05:00
Sascha Askani
0e0828f47f Revert "Fix FORGEVERSION -> FORGE_VERSION, remove unneeded statement in default"
This reverts commit cb6643a345.
2017-06-07 20:55:39 -05:00
Geoff Bourne
532c9fa69a Merge branch 'master' into mc_fixes 2017-06-07 20:54:35 -05:00
Geoff Bourne
e509563b10 [mc] Correctly pre-populate json config files
For #158
2017-06-07 20:43:35 -05:00
Geoff Bourne
899f31917c [mc] Add some FORGE_INSTALLER lookup messages 2017-06-07 08:07:44 -05:00
Geoff Bourne
e6ca9a1c6d [mc] glob for forge jar, but exclude installer 2017-06-06 23:09:45 -05:00
Geoff Bourne
24c68b9c2c [mc] Avoid trying to run forge installer as server 2017-06-06 22:36:39 -05:00
Geoff Bourne
2891e1ac3e [mc] Check for valid $FORGE_INSTALLER 2017-06-05 21:34:15 -05:00
Sascha Askani
da9618c08b add support for BIOMESOP level type 2017-06-05 16:09:26 +02:00
Sascha Askani
cb6643a345 Fix FORGEVERSION -> FORGE_VERSION, remove unneeded statement in default
case
2017-06-05 16:08:26 +02:00
Geoff Bourne
71527b87c1 [mc] Add support for custom Forge installer sources
For #154
2017-06-03 20:51:54 -05:00
32 changed files with 1273 additions and 670 deletions

17
.circleci/config.yml Normal file
View File

@@ -0,0 +1,17 @@
version: 2
jobs:
minecraft_server:
docker:
- image: circleci/buildpack-deps:18.04
steps:
- checkout
- setup_remote_docker
- run:
name: Build image
command: docker build -t mc:$CIRCLE_BUILD_NUM minecraft-server
workflows:
version: 2
build:
jobs:
- minecraft_server

5
.editorconfig Normal file
View File

@@ -0,0 +1,5 @@
root = true
[*]
end_of_line = lf
indent_style = space

View File

@@ -3,7 +3,7 @@ This repository contains the various Dockerfile definitions I'm maintaining.
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/itzg/dockerfiles?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
### Discontinued
### Images that are discontinued
##### Cassandra

View File

@@ -4,12 +4,18 @@ LABEL maintainer "itzg"
RUN apk -U add bash
ENV ES_VERSION=5.4.1
ARG ES_VERSION=5.5.2
# avoid conflicts with debian host systems when mounting to host volume
ARG DEFAULT_ES_USER_UID=1100
ADD https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-$ES_VERSION.tar.gz /tmp/es.tgz
ADD https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-$ES_VERSION.tar.gz /tmp
# need to adapt to both Docker's new remote-unpack-ADD behavior and the old behavior
RUN cd /usr/share && \
tar xf /tmp/es.tgz && \
rm /tmp/es.tgz
if [ -f /tmp/elasticsearch-$ES_VERSION.tar.gz ]; then \
tar xf /tmp/elasticsearch-$ES_VERSION.tar.gz; \
else mv /tmp/elasticsearch-${ES_VERSION} /usr/share; \
fi && \
rm -f /tmp/elasticsearch-$ES_VERSION.tar.gz
EXPOSE 9200 9300
@@ -17,9 +23,10 @@ HEALTHCHECK --timeout=5s CMD wget -q -O - http://$HOSTNAME:9200/_cat/health
ENV ES_HOME=/usr/share/elasticsearch-$ES_VERSION \
DEFAULT_ES_USER=elasticsearch \
DEFAULT_ES_USER_UID=$DEFAULT_ES_USER_UID \
ES_JAVA_OPTS="-Xms1g -Xmx1g"
RUN adduser -S -s /bin/sh $DEFAULT_ES_USER
RUN adduser -S -s /bin/sh -u $DEFAULT_ES_USER_UID $DEFAULT_ES_USER
VOLUME ["/data","/conf"]

View File

@@ -181,8 +181,9 @@ To simplify all that, this image provides a `TYPE` variable to let you amongst t
* `MASTER` : master-eligible, but holds no data. It is good to have three or more of these in a
large cluster
* `DATA` (or `NON_MASTER`) : holds data and serves search/index requests. Scale these out for elastic-y goodness.
* `NON_DATA` : performs all duties except holding data
* `GATEWAY` (or `COORDINATING`) : only operates as a client node or a "smart router". These are the ones whose HTTP port 9200 will need to be exposed
* `INGEST` : operates only as an ingest node and is not master or data eligble
* `INGEST` : operates only as an ingest node and is not master or data eligible
A [Docker Compose](https://docs.docker.com/compose/overview/) file will serve as a good example of these three node types:

View File

@@ -0,0 +1,35 @@
# This composition is known to work on a Swarm cluster consisting of
# 3 VM nodes with 1GB allocated to each.
version: '3'
services:
master:
image: itzg/elasticsearch
environment:
UNICAST_HOSTS: master
MIN_MASTERS: 1
ES_JAVA_OPTS: -Xms756m -Xmx756m
TYPE: NON_DATA
ports:
- "9200:9200"
- "9300:9300"
deploy:
replicas: 1
update_config:
parallelism: 1
data:
image: itzg/elasticsearch
deploy:
mode: global
update_config:
parallelism: 1
environment:
TYPE: DATA
UNICAST_HOSTS: master
ES_JAVA_OPTS: -Xms512m -Xmx512m
kibana:
image: kibana
ports:
- "5601:5601"
environment:
ELASTICSEARCH_URL: http://master:9200

View File

@@ -28,7 +28,7 @@ services:
TYPE: INGEST
UNICAST_HOSTS: master
kibana:
image: kibana
image: kibana:5.5.1
ports:
- "5601:5601"
environment:

View File

@@ -0,0 +1,21 @@
version: '3'
services:
master:
image: itzg/elasticsearch
environment:
UNICAST_HOSTS: master
MIN_MASTERS: 1
ports:
- "9200:9200"
- "9300:9300"
deploy:
replicas: 1
update_config:
parallelism: 1
kibana:
image: kibana
ports:
- "5601:5601"
environment:
ELASTICSEARCH_URL: http://master:9200

View File

@@ -99,10 +99,18 @@ setup_personality() {
OPTS="$OPTS -E node.master=false -E node.data=false -E node.ingest=true"
;;
DATA|NON_MASTER)
DATA)
OPTS="$OPTS -E node.master=false -E node.data=true -E node.ingest=false"
;;
NON_MASTER)
OPTS="$OPTS -E node.master=false -E node.data=true -E node.ingest=true"
;;
NON_DATA)
OPTS="$OPTS -E node.master=true -E node.data=false -E node.ingest=true"
;;
*)
echo "Unknown node type. Please use MASTER|GATEWAY|DATA|NON_MASTER"
exit 1

View File

@@ -0,0 +1,2 @@
[start-*]
indent_size = 2

View File

@@ -1,50 +1,61 @@
FROM alpine
FROM openjdk:8u171-jre-alpine
LABEL maintainer "itzg"
RUN echo "http://dl-3.alpinelinux.org/alpine/v3.5/community/" >> /etc/apk/repositories &&\
apk update && \
apk add \
openjdk8-jre-base \
RUN apk add --no-cache -U \
openssl \
imagemagick \
lsof \
su-exec \
shadow \
bash \
curl \
curl iputils wget \
git \
jq \
mysql-client \
python python-dev && \
rm -rf /var/cache/apk/*
python python-dev py2-pip
RUN pip install mcstatus
HEALTHCHECK CMD mcstatus localhost:$SERVER_PORT ping
RUN addgroup -g 1000 minecraft \
&& adduser -Ss /bin/false -u 1000 -G minecraft -h /home/minecraft minecraft \
&& mkdir /data \
&& mkdir /config \
&& mkdir /mods \
&& mkdir /plugins \
&& mkdir -m 777 /data /mods /config /plugins \
&& chown minecraft:minecraft /data /config /mods /plugins /home/minecraft
EXPOSE 25565 25575
ADD https://github.com/itzg/restify/releases/download/1.0.4/restify_linux_amd64 /usr/local/bin/restify
ADD https://github.com/itzg/rcon-cli/releases/download/1.3/rcon-cli_linux_amd64 /usr/local/bin/rcon-cli
COPY start.sh /start
COPY start-minecraft.sh /start-minecraft
ARG RESTIFY_VER=1.1.4
ARG RCON_CLI_VER=1.4.0
ARG MC_SERVER_RUNNER_VER=1.2.0
ARG ARCH=amd64
ADD https://github.com/itzg/restify/releases/download/${RESTIFY_VER}/restify_${RESTIFY_VER}_linux_${ARCH}.tar.gz /tmp/restify.tgz
RUN tar -x -C /usr/local/bin -f /tmp/restify.tgz restify && \
rm /tmp/restify.tgz
ADD https://github.com/itzg/rcon-cli/releases/download/${RCON_CLI_VER}/rcon-cli_${RCON_CLI_VER}_linux_${ARCH}.tar.gz /tmp/rcon-cli.tgz
RUN tar -x -C /usr/local/bin -f /tmp/rcon-cli.tgz rcon-cli && \
rm /tmp/rcon-cli.tgz
ADD https://github.com/itzg/mc-server-runner/releases/download/${MC_SERVER_RUNNER_VER}/mc-server-runner_${MC_SERVER_RUNNER_VER}_linux_${ARCH}.tar.gz /tmp/mc-server-runner.tgz
RUN tar -x -C /usr/local/bin -f /tmp/mc-server-runner.tgz mc-server-runner && \
rm /tmp/mc-server-runner.tgz
COPY mcadmin.jq /usr/share
RUN chmod +x /usr/local/bin/*
VOLUME ["/data","/mods","/config","/plugins","/home/minecraft"]
VOLUME ["/data","/mods","/config","/plugins"]
COPY server.properties /tmp/server.properties
WORKDIR /data
ENTRYPOINT [ "/start" ]
ENV UID=1000 GID=1000 \
MOTD="A Minecraft Server Powered by Docker" \
JVM_XX_OPTS="-XX:+UseG1GC" MEMORY="1G" \
TYPE=VANILLA VERSION=LATEST FORGEVERSION=RECOMMENDED LEVEL=world PVP=true DIFFICULTY=easy \
ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
LEVEL_TYPE=DEFAULT GENERATOR_SETTINGS= WORLD= MODPACK= ONLINE_MODE=TRUE CONSOLE=true
TYPE=VANILLA VERSION=LATEST FORGEVERSION=RECOMMENDED SPONGEBRANCH=STABLE SPONGEVERSION= LEVEL=world \
PVP=true DIFFICULTY=easy ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
LEVEL_TYPE=DEFAULT GENERATOR_SETTINGS= WORLD= MODPACK= SERVER_PORT=25565 ONLINE_MODE=TRUE CONSOLE=true
COPY start* /

View File

@@ -1,6 +1,7 @@
[![Docker Pulls](https://img.shields.io/docker/pulls/itzg/minecraft-server.svg)](https://hub.docker.com/r/itzg/minecraft-server/)
[![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/dockerfiles.svg)](https://github.com/itzg/dockerfiles/issues)
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
@@ -90,17 +91,6 @@ to map a directory on your host machine to the container's `/data` directory, su
When attached in this way you can stop the server, edit the configuration under your attached `/path/on/host`
and start the server again with `docker start CONTAINERID` to pick up the new configuration.
**NOTE**: By default, the files in the attached directory will be owned by the host user with UID of 1000 and host group with GID of 1000.
You can use an different UID and GID by passing the options:
-e UID=1000 -e GID=1000
replacing 1000 with a UID and GID that is present on the host.
Here is one way to find the UID and GID:
id some_host_user
getent group some_host_group
## Versions
To use a different Minecraft version, pass the `VERSION` environment variable, which can have the value
@@ -117,6 +107,34 @@ or a specific version:
docker run -d -e VERSION=1.7.9 ...
## Healthcheck
This image contains [Dinnerbone's mcstatus](https://github.com/Dinnerbone/mcstatus) and uses
its `ping` command to continually check on the container's. That can be observed
from the `STATUS` column of `docker ps`
```
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b418af073764 mc "/start" 43 seconds ago Up 41 seconds (healthy) 0.0.0.0:25565->25565/tcp, 25575/tcp mc
```
You can also query the container's health in a script friendly way:
```
> docker container inspect -f "{{.State.Health.Status}}" mc
healthy
```
Finally, since `mcstatus` is on the `PATH` you can exec into the container
and use mcstatus directly and invoke any of its other commands:
```
> docker exec mc mcstatus localhost status
version: v1.12 (protocol 335)
description: "{u'text': u'A Minecraft Server Powered by Docker'}"
players: 0/20 No players online
```
## Running a Forge Server
Enable Forge server mode by adding a `-e TYPE=FORGE` to your command-line.
@@ -127,6 +145,20 @@ but you can also choose to run a specific version with `-e FORGEVERSION=10.13.4.
-e TYPE=FORGE -e FORGEVERSION=10.13.4.1448 \
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
To use a pre-downloaded Forge installer, place it in the attached `/data` directory and
specify the name of the installer file with `FORGE_INSTALLER`, such as:
$ docker run -d -v /path/on/host:/data ... \
-e FORGE_INSTALLER=forge-1.11.2-13.20.0.2228-installer.jar ...
To download a Forge installer from a custom location, such as your own file repository, specify
the URL with `FORGE_INSTALLER_URL`, such as:
$ docker run -d -v /path/on/host:/data ... \
-e FORGE_INSTALLER_URL=http://HOST/forge-1.11.2-13.20.0.2228-installer.jar ...
In both of the cases above, there is no need for the `VERSION` or `FORGEVERSION` variables.
In order to add mods, you have two options.
### Using the /data volume
@@ -336,24 +368,30 @@ with `FTB_SERVER_MOD` specifying the updated modpack file.
-e FTB_SERVER_MOD=FTBPresentsSkyfactory3Server_3.0.7.zip \
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
### FTB server JVM options
### Fixing "unable to launch forgemodloader"
An FTB server modpack contains its own startup script that launches the
JVM and it does not use the `JVM_OPTS` environment variable. Instead
you can use `MIN_RAM` and `MAX_RAM` variables. These are appended to
the JVM `-Xms` and `-Xmx` options. For example, `-e MIN_RAM=2G` results
in `-Xms2G` passed to the JVM.
If your server's modpack fails to load with an error [like this](https://support.feed-the-beast.com/t/cant-start-crashlanding-server-unable-to-launch-forgemodloader/6028/2):
Additionally, `PERMGEN_SIZE` is passed on to `-XX:PermSize`. Here is an
example:
unable to launch forgemodloader
$ docker run -d -v /path/on/host:/data -e TYPE=FTB \
-e MIN_RAM=1G -e MAX_RAM=2G -e PERMGEN_SIZE=512M \
-e FTB_SERVER_MOD=FTBPresentsSkyfactory3Server_3.0.6.zip \
then you apply a workaround by adding this to the run invocation:
-e FTB_LEGACYJAVAFIXER=true
## Running a SpongeVanilla server
Enable SpongeVanilla server mode by adding a `-e TYPE=SPONGEVANILLA` to your command-line.
By default the container will run the latest `STABLE` version.
If you want to run a specific version, you can add `-e SPONGEVERSION=1.11.2-6.1.0-BETA-19` to your command-line.
docker run -d -v /path/on/host:/data -e TYPE=SPONGEVANILLA \
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
Note: The FTB server start script will also override other options,
like `MOTD`.
You can also choose to use the `EXPERIMENTAL` branch.
Just change it with `SPONGEBRANCH`, such as:
$ docker run -d -v /path/on/host:/data ... \
-e TYPE=SPONGEVANILLA -e SPONGEBRANCH=EXPERIMENTAL ...
## Using Docker Compose
@@ -388,6 +426,11 @@ this server instance.
## Server configuration
### Server port
The server port can be set like:
docker run -d -e SERVER_PORT=25565 ...
### Difficulty
The difficulty level (default: `easy`) can be set like:
@@ -489,6 +532,12 @@ If set to true, players will be set to spectator mode if they die.
docker run -d -e HARDCORE=false
### Snooper
If set to false, the server will not send data to snoop.minecraft.net server.
docker run -d -e SNOOPER_ENABLED=false
### Max Build Height
The maximum height in which building is allowed.
@@ -555,8 +604,14 @@ The message of the day, shown below each server entry in the UI, can be changed
docker run -d -e 'MOTD=My Server' ...
If you leave it off, the last used or default message will be used. _The example shows how to specify a server
message of the day that contains spaces by putting quotes around the whole thing._
If you leave it off, a default is computed from the server type and version, such as
A Paper Minecraft Server powered by Docker
when `TYPE` is `PAPER`. That way you can easily differentiate between several servers you may have started.
_The example shows how to specify a server message of the day that contains spaces by putting quotes
around the whole thing._
### PVP Mode
@@ -575,10 +630,11 @@ be configured by setting `LEVEL_TYPE` to
* LARGEBIOMES
* AMPLIFIED
* CUSTOMIZED
* BUFFET
Descriptions are available at the [gamepedia](http://minecraft.gamepedia.com/Server.properties).
When using a level type of `FLAT` and `CUSTOMIZED`, you can further configure the world generator
When using a level type of `FLAT`, `CUSTOMIZED`, and `BUFFET`, you can further configure the world generator
by passing [custom generator settings](http://minecraft.gamepedia.com/Superflat).
**Since generator settings usually have ;'s in them, surround the -e value with a single quote, like below.**
@@ -618,6 +674,19 @@ will be deleted when the container is deleted.
you should use an IP address or a globally resolveable FQDN, or else the
name of a linked container.
### Cloning world from a container path
The `WORLD` option can also be used to reference a directory that will be used
as a source to clone the world directory.
For example, the following would initially clone the world's content
from `/worlds/basic`. Also notice in the example that you can use a
read-only volume attachment to ensure the clone source remains pristine.
```
docker run ... -v $HOME/worlds:/worlds:ro -e WORLD=/worlds/basic
```
### Downloadable mod/plugin pack for Forge, Bukkit, and Spigot Servers
Like the `WORLD` option above, you can specify the URL of a "mod pack"
@@ -630,14 +699,45 @@ To use this option pass the environment variable `MODPACK`, such as
top level of the zip archive. Make sure the jars are compatible with the
particular `TYPE` of server you are running.
### Remove old mods/plugins
When the option above is specified (`MODPACK`) you can also instruct script to
delete old mods/plugins prior to installing new ones. This behaviour is desirable
in case you want to upgrade mods/plugins from downloaded zip file.
To use this option pass the environment variable `REMOVE_OLD_MODS="TRUE"`, such as
docker run -d -e REMOVE_OLD_MODS="TRUE" -e MODPACK=http://www.example.com/mods/modpack.zip ...
**NOTE:** This option will be taken into account only when option `MODPACK` is also used.
**WARNING:** All content of the `mods` or `plugins` directory will be deleted
before unpacking new content from the zip file.
### Online mode
By default, server checks connecting players against Minecraft's account database. If you want to create an offline server or your server is not connected to the internet, you can disable the server to try connecting to minecraft.net to authenticate players with environment variable `ONLINE_MODE`, like this
docker run -d -e ONLINE_MODE=FALSE ...
### Allow flight
Allows users to use flight on your server while in Survival mode, if they have a mod that provides flight installed.
-e ALLOW_FLIGHT=TRUE|FALSE
## Miscellaneous Options
### Running as alternate user/group ID
By default, the container will switch to user ID 1000 and group ID 1000;
however, you can override those values by setting `UID` and/or `GID` as environmental entries, during the `docker run` command.
-e UID=1234
-e GID=1234
The container will also skip user switching if the `--user`/`-u` argument
is passed to `docker run`.
### Memory Limit
By default, the image declares a Java initial and maximum memory limit of 1 GB. There are several
@@ -651,6 +751,16 @@ ways to adjust the memory settings:
The values of all three are passed directly to the JVM and support format/units as
`<size>[g|G|m|M|k|K]`.
### /data ownership
### JVM Options
In order to adapt to differences in `UID` and `GID` settings the entry script will attempt to correct ownership and writability of the `/data` directory. This logic can be disabled by setting `-e SKIP_OWNERSHIP_FIX=TRUE`.
General JVM options can be passed to the Minecraft Server invocation by passing a `JVM_OPTS`
environment variable. Options like `-X` that need to proceed general JVM options can be passed
via a `JVM_XX_OPTS` environment variable.
### HTTP Proxy
You may configure the use of an HTTP/HTTPS proxy by passing the proxy's URL via the `PROXY`
environment variable. In [the example compose file](docker-compose-proxied.yml) it references
a companion squid proxy by setting the equivalent of
-e PROXY=proxy:3128

View File

@@ -0,0 +1,16 @@
version: '3'
services:
mc:
# build: .
image: itzg/minecraft-server
ports:
- 25565:25565
environment:
EULA: "TRUE"
# TYPE: SPIGOT
# VERSION: 1.11.2
PROXY: proxy:3128
proxy:
image: sameersbn/squid

View File

@@ -0,0 +1,11 @@
version: '3.2'
services:
mc:
image: itzg/minecraft-server
environment:
EULA: "true"
TYPE: FTB
FTB_SERVER_MOD: https://minecraft.curseforge.com/projects/all-the-mods-expert-remastered/files/2493900/download
ports:
- 25565:25565

View File

@@ -0,0 +1,16 @@
version: '3.2'
services:
mc:
image: itzg/minecraft-server
environment:
EULA: "true"
TYPE: FTB
FTB_SERVER_MOD: https://www.feed-the-beast.com/projects/ftb-presents-skyfactory-3/files/2481284
ports:
- 25565:25565
volumes:
- mc-ftb:/data
volumes:
mc-ftb:

View File

@@ -0,0 +1,41 @@
apiVersion: v1
kind: Service
metadata:
name: mc-vanilla
spec:
type: NodePort
ports:
- port: 25565
nodePort: 30000
selector:
app: mc-vanilla
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mc-vanilla
spec:
selector:
matchLabels:
app: mc-vanilla
template:
metadata:
labels:
app: mc-vanilla
spec:
containers:
- image: itzg/minecraft-server
name: mc-vanilla
env:
# Use secret in real usage
- name: EULA
value: "true"
ports:
- containerPort: 25565
name: main
volumeMounts:
- name: mc-data
mountPath: /data
volumes:
- name: mc-data
emptyDir: {}

22
minecraft-server/start Executable file
View File

@@ -0,0 +1,22 @@
#!/bin/bash
umask 0002
chmod g+w /data
if [ $(id -u) = 0 ]; then
if [[ -v UID && $UID != $(id -u) ]]; then
usermod -u $UID minecraft
fi
if [[ -v GID ]]; then
groupmod -g $GID minecraft
fi
if [[ $(stat -c "%u" /data) != $UID ]]; then
echo "Changing ownership of /data to $UID ..."
chown -R minecraft:minecraft /data
fi
exec su-exec minecraft:minecraft /start-configuration
else
exec /start-configuration
fi

View File

@@ -0,0 +1,98 @@
#!/bin/bash
shopt -s nullglob
#umask 002
export HOME=/data
if [ ! -e /data/eula.txt ]; then
if [ "$EULA" != "" ]; then
echo "# Generated via Docker on $(date)" > eula.txt
echo "eula=$EULA" >> eula.txt
if [ $? != 0 ]; then
echo "ERROR: unable to write eula to /data. Please make sure attached directory is writable by uid=${UID}"
exit 2
fi
else
echo ""
echo "Please accept the Minecraft EULA at"
echo " https://account.mojang.com/documents/minecraft_eula"
echo "by adding the following immediately after 'docker run':"
echo " -e EULA=TRUE"
echo ""
exit 1
fi
fi
echo "Running as uid=$(id -u) gid=$(id -g) with /data as '$(ls -lnd /data)'"
if ! touch /data/.verify_access; then
echo "ERROR: /data doesn't seem to be writable. Please make sure attached directory is writable by uid=$(id -u)"
exit 2
fi
rm /data/.verify_access || true
if [[ $PROXY ]]; then
export http_proxy="$PROXY"
export https_proxy="$PROXY"
echo "INFO: Giving proxy time to startup..."
sleep 5
fi
export SERVER_PROPERTIES=/data/server.properties
export VERSIONS_JSON=https://launchermeta.mojang.com/mc/game/version_manifest.json
echo "Checking version information."
case "X$VERSION" in
X|XLATEST|Xlatest)
export VANILLA_VERSION=`curl -fsSL $VERSIONS_JSON | jq -r '.latest.release'`
;;
XSNAPSHOT|Xsnapshot)
export VANILLA_VERSION=`curl -fsSL $VERSIONS_JSON | jq -r '.latest.snapshot'`
;;
X[1-9]*)
export VANILLA_VERSION=$VERSION
;;
*)
export VANILLA_VERSION=`curl -fsSL $VERSIONS_JSON | jq -r '.latest.release'`
;;
esac
cd /data
export ORIGINAL_TYPE=${TYPE^^}
echo "Checking type information."
case "${TYPE^^}" in
*BUKKIT|SPIGOT)
exec /start-deployBukkitSpigot $@
;;
PAPER)
exec /start-deployPaper $@
;;
FORGE)
exec /start-deployForge $@
;;
FTB|CURSEFORGE)
exec /start-deployFTB $@
;;
VANILLA)
exec /start-deployVanilla $@
;;
SPONGEVANILLA)
exec /start-deploySpongeVanilla $@
;;
*)
echo "Invalid type: '$TYPE'"
echo "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTB, CURSEFORGE, SPONGEVANILLA"
exit 1
;;
esac

View File

@@ -0,0 +1,78 @@
#!/bin/bash
function buildSpigotFromSource {
echo "Building Spigot $VANILLA_VERSION from source, might take a while, get some coffee"
mkdir /data/temp
cd /data/temp
curl -sSL -o /data/temp/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar && \
java -jar /data/temp/BuildTools.jar --rev $VANILLA_VERSION 2>&1 |tee /data/spigot_build.log| while read l; do echo -n .; done; echo "done"
mv spigot-*.jar /data/spigot_server.jar
mv craftbukkit-*.jar /data/craftbukkit_server.jar
echo "Cleaning up"
rm -rf /data/temp
cd /data
}
function downloadSpigot {
local match
case "$TYPE" in
*BUKKIT|*bukkit)
match="CraftBukkit"
downloadUrl=${BUKKIT_DOWNLOAD_URL}
getbukkitFlavor=craftbukkit
;;
*)
match="Spigot"
downloadUrl=${SPIGOT_DOWNLOAD_URL}
getbukkitFlavor=spigot
;;
esac
local downloadVersion
if [[ ${VERSION} == LATEST ]]; then
downloadVersion=${VANILLA_VERSION}
else
downloadVersion=${VERSION}
fi
if [[ -z $downloadUrl ]]; then
downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${downloadVersion}.jar"
fi
echo "Downloading $match from $downloadUrl ..."
curl -fsSL -o $SERVER "$downloadUrl"
if [[ $? != 0 || $(grep -c "DOCTYPE html" $SERVER) != 0 ]]; then
cat <<EOF
ERROR: failed to download from $downloadUrl
Visit https://getbukkit.org/download/${getbukkitFlavor} to lookup the
exact version, such as 1.4.6-R0.4-SNAPSHOT or 1.8-R0.1-SNAPSHOT-LATEST
EOF
exit 3
fi
}
case "$TYPE" in
*BUKKIT|*bukkit)
export SERVER=craftbukkit_server.jar
;;
*)
export SERVER=spigot_server.jar
;;
esac
if [ ! -f $SERVER ]; then
if [[ "$BUILD_SPIGOT_FROM_SOURCE" = TRUE || "$BUILD_SPIGOT_FROM_SOURCE" = true || "$BUILD_FROM_SOURCE" = TRUE || "$BUILD_FROM_SOURCE" = true ]]; then
buildSpigotFromSource
else
downloadSpigot
fi
fi
# Normalize on Spigot for operations below
export TYPE=SPIGOT
# Continue to Final Setup
exec /start-finalSetup01World $@

104
minecraft-server/start-deployFTB Executable file
View File

@@ -0,0 +1,104 @@
#!/bin/bash
. /start-utils
export FTB_BASE_DIR=/data/FeedTheBeast
legacyJavaFixerUrl=http://ftb.cursecdn.com/FTB2/maven/net/minecraftforge/lex/legacyjavafixer/1.0/legacyjavafixer-1.0.jar
export TYPE=FEED-THE-BEAST
echo "Looking for Feed-The-Beast server modpack."
if [[ -z $FTB_SERVER_MOD ]]; then
echo "Environment variable FTB_SERVER_MOD not set."
echo "Set FTB_SERVER_MOD to the file name of the FTB server modpack."
echo "(And place the modpack in the /data directory.)"
exit 2
fi
if [[ -d ${FTB_BASE_DIR} ]]; then
startScriptCount=$(find ${FTB_BASE_DIR} -name ServerStart.sh |wc -l)
if [[ $startScriptCount > 1 ]]; then
echo "Conflicting FTB/CurseForge packages have been installed. Please cleanup ${FTB_BASE_DIR}"
exit 2
fi
else
startScriptCount=0
fi
# only download and install if a mod pack isn't already installed
# also check for the start script rather than just the folder
# this allows saving just the world separate from the rest of the data directory
if [[ $startScriptCount = 0 ]]; then
srv_modpack=${FTB_SERVER_MOD}
if isURL ${srv_modpack}; then
case $srv_modpack in
https://www.feed-the-beast.com/*/download|https://minecraft.curseforge.com/*/download)
;;
https://www.feed-the-beast.com/*|https://minecraft.curseforge.com/*)
srv_modpack=${srv_modpack}/download;;
esac
file=$(basename $(dirname $srv_modpack))
downloaded=/data/${file}.zip
if [ ! -e $downloaded ]; then
echo "Downloading FTB modpack...
$srv_modpack -> $downloaded"
curl -sSL -o $downloaded $srv_modpack
fi
srv_modpack=$downloaded
fi
if [[ ${srv_modpack:0:5} == "data/" ]]; then
# Prepend with "/"
srv_modpack=/${srv_modpack}
fi
if [[ ! ${srv_modpack:0:1} == "/" ]]; then
# If not an absolute path, assume file is in "/data"
srv_modpack=/data/${srv_modpack}
fi
if [[ ! -f ${srv_modpack} ]]; then
echo "FTB server modpack ${srv_modpack} not found."
exit 2
fi
if [[ ! ${srv_modpack: -4} == ".zip" ]]; then
echo "FTB server modpack ${srv_modpack} is not a zip archive."
echo "Please set FTB_SERVER_MOD to a file with a .zip extension."
exit 2
fi
echo "Unpacking FTB server modpack ${srv_modpack} ..."
mkdir -p ${FTB_BASE_DIR}
unzip -o ${srv_modpack} -d ${FTB_BASE_DIR} | awk '{printf "."} END {print ""}'
fi
if [[ $(find ${FTB_BASE_DIR} -name ServerStart.sh -o -name LaunchServer.sh |wc -l) = 0 ]]; then
echo "Please make sure you are using the server version of the FTB modpack!"
exit 2
fi
export FTB_SERVER_START=$(find ${FTB_BASE_DIR} -name ServerStart.sh -o -name LaunchServer.sh)
if [[ $(echo ${FTB_SERVER_START} | wc -w) != 1 ]]; then
echo "Please make sure you are using the server version of the FTB modpack!"
exit 2
fi
export FTB_DIR=$(dirname ${FTB_SERVER_START})
chmod a+x ${FTB_SERVER_START}
sed -i 's/-jar/-Dfml.queryResult=confirm -jar/' ${FTB_SERVER_START}
sed -i 's/.*read.*Restart now/#\0/' ${FTB_SERVER_START}
legacyJavaFixerPath=${FTB_DIR}/mods/legacyjavafixer.jar
if isTrue ${FTB_LEGACYJAVAFIXER} && [ ! -e ${legacyJavaFixerPath} ]; then
echo "Installing legacy java fixer to ${legacyJavaFixerPath}"
curl -sSL -o ${legacyJavaFixerPath} ${legacyJavaFixerUrl}
fi
if [ -e ${FTB_DIR}/FTBInstall.sh ]; then
pushd ${FTB_DIR}
sh FTBInstall.sh
popd
elif [ -e ${FTB_DIR}/Install.sh ]; then
pushd ${FTB_DIR}
sh Install.sh
popd
fi
# Continue to Final Setup
exec /start-finalSetup01World $@

View File

@@ -0,0 +1,120 @@
#!/bin/bash
export TYPE=FORGE
if [[ -z $FORGE_INSTALLER && -z $FORGE_INSTALLER_URL ]]; then
norm=$VANILLA_VERSION
case $VANILLA_VERSION in
*.*.*)
norm=$VANILLA_VERSION ;;
*.*)
norm=${VANILLA_VERSION}.0 ;;
esac
################### TEMPORORAY LOGIC util forge is generally available for 1.13
if [[ $VERSION = LATEST ]]; then
VANILLA_VERSION=1.12.2
fi
#################################################################################
echo "Checking Forge version information."
case $FORGEVERSION in
RECOMMENDED)
curl -fsSL -o /tmp/forge.json http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json
FORGE_VERSION=$(cat /tmp/forge.json | jq -r ".promos[\"$VANILLA_VERSION-recommended\"]")
if [ $FORGE_VERSION = null ]; then
FORGE_VERSION=$(cat /tmp/forge.json | jq -r ".promos[\"$VANILLA_VERSION-latest\"]")
if [ $FORGE_VERSION = null ]; then
echo "ERROR: Version $VANILLA_VERSION is not supported by Forge"
echo " Refer to http://files.minecraftforge.net/ for supported versions"
exit 2
fi
fi
;;
*)
FORGE_VERSION=$FORGEVERSION
;;
esac
normForgeVersion=$VANILLA_VERSION-$FORGE_VERSION-$norm
shortForgeVersion=$VANILLA_VERSION-$FORGE_VERSION
FORGE_INSTALLER="/tmp/forge-$shortForgeVersion-installer.jar"
elif [[ -z $FORGE_INSTALLER ]]; then
FORGE_INSTALLER="/tmp/forge-installer.jar"
elif [[ ! -e $FORGE_INSTALLER ]]; then
echo "ERROR: the given Forge installer doesn't exist : $FORGE_INSTALLER"
exit 2
fi
installMarker=".forge-installed-$shortForgeVersion"
if [ ! -e $installMarker ]; then
if [ ! -e $FORGE_INSTALLER ]; then
if [[ -z $FORGE_INSTALLER_URL ]]; then
echo "Downloading $normForgeVersion"
forgeFileNames="
$normForgeVersion/forge-$normForgeVersion-installer.jar
$shortForgeVersion/forge-$shortForgeVersion-installer.jar
END
"
for fn in $forgeFileNames; do
if [ $fn == END ]; then
echo "Unable to compute URL for $normForgeVersion"
exit 2
fi
downloadUrl=http://files.minecraftforge.net/maven/net/minecraftforge/forge/$fn
echo "...trying $downloadUrl"
if curl -o $FORGE_INSTALLER -fsSL $downloadUrl; then
break
fi
done
else
echo "Downloading $FORGE_INSTALLER_URL ..."
if ! curl -o $FORGE_INSTALLER -fsSL $FORGE_INSTALLER_URL; then
echo "Failed to download from given location $FORGE_INSTALLER_URL"
exit 2
fi
fi
fi
echo "Installing Forge $shortForgeVersion using $FORGE_INSTALLER"
mkdir -p mods
tries=3
while ((--tries >= 0)); do
java -jar $FORGE_INSTALLER --installServer
if [ $? == 0 ]; then
break
fi
done
if (($tries < 0)); then
echo "Forge failed to install after several tries." >&2
exit 10
fi
# NOTE $shortForgeVersion will be empty if installer location was given to us
echo "Finding installed server jar..."
unset -v latest
for file in *forge*.jar; do
[[ $file =~ installer ]] || [[ $file -nt $latest ]] && latest=$file
done
if [[ -z $latest ]]; then
echo "Unable to derive server jar for Forge"
exit 2
fi
export SERVER=$latest
echo "Using server $SERVER"
echo $SERVER > $installMarker
else
export SERVER=$(cat $installMarker)
fi
# Continue to Final Setup
exec /start-finalSetup01World $@

View File

@@ -0,0 +1,50 @@
#!/bin/bash
export SERVER=paper_server.jar
if [ ! -f $SERVER ]; then
job=PaperSpigot
case "${VANILLA_VERSION}" in
1.13.*)
job=Paper-1.13
build="lastSuccessfulBuild"
;;
1.12.2)
build="lastSuccessfulBuild";;
1.11.2)
build="1104";;
1.10.2)
build="916";;
1.9.4)
build="773";;
1.9.2)
build="727";;
1.9)
build="612";;
1.8.8)
build="443";;
*)
build="nosupp";;
esac
if [ $build != "nosupp" ]; then
rm -f $SERVER
downloadUrl=${PAPER_DOWNLOAD_URL:-https://ci.destroystokyo.com/job/$job/$build/artifact/paperclip.jar}
echo "Downloading Paper $VANILLA_VERSION from $downloadUrl ..."
curl -fsSL -o $SERVER "$downloadUrl"
if [ ! -f $SERVER ]; then
echo "ERROR: failed to download from $downloadUrl (status=$?)"
exit 3
fi
else
echo "ERROR: Version $VERSION is not supported for $TYPE"
echo " Refer to https://ci.destroystokyo.com/job/PaperSpigot/"
echo " for supported versions"
exit 2
fi
fi
# Normalize on Spigot for operations below
export TYPE=SPIGOT
# Continue to Final Setup
exec /start-finalSetup01World $@

View File

@@ -0,0 +1,37 @@
#!/bin/bash
export TYPE=spongevanilla
# Parse branch
echo "Choosing branch for Sponge"
case "$SPONGEBRANCH" in
EXPERIMENTAL|experimental|BLEEDING|bleeding)
SPONGEBRANCH=bleeding
;;
*)
SPONGEBRANCH=stable
;;
esac
# If not SPONGEVERSION selected, detect last version on selected branch
if [ -z $SPONGEVERSION ]; then
echo "Choosing Version for Sponge"
if [ "$SPONGEBRANCH" == "stable" ]; then
export SPONGEVERSION=`curl -fsSL https://dl-api.spongepowered.org/v1/org.spongepowered/$TYPE | jq -r '.buildTypes.stable.latest.version'`
else
export SPONGEVERSION=`curl -fsSL https://dl-api.spongepowered.org/v1/org.spongepowered/$TYPE | jq -r '.buildTypes.bleeding.latest.version'`
fi
fi
export SERVER="spongevanilla-$SPONGEVERSION.jar"
if [ ! -e $SERVER ]; then
echo "Downloading $SERVER ..."
curl -sSL -o $SERVER https://repo.spongepowered.org/maven/org/spongepowered/$TYPE/$SPONGEVERSION/$SERVER
fi
# Continue to Final Setup
exec /start-finalSetup01World $@

View File

@@ -0,0 +1,11 @@
#!/bin/bash
export SERVER="minecraft_server.$VANILLA_VERSION.jar"
if [ ! -e $SERVER ]; then
echo "Downloading $SERVER ..."
curl -sSL -o $SERVER $(curl -s $(curl -s 'https://launchermeta.mojang.com/mc/game/version_manifest.json' | jq --arg VANILLA_VERSION "$VANILLA_VERSION" --raw-output '[.versions[]|select(.id == $VANILLA_VERSION)][0].url') | jq --raw-output '.downloads.server.url')
fi
# Continue to Final Setup
exec /start-finalSetup01World $@

View File

@@ -0,0 +1,46 @@
#!/bin/bash
worldDest=/data/$LEVEL
# If supplied with a URL for a world, download it and unpack
if [[ "$WORLD" ]]; then
case "X$WORLD" in
X[Hh][Tt][Tt][Pp]*)
echo "Downloading world from $WORLD"
curl -sSL -o - "$WORLD" > /data/world.zip
echo "Unzipping world"
unzip -o -q /data/world.zip
rm -f /data/world.zip
if [ ! -d $worldDest ]; then
echo World directory not found
for i in /data/*/level.dat; do
if [ -f "$i" ]; then
d=`dirname "$i"`
echo Renaming world directory from $d
mv -f "$d" $worldDest
fi
done
fi
if [ "$TYPE" = "SPIGOT" ]; then
# Reorganise if a Spigot server
echo "Moving End and Nether maps to Spigot location"
[ -d "$worldDest/DIM1" ] && mv -f "$worldDest/DIM1" "/data/${LEVEL}_the_end"
[ -d "$worldDest/DIM-1" ] && mv -f "$worldDest/DIM-1" "/data/${LEVEL}_nether"
fi
;;
*)
if [[ -d $WORLD ]]; then
if [[ ! -d $worldDest ]]; then
echo "Cloning world directory from $WORLD ..."
cp -r $WORLD $worldDest
else
echo "Skipping clone from $WORLD since $worldDest exists"
fi
else
echo "Invalid URL given for world: Must be HTTP or HTTPS and a ZIP file"
fi
;;
esac
fi
exec /start-finalSetup02Modpack $@

View File

@@ -0,0 +1,39 @@
#!/bin/bash
# If supplied with a URL for a modpack (simple zip of jars), download it and unpack
if [[ "$MODPACK" ]]; then
case "X$MODPACK" in
X[Hh][Tt][Tt][Pp]*.zip)
echo "Downloading mod/plugin pack via HTTP"
echo " from $MODPACK ..."
if ! curl -sSL -o /tmp/modpack.zip "$MODPACK"; then
echo "ERROR: failed to download from $MODPACK"
exit 2
fi
if [ "$TYPE" = "SPIGOT" ]; then
if [ "$REMOVE_OLD_MODS" = "TRUE" ]; then
rm -rf /data/plugins/*
fi
mkdir -p /data/plugins
if ! unzip -o -d /data/plugins /tmp/modpack.zip; then
echo "ERROR: failed to unzip the modpack from $MODPACK"
fi
else
if [ "$REMOVE_OLD_MODS" = "TRUE" ]; then
rm -rf /data/mods/*
fi
mkdir -p /data/mods
if ! unzip -o -d /data/mods /tmp/modpack.zip; then
echo "ERROR: failed to unzip the modpack from $MODPACK"
fi
fi
rm -f /tmp/modpack.zip
;;
*)
echo "Invalid URL given for modpack: Must be HTTP or HTTPS and a ZIP file"
;;
esac
fi
exec /start-finalSetup03Modconfig $@

View File

@@ -0,0 +1,25 @@
#!/bin/bash
# If supplied with a URL for a config (simple zip of configurations), download it and unpack
if [[ "$MODCONFIG" ]]; then
case "X$MODCONFIG" in
X[Hh][Tt][Tt][Pp]*[Zz][iI][pP])
echo "Downloading mod/plugin configs via HTTP"
echo " from $MODCONFIG ..."
curl -sSL -o /tmp/modconfig.zip "$MODCONFIG"
if [ "$TYPE" = "SPIGOT" ]; then
mkdir -p /data/plugins
unzip -o -d /data/plugins /tmp/modconfig.zip
else
mkdir -p /data/config
unzip -o -d /data/config /tmp/modconfig.zip
fi
rm -f /tmp/modconfig.zip
;;
*)
echo "Invalid URL given for modconfig: Must be HTTP or HTTPS and a ZIP file"
;;
esac
fi
exec /start-finalSetup04ServerProperties $@

View File

@@ -0,0 +1,149 @@
#!/bin/bash
# FUNCTIONS
function setServerProp {
local prop=$1
local var=$2
if [ -n "$var" ]; then
# normalize booleans
case ${var^^} in
TRUE|FALSE)
var=${var,,} ;;
esac
echo "Setting ${prop} to '${var}' in ${SERVER_PROPERTIES}"
sed -i "/^${prop}\s*=/ c ${prop}=${var}" $SERVER_PROPERTIES
else
echo "Skip setting ${prop}"
fi
}
# Deploy server.properties file
if [ ! -e $SERVER_PROPERTIES ]; then
echo "Creating server.properties in ${SERVER_PROPERTIES}"
cp /tmp/server.properties $SERVER_PROPERTIES
if [[ ${TYPE} == "FEED-THE-BEAST" ]]; then
export SERVER_PROPERTIES=${FTB_DIR}/server.properties
echo "detected FTB, changing properties path to ${SERVER_PROPERTIES}"
cp /tmp/server.properties $SERVER_PROPERTIES
fi
if [ -n "$WHITELIST" ]; then
echo "Creating whitelist"
setServerProp "whitelist" "true"
setServerProp "white-list" "true"
fi
# If not provided, generate a reasonable default message-of-the-day,
# which shows up in the server listing in the client
if [ -z $MOTD ]; then
# snapshot is the odd case where we have to look at version to identify that label
if [[ ${ORIGINAL_TYPE} == "VANILLA" && ${VERSION} == "SNAPSHOT" ]]; then
label=SNAPSHOT
else
label=${ORIGINAL_TYPE}
fi
# Convert label to title-case
label=${label,,}
label=${label^}
MOTD="A ${label} Minecraft Server powered by Docker"
fi
setServerProp "server-port" "$SERVER_PORT"
setServerProp "motd" "$MOTD"
setServerProp "allow-nether" "$ALLOW_NETHER"
setServerProp "announce-player-achievements" "$ANNOUNCE_PLAYER_ACHIEVEMENTS"
setServerProp "enable-command-block" "$ENABLE_COMMAND_BLOCK"
setServerProp "spawn-animals" "$SPAWN_ANIMALS"
setServerProp "spawn-monsters" "$SPAWN_MONSTERS"
setServerProp "spawn-npcs" "$SPAWN_NPCS"
setServerProp "generate-structures" "$GENERATE_STRUCTURES"
setServerProp "view-distance" "$VIEW_DISTANCE"
setServerProp "hardcore" "$HARDCORE"
setServerProp "snooper-enabled" "$SNOOPER_ENABLED"
setServerProp "max-build-height" "$MAX_BUILD_HEIGHT"
setServerProp "force-gamemode" "$FORCE_GAMEMODE"
setServerProp "max-tick-time" "$MAX_TICK_TIME"
setServerProp "enable-query" "$ENABLE_QUERY"
setServerProp "query.port" "$QUERY_PORT"
setServerProp "enable-rcon" "$ENABLE_RCON"
setServerProp "rcon.password" "$RCON_PASSWORD"
setServerProp "rcon.port" "$RCON_PORT"
setServerProp "max-players" "$MAX_PLAYERS"
setServerProp "max-world-size" "$MAX_WORLD_SIZE"
setServerProp "level-name" "$LEVEL"
setServerProp "level-seed" "$SEED"
setServerProp "pvp" "$PVP"
setServerProp "generator-settings" "$GENERATOR_SETTINGS"
setServerProp "online-mode" "$ONLINE_MODE"
setServerProp "allow-flight" "$ALLOW_FLIGHT"
if [ -n "$LEVEL_TYPE" ]; then
# normalize to uppercase
LEVEL_TYPE=$( echo ${LEVEL_TYPE} | tr '[:lower:]' '[:upper:]' )
echo "Setting level type to $LEVEL_TYPE"
# check for valid values and only then set
case $LEVEL_TYPE in
DEFAULT|FLAT|LARGEBIOMES|AMPLIFIED|CUSTOMIZED|BIOMESOP|RTG|RWG|BUFFET)
setServerProp "level-type" "$LEVEL_TYPE"
;;
*)
echo "Invalid LEVEL_TYPE: $LEVEL_TYPE"
exit 1
;;
esac
fi
if [ -n "$DIFFICULTY" ]; then
case $DIFFICULTY in
peaceful|0)
DIFFICULTY=0
;;
easy|1)
DIFFICULTY=1
;;
normal|2)
DIFFICULTY=2
;;
hard|3)
DIFFICULTY=3
;;
*)
echo "DIFFICULTY must be peaceful, easy, normal, or hard."
exit 1
;;
esac
setServerProp "difficulty" "$DIFFICULTY"
fi
if [ -n "$MODE" ]; then
echo "Setting mode"
MODE_LC=$( echo $MODE | tr '[:upper:]' '[:lower:]' )
case $MODE_LC in
0|1|2|3)
;;
su*)
MODE=0
;;
c*)
MODE=1
;;
a*)
MODE=2
;;
sp*)
MODE=3
;;
*)
echo "ERROR: Invalid game mode: $MODE"
exit 1
;;
esac
setServerProp "gamemode" "$MODE"
fi
else
echo "server.properties already created, skipping"
fi
exec /start-minecraftFinalSetup $@

View File

@@ -1,588 +0,0 @@
#!/bin/bash
#umask 002
export HOME=/data
if [ ! -e /data/eula.txt ]; then
if [ "$EULA" != "" ]; then
echo "# Generated via Docker on $(date)" > eula.txt
echo "eula=$EULA" >> eula.txt
else
echo ""
echo "Please accept the Minecraft EULA at"
echo " https://account.mojang.com/documents/minecraft_eula"
echo "by adding the following immediately after 'docker run':"
echo " -e EULA=TRUE"
echo ""
exit 1
fi
fi
SERVER_PROPERTIES=/data/server.properties
FTB_DIR=/data/FeedTheBeast
VERSIONS_JSON=https://launchermeta.mojang.com/mc/game/version_manifest.json
echo "Checking version information."
case "X$VERSION" in
X|XLATEST|Xlatest)
VANILLA_VERSION=`curl -fsSL $VERSIONS_JSON | jq -r '.latest.release'`
;;
XSNAPSHOT|Xsnapshot)
VANILLA_VERSION=`curl -fsSL $VERSIONS_JSON | jq -r '.latest.snapshot'`
;;
X[1-9]*)
VANILLA_VERSION=$VERSION
;;
*)
VANILLA_VERSION=`curl -fsSL $VERSIONS_JSON | jq -r '.latest.release'`
;;
esac
cd /data
function buildSpigotFromSource {
echo "Building Spigot $VANILLA_VERSION from source, might take a while, get some coffee"
mkdir /data/temp
cd /data/temp
wget -q -P /data/temp https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar && \
java -jar /data/temp/BuildTools.jar --rev $VANILLA_VERSION 2>&1 |tee /data/spigot_build.log| while read l; do echo -n .; done; echo "done"
mv spigot-*.jar /data/spigot_server.jar
mv craftbukkit-*.jar /data/craftbukkit_server.jar
echo "Cleaning up"
rm -rf /data/temp
cd /data
}
function downloadSpigot {
local match
case "$TYPE" in
*BUKKIT|*bukkit)
match="Craftbukkit"
downloadUrl=${BUKKIT_DOWNLOAD_URL}
;;
*)
match="Spigot"
downloadUrl=${SPIGOT_DOWNLOAD_URL}
;;
esac
if [[ -z $downloadUrl ]]; then
downloadUrl=$(restify --class=jar-div https://mcadmin.net/ | \
jq --arg version "$match $VANILLA_VERSION" -r -f /usr/share/mcadmin.jq)
if [[ -z $downloadUrl ]]; then
echo "ERROR: Version $VANILLA_VERSION is not supported for $TYPE"
echo " Refer to https://mcadmin.net/ for supported versions"
exit 2
fi
fi
echo "Downloading $match"
curl -kfsSL -o $SERVER "$downloadUrl"
status=$?
if [ ! -f $SERVER ]; then
echo "ERROR: failed to download from $downloadUrl (status=$status)"
exit 3
fi
}
function downloadPaper {
local build
case "$VERSION" in
latest|LATEST|1.10)
build="lastSuccessfulBuild";;
1.9.4)
build="773";;
1.9.2)
build="727";;
1.9)
build="612";;
1.8.8)
build="443";;
*)
build="nosupp";;
esac
if [ $build != "nosupp" ]; then
rm $SERVER
downloadUrl=${PAPER_DOWNLOAD_URL:-https://ci.destroystokyo.com/job/PaperSpigot/$build/artifact/paperclip.jar}
curl -fsSL -o $SERVER "$downloadUrl"
if [ ! -f $SERVER ]; then
echo "ERROR: failed to download from $downloadUrl (status=$?)"
exit 3
fi
else
echo "ERROR: Version $VERSION is not supported for $TYPE"
echo " Refer to https://ci.destroystokyo.com/job/PaperSpigot/"
echo " for supported versions"
exit 2
fi
}
function installForge {
TYPE=FORGE
norm=$VANILLA_VERSION
case $VANILLA_VERSION in
*.*.*)
norm=$VANILLA_VERSION ;;
*.*)
norm=${VANILLA_VERSION}.0 ;;
esac
echo "Checking Forge version information."
case $FORGEVERSION in
RECOMMENDED)
curl -fsSL -o /tmp/forge.json http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json
FORGE_VERSION=$(cat /tmp/forge.json | jq -r ".promos[\"$VANILLA_VERSION-recommended\"]")
if [ $FORGE_VERSION = null ]; then
FORGE_VERSION=$(cat /tmp/forge.json | jq -r ".promos[\"$VANILLA_VERSION-latest\"]")
if [ $FORGE_VERSION = null ]; then
echo "ERROR: Version $VANILLA_VERSION is not supported by Forge"
echo " Refer to http://files.minecraftforge.net/ for supported versions"
exit 2
fi
fi
;;
*)
FORGE_VERSION=$FORGEVERSION
;;
esac
normForgeVersion=$VANILLA_VERSION-$FORGE_VERSION-$norm
shortForgeVersion=$VANILLA_VERSION-$FORGE_VERSION
forgeFileNames="
$normForgeVersion/forge-$normForgeVersion-installer.jar
$shortForgeVersion/forge-$shortForgeVersion-installer.jar
END
"
FORGE_INSTALLER="/tmp/forge-$shortForgeVersion-installer.jar"
installMarker=".forge-installed-$shortForgeVersion"
if [ ! -e $installMarker ]; then
if [ ! -e $FORGE_INSTALLER ]; then
echo "Downloading $normForgeVersion"
for fn in $forgeFileNames; do
if [ $fn == END ]; then
echo "Unable to compute URL for $normForgeVersion"
exit 2
fi
downloadUrl=http://files.minecraftforge.net/maven/net/minecraftforge/forge/$fn
echo "...trying $downloadUrl"
if curl -o $FORGE_INSTALLER -fsSL $downloadUrl; then
break
fi
done
echo "Installing Forge $shortForgeVersion"
mkdir -p mods
tries=3
while ((--tries >= 0)); do
java -jar $FORGE_INSTALLER --installServer
if [ $? == 0 ]; then
break
fi
done
if (($tries < 0)); then
echo "Forge failed to install after several tries." >&2
exit 10
fi
SERVER=$(ls *forge*$shortForgeVersion*.jar)
if [ -z $SERVER ]; then
echo "Unable to derive server jar for Forge $shortForgeVersion"
exit 2
fi
echo "Using server $SERVER"
echo $SERVER > $installMarker
fi
else
SERVER=$(cat $installMarker)
fi
}
function isURL {
local value=$1
if [[ ${value:0:8} == "https://" || ${value:0:7} = "http://" ]]; then
return 0
else
return 1
fi
}
function installFTB {
TYPE=FEED-THE-BEAST
echo "Looking for Feed-The-Beast server modpack."
if [[ -z $FTB_SERVER_MOD ]]; then
echo "Environment variable FTB_SERVER_MOD not set."
echo "Set FTB_SERVER_MOD to the file name of the FTB server modpack."
echo "(And place the modpack in the /data directory.)"
exit 2
fi
local srv_modpack=${FTB_SERVER_MOD}
if isURL ${srv_modpack}; then
case $srv_modpack in
*/download)
break;;
*)
srv_modpack=${srv_modpack}/download;;
esac
local file=$(basename $(dirname $srv_modpack))
local downloaded=/data/${file}.zip
echo "Downloading FTB modpack...
$srv_modpack -> $downloaded"
curl -sSL -o $downloaded $srv_modpack
srv_modpack=$downloaded
fi
if [[ ${srv_modpack:0:5} == "data/" ]]; then
# Prepend with "/"
srv_modpack=/${srv_modpack}
fi
if [[ ! ${srv_modpack:0:1} == "/" ]]; then
# If not an absolute path, assume file is in "/data"
srv_modpack=/data/${srv_modpack}
fi
if [[ ! -f ${srv_modpack} ]]; then
echo "FTB server modpack ${srv_modpack} not found."
exit 2
fi
if [[ ! ${srv_modpack: -4} == ".zip" ]]; then
echo "FTB server modpack ${srv_modpack} is not a zip archive."
echo "Please set FTB_SERVER_MOD to a file with a .zip extension."
exit 2
fi
echo "Unpacking FTB server modpack ${srv_modpack} ..."
mkdir -p ${FTB_DIR}
unzip -o ${srv_modpack} -d ${FTB_DIR}
cp -f /data/eula.txt ${FTB_DIR}/eula.txt
FTB_SERVER_START=${FTB_DIR}/ServerStart.sh
chmod a+x ${FTB_SERVER_START}
sed -i "s/-jar/-Dfml.queryResult=confirm -jar/" ${FTB_SERVER_START}
}
function installVanilla {
SERVER="minecraft_server.$VANILLA_VERSION.jar"
if [ ! -e $SERVER ]; then
echo "Downloading $SERVER ..."
wget -q https://s3.amazonaws.com/Minecraft.Download/versions/$VANILLA_VERSION/$SERVER
fi
}
echo "Checking type information."
case "$TYPE" in
*BUKKIT|*bukkit|SPIGOT|spigot)
case "$TYPE" in
*BUKKIT|*bukkit)
SERVER=craftbukkit_server.jar
;;
*)
SERVER=spigot_server.jar
;;
esac
if [ ! -f $SERVER ]; then
if [[ "$BUILD_SPIGOT_FROM_SOURCE" = TRUE || "$BUILD_SPIGOT_FROM_SOURCE" = true || "$BUILD_FROM_SOURCE" = TRUE || "$BUILD_FROM_SOURCE" = true ]]; then
buildSpigotFromSource
else
downloadSpigot
fi
fi
# normalize on Spigot for operations below
TYPE=SPIGOT
;;
PAPER|paper)
SERVER=paper_server.jar
if [ ! -f $SERVER ]; then
downloadPaper
fi
# normalize on Spigot for operations below
TYPE=SPIGOT
;;
FORGE|forge)
TYPE=FORGE
installForge
;;
FTB|ftb)
TYPE=FEED-THE-BEAST
installFTB
;;
VANILLA|vanilla)
installVanilla
;;
*)
echo "Invalid type: '$TYPE'"
echo "Must be: VANILLA, FORGE, SPIGOT"
exit 1
;;
esac
# If supplied with a URL for a world, download it and unpack
if [[ "$WORLD" ]]; then
case "X$WORLD" in
X[Hh][Tt][Tt][Pp]*)
echo "Downloading world via HTTP"
echo "$WORLD"
wget -q -O - "$WORLD" > /data/world.zip
echo "Unzipping word"
unzip -q /data/world.zip
rm -f /data/world.zip
if [ ! -d /data/world ]; then
echo World directory not found
for i in /data/*/level.dat; do
if [ -f "$i" ]; then
d=`dirname "$i"`
echo Renaming world directory from $d
mv -f "$d" /data/world
fi
done
fi
if [ "$TYPE" = "SPIGOT" ]; then
# Reorganise if a Spigot server
echo "Moving End and Nether maps to Spigot location"
[ -d "/data/world/DIM1" ] && mv -f "/data/world/DIM1" "/data/world_the_end"
[ -d "/data/world/DIM-1" ] && mv -f "/data/world/DIM-1" "/data/world_nether"
fi
;;
*)
echo "Invalid URL given for world: Must be HTTP or HTTPS and a ZIP file"
;;
esac
fi
# If supplied with a URL for a modpack (simple zip of jars), download it and unpack
if [[ "$MODPACK" ]]; then
case "X$MODPACK" in
X[Hh][Tt][Tt][Pp]*[Zz][iI][pP])
echo "Downloading mod/plugin pack via HTTP"
echo " from $MODPACK ..."
curl -sSL -o /tmp/modpack.zip "$MODPACK"
if [ "$TYPE" = "SPIGOT" ]; then
mkdir -p /data/plugins
unzip -o -d /data/plugins /tmp/modpack.zip
else
mkdir -p /data/mods
unzip -o -d /data/mods /tmp/modpack.zip
fi
rm -f /tmp/modpack.zip
;;
*)
echo "Invalid URL given for modpack: Must be HTTP or HTTPS and a ZIP file"
;;
esac
fi
function setServerProp {
local prop=$1
local var=$2
if [ -n "$var" ]; then
echo "Setting $prop to $var"
sed -i "/$prop\s*=/ c $prop=$var" /data/server.properties
fi
}
if [ ! -e server.properties ]; then
echo "Creating server.properties"
cp /tmp/server.properties .
if [ -n "$WHITELIST" ]; then
echo "Creating whitelist"
sed -i "/whitelist\s*=/ c whitelist=true" /data/server.properties
sed -i "/white-list\s*=/ c white-list=true" /data/server.properties
fi
setServerProp "motd" "$MOTD"
setServerProp "allow-nether" "$ALLOW_NETHER"
setServerProp "announce-player-achievements" "$ANNOUNCE_PLAYER_ACHIEVEMENTS"
setServerProp "enable-command-block" "$ENABLE_COMMAND_BLOCK"
setServerProp "spawn-animals" "$SPAWN_ANIMAILS"
setServerProp "spawn-monsters" "$SPAWN_MONSTERS"
setServerProp "spawn-npcs" "$SPAWN_NPCS"
setServerProp "generate-structures" "$GENERATE_STRUCTURES"
setServerProp "spawn-npcs" "$SPAWN_NPCS"
setServerProp "view-distance" "$VIEW_DISTANCE"
setServerProp "hardcore" "$HARDCORE"
setServerProp "max-build-height" "$MAX_BUILD_HEIGHT"
setServerProp "force-gamemode" "$FORCE_GAMEMODE"
setServerProp "hardmax-tick-timecore" "$MAX_TICK_TIME"
setServerProp "enable-query" "$ENABLE_QUERY"
setServerProp "query.port" "$QUERY_PORT"
setServerProp "enable-rcon" "$ENABLE_RCON"
setServerProp "rcon.password" "$RCON_PASSWORD"
setServerProp "rcon.port" "$RCON_PORT"
setServerProp "max-players" "$MAX_PLAYERS"
setServerProp "max-world-size" "$MAX_WORLD_SIZE"
setServerProp "level-name" "$LEVEL"
setServerProp "level-seed" "$SEED"
setServerProp "pvp" "$PVP"
setServerProp "generator-settings" "$GENERATOR_SETTINGS"
setServerProp "online-mode" "$ONLINE_MODE"
if [ -n "$LEVEL_TYPE" ]; then
# normalize to uppercase
LEVEL_TYPE=$( echo ${LEVEL_TYPE} | tr '[:lower:]' '[:upper:]' )
echo "Setting level type to $LEVEL_TYPE"
# check for valid values and only then set
case $LEVEL_TYPE in
DEFAULT|FLAT|LARGEBIOMES|AMPLIFIED|CUSTOMIZED)
sed -i "/level-type\s*=/ c level-type=$LEVEL_TYPE" /data/server.properties
;;
*)
echo "Invalid LEVEL_TYPE: $LEVEL_TYPE"
exit 1
;;
esac
fi
if [ -n "$DIFFICULTY" ]; then
case $DIFFICULTY in
peaceful|0)
DIFFICULTY=0
;;
easy|1)
DIFFICULTY=1
;;
normal|2)
DIFFICULTY=2
;;
hard|3)
DIFFICULTY=3
;;
*)
echo "DIFFICULTY must be peaceful, easy, normal, or hard."
exit 1
;;
esac
echo "Setting difficulty to $DIFFICULTY"
sed -i "/difficulty\s*=/ c difficulty=$DIFFICULTY" /data/server.properties
fi
if [ -n "$MODE" ]; then
echo "Setting mode"
MODE_LC=$( echo $MODE | tr '[:upper:]' '[:lower:]' )
case $MODE_LC in
0|1|2|3)
;;
su*)
MODE=0
;;
c*)
MODE=1
;;
a*)
MODE=2
;;
sp*)
MODE=3
;;
*)
echo "ERROR: Invalid game mode: $MODE"
exit 1
;;
esac
sed -i "/gamemode\s*=/ c gamemode=$MODE" $SERVER_PROPERTIES
fi
fi
if [ -n "$OPS" -a ! -e ops.txt.converted ]; then
echo "Setting ops"
echo $OPS | awk -v RS=, '{print}' >> ops.txt
fi
if [ -n "$WHITELIST" -a ! -e white-list.txt.converted ]; then
echo "Setting whitelist"
echo $WHITELIST | awk -v RS=, '{print}' >> white-list.txt
fi
if [ -n "$ICON" -a ! -e server-icon.png ]; then
echo "Using server icon from $ICON..."
# Not sure what it is yet...call it "img"
wget -q -O /tmp/icon.img $ICON
specs=$(identify /tmp/icon.img | awk '{print $2,$3}')
if [ "$specs" = "PNG 64x64" ]; then
mv /tmp/icon.img /data/server-icon.png
else
echo "Converting image to 64x64 PNG..."
convert /tmp/icon.img -resize 64x64! /data/server-icon.png
fi
fi
# Make sure files exist to avoid errors
if [ ! -e banned-players.json ]; then
echo '' > banned-players.json
fi
if [ ! -e banned-ips.json ]; then
echo '' > banned-ips.json
fi
# If any modules have been provided, copy them over
mkdir -p /data/mods
for m in /mods/*.{jar,zip}
do
if [ -f "$m" -a ! -f "/data/mods/$m" ]; then
echo Copying mod `basename "$m"`
cp "$m" /data/mods
fi
done
[ -d /data/config ] || mkdir /data/config
for c in /config/*
do
if [ -f "$c" ]; then
echo Copying configuration `basename "$c"`
cp -rf "$c" /data/config
fi
done
if [ "$TYPE" = "SPIGOT" ]; then
if [ -d /plugins ]; then
echo Copying any Bukkit plugins over
cp -r /plugins /data
fi
fi
EXTRA_ARGS=""
# Optional disable console
if [[ ${CONSOLE} = false || ${CONSOLE} = FALSE ]]; then
EXTRA_ARGS+="--noconsole"
fi
# Optional disable GUI for headless servers
if [[ ${GUI} = false || ${GUI} = FALSE ]]; then
EXTRA_ARGS="${EXTRA_ARGS} nogui"
fi
# put these prior JVM_OPTS at the end to give any memory settings there higher precedence
echo "Setting initial memory to ${INIT_MEMORY:-${MEMORY}} and max to ${MAX_MEMORY:-${MEMORY}}"
JVM_OPTS="-Xms${INIT_MEMORY:-${MEMORY}} -Xmx${MAX_MEMORY:-${MEMORY}} ${JVM_OPTS}"
if [[ ${TYPE} == "FEED-THE-BEAST" ]]; then
cp -f $SERVER_PROPERTIES ${FTB_DIR}/server.properties
cp -f /data/{eula,ops,white-list}.txt ${FTB_DIR}/
cd ${FTB_DIR}
echo "Running FTB server modpack start ..."
exec sh ${FTB_SERVER_START}
else
# If we have a bootstrap.txt file... feed that in to the server stdin
if [ -f /data/bootstrap.txt ];
then
exec java $JVM_XX_OPTS $JVM_OPTS -jar $SERVER "$@" $EXTRA_ARGS < /data/bootstrap.txt
else
exec java $JVM_XX_OPTS $JVM_OPTS -jar $SERVER "$@" $EXTRA_ARGS
fi
fi

View File

@@ -0,0 +1,105 @@
#!/bin/bash
if [ -n "$OPS" -a ! -e ops.txt.converted ]; then
echo "Setting ops"
echo $OPS | awk -v RS=, '{print}' >> ops.txt
fi
if [ -n "$WHITELIST" -a ! -e white-list.txt.converted ]; then
echo "Setting whitelist"
echo $WHITELIST | awk -v RS=, '{print}' >> white-list.txt
fi
if [ -n "$ICON" -a ! -e server-icon.png ]; then
echo "Using server icon from $ICON..."
# Not sure what it is yet...call it "img"
curl -sSL -o /tmp/icon.img $ICON
specs=$(identify /tmp/icon.img | awk '{print $2,$3}')
if [ "$specs" = "PNG 64x64" ]; then
mv /tmp/icon.img /data/server-icon.png
else
echo "Converting image to 64x64 PNG..."
convert /tmp/icon.img -resize 64x64! /data/server-icon.png
fi
fi
# Make sure files exist and are valid JSON (for pre-1.12 to 1.12 upgrades)
if [[ -z "ls *.json" ]]; then
echo "Checking JSON files"
for j in *.json; do
if [[ $(python -c "print open('$j').read().strip()==''") = True ]]; then
echo "Fixing JSON $j"
echo '[]' > $j
fi
done
else
echo "Skipping JSON check. No files present."
fi
# If any modules have been provided, copy them over
mkdir -p /data/mods
for m in /mods/*.{jar,zip}
do
if [ -f "$m" -a ! -f "/data/mods/$m" ]; then
echo Copying mod `basename "$m"`
cp "$m" /data/mods
fi
done
[ -d /data/config ] || mkdir /data/config
for c in /config/*
do
if [ -f "$c" ]; then
echo Copying configuration `basename "$c"`
cp -rf "$c" /data/config
fi
done
if [ "$TYPE" = "SPIGOT" ]; then
if [ -d /plugins ]; then
echo Copying any Bukkit plugins over
cp -r /plugins /data
fi
fi
EXTRA_ARGS=""
# Optional disable console
if [[ ${CONSOLE} = false || ${CONSOLE} = FALSE ]]; then
EXTRA_ARGS+="--noconsole"
fi
# Optional disable GUI for headless servers
if [[ ${GUI} = false || ${GUI} = FALSE ]]; then
EXTRA_ARGS="${EXTRA_ARGS} nogui"
fi
# put these prior JVM_OPTS at the end to give any memory settings there higher precedence
echo "Setting initial memory to ${INIT_MEMORY:=${MEMORY}} and max to ${MAX_MEMORY:=${MEMORY}}"
if [[ ${TYPE} == "FEED-THE-BEAST" ]]; then
if [ ! -e ${FTB_DIR}/ops.json -a -e /data/ops.txt ]; then
cp -f /data/ops.txt ${FTB_DIR}/
fi
if [ ! -e ${FTB_DIR}/whitelist.json -a -e /data/white-list.txt ]; then
cp -f /data/white-list.txt ${FTB_DIR}/
fi
cp -f /data/eula.txt ${FTB_DIR}/
cat > ${FTB_DIR}/settings-local.sh <<EOF
export MIN_RAM="${INIT_MEMORY}"
export MAX_RAM="${MAX_MEMORY}"
EOF
cd ${FTB_DIR}
echo "Running FTB ${FTB_SERVER_START} in ${FTB_DIR} ..."
exec mc-server-runner ${FTB_SERVER_START}
else
# If we have a bootstrap.txt file... feed that in to the server stdin
if [ -f /data/bootstrap.txt ]; then
bootstrapArgs="--bootstrap /data/bootstrap.txt"
fi
JVM_OPTS="-Xms${INIT_MEMORY} -Xmx${MAX_MEMORY} ${JVM_OPTS}"
exec mc-server-runner ${bootstrapArgs} java $JVM_XX_OPTS $JVM_OPTS -jar $SERVER "$@" $EXTRA_ARGS
fi

View File

@@ -0,0 +1,28 @@
#!/bin/bash
function isURL {
local value=$1
if [[ ${value:0:8} == "https://" || ${value:0:7} = "http://" ]]; then
return 0
else
return 1
fi
}
function isTrue {
local value=${1,,}
result=
case ${value} in
true|on)
result=0
;;
*)
result=1
;;
esac
return ${result}
}

View File

@@ -1,22 +0,0 @@
#!/bin/sh
set -e
sed -i "/^minecraft/s/:1000:1000:/:${UID}:${GID}:/g" /etc/passwd
sed -i "/^minecraft/s/:1000:/:${GID}:/g" /etc/group
if [ "$SKIP_OWNERSHIP_FIX" != "TRUE" ]; then
fix_ownership() {
dir=$1
if ! su-exec minecraft test -w $dir; then
echo "Correcting writability of $dir ..."
chown -R minecraft:minecraft $dir
chmod -R u+w $dir
fi
}
fix_ownership /data
fix_ownership /home/minecraft
fi
echo "Switching to user 'minecraft'"
su-exec minecraft /start-minecraft $@