mirror of
https://github.com/itzg/docker-minecraft-server.git
synced 2026-02-17 23:16:24 +00:00
Compare commits
247 Commits
2021.15.0-
...
java16
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3b89f143c2 | ||
|
|
9116be11ae | ||
|
|
788f61c693 | ||
|
|
969f4c8db6 | ||
|
|
e6916e91e7 | ||
|
|
7651f3da07 | ||
|
|
9544aeaf7a | ||
|
|
babeac1693 | ||
|
|
0bf77c18b0 | ||
|
|
130b067955 | ||
|
|
55d272141d | ||
|
|
df7d6c298a | ||
|
|
b8b5fba660 | ||
|
|
a8a60264e9 | ||
|
|
721df8d32b | ||
|
|
2375a6796c | ||
|
|
e04e943e1c | ||
|
|
1bf75671f6 | ||
|
|
7d56de9d15 | ||
|
|
8a8ec9e52e | ||
|
|
a8de790b57 | ||
|
|
cafddd3b12 | ||
|
|
fc958faf7b | ||
|
|
402894cd8d | ||
|
|
f97cea4b06 | ||
|
|
1ee8ad87ba | ||
|
|
0198c15b8c | ||
|
|
e813007f49 | ||
|
|
df2962bdb3 | ||
|
|
367f07b784 | ||
|
|
9de9ec2e34 | ||
|
|
6ad7773e2b | ||
|
|
8177dd9a5a | ||
|
|
81994ec3b3 | ||
|
|
d8f256954c | ||
|
|
ecee4069f1 | ||
|
|
3713d9c4e8 | ||
|
|
c7f1d13f9b | ||
|
|
cc8d18d41f | ||
|
|
afd863ab89 | ||
|
|
46f6653b13 | ||
|
|
3237d1a996 | ||
|
|
386e34e05b | ||
|
|
4fd234e482 | ||
|
|
38fd0dac8b | ||
|
|
11ac111036 | ||
|
|
9803547967 | ||
|
|
1a0c7c4f85 | ||
|
|
7b7d5db796 | ||
|
|
e741bf325d | ||
|
|
34baf8a354 | ||
|
|
583574281b | ||
|
|
cc9e0fe1ef | ||
|
|
235646840c | ||
|
|
9c354d5775 | ||
|
|
2dce24c1bd | ||
|
|
6f80ce5584 | ||
|
|
c8df2d8e31 | ||
|
|
60b26f02ec | ||
|
|
2e8f27a8ef | ||
|
|
e20dd63f76 | ||
|
|
3e62389325 | ||
|
|
f3c880f96a | ||
|
|
2c7796ea0b | ||
|
|
0daeeb70f7 | ||
|
|
86782865c4 | ||
|
|
ddcabb175a | ||
|
|
c7a4f87e8e | ||
|
|
7b09e525e8 | ||
|
|
70b56c3e28 | ||
|
|
2eefb12e6b | ||
|
|
5777a248d4 | ||
|
|
97a6a4ba85 | ||
|
|
531d33af1c | ||
|
|
0618d690fa | ||
|
|
87949bf7c1 | ||
|
|
6aa3b1066f | ||
|
|
393544a194 | ||
|
|
4aea1753bd | ||
|
|
0e39351ba8 | ||
|
|
c42d8971ca | ||
|
|
ee7f2ee739 | ||
|
|
6008660a81 | ||
|
|
043d9778b8 | ||
|
|
8bf7c6cccd | ||
|
|
80d7efb365 | ||
|
|
f85673a72e | ||
|
|
56a00aa416 | ||
|
|
32ed58692c | ||
|
|
63b919f1a9 | ||
|
|
57d9da96a1 | ||
|
|
e6a420036d | ||
|
|
ec97c67aca | ||
|
|
e5e9b0d928 | ||
|
|
52f5660e72 | ||
|
|
2e37c16b2c | ||
|
|
fb949d2fdd | ||
|
|
bcdab80f41 | ||
|
|
c3cf892e40 | ||
|
|
79714cd6c7 | ||
|
|
1d41593a84 | ||
|
|
52452020dd | ||
|
|
65f2562d52 | ||
|
|
3482944ac8 | ||
|
|
9d03a1dc13 | ||
|
|
a2f61da686 | ||
|
|
012d3e7b65 | ||
|
|
332b5b3eb9 | ||
|
|
10d254bbbc | ||
|
|
8acb3f8a90 | ||
|
|
1b00a8692b | ||
|
|
45a85c83b0 | ||
|
|
814559bef8 | ||
|
|
8bac02bbcf | ||
|
|
7ef031e244 | ||
|
|
250d32e3dc | ||
|
|
bdeab5bb9c | ||
|
|
764e1e9363 | ||
|
|
72461546b8 | ||
|
|
98ad3b0f4a | ||
|
|
c046a5855e | ||
|
|
7afd2adacf | ||
|
|
4c52d0ec42 | ||
|
|
9f66622472 | ||
|
|
19eebae327 | ||
|
|
1f2f33d6c0 | ||
|
|
1a3c454d7f | ||
|
|
fa11d313fb | ||
|
|
20bc2a97d9 | ||
|
|
088bc53010 | ||
|
|
0cd49c4c81 | ||
|
|
6c1cd2537d | ||
|
|
cf31f24752 | ||
|
|
27523a1c45 | ||
|
|
e1d0fe6b92 | ||
|
|
d3f4a4991e | ||
|
|
296ddbdec5 | ||
|
|
f7cd34b8d8 | ||
|
|
7bafffbd06 | ||
|
|
201ec3be5a | ||
|
|
7d1d5af097 | ||
|
|
f9ce5bce4d | ||
|
|
748768c771 | ||
|
|
f307077636 | ||
|
|
19c5626085 | ||
|
|
179cd878a9 | ||
|
|
788548d1f4 | ||
|
|
0ae15c2b3c | ||
|
|
b5b4257032 | ||
|
|
657db124b2 | ||
|
|
f5ea43b3d3 | ||
|
|
01747510d5 | ||
|
|
ff8b160a2b | ||
|
|
28b7afda15 | ||
|
|
ecd253dd3e | ||
|
|
03cbbd465a | ||
|
|
8d0dbcd50e | ||
|
|
592f18358a | ||
|
|
327f21f1bb | ||
|
|
c96d6b2958 | ||
|
|
905906fa6c | ||
|
|
da8fb37317 | ||
|
|
4d7e29cb3a | ||
|
|
c862745534 | ||
|
|
17099320e9 | ||
|
|
f3dbb4dd2d | ||
|
|
ead8543b48 | ||
|
|
b3b3cdde08 | ||
|
|
d34ae9d57d | ||
|
|
b8cd510a0e | ||
|
|
0d5eb2ea9e | ||
|
|
b6e53249f9 | ||
|
|
2b0fd2e5c0 | ||
|
|
4168821ec4 | ||
|
|
6353488db7 | ||
|
|
b446d4cc3f | ||
|
|
8020f83c3d | ||
|
|
16b2762025 | ||
|
|
fe01df78c4 | ||
|
|
c5a3e2e376 | ||
|
|
afd0865d33 | ||
|
|
5018298c81 | ||
|
|
37b81aa0be | ||
|
|
6a3a0465a4 | ||
|
|
34d67d6018 | ||
|
|
9c4403d7ff | ||
|
|
bcf408fb44 | ||
|
|
3c0566cb87 | ||
|
|
37f59eecd9 | ||
|
|
4357066cdf | ||
|
|
67ca9a7fc4 | ||
|
|
9c9c295a79 | ||
|
|
daa3292000 | ||
|
|
2da5e2b2ec | ||
|
|
c5119ad27b | ||
|
|
4808507da8 | ||
|
|
4ae2e5592f | ||
|
|
11a286fe26 | ||
|
|
8fc44e0071 | ||
|
|
ca80b4730f | ||
|
|
f3fa90b700 | ||
|
|
80a8ce8a46 | ||
|
|
c1322a23ea | ||
|
|
d804323cab | ||
|
|
4cbf481441 | ||
|
|
cbaef446ac | ||
|
|
8aa1312ae2 | ||
|
|
7ec09fcfe9 | ||
|
|
1cd8ec83ef | ||
|
|
c090095e08 | ||
|
|
f24bc00eb9 | ||
|
|
9778bddd4f | ||
|
|
f91ee5d245 | ||
|
|
a03a1a8eff | ||
|
|
dd6700e659 | ||
|
|
408af32fbe | ||
|
|
ca8a27babe | ||
|
|
141d6c7125 | ||
|
|
19cc894662 | ||
|
|
15320f0eb2 | ||
|
|
ddd4712ea0 | ||
|
|
af758af51a | ||
|
|
9d231801da | ||
|
|
680987a385 | ||
|
|
33c2154a98 | ||
|
|
f890b316da | ||
|
|
655ae04abb | ||
|
|
2e4cf0b731 | ||
|
|
f5a319b0b3 | ||
|
|
2533d2c694 | ||
|
|
b1fed81821 | ||
|
|
0064c0357f | ||
|
|
20cd8cce1d | ||
|
|
bc8af2784f | ||
|
|
e300810a16 | ||
|
|
33b48a8a4b | ||
|
|
6f2f1174e6 | ||
|
|
adbe75ae7e | ||
|
|
dae2add713 | ||
|
|
38946fd294 | ||
|
|
f62dd55300 | ||
|
|
047ef107ae | ||
|
|
1bb2f92f5b | ||
|
|
727a1f29d1 | ||
|
|
012bd3a307 | ||
|
|
ae5b19b0aa | ||
|
|
81d9c55eee |
5
.github/FUNDING.yml
vendored
Normal file
5
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
#github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||||
|
custom:
|
||||||
|
- https://www.buymeacoffee.com/itzg
|
||||||
|
- https://paypal.me/itzg
|
||||||
40
.github/ISSUE_TEMPLATE/bug.yml
vendored
Normal file
40
.github/ISSUE_TEMPLATE/bug.yml
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
name: Bug Report
|
||||||
|
description: File a bug report
|
||||||
|
labels:
|
||||||
|
- bug
|
||||||
|
- status/needs triage
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to report a bug.
|
||||||
|
|
||||||
|
Please double check some things first:
|
||||||
|
- Do you just have a question about something? If so, asking in the [Q&A Discussions](https://github.com/itzg/docker-minecraft-server/discussions/categories/q-a) or asking on [the Discord server](https://discord.gg/DXfKpjB) would be best.
|
||||||
|
- Is this bug happening after the `[init]` prefixed logs and after the log that says "Starting the Minecraft server"? If so, please report the bug with Mojang or the respective server provider.
|
||||||
|
- Are you seeing a performance problem? If so, that is typically outside the scope of the image setup mechanims. Ask a question as above or contact the respective server provider.
|
||||||
|
- type: textarea
|
||||||
|
id: problem
|
||||||
|
attributes:
|
||||||
|
label: Describe the problem
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: container
|
||||||
|
attributes:
|
||||||
|
label: Container definition
|
||||||
|
description: Please provide the compose file or run command used to create the container
|
||||||
|
value: |
|
||||||
|
```
|
||||||
|
Paste run command or compose file here
|
||||||
|
```
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Container logs
|
||||||
|
description: |
|
||||||
|
Please provide container logs from the start of the container, which will be the ones prefixed with `[init]`. It is even better if you can set the variable `DEBUG` to "true" and provide those debug container logs.
|
||||||
|
value: |
|
||||||
|
```
|
||||||
|
Paste logs here
|
||||||
|
```
|
||||||
7
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
7
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
contact_links:
|
||||||
|
- name: Ask a question in discussions
|
||||||
|
url: https://github.com/itzg/docker-minecraft-server/discussions
|
||||||
|
about: Please ask questions here
|
||||||
|
- name: Ask a question on Discord
|
||||||
|
url: https://discord.gg/DXfKpjB
|
||||||
|
about: Please ask questions here
|
||||||
29
.github/ISSUE_TEMPLATE/enhancement.yml
vendored
Normal file
29
.github/ISSUE_TEMPLATE/enhancement.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
name: Enhancement Request
|
||||||
|
description: Request an enhancement
|
||||||
|
labels:
|
||||||
|
- enhancement
|
||||||
|
- status/needs triage
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to request an enhancement.
|
||||||
|
|
||||||
|
Even if you plan on submitting a pull request with a contributed enhancement it is best to describe the enhancement here first. Somebody might already be working on a similar thing and could use your help.
|
||||||
|
- type: dropdown
|
||||||
|
id: type
|
||||||
|
attributes:
|
||||||
|
label: Enhancement Type
|
||||||
|
options:
|
||||||
|
- Improve an existing feature
|
||||||
|
- A completely new feature
|
||||||
|
- New server type
|
||||||
|
- Not sure
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: Describe the enhancement
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
6
.github/no-response.yml
vendored
6
.github/no-response.yml
vendored
@@ -1,6 +0,0 @@
|
|||||||
daysUntilClose: 14
|
|
||||||
responseRequiredLabel: "status/waiting on feedback"
|
|
||||||
closeComment: >
|
|
||||||
This issue has been automatically closed because there has been no response
|
|
||||||
after requesting feedback. Please feel free to re-open this issue if the
|
|
||||||
scenario still exists and provide a comment with more information.
|
|
||||||
32
.github/workflows/build-multiarch.yml
vendored
32
.github/workflows/build-multiarch.yml
vendored
@@ -3,16 +3,15 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
- "*-multiarch"
|
- java8-multiarch
|
||||||
- "multiarch*"
|
|
||||||
- java8-openj9
|
- java8-openj9
|
||||||
- java11*
|
- java11*
|
||||||
- java16*
|
- java16*
|
||||||
- test/multiarch/*
|
- java17*
|
||||||
|
- test/*
|
||||||
tags:
|
tags:
|
||||||
- "[0-9]+.[0-9]+.[0-9]+"
|
- "[0-9]+.[0-9]+.[0-9]+"
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-multiarch*"
|
- "[0-9]+.[0-9]+.[0-9]+-java8-multiarch"
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-*multiarch"
|
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-java8-openj9"
|
- "[0-9]+.[0-9]+.[0-9]+-java8-openj9"
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-java11*"
|
- "[0-9]+.[0-9]+.[0-9]+-java11*"
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-java16*"
|
- "[0-9]+.[0-9]+.[0-9]+-java16*"
|
||||||
@@ -23,12 +22,11 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
docker-buildx:
|
docker-buildx:
|
||||||
|
if: github.repository == 'itzg/docker-minecraft-server'
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
env:
|
|
||||||
CACHE_NAME: java16
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2.3.4
|
uses: actions/checkout@v2.4.0
|
||||||
|
|
||||||
- name: Docker meta
|
- name: Docker meta
|
||||||
id: meta
|
id: meta
|
||||||
@@ -39,9 +37,8 @@ jobs:
|
|||||||
tags: |
|
tags: |
|
||||||
type=ref,event=branch
|
type=ref,event=branch
|
||||||
type=ref,event=tag
|
type=ref,event=tag
|
||||||
type=edge,branch=master
|
|
||||||
flavor: |
|
flavor: |
|
||||||
latest=false
|
latest=${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
|
||||||
|
|
||||||
- name: Setup Docker Buildx
|
- name: Setup Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v1
|
||||||
@@ -50,9 +47,8 @@ jobs:
|
|||||||
uses: actions/cache@v2.1.6
|
uses: actions/cache@v2.1.6
|
||||||
with:
|
with:
|
||||||
path: /tmp/.buildx-cache
|
path: /tmp/.buildx-cache
|
||||||
key: ${{ runner.os }}-buildx-${{ env.CACHE_NAME }}-${{ github.sha }}
|
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-buildx-${{ env.CACHE_NAME }}-
|
|
||||||
${{ runner.os }}-buildx-
|
${{ runner.os }}-buildx-
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
@@ -66,7 +62,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
id: docker_build
|
id: docker_build
|
||||||
uses: docker/build-push-action@v2.5.0
|
uses: docker/build-push-action@v2.7.0
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
||||||
@@ -75,8 +71,16 @@ jobs:
|
|||||||
# ensure latest base image is used
|
# ensure latest base image is used
|
||||||
pull: true
|
pull: true
|
||||||
cache-from: type=local,src=/tmp/.buildx-cache
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
cache-to: type=local,dest=/tmp/.buildx-cache
|
cache-to: type=local,dest=/tmp/.buildx-cache-new
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
|
||||||
- name: Image digest
|
- name: Image digest
|
||||||
run: echo ${{ steps.docker_build.outputs.digest }}
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
|
|
||||||
|
- # Temp fix
|
||||||
|
# https://github.com/docker/build-push-action/issues/252
|
||||||
|
# https://github.com/moby/buildkit/issues/1896
|
||||||
|
name: Move cache
|
||||||
|
run: |
|
||||||
|
rm -rf /tmp/.buildx-cache
|
||||||
|
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
|
||||||
5
.github/workflows/generate-toc.yml
vendored
5
.github/workflows/generate-toc.yml
vendored
@@ -7,14 +7,15 @@ on:
|
|||||||
- README.md
|
- README.md
|
||||||
jobs:
|
jobs:
|
||||||
generate:
|
generate:
|
||||||
|
if: github.repository == 'itzg/docker-minecraft-server'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2.3.4
|
- uses: actions/checkout@v2.4.0
|
||||||
- run: |
|
- run: |
|
||||||
curl https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc -o gh-md-toc
|
curl https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc -o gh-md-toc
|
||||||
chmod a+x gh-md-toc
|
chmod a+x gh-md-toc
|
||||||
./gh-md-toc --insert --no-backup README.md
|
./gh-md-toc --insert --no-backup README.md
|
||||||
- uses: stefanzweifel/git-auto-commit-action@v4.11.0
|
- uses: stefanzweifel/git-auto-commit-action@v4.12.0
|
||||||
with:
|
with:
|
||||||
commit_message: "docs: Auto update markdown TOC"
|
commit_message: "docs: Auto update markdown TOC"
|
||||||
25
.github/workflows/main.yml
vendored
25
.github/workflows/main.yml
vendored
@@ -7,7 +7,7 @@ on:
|
|||||||
- openj9
|
- openj9
|
||||||
- openj9-11
|
- openj9-11
|
||||||
- adopt11
|
- adopt11
|
||||||
- test/*
|
- test/alpine/*
|
||||||
tags:
|
tags:
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-java8"
|
- "[0-9]+.[0-9]+.[0-9]+-java8"
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-openj9"
|
- "[0-9]+.[0-9]+.[0-9]+-openj9"
|
||||||
@@ -20,7 +20,7 @@ jobs:
|
|||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2.3.4
|
- uses: actions/checkout@v2.4.0
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: |
|
run: |
|
||||||
@@ -29,11 +29,9 @@ jobs:
|
|||||||
needs:
|
needs:
|
||||||
- test
|
- test
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
env:
|
|
||||||
CACHE_NAME: java16
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2.3.4
|
- uses: actions/checkout@v2.4.0
|
||||||
|
|
||||||
- name: Prepare
|
- name: Prepare
|
||||||
id: prep
|
id: prep
|
||||||
@@ -51,9 +49,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
TAGS="${DOCKER_IMAGE}:${VERSION//\//-}"
|
TAGS="${DOCKER_IMAGE}:${VERSION//\//-}"
|
||||||
echo ::set-output name=tags::${TAGS}
|
echo ::set-output name=tags::${TAGS}
|
||||||
echo ::set-output name=cache_from::${TAGS}
|
|
||||||
echo ::set-output name=version::${VERSION//\//-}
|
echo ::set-output name=version::${VERSION//\//-}
|
||||||
echo ::set-output name=cache_version::${VERSION//\//-}
|
|
||||||
|
|
||||||
- name: Setup Docker Buildx
|
- name: Setup Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v1
|
||||||
@@ -62,9 +58,8 @@ jobs:
|
|||||||
uses: actions/cache@v2.1.6
|
uses: actions/cache@v2.1.6
|
||||||
with:
|
with:
|
||||||
path: /tmp/.buildx-cache
|
path: /tmp/.buildx-cache
|
||||||
key: ${{ runner.os }}-buildx-${{ env.CACHE_NAME }}-${{ github.sha }}
|
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-buildx-${{ env.CACHE_NAME }}-
|
|
||||||
${{ runner.os }}-buildx-
|
${{ runner.os }}-buildx-
|
||||||
|
|
||||||
- name: Login to DockerHub
|
- name: Login to DockerHub
|
||||||
@@ -75,7 +70,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
id: docker_build
|
id: docker_build
|
||||||
uses: docker/build-push-action@v2.5.0
|
uses: docker/build-push-action@v2.7.0
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: ./Dockerfile
|
file: ./Dockerfile
|
||||||
@@ -86,7 +81,7 @@ jobs:
|
|||||||
# tags determined by prep step
|
# tags determined by prep step
|
||||||
tags: ${{ steps.prep.outputs.tags }}
|
tags: ${{ steps.prep.outputs.tags }}
|
||||||
cache-from: type=local,src=/tmp/.buildx-cache
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
cache-to: type=local,dest=/tmp/.buildx-cache
|
cache-to: type=local,dest=/tmp/.buildx-cache-new
|
||||||
labels: |
|
labels: |
|
||||||
org.opencontainers.image.documentation=https://github.com/itzg/docker-minecraft-server
|
org.opencontainers.image.documentation=https://github.com/itzg/docker-minecraft-server
|
||||||
org.opencontainers.image.version=${{ steps.prep.outputs.version }}
|
org.opencontainers.image.version=${{ steps.prep.outputs.version }}
|
||||||
@@ -95,3 +90,11 @@ jobs:
|
|||||||
|
|
||||||
- name: Image digest
|
- name: Image digest
|
||||||
run: echo ${{ steps.docker_build.outputs.digest }}
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
|
|
||||||
|
- # Temp fix
|
||||||
|
# https://github.com/docker/build-push-action/issues/252
|
||||||
|
# https://github.com/moby/buildkit/issues/1896
|
||||||
|
name: Move cache
|
||||||
|
run: |
|
||||||
|
rm -rf /tmp/.buildx-cache
|
||||||
|
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
|
||||||
|
|||||||
2
.github/workflows/pr.yml
vendored
2
.github/workflows/pr.yml
vendored
@@ -9,7 +9,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2.3.4
|
- uses: actions/checkout@v2.4.0
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
26
.github/workflows/stale-check.yml
vendored
Normal file
26
.github/workflows/stale-check.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
name: Stale Check
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
schedule:
|
||||||
|
- cron: 0 2 * * *
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
steps:
|
||||||
|
- name: Process Stale Issues
|
||||||
|
uses: actions/stale@v4.0.0
|
||||||
|
with:
|
||||||
|
stale-issue-label: status/stale
|
||||||
|
stale-pr-label: status/stale
|
||||||
|
stale-issue-message: >
|
||||||
|
This issue is stale because it has been open 30 days with no activity.
|
||||||
|
Please add a comment describing the reason to keep this issue open.
|
||||||
|
days-before-stale: 30
|
||||||
|
days-before-close: 5
|
||||||
|
exempt-issue-labels: 'enhancement,keep,status/needs triage'
|
||||||
|
|
||||||
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
Adding a new server `TYPE` can vary due to the complexity of obtaining and configuring each type; however, the addition of any server type includes at least the following steps:
|
Adding a new server `TYPE` can vary due to the complexity of obtaining and configuring each type; however, the addition of any server type includes at least the following steps:
|
||||||
|
|
||||||
1. Copy an existing "start-deploy*" script, such as [start-deployMohist](start-deployMohist) and rename it accordingly making sure to retain the "start-deploy" prefix
|
1. Copy an existing "start-deploy*" script, such as [start-deployMohist](scripts/start-deployMohist) and rename it accordingly making sure to retain the "start-deploy" prefix
|
||||||
2. Modify the type-specific behavior between the "start-utils" preamble and the hand-off to `start-finalSetupWorld` at the end of the script
|
2. Modify the type-specific behavior between the "start-utils" preamble and the hand-off to `start-setupWorld` at the end of the script
|
||||||
3. Develop and test the changes using the [iterative process described below](#iterative-script-development)
|
3. Develop and test the changes using the [iterative process described below](#iterative-script-development)
|
||||||
4. Add a case-entry to the `case "${TYPE^^}"` in [start-configuration](start-configuration)
|
4. Add a case-entry to the `case "${TYPE^^}"` in [start-configuration](scripts/start-configuration)
|
||||||
5. Add a section to the [README](README.md). It is recommended to copy-modify an existing section to retain a similar wording and level of detail
|
5. Add a section to the [README](README.md). It is recommended to copy-modify an existing section to retain a similar wording and level of detail
|
||||||
6. [Submit a pull request](https://github.com/itzg/docker-minecraft-server/pulls)
|
6. [Submit a pull request](https://github.com/itzg/docker-minecraft-server/pulls)
|
||||||
|
|
||||||
@@ -40,6 +40,29 @@ VANILLA_VERSION=1.12.2 /scripts/start-magma
|
|||||||
|
|
||||||
> NOTE: You may want to temporarily add an `exit` statement near the end of your script to isolate execution to just the script you're developing.
|
> NOTE: You may want to temporarily add an `exit` statement near the end of your script to isolate execution to just the script you're developing.
|
||||||
|
|
||||||
|
## Using development copy of mc-image-helper
|
||||||
|
|
||||||
|
In the cloned copy of [`mc-image-helper`](https://github.com/itzg/mc-image-helper), create an up-to-date snapshot build of the tgz distribution using:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
./gradlew distTar
|
||||||
|
```
|
||||||
|
|
||||||
|
Assuming [http-server](https://www.npmjs.com/package/http-server) is installed globally, start a static web server using:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
http-server ./build/distributions -p 0
|
||||||
|
```
|
||||||
|
|
||||||
|
Note the port that was selected by http-server and pass the build arguments, such as:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
--build-arg MC_HELPER_VERSION=1.8.1-SNAPSHOT \
|
||||||
|
--build-arg MC_HELPER_BASE_URL=http://host.docker.internal:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
Now the image can be built like normal and it will install mc-image-helper from the locally built copy.
|
||||||
|
|
||||||
## Multi-base-image variants
|
## Multi-base-image variants
|
||||||
|
|
||||||
Several base-image variants are maintained in order to offer choices in JDK provider and version. The variants are maintained in their respective branches:
|
Several base-image variants are maintained in order to offer choices in JDK provider and version. The variants are maintained in their respective branches:
|
||||||
@@ -70,5 +93,5 @@ The multiarch images are built and published by [a Github action](https://github
|
|||||||
The following git command can be used to provide the bulk of release notes content:
|
The following git command can be used to provide the bulk of release notes content:
|
||||||
|
|
||||||
```shell script
|
```shell script
|
||||||
git log --invert-grep --grep "^ci:" --grep "^misc:" --grep "^docs:" --pretty="- %s" 1.1.0..1.2.0
|
git log --invert-grep --grep "^ci:" --grep "^misc:" --grep "^docs:" --pretty="* %s" 1.1.0..1.2.0
|
||||||
```
|
```
|
||||||
|
|||||||
35
Dockerfile
35
Dockerfile
@@ -1,4 +1,4 @@
|
|||||||
FROM adoptopenjdk:16-jre
|
FROM eclipse-temurin:16-jdk
|
||||||
|
|
||||||
LABEL org.opencontainers.image.authors="Geoff Bourne <itzgeoff@gmail.com>"
|
LABEL org.opencontainers.image.authors="Geoff Bourne <itzgeoff@gmail.com>"
|
||||||
|
|
||||||
@@ -9,6 +9,7 @@ RUN apt-get update \
|
|||||||
gosu \
|
gosu \
|
||||||
sudo \
|
sudo \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
iputils-ping \
|
||||||
curl wget \
|
curl wget \
|
||||||
git \
|
git \
|
||||||
jq \
|
jq \
|
||||||
@@ -44,26 +45,28 @@ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
|||||||
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
||||||
|
|
||||||
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
||||||
--var version=1.4.7 --var app=rcon-cli --file {{.app}} \
|
--var version=1.5.1 --var app=rcon-cli --file {{.app}} \
|
||||||
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
||||||
|
|
||||||
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
||||||
--var version=0.7.1 --var app=mc-monitor --file {{.app}} \
|
--var version=0.10.1 --var app=mc-monitor --file {{.app}} \
|
||||||
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
||||||
|
|
||||||
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
||||||
--var version=1.5.0 --var app=mc-server-runner --file {{.app}} \
|
--var version=1.8.0 --var app=mc-server-runner --file {{.app}} \
|
||||||
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
||||||
|
|
||||||
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
||||||
--var version=0.1.1 --var app=maven-metadata-release --file {{.app}} \
|
--var version=0.1.1 --var app=maven-metadata-release --file {{.app}} \
|
||||||
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
||||||
|
|
||||||
COPY mcstatus /usr/local/bin
|
ARG MC_HELPER_VERSION=1.9.6
|
||||||
|
ARG MC_HELPER_BASE_URL=https://github.com/itzg/mc-image-helper/releases/download/v${MC_HELPER_VERSION}
|
||||||
|
RUN curl -fsSL ${MC_HELPER_BASE_URL}/mc-image-helper-${MC_HELPER_VERSION}.tgz \
|
||||||
|
| tar -C /usr/share -zxf - \
|
||||||
|
&& ln -s /usr/share/mc-image-helper-${MC_HELPER_VERSION}/bin/mc-image-helper /usr/bin
|
||||||
|
|
||||||
VOLUME ["/data"]
|
VOLUME ["/data"]
|
||||||
COPY server.properties /tmp/server.properties
|
|
||||||
COPY log4j2.xml /tmp/log4j2.xml
|
|
||||||
WORKDIR /data
|
WORKDIR /data
|
||||||
|
|
||||||
STOPSIGNAL SIGTERM
|
STOPSIGNAL SIGTERM
|
||||||
@@ -72,18 +75,18 @@ ENV UID=1000 GID=1000 \
|
|||||||
MEMORY="1G" \
|
MEMORY="1G" \
|
||||||
TYPE=VANILLA VERSION=LATEST \
|
TYPE=VANILLA VERSION=LATEST \
|
||||||
ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
|
ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
|
||||||
SERVER_PORT=25565 ONLINE_MODE=TRUE SERVER_NAME="Dedicated Server" \
|
|
||||||
ENABLE_AUTOPAUSE=false AUTOPAUSE_TIMEOUT_EST=3600 AUTOPAUSE_TIMEOUT_KN=120 AUTOPAUSE_TIMEOUT_INIT=600 \
|
ENABLE_AUTOPAUSE=false AUTOPAUSE_TIMEOUT_EST=3600 AUTOPAUSE_TIMEOUT_KN=120 AUTOPAUSE_TIMEOUT_INIT=600 \
|
||||||
AUTOPAUSE_PERIOD=10 AUTOPAUSE_KNOCK_INTERFACE=eth0
|
AUTOPAUSE_PERIOD=10 AUTOPAUSE_KNOCK_INTERFACE=eth0
|
||||||
|
|
||||||
COPY start* /
|
COPY scripts/start* /
|
||||||
COPY health.sh /
|
COPY bin/ /usr/local/bin/
|
||||||
ADD files/autopause /autopause
|
COPY bin/mc-health /health.sh
|
||||||
|
COPY files/server.properties /tmp/server.properties
|
||||||
RUN dos2unix /start* && chmod +x /start*
|
COPY files/log4j2.xml /tmp/log4j2.xml
|
||||||
RUN dos2unix /health.sh && chmod +x /health.sh
|
COPY files/autopause /autopause
|
||||||
RUN dos2unix /autopause/* && chmod +x /autopause/*.sh
|
|
||||||
|
|
||||||
|
RUN dos2unix /start* && chmod +x /start* \
|
||||||
|
&& dos2unix /autopause/* && chmod +x /autopause/*.sh
|
||||||
|
|
||||||
ENTRYPOINT [ "/start" ]
|
ENTRYPOINT [ "/start" ]
|
||||||
HEALTHCHECK --start-period=1m CMD /health.sh
|
HEALTHCHECK --start-period=1m CMD mc-health
|
||||||
|
|||||||
412
README.md
412
README.md
@@ -13,30 +13,11 @@ To simply use the latest stable version, run
|
|||||||
|
|
||||||
docker run -d -it -p 25565:25565 -e EULA=TRUE itzg/minecraft-server
|
docker run -d -it -p 25565:25565 -e EULA=TRUE itzg/minecraft-server
|
||||||
|
|
||||||
where the standard server port, 25565, will be exposed on your host machine.
|
where, in this case, the standard server port 25565, will be exposed on your host machine.
|
||||||
|
|
||||||
If you want to serve up multiple Minecraft servers or just use an alternate port,
|
> If you plan on running a server for a longer amount of time it is highly recommended using a management layer such as [Docker Compose](#using-docker-compose) or [Kubernetes](#deployment-templates-and-examples) to allow for incremental reconfiguration and image upgrades.
|
||||||
change the host-side port mapping such as
|
|
||||||
|
|
||||||
... -p 25566:25565 ...
|
> Be sure to always include `-e EULA=TRUE` in your commands and container definitions, as Mojang/Microsoft requires EULA acceptance.
|
||||||
|
|
||||||
will serve your Minecraft server on your host's port 25566 since the `-p` syntax is
|
|
||||||
`host-port`:`container-port`.
|
|
||||||
|
|
||||||
Speaking of multiple servers, it's handy to give your containers explicit names using `--name`, such as naming this one "mc"
|
|
||||||
|
|
||||||
... --name mc itzg/minecraft-server
|
|
||||||
|
|
||||||
With that you can easily view the logs, stop, or re-start the container:
|
|
||||||
|
|
||||||
docker logs -f mc
|
|
||||||
( Ctrl-C to exit logs action )
|
|
||||||
|
|
||||||
docker stop mc
|
|
||||||
|
|
||||||
docker start mc
|
|
||||||
|
|
||||||
> Be sure to always include `-e EULA=TRUE` in your commands, as Mojang/Microsoft requires EULA acceptance.
|
|
||||||
|
|
||||||
By default, the container will download the latest version of the "vanilla" [Minecraft: Java Edition server](https://www.minecraft.net/en-us/download/server) provided by Mojang. The [`VERSION`](#versions) and the [`TYPE`](#server-types) can be configured to create many variations of desired Minecraft server.
|
By default, the container will download the latest version of the "vanilla" [Minecraft: Java Edition server](https://www.minecraft.net/en-us/download/server) provided by Mojang. The [`VERSION`](#versions) and the [`TYPE`](#server-types) can be configured to create many variations of desired Minecraft server.
|
||||||
|
|
||||||
@@ -57,20 +38,21 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [Examples](#examples)
|
* [Examples](#examples)
|
||||||
* [Amazon Web Services (AWS) Deployment](#amazon-web-services-aws-deployment)
|
* [Amazon Web Services (AWS) Deployment](#amazon-web-services-aws-deployment)
|
||||||
* [Using Docker Compose](#using-docker-compose)
|
* [Using Docker Compose](#using-docker-compose)
|
||||||
|
* [Troubleshooting](#troubleshooting)
|
||||||
* [Server types](#server-types)
|
* [Server types](#server-types)
|
||||||
* [Running a Forge Server](#running-a-forge-server)
|
* [Running a Forge Server](#running-a-forge-server)
|
||||||
* [Running a Bukkit/Spigot server](#running-a-bukkitspigot-server)
|
* [Running a Bukkit/Spigot server](#running-a-bukkitspigot-server)
|
||||||
* [Running a Paper server](#running-a-paper-server)
|
* [Running a Paper server](#running-a-paper-server)
|
||||||
* [Running a Tuinity server](#running-a-tuinity-server)
|
|
||||||
* [Running an Airplane server](#running-an-airplane-server)
|
* [Running an Airplane server](#running-an-airplane-server)
|
||||||
* [Running a Purpur server](#running-a-purpur-server)
|
* [Running a Purpur server](#running-a-purpur-server)
|
||||||
* [Running a Yatopia server](#running-a-yatopia-server)
|
|
||||||
* [Running a Magma server](#running-a-magma-server)
|
* [Running a Magma server](#running-a-magma-server)
|
||||||
* [Running a Mohist server](#running-a-mohist-server)
|
* [Running a Mohist server](#running-a-mohist-server)
|
||||||
* [Running a Catserver type server](#running-a-catserver-type-server)
|
* [Running a Catserver type server](#running-a-catserver-type-server)
|
||||||
* [Running an Canyon server](#running-an-canyon-server)
|
* [Running an Canyon server](#running-an-canyon-server)
|
||||||
* [Running a SpongeVanilla server](#running-a-spongevanilla-server)
|
* [Running a SpongeVanilla server](#running-a-spongevanilla-server)
|
||||||
* [Running a Fabric Server](#running-a-fabric-server)
|
* [Running a Fabric Server](#running-a-fabric-server)
|
||||||
|
* [Running a Limbo server](#running-a-limbo-server)
|
||||||
|
* [Running a Crucible server](#running-a-crucible-server)
|
||||||
* [Running a server with a Feed the Beast modpack](#running-a-server-with-a-feed-the-beast-modpack)
|
* [Running a server with a Feed the Beast modpack](#running-a-server-with-a-feed-the-beast-modpack)
|
||||||
* [Environment Variables:](#environment-variables)
|
* [Environment Variables:](#environment-variables)
|
||||||
* [Upgrading](#upgrading)
|
* [Upgrading](#upgrading)
|
||||||
@@ -83,14 +65,15 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [Optional plugins, mods, and config attach points](#optional-plugins-mods-and-config-attach-points)
|
* [Optional plugins, mods, and config attach points](#optional-plugins-mods-and-config-attach-points)
|
||||||
* [Auto-downloading SpigotMC/Bukkit/PaperMC plugins](#auto-downloading-spigotmcbukkitpapermc-plugins)
|
* [Auto-downloading SpigotMC/Bukkit/PaperMC plugins](#auto-downloading-spigotmcbukkitpapermc-plugins)
|
||||||
* [Downloadable mod/plugin pack for Forge, Bukkit, and Spigot Servers](#downloadable-modplugin-pack-for-forge-bukkit-and-spigot-servers)
|
* [Downloadable mod/plugin pack for Forge, Bukkit, and Spigot Servers](#downloadable-modplugin-pack-for-forge-bukkit-and-spigot-servers)
|
||||||
|
* [Generic pack file](#generic-pack-file)
|
||||||
|
* [Mod/Plugin URL Listing File](#modplugin-url-listing-file)
|
||||||
* [Remove old mods/plugins](#remove-old-modsplugins)
|
* [Remove old mods/plugins](#remove-old-modsplugins)
|
||||||
* [Working with world data](#working-with-world-data)
|
* [Working with world data](#working-with-world-data)
|
||||||
* [Downloadable world](#downloadable-world)
|
* [Downloadable world](#downloadable-world)
|
||||||
* [Cloning world from a container path](#cloning-world-from-a-container-path)
|
* [Cloning world from a container path](#cloning-world-from-a-container-path)
|
||||||
* [Overwrite world on start](#overwrite-world-on-start)
|
* [Overwrite world on start](#overwrite-world-on-start)
|
||||||
* [Server configuration](#server-configuration)
|
* [Server configuration](#server-configuration)
|
||||||
* [Server name](#server-name)
|
* [Message of the Day](#message-of-the-day)
|
||||||
* [Server port](#server-port)
|
|
||||||
* [Difficulty](#difficulty)
|
* [Difficulty](#difficulty)
|
||||||
* [Whitelist Players](#whitelist-players)
|
* [Whitelist Players](#whitelist-players)
|
||||||
* [Op/Administrator Players](#opadministrator-players)
|
* [Op/Administrator Players](#opadministrator-players)
|
||||||
@@ -115,22 +98,25 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [View Distance](#view-distance)
|
* [View Distance](#view-distance)
|
||||||
* [Level Seed](#level-seed)
|
* [Level Seed](#level-seed)
|
||||||
* [Game Mode](#game-mode)
|
* [Game Mode](#game-mode)
|
||||||
* [Message of the Day](#message-of-the-day)
|
|
||||||
* [PVP Mode](#pvp-mode)
|
* [PVP Mode](#pvp-mode)
|
||||||
* [Level Type and Generator Settings](#level-type-and-generator-settings)
|
* [Level Type and Generator Settings](#level-type-and-generator-settings)
|
||||||
* [Custom Server Resource Pack](#custom-server-resource-pack)
|
* [Custom Server Resource Pack](#custom-server-resource-pack)
|
||||||
* [World Save Name](#world-save-name)
|
* [Level / World Save Name](#level--world-save-name)
|
||||||
* [Online mode](#online-mode)
|
* [Online mode](#online-mode)
|
||||||
* [Allow flight](#allow-flight)
|
* [Allow flight](#allow-flight)
|
||||||
|
* [Server name](#server-name)
|
||||||
|
* [Server port](#server-port)
|
||||||
* [Other server property mappings](#other-server-property-mappings)
|
* [Other server property mappings](#other-server-property-mappings)
|
||||||
* [Miscellaneous Options](#miscellaneous-options)
|
* [Miscellaneous Options](#miscellaneous-options)
|
||||||
* [Replacing variables inside configs](#replacing-variables-inside-configs)
|
* [Replacing variables inside configs](#replacing-variables-inside-configs)
|
||||||
|
* [Patching existing files](#patching-existing-files)
|
||||||
* [Running with a custom server JAR](#running-with-a-custom-server-jar)
|
* [Running with a custom server JAR](#running-with-a-custom-server-jar)
|
||||||
* [Force re-download of the server file](#force-re-download-of-the-server-file)
|
* [Force re-download of the server file](#force-re-download-of-the-server-file)
|
||||||
* [Running as alternate user/group ID](#running-as-alternate-usergroup-id)
|
* [Running as alternate user/group ID](#running-as-alternate-usergroup-id)
|
||||||
* [Memory Limit](#memory-limit)
|
* [Memory Limit](#memory-limit)
|
||||||
* [JVM Options](#jvm-options)
|
* [JVM Options](#jvm-options)
|
||||||
* [Interactive and Color Console](#interactive-and-color-console)
|
* [Interactive and Color Console](#interactive-and-color-console)
|
||||||
|
* [Server Shutdown Options](#server-shutdown-options)
|
||||||
* [OpenJ9 Specific Options](#openj9-specific-options)
|
* [OpenJ9 Specific Options](#openj9-specific-options)
|
||||||
* [Enabling rolling logs](#enabling-rolling-logs)
|
* [Enabling rolling logs](#enabling-rolling-logs)
|
||||||
* [Timezone Configuration](#timezone-configuration)
|
* [Timezone Configuration](#timezone-configuration)
|
||||||
@@ -140,12 +126,14 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [Using "noconsole" option](#using-noconsole-option)
|
* [Using "noconsole" option](#using-noconsole-option)
|
||||||
* [Explicitly disable GUI](#explicitly-disable-gui)
|
* [Explicitly disable GUI](#explicitly-disable-gui)
|
||||||
* [Stop Duration](#stop-duration)
|
* [Stop Duration](#stop-duration)
|
||||||
|
* [Setup only](#setup-only)
|
||||||
* [Autopause](#autopause)
|
* [Autopause](#autopause)
|
||||||
* [Description](#description)
|
* [Description](#description)
|
||||||
* [Enabling Autopause](#enabling-autopause)
|
* [Enabling Autopause](#enabling-autopause)
|
||||||
* [Running on RaspberryPi](#running-on-raspberrypi)
|
* [Running on RaspberryPi](#running-on-raspberrypi)
|
||||||
|
* [Contributing](#contributing)
|
||||||
|
|
||||||
<!-- Added by: runner, at: Sun May 23 17:29:02 UTC 2021 -->
|
<!-- Added by: runner, at: Tue Nov 16 02:46:53 UTC 2021 -->
|
||||||
|
|
||||||
<!--te-->
|
<!--te-->
|
||||||
|
|
||||||
@@ -167,8 +155,7 @@ docker exec -i mc rcon-cli
|
|||||||
|
|
||||||
Note: The `-i` is required for interactive use of rcon-cli.
|
Note: The `-i` is required for interactive use of rcon-cli.
|
||||||
|
|
||||||
To run a simple, one-shot command, such as stopping a Minecraft server, pass the command as
|
To run a simple, one-shot command, such as stopping a Minecraft server, pass the command as arguments to `rcon-cli`, such as:
|
||||||
arguments to `rcon-cli`, such as:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
docker exec mc rcon-cli stop
|
docker exec mc rcon-cli stop
|
||||||
@@ -176,6 +163,14 @@ docker exec mc rcon-cli stop
|
|||||||
|
|
||||||
_The `-i` is not needed in this case._
|
_The `-i` is not needed in this case._
|
||||||
|
|
||||||
|
If rcon is disabled you can send commands by passing them as arguments to the packaged `mc-send-to-console` script. For example, a player can be op'ed in the container `mc` with:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker exec mc mc-send-to-console op player
|
||||||
|
| |
|
||||||
|
+- container name +- Minecraft commands start here
|
||||||
|
```
|
||||||
|
|
||||||
In order to attach and interact with the Minecraft server, add `-it` when starting the container, such as
|
In order to attach and interact with the Minecraft server, add `-it` when starting the container, such as
|
||||||
|
|
||||||
docker run -d -it -p 25565:25565 --name mc itzg/minecraft-server
|
docker run -d -it -p 25565:25565 --name mc itzg/minecraft-server
|
||||||
@@ -212,7 +207,7 @@ When attached in this way you can stop the server, edit the configuration under
|
|||||||
With Docker Compose, setting up a host attached directory is even easier since relative paths can be configured. For example, with the following `docker-compose.yml` Docker will automatically create/attach the relative directory `minecraft-data` to the container.
|
With Docker Compose, setting up a host attached directory is even easier since relative paths can be configured. For example, with the following `docker-compose.yml` Docker will automatically create/attach the relative directory `minecraft-data` to the container.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
version: "3.8"
|
version: "3"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
mc:
|
mc:
|
||||||
@@ -221,11 +216,16 @@ services:
|
|||||||
- 25565:25565
|
- 25565:25565
|
||||||
environment:
|
environment:
|
||||||
EULA: "TRUE"
|
EULA: "TRUE"
|
||||||
|
tty: true
|
||||||
|
stdin_open: true
|
||||||
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
# attach a directory relative to the directory containing this compose file
|
# attach a directory relative to the directory containing this compose file
|
||||||
- ./minecraft-data:/data
|
- ./minecraft-data:/data
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> NOTE: if you have SELinux enabled, then you might need to add `:Z` to the end of volume mount specifications, [as described here](https://prefetch.net/blog/2017/09/30/using-docker-volumes-on-selinux-enabled-servers/).
|
||||||
|
|
||||||
### Converting anonymous `/data` volume to named volume
|
### Converting anonymous `/data` volume to named volume
|
||||||
|
|
||||||
If you had used the commands in the first section, without the `-v` volume attachment, then an anonymous data volume was created by Docker. You can later bring over that content to a named or host attached volume using the following procedure.
|
If you had used the commands in the first section, without the `-v` volume attachment, then an anonymous data volume was created by Docker. You can later bring over that content to a named or host attached volume using the following procedure.
|
||||||
@@ -249,7 +249,7 @@ docker run -d -it --name mc-new -v mc:/data -p 25565:25565 -e EULA=TRUE -e MEMOR
|
|||||||
|
|
||||||
## Versions
|
## Versions
|
||||||
|
|
||||||
To use a different Minecraft version, pass the `VERSION` environment variable, which can have the value
|
To use a different Minecraft version, pass the `VERSION` environment variable (case sensitive), which can have the value
|
||||||
|
|
||||||
- LATEST (the default)
|
- LATEST (the default)
|
||||||
- SNAPSHOT
|
- SNAPSHOT
|
||||||
@@ -282,13 +282,13 @@ To use a different version of Java, please use a docker tag to run your Minecraf
|
|||||||
| java11-openj9 | 11 | Debian | OpenJ9 | amd64 |
|
| java11-openj9 | 11 | Debian | OpenJ9 | amd64 |
|
||||||
| java16 | 16 | Debian | Hotspot | amd64,arm64,armv7 |
|
| java16 | 16 | Debian | Hotspot | amd64,arm64,armv7 |
|
||||||
| java16-openj9 | 16 | Debian | OpenJ9 | amd64 |
|
| java16-openj9 | 16 | Debian | OpenJ9 | amd64 |
|
||||||
| multiarch-latest | 15+ | Debian | Hotspot | amd64,arm64,armv7 |
|
| java17 | 17 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||||
|
|
||||||
For example, to use Java version 15 on any supported architecture:
|
For example, to use Java version 16 on any supported architecture:
|
||||||
|
|
||||||
docker run --name mc itzg/minecraft-server:java15
|
docker run --name mc itzg/minecraft-server:java16
|
||||||
|
|
||||||
> Keep in mind that some versions of Minecraft server can't work on the newest versions of Java. Also, FORGE doesn't support openj9 JVM implementation.
|
> Keep in mind that some versions of Minecraft server, such as Forge before 1.17, can't work on the newest versions of Java. Instead, one of the Java 8 images should be used. Also, FORGE doesn't support openj9 JVM implementation.
|
||||||
|
|
||||||
### Deprecated Image Tags
|
### Deprecated Image Tags
|
||||||
|
|
||||||
@@ -297,6 +297,7 @@ The following image tags have been deprecated and are no longer receiving update
|
|||||||
- adopt14
|
- adopt14
|
||||||
- adopt15
|
- adopt15
|
||||||
- openj9-nightly
|
- openj9-nightly
|
||||||
|
- multiarch-latest
|
||||||
|
|
||||||
## Healthcheck
|
## Healthcheck
|
||||||
|
|
||||||
@@ -343,20 +344,18 @@ every time you want to create new Minecraft server, you can now use
|
|||||||
`docker-compose.yml` file like the following:
|
`docker-compose.yml` file like the following:
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
version: "3.8"
|
version: "3"
|
||||||
|
|
||||||
minecraft-server:
|
services:
|
||||||
|
mc:
|
||||||
image: itzg/minecraft-server
|
image: itzg/minecraft-server
|
||||||
|
|
||||||
ports:
|
ports:
|
||||||
- "25565:25565"
|
- 25565:25565
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
EULA: "TRUE"
|
EULA: "TRUE"
|
||||||
|
|
||||||
tty: true
|
tty: true
|
||||||
stdin_open: true
|
stdin_open: true
|
||||||
restart: always
|
restart: unless-stopped
|
||||||
```
|
```
|
||||||
|
|
||||||
and in the same directory as that file run
|
and in the same directory as that file run
|
||||||
@@ -366,6 +365,14 @@ and in the same directory as that file run
|
|||||||
Now, go play...or adjust the `environment` section to configure
|
Now, go play...or adjust the `environment` section to configure
|
||||||
this server instance.
|
this server instance.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
To troubleshoot the container initialization, such as when server files are pre-downloaded, set the environment variable `DEBUG` to `true`. The container logs will include **much more** output, and it is highly recommended including that output when reporting any [issues](https://github.com/itzg/docker-minecraft-server/issues).
|
||||||
|
|
||||||
|
To troubleshoot just the command-line used to start the Minecraft server, set the environment variable `DEBUG_EXEC` to `true`.
|
||||||
|
|
||||||
|
To troubleshoot any issues with memory allocation reported by the JVM, set the environment variable `DEBUG_MEMORY` to `true`.
|
||||||
|
|
||||||
## Server types
|
## Server types
|
||||||
|
|
||||||
### Running a Forge Server
|
### Running a Forge Server
|
||||||
@@ -408,7 +415,7 @@ 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`
|
You can build spigot from source by adding `-e BUILD_FROM_SOURCE=true`
|
||||||
|
|
||||||
Plugins can either be managed within the `plugins` subdirectory of the [data directory](#data-directory) or you can also [attach a `/plugins` volume](#deploying-plugins-from-attached-volume). If you add plugins while the container is running, you'll need to restart it to pick those up.
|
Plugins can either be managed within the `plugins` subdirectory of the [data directory](#data-directory) or you can also [attach a `/plugins` volume](#optional-plugins-mods-and-config-attach-points). If you add plugins while the container is running, you'll need to restart it to pick those up.
|
||||||
|
|
||||||
[You can also auto-download plugins using `SPIGET_RESOURCES`.](#auto-downloading-spigotmcbukkitpapermc-plugins)
|
[You can also auto-download plugins using `SPIGET_RESOURCES`.](#auto-downloading-spigotmcbukkitpapermc-plugins)
|
||||||
|
|
||||||
@@ -432,35 +439,26 @@ If you are hosting your own copy of Paper you can override the download URL with
|
|||||||
An example compose file is provided at
|
An example compose file is provided at
|
||||||
[examples/docker-compose-paper.yml](examples/docker-compose-paper.yml).
|
[examples/docker-compose-paper.yml](examples/docker-compose-paper.yml).
|
||||||
|
|
||||||
If you have attached a host directory to the `/data` volume, then you can install plugins via the `plugins` subdirectory. You can also [attach a `/plugins` volume](#deploying-plugins-from-attached-volume). If you add plugins while the container is running, you'll need to restart it to pick those up.
|
If you have attached a host directory to the `/data` volume, then you can install plugins via the `plugins` subdirectory. You can also [attach a `/plugins` volume](#optional-plugins-mods-and-config-attach-points). If you add plugins while the container is running, you'll need to restart it to pick those up.
|
||||||
|
|
||||||
[You can also auto-download plugins using `SPIGET_RESOURCES`.](#auto-downloading-spigotmcbukkitpapermc-plugins)
|
[You can also auto-download plugins using `SPIGET_RESOURCES`.](#auto-downloading-spigotmcbukkitpapermc-plugins)
|
||||||
|
|
||||||
### Running a Tuinity server
|
|
||||||
|
|
||||||
A [Tuinity](https://github.com/Spottedleaf/Tuinity) server, which is a fork of Paper aimed at improving server performance at high playercounts.
|
|
||||||
|
|
||||||
-e TYPE=TUINITY
|
|
||||||
|
|
||||||
> **NOTE** only `VERSION=LATEST` is supported
|
|
||||||
|
|
||||||
### Running an Airplane server
|
### Running an Airplane server
|
||||||
|
|
||||||
An [Airplane](https://github.com/TECHNOVE/Airplane) server, which is a fork of Tuinity aimed at further improving server performance at high playercounts.
|
An [Airplane](https://airplane.gg) server, which is "a stable, optimized, well supported 1.17 Paper fork."
|
||||||
|
|
||||||
-e TYPE=AIRPLANE
|
-e TYPE=AIRPLANE
|
||||||
|
|
||||||
> **NOTE** only `VERSION=LATEST` is supported
|
> NOTE: The `VERSION` variable is used to select an Airplane branch to download from. The available options are "LATEST" "1.17" "1.16" "PURPUR" and "PURPUR-1.16"
|
||||||
|
|
||||||
> **NOTE** only Java 8 and 11 are supported
|
|
||||||
|
|
||||||
Extra variables:
|
Extra variables:
|
||||||
|
- `AIRPLANE_BUILD=lastSuccessfulBuild` : set a specific Airplane build to use
|
||||||
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
||||||
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the [Flare](https://blog.airplane.gg/flare) profiler
|
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the [Flare](https://blog.airplane.gg/flare) profiler
|
||||||
|
|
||||||
### Running a Purpur server
|
### Running a Purpur server
|
||||||
|
|
||||||
A [Purpur](https://purpur.pl3x.net/) server, which is "a fork of Paper, Tuinity, Airplane with the goal of providing new and interesting configuration options".
|
A [Purpur](https://purpur.pl3x.net/) server, which is "drop-in replacement for Paper servers designed for configurability, new fun and exciting gameplay features, and performance built on top of Airplane."
|
||||||
|
|
||||||
-e TYPE=PURPUR
|
-e TYPE=PURPUR
|
||||||
|
|
||||||
@@ -471,30 +469,21 @@ Extra variables:
|
|||||||
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
||||||
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the [Flare](https://blog.airplane.gg/flare) profiler
|
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the [Flare](https://blog.airplane.gg/flare) profiler
|
||||||
|
|
||||||
### Running a Yatopia server
|
|
||||||
|
|
||||||
A [Yatopia](https://github.com/YatopiaMC/Yatopia) server, which is a "blazing fast Tuinity fork with best in class performance".
|
|
||||||
|
|
||||||
-e TYPE=YATOPIA
|
|
||||||
|
|
||||||
> NOTE: the `VERSION` variable is used to locate the Yatopia version to download
|
|
||||||
|
|
||||||
Extra variables:
|
|
||||||
- `RELEASE=stable` : set to `stable` or `latest`
|
|
||||||
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
|
||||||
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the [Flare](https://blog.airplane.gg/flare) profiler
|
|
||||||
|
|
||||||
### Running a Magma server
|
### Running a Magma server
|
||||||
|
|
||||||
A [Magma](https://magmafoundation.org/) server, which is a combination of Forge and PaperMC, can be used with
|
A [Magma](https://magmafoundation.org/) server, which is a combination of Forge and PaperMC, can be used with
|
||||||
|
|
||||||
-e TYPE=MAGMA
|
-e TYPE=MAGMA
|
||||||
|
|
||||||
> **NOTE** there are limited base versions supported, so you will also need to set `VERSION`, such as "1.12.2"
|
By default, the "stable" channel is used, but you can set `MAGMA_CHANNEL` to "dev" to access dev channel versions.
|
||||||
|
|
||||||
|
> **NOTE** there are limited base versions supported, so you will also need to set `VERSION`, such as "1.12.2", "1.16.5", etc.
|
||||||
|
|
||||||
|
|
||||||
### Running a Mohist server
|
### Running a Mohist server
|
||||||
|
|
||||||
|
> **CAUTION** Be sure to [read this article](https://essentialsx.net/do-not-use-mohist.html) to understand the risks associated with using Mohist.
|
||||||
|
|
||||||
A [Mohist](https://github.com/MohistMC/Mohist) server can be used with
|
A [Mohist](https://github.com/MohistMC/Mohist) server can be used with
|
||||||
|
|
||||||
-e TYPE=MOHIST
|
-e TYPE=MOHIST
|
||||||
@@ -530,11 +519,14 @@ By default the latest build will be used; however, a specific build number can b
|
|||||||
### Running a SpongeVanilla server
|
### Running a SpongeVanilla server
|
||||||
|
|
||||||
Enable SpongeVanilla server mode by adding a `-e TYPE=SPONGEVANILLA` to your command-line.
|
Enable SpongeVanilla server mode by adding a `-e TYPE=SPONGEVANILLA` to your command-line.
|
||||||
|
|
||||||
By default the container will run the latest `STABLE` version.
|
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.
|
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.
|
||||||
|
|
||||||
|
Beware that current [Sponge](https://www.spongepowered.org) `STABLE` versions for Minecraft 1.12 require using [the Java 8 tag](#running-minecraft-server-on-different-java-version):
|
||||||
|
|
||||||
docker run -d -v /path/on/host:/data -e TYPE=SPONGEVANILLA \
|
docker run -d -v /path/on/host:/data -e TYPE=SPONGEVANILLA \
|
||||||
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
|
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server:java8-multiarch
|
||||||
|
|
||||||
You can also choose to use the `EXPERIMENTAL` branch.
|
You can also choose to use the `EXPERIMENTAL` branch.
|
||||||
Just change it with `SPONGEBRANCH`, such as:
|
Just change it with `SPONGEBRANCH`, such as:
|
||||||
@@ -568,7 +560,36 @@ docker run -d -v /path/on/host:/data ... \
|
|||||||
-e FABRIC_INSTALLER_URL=http://HOST/fabric-installer-0.5.0.32.jar ...
|
-e FABRIC_INSTALLER_URL=http://HOST/fabric-installer-0.5.0.32.jar ...
|
||||||
```
|
```
|
||||||
|
|
||||||
In order to add mods, you have two options:
|
A specific loader version can be requested using `FABRIC_LOADER_VERSION`, such as:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run -d -v /path/on/host:/data ... \
|
||||||
|
-e FABRIC_LOADER_VERSION=0.11.7
|
||||||
|
```
|
||||||
|
|
||||||
|
### Running a Limbo server
|
||||||
|
|
||||||
|
A [Limbo](https://github.com/LOOHP/Limbo) server can be run by setting `TYPE` to `LIMBO`.
|
||||||
|
|
||||||
|
Configuration options with defaults:
|
||||||
|
|
||||||
|
- `LIMBO_BUILD`=LATEST
|
||||||
|
|
||||||
|
The `VERSION` will be ignored so locate the appropriate value from [here](https://ci.loohpjames.com/job/Limbo/) to match the version expected by clients.
|
||||||
|
|
||||||
|
- `FORCE_REDOWNLOAD`=false
|
||||||
|
- `LIMBO_SCHEMA_FILENAME`=default.schem
|
||||||
|
- `LEVEL`="Default;${LIMBO_SCHEMA_FILENAME}"
|
||||||
|
|
||||||
|
### Running a Crucible server
|
||||||
|
|
||||||
|
A [Crucible](https://github.com/CrucibleMC/Crucible) server can be run by setting `TYPE` to `CRUCIBLE`.
|
||||||
|
|
||||||
|
Configuration options with defaults:
|
||||||
|
|
||||||
|
- `CRUCIBLE_RELEASE`=latest
|
||||||
|
|
||||||
|
Crucible is only available for 1.7.10, so be sure to set `VERSION=1.7.10`.
|
||||||
|
|
||||||
## Running a server with a Feed the Beast modpack
|
## Running a server with a Feed the Beast modpack
|
||||||
|
|
||||||
@@ -621,13 +642,13 @@ The following example uses `/modpacks` as the container path as the pre-download
|
|||||||
-e CF_SERVER_MOD=/modpacks/SkyFactory_4_Server_4.1.0.zip \
|
-e CF_SERVER_MOD=/modpacks/SkyFactory_4_Server_4.1.0.zip \
|
||||||
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
|
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
|
||||||
|
|
||||||
#### Modpack data directory
|
### Modpack data directory
|
||||||
|
|
||||||
By default, CurseForge modpacks are expanded into the sub-directory `/data/FeedTheBeast` and executed from there. (The default location was chosen for legacy reasons, when Curse and FTB were maintained together.)
|
By default, CurseForge modpacks are expanded into the sub-directory `/data/FeedTheBeast` and executed from there. (The default location was chosen for legacy reasons, when Curse and FTB were maintained together.)
|
||||||
|
|
||||||
The directory can be changed by setting `CF_BASE_DIR`, such as `-e CF_BASE_DIR=/data`.
|
The directory can be changed by setting `CF_BASE_DIR`, such as `-e CF_BASE_DIR=/data`.
|
||||||
|
|
||||||
#### Buggy start scripts
|
### Buggy start scripts
|
||||||
|
|
||||||
Some modpacks have buggy or overly complex start scripts. You can avoid using the bundled start script and use this image's standard server-starting logic by adding `-e USE_MODPACK_START_SCRIPT=false`.
|
Some modpacks have buggy or overly complex start scripts. You can avoid using the bundled start script and use this image's standard server-starting logic by adding `-e USE_MODPACK_START_SCRIPT=false`.
|
||||||
|
|
||||||
@@ -648,20 +669,20 @@ then you apply a workaround by adding this to the run invocation:
|
|||||||
There are optional volume paths that can be attached to supply content to be copied into the data area:
|
There are optional volume paths that can be attached to supply content to be copied into the data area:
|
||||||
|
|
||||||
`/plugins`
|
`/plugins`
|
||||||
: contents are copied into `/data/plugins` for Bukkit related server types. Set `PLUGINS_SYNC_UPDATE=false` if you want files from `/plugins` to take precedence over newer files in `/data/plugins`.
|
: contents are synchronized into `/data/plugins` for Bukkit related server types. Set `SYNC_SKIP_NEWER_IN_DESTINATION=false` if you want files from `/plugins` to take precedence over newer files in `/data/plugins`.
|
||||||
|
|
||||||
`/mods`
|
`/mods`
|
||||||
: contents are copied into `/data/mods` for Forge related server types
|
: contents are synchronized into `/data/mods` for Forge related server types. The destination can be changed by setting `COPY_MODS_DEST`.
|
||||||
|
|
||||||
`/config`
|
`/config`
|
||||||
: contents are copied into `/data/config` by default, but can be changed with `COPY_CONFIG_DEST`
|
: contents are synchronized into `/data/config` by default, but can be changed with `COPY_CONFIG_DEST`. For example, `-v ./config:/config -e COPY_CONFIG_DEST=/data` will allow you to copy over files like `bukkit.yml` and so on directly into the server directory. Set `SYNC_SKIP_NEWER_IN_DESTINATION=false` if you want files from `/config` to take precedence over newer files in `/data/config`.
|
||||||
|
|
||||||
|
By default, the [environment variable processing](#replacing-variables-inside-configs) is performed on synchronized files that match the expected suffixes in `REPLACE_ENV_SUFFIXES` (by default "yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml") and are not excluded by `REPLACE_ENV_VARIABLES_EXCLUDES` and `REPLACE_ENV_VARIABLES_EXCLUDE_PATHS`. This processing can be disabled by setting `REPLACE_ENV_DURING_SYNC` to `false`.
|
||||||
|
|
||||||
If you want old mods/plugins to be removed before the content is brought over from those attach points, then add `-e REMOVE_OLD_MODS=TRUE`. You can fine tune the removal process by specifying the `REMOVE_OLD_MODS_INCLUDE` and `REMOVE_OLD_MODS_EXCLUDE` variables. By default, everything will be removed. You can also specify the `REMOVE_OLD_MODS_DEPTH` (default is 16) variable to only delete files up to a certain level.
|
If you want old mods/plugins to be removed before the content is brought over from those attach points, then add `-e REMOVE_OLD_MODS=TRUE`. You can fine tune the removal process by specifying the `REMOVE_OLD_MODS_INCLUDE` and `REMOVE_OLD_MODS_EXCLUDE` variables. By default, everything will be removed. You can also specify the `REMOVE_OLD_MODS_DEPTH` (default is 16) variable to only delete files up to a certain level.
|
||||||
|
|
||||||
For example: `-e REMOVE_OLD_MODS=TRUE -e REMOVE_OLD_MODS_INCLUDE="*.jar" -e REMOVE_OLD_MODS_DEPTH=1` will remove all old jar files that are directly inside the `plugins/` or `mods/` directory.
|
For example: `-e REMOVE_OLD_MODS=TRUE -e REMOVE_OLD_MODS_INCLUDE="*.jar" -e REMOVE_OLD_MODS_DEPTH=1` will remove all old jar files that are directly inside the `plugins/` or `mods/` directory.
|
||||||
|
|
||||||
You can specify the destination of the files that are copied from `/mods` and `/config` by setting the `COPY_MODS_DEST` and `COPY_CONFIG_DEST`, where the default is `/data/mods` and `/data/config`. For example, `-v ./config:/config -e COPY_CONFIG_DEST=/data` will allow you to copy over files like `bukkit.yml` and so on directly into the server directory.
|
|
||||||
|
|
||||||
These paths work well if you want to have a common set of modules in a separate location, but still have multiple worlds with different server requirements in either persistent volumes or a downloadable archive.
|
These paths work well if you want to have a common set of modules in a separate location, but still have multiple worlds with different server requirements in either persistent volumes or a downloadable archive.
|
||||||
|
|
||||||
> For more flexibility with mods/plugins preparation, you can declare directories to use in [the `MODS` variable](#downloadable-modplugin-pack-for-forge-bukkit-and-spigot-servers)
|
> For more flexibility with mods/plugins preparation, you can declare directories to use in [the `MODS` variable](#downloadable-modplugin-pack-for-forge-bukkit-and-spigot-servers)
|
||||||
@@ -700,14 +721,42 @@ You may also download or copy over individual mods using the `MODS` environment
|
|||||||
|
|
||||||
docker run -d -e MODS=https://www.example.com/mods/mod1.jar,/plugins/common,/plugins/special/mod2.jar ...
|
docker run -d -e MODS=https://www.example.com/mods/mod1.jar,/plugins/common,/plugins/special/mod2.jar ...
|
||||||
|
|
||||||
|
### Generic pack file
|
||||||
|
|
||||||
|
To install all of the server content (jars, mods, plugins, configs, etc) from a zip file, such as a CurseForge modpack that is missing a server start script, then set `GENERIC_PACK` to the container path of the zip file. That, combined with `TYPE`, allows for custom content along with container managed server download and install.
|
||||||
|
|
||||||
|
If multiple generic packs need to be applied together, set `GENERIC_PACKS` instead, with a comma separated list of zip file paths and/or URLs to zip files.
|
||||||
|
|
||||||
|
### Mod/Plugin URL Listing File
|
||||||
|
|
||||||
|
As an alternative to `MODS`, the variable `MODS_FILE` can be set with the path to a text file listing a mod/plugin URL on each line. For example, the following
|
||||||
|
|
||||||
|
-e MODS_FILE=/extras/mods.txt
|
||||||
|
|
||||||
|
would load from a file mounted into the container at `/extras/mods.txt`. That file might look like:
|
||||||
|
|
||||||
|
```text
|
||||||
|
https://edge.forgecdn.net/files/2965/233/Bookshelf-1.15.2-5.6.40.jar
|
||||||
|
https://edge.forgecdn.net/files/2926/27/ProgressiveBosses-2.1.5-mc1.15.2.jar
|
||||||
|
# This and next line are ignored
|
||||||
|
#https://edge.forgecdn.net/files/3248/905/goblintraders-1.3.1-1.15.2.jar
|
||||||
|
https://edge.forgecdn.net/files/3272/32/jei-1.15.2-6.0.3.16.jar
|
||||||
|
https://edge.forgecdn.net/files/2871/647/ToastControl-1.15.2-3.0.1.jar
|
||||||
|
```
|
||||||
|
> Blank lines and lines that start with a `#` will be ignored
|
||||||
|
|
||||||
|
> [This compose file](examples/docker-compose-mods-file.yml) shows another example of using this feature.
|
||||||
|
|
||||||
|
> It is recommended to combine this option with `REMOVE_OLD_MODS=TRUE` to ensure the mods/plugins remain consistent with the file's listing.
|
||||||
|
|
||||||
### Remove old mods/plugins
|
### Remove old mods/plugins
|
||||||
|
|
||||||
When the option above is specified (`MODPACK`) you can also instruct script to
|
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
|
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.
|
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
|
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 ...
|
docker run -d -e REMOVE_OLD_MODS=TRUE -e MODPACK=http://www.example.com/mods/modpack.zip ...
|
||||||
|
|
||||||
**WARNING:** All content of the `mods` or `plugins` directory will be deleted
|
**WARNING:** All content of the `mods` or `plugins` directory will be deleted
|
||||||
before unpacking new content from the MODPACK or MODS.
|
before unpacking new content from the MODPACK or MODS.
|
||||||
@@ -738,39 +787,46 @@ read-only volume attachment to ensure the clone source remains pristine.
|
|||||||
docker run ... -v $HOME/worlds:/worlds:ro -e WORLD=/worlds/basic
|
docker run ... -v $HOME/worlds:/worlds:ro -e WORLD=/worlds/basic
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The following diagram shows how this option can be used in a compose deployment with a relative directory:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### Overwrite world on start
|
### Overwrite world on start
|
||||||
The world will only be downloaded or copied if it doesn't exist already. Set `FORCE_WORLD_COPY=TRUE` to force overwrite the world on every server start.
|
The world will only be downloaded or copied if it doesn't exist already. Set `FORCE_WORLD_COPY=TRUE` to force overwrite the world on every server start.
|
||||||
|
|
||||||
## Server configuration
|
## Server configuration
|
||||||
|
|
||||||
By default the server configuration will be created and set based on the following
|
By default, the server configuration will be created and set based on the following environment variables, but only the first time the server is started. If the `server.properties` file already exists, the values in them will not be changed.
|
||||||
environment variables, but only the first time the server is started. If the
|
|
||||||
`server.properties` file already exists, the values in them will not be changed.
|
|
||||||
|
|
||||||
If you would like to override the server configuration each time the container
|
If you would like to override the server configuration each time the container starts up, you can set the `OVERRIDE_SERVER_PROPERTIES` environment variable like:
|
||||||
starts up, you can set the OVERRIDE_SERVER_PROPERTIES environment variable like:
|
|
||||||
|
|
||||||
docker run -d -e OVERRIDE_SERVER_PROPERTIES=true ...
|
docker run -d -e OVERRIDE_SERVER_PROPERTIES=true ...
|
||||||
|
|
||||||
This will reset any manual configuration of the `server.properties` file, so if
|
This will reset any manual configuration of the `server.properties` file, so if you want to make any persistent configuration changes you will need to make sure you have properly set the proper environment variables in your container configuration.
|
||||||
you want to make any persistent configuration changes you will need to make sure
|
|
||||||
you have properly set the proper environment variables in your docker run command (described below).
|
|
||||||
|
|
||||||
### Server name
|
In the opposite case, you can skip the startup script's creation of `server.properties`, by setting `SKIP_SERVER_PROPERTIES` to "true".
|
||||||
|
|
||||||
The server name (e.g. for bungeecord) can be set like:
|
> NOTE: to clear a server property, set the variable to an empty string, such as `-e RESOURCE_PACK=""`. A variables that maps to a server property that is unset, is ignored and the existing `server.property` is left unchanged.
|
||||||
|
|
||||||
docker run -d -e SERVER_NAME=MyServer ...
|
### Message of the Day
|
||||||
|
|
||||||
### Server port
|
The message of the day, shown below each server entry in the client UI, can be changed with the `MOTD` environment variable, such as
|
||||||
|
|
||||||
> **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.
|
-e MOTD="My Server"
|
||||||
|
|
||||||
If you must, the server port can be set like:
|
If you leave it off, a default is computed from the server type and version, such as
|
||||||
|
|
||||||
docker run -d -e SERVER_PORT=25566 ...
|
A Paper Minecraft Server powered by Docker
|
||||||
|
|
||||||
**however**, be sure to change your port mapping accordingly and be prepared for some features to break.
|
That way you can easily differentiate between several servers you may have started.
|
||||||
|
|
||||||
|
The section symbol (§) and other unicode characters are automatically converted to allow [formatting codes](https://minecraft.fandom.com/wiki/Formatting_codes) to be used consistently with all server versions. For example,
|
||||||
|
|
||||||
|
-e MOTD="A §l§cMinecraft§r §nserver"
|
||||||
|
|
||||||
|
renders
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### Difficulty
|
### Difficulty
|
||||||
|
|
||||||
@@ -784,16 +840,19 @@ values.
|
|||||||
|
|
||||||
### Whitelist Players
|
### Whitelist Players
|
||||||
|
|
||||||
|
> **NOTE** it is very important to set this with servers exposed to the internet where you want only limited players to join.
|
||||||
|
|
||||||
To whitelist players for your Minecraft server, pass the Minecraft usernames separated by commas via the `WHITELIST` environment variable, such as
|
To whitelist players for your Minecraft server, pass the Minecraft usernames separated by commas via the `WHITELIST` environment variable, such as
|
||||||
|
|
||||||
docker run -d -e WHITELIST=user1,user2 ...
|
docker run -d -e WHITELIST=user1,user2 ...
|
||||||
|
|
||||||
If the `WHITELIST` environment variable is not used, any user can join your Minecraft server if it's publicly accessible.
|
If the `WHITELIST` environment variable is not used, any user can join your Minecraft server if it's publicly accessible.
|
||||||
|
|
||||||
> NOTE: When `WHITELIST` is used the server property `white-list` will automatically get set to `true`.
|
> NOTE: When `WHITELIST` is used the server properties `white-list` and `whitelist` will automatically get set to `true`.
|
||||||
|
|
||||||
> By default, the players in `WHITELIST` are **added** to the final `whitelist.json` file by the Minecraft server. If you set `OVERRIDE_WHITELIST` to "true" then the `whitelist.json` file will be recreated on each server startup.
|
> By default, the players in `WHITELIST` are **added** to the final `whitelist.json` file by the Minecraft server. If you set `OVERRIDE_WHITELIST` to "true" then the `whitelist.json` file will be recreated on each server startup.
|
||||||
|
|
||||||
|
Alternatively, you can set `ENABLE_WHITELIST=true` to only set the server properties `white-list` and `whitelist` without modifying the whitelist file. In this case the whitelist is solely managed using the `whitelist add` and `whitelist remove` commands.
|
||||||
### Op/Administrator Players
|
### Op/Administrator Players
|
||||||
|
|
||||||
To add more "op" (aka adminstrator) users to your Minecraft server, pass the Minecraft usernames separated by commas via the `OPS` environment variable, such as
|
To add more "op" (aka adminstrator) users to your Minecraft server, pass the Minecraft usernames separated by commas via the `OPS` environment variable, such as
|
||||||
@@ -815,7 +874,8 @@ The server icon which has been set doesn't get overridden by default. It can be
|
|||||||
|
|
||||||
### Rcon
|
### Rcon
|
||||||
|
|
||||||
To use rcon use the `ENABLE_RCON` and `RCON_PASSORD` variables.
|
To use rcon use the `ENABLE_RCON` and `RCON_PASSWORD` variables.
|
||||||
|
The default RCON password is _"minecraft",_ but it's **highly** recommended to override that.
|
||||||
By default rcon port will be `25575` but can easily be changed with the `RCON_PORT` variable.
|
By default rcon port will be `25575` but can easily be changed with the `RCON_PORT` variable.
|
||||||
|
|
||||||
docker run -d -e ENABLE_RCON=true -e RCON_PASSWORD=testing
|
docker run -d -e ENABLE_RCON=true -e RCON_PASSWORD=testing
|
||||||
@@ -958,18 +1018,6 @@ For example:
|
|||||||
|
|
||||||
docker run -d -e MODE=creative ...
|
docker run -d -e MODE=creative ...
|
||||||
|
|
||||||
### Message of the Day
|
|
||||||
|
|
||||||
The message of the day, shown below each server entry in the UI, can be changed with the `MOTD` environment variable, such as
|
|
||||||
|
|
||||||
-e MOTD="My Server"
|
|
||||||
|
|
||||||
If you leave it off, a default is computed from the server type and version, such as
|
|
||||||
|
|
||||||
A Paper Minecraft Server powered by Docker
|
|
||||||
|
|
||||||
That way you can easily differentiate between several servers you may have started.
|
|
||||||
|
|
||||||
### PVP Mode
|
### PVP Mode
|
||||||
|
|
||||||
By default, servers are created with player-vs-player (PVP) mode enabled. You can disable this with the `PVP`
|
By default, servers are created with player-vs-player (PVP) mode enabled. You can disable this with the `PVP`
|
||||||
@@ -1001,6 +1049,10 @@ For example (just the `-e` bits):
|
|||||||
|
|
||||||
-e LEVEL_TYPE=flat -e 'GENERATOR_SETTINGS=3;minecraft:bedrock,3*minecraft:stone,52*minecraft:sandstone;2;'
|
-e LEVEL_TYPE=flat -e 'GENERATOR_SETTINGS=3;minecraft:bedrock,3*minecraft:stone,52*minecraft:sandstone;2;'
|
||||||
|
|
||||||
|
In Minecraft 1.13+ you need to pass json ([generator site](https://misode.github.io/world/)) like this (details see [here](https://github.com/itzg/docker-minecraft-server/issues/999#issuecomment-907849644)):
|
||||||
|
|
||||||
|
-e LEVEL_TYPE=flat -e 'GENERATOR_SETTINGS={"biome":"minecraft:the_void","layers":[{"block":"minecraft:bedrock","height":1},{"block":"minecraft:stone","height":10},{"block":"minecraft:dirt","height":1}],"structures":{"structures":{}}}'
|
||||||
|
|
||||||
### Custom Server Resource Pack
|
### Custom Server Resource Pack
|
||||||
|
|
||||||
You can set a link to a custom resource pack and set it's checksum using the `RESOURCE_PACK` and `RESOURCE_PACK_SHA1` options respectively, the default is blank:
|
You can set a link to a custom resource pack and set it's checksum using the `RESOURCE_PACK` and `RESOURCE_PACK_SHA1` options respectively, the default is blank:
|
||||||
@@ -1009,16 +1061,18 @@ You can set a link to a custom resource pack and set it's checksum using the `RE
|
|||||||
|
|
||||||
**NOTE:** `:` and `=` must be escaped using `\`. The checksum plain-text hexadecimal.
|
**NOTE:** `:` and `=` must be escaped using `\`. The checksum plain-text hexadecimal.
|
||||||
|
|
||||||
### World Save Name
|
### Level / World Save Name
|
||||||
|
|
||||||
You can either switch between world saves or run multiple containers with different saves by using the `LEVEL` option,
|
You can either switch between world saves or run multiple containers with different saves by using the `LEVEL` option,
|
||||||
where the default is "world":
|
where the default is "world":
|
||||||
|
|
||||||
docker run -d -e LEVEL=bonus ...
|
docker run -d -e LEVEL=bonus ...
|
||||||
|
|
||||||
**NOTE:** if running multiple containers be sure to either specify a different `-v` host directory for each
|
> **NOTE:** if running multiple containers be sure to either specify a different `-v` host directory for each
|
||||||
`LEVEL` in use or don't use `-v` and the container's filesystem will keep things encapsulated.
|
`LEVEL` in use or don't use `-v` and the container's filesystem will keep things encapsulated.
|
||||||
|
|
||||||
|
> **INFO** Refer to the [data directory](#data-directory) section for a visual description of where the `$LEVEL` directory is situated.
|
||||||
|
|
||||||
### Online mode
|
### 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
|
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
|
||||||
@@ -1031,6 +1085,22 @@ Allows users to use flight on your server while in Survival mode, if they have a
|
|||||||
|
|
||||||
-e ALLOW_FLIGHT=TRUE|FALSE
|
-e ALLOW_FLIGHT=TRUE|FALSE
|
||||||
|
|
||||||
|
### Server name
|
||||||
|
|
||||||
|
The server name (e.g. for bungeecord) can be set like:
|
||||||
|
|
||||||
|
docker run -d -e SERVER_NAME=MyServer ...
|
||||||
|
|
||||||
|
### Server port
|
||||||
|
|
||||||
|
> **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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
### Other server property mappings
|
### Other server property mappings
|
||||||
|
|
||||||
| Environment Variable | Server Property |
|
| Environment Variable | Server Property |
|
||||||
@@ -1048,6 +1118,8 @@ Allows users to use flight on your server while in Survival mode, if they have a
|
|||||||
| PREVENT_PROXY_CONNECTIONS | prevent-proxy-connections |
|
| PREVENT_PROXY_CONNECTIONS | prevent-proxy-connections |
|
||||||
| USE_NATIVE_TRANSPORT | use-native-transport |
|
| USE_NATIVE_TRANSPORT | use-native-transport |
|
||||||
| ENFORCE_WHITELIST | enforce-whitelist |
|
| ENFORCE_WHITELIST | enforce-whitelist |
|
||||||
|
| ENABLE_WHITELIST | white-list and whitelist |
|
||||||
|
| SIMULATION_DISTANCE | simulation-distance |
|
||||||
|
|
||||||
## Miscellaneous Options
|
## Miscellaneous Options
|
||||||
|
|
||||||
@@ -1062,24 +1134,13 @@ in your config files after the container starts.
|
|||||||
For those cases there is the option to replace defined variables inside your configs
|
For those cases there is the option to replace defined variables inside your configs
|
||||||
with environment variables defined at container runtime.
|
with environment variables defined at container runtime.
|
||||||
|
|
||||||
If you set the enviroment variable `REPLACE_ENV_VARIABLES` to `TRUE` the startup script
|
When the environment variable `REPLACE_ENV_IN_PLACE` is set to `true` (the default), the startup script will go through all files inside the container's `/data` path and replace variables that match the container's environment variables. Variables can instead (or in addition to) be replaced in files sync'ed from `/plugins`, `/mods`, and `/config` by setting `REPLACE_ENV_DURING_SYNC` to `true` (defaults to `false`).
|
||||||
will go thru all files inside your `/data` volume and replace variables that match your
|
|
||||||
defined environment variables. Variables that you want to replace need to be wrapped
|
|
||||||
inside `${YOUR_VARIABLE}` curly brackets and prefixed with a dollar sign. This is the regular
|
|
||||||
syntax for enviromment variables inside strings or config files.
|
|
||||||
|
|
||||||
Optionally you can also define a prefix to only match predefined environment variables.
|
Variables that you want to replace need to be declared inside curly brackets and prefixed with a dollar sign, such as `${CFG_YOUR_VARIABLE}`, which is same as many scripting languages.
|
||||||
|
|
||||||
`ENV_VARIABLE_PREFIX="CFG_"` <-- this is the default prefix
|
You can also change `REPLACE_ENV_VARIABLE_PREFIX`, which defaults to "CFG_", to limit which environment variables are allowed to be used. For example, with "CFG_" as the prefix, the variable `${CFG_DB_HOST}` would be subsituted, but not `${DB_HOST}`.
|
||||||
|
|
||||||
If you want use file for value (like when use secrets) you can add suffix `_FILE` to your variable name (in run command).
|
If you want to use a file for value (like when use secrets) you can add suffix `_FILE` to your variable name.
|
||||||
|
|
||||||
There are some limitations to what characters you can use.
|
|
||||||
|
|
||||||
| Type | Allowed Characters |
|
|
||||||
| ----- | ------------------- |
|
|
||||||
| Name | `0-9a-zA-Z_-` |
|
|
||||||
| Value | `0-9a-zA-Z_-:/=?.+` |
|
|
||||||
|
|
||||||
Variables will be replaced in files with the following extensions:
|
Variables will be replaced in files with the following extensions:
|
||||||
`.yml`, `.yaml`, `.txt`, `.cfg`, `.conf`, `.properties`.
|
`.yml`, `.yaml`, `.txt`, `.cfg`, `.conf`, `.properties`.
|
||||||
@@ -1129,14 +1190,6 @@ services:
|
|||||||
CFG_DB_HOST: "http://localhost:3306"
|
CFG_DB_HOST: "http://localhost:3306"
|
||||||
CFG_DB_NAME: "minecraft"
|
CFG_DB_NAME: "minecraft"
|
||||||
CFG_DB_PASSWORD_FILE: "/run/secrets/db_password"
|
CFG_DB_PASSWORD_FILE: "/run/secrets/db_password"
|
||||||
restart: always
|
|
||||||
rcon:
|
|
||||||
image: itzg/rcon
|
|
||||||
ports:
|
|
||||||
- "4326:4326"
|
|
||||||
- "4327:4327"
|
|
||||||
volumes:
|
|
||||||
- "rcon:/opt/rcon-web-admin/db"
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
mc:
|
mc:
|
||||||
@@ -1147,9 +1200,47 @@ secrets:
|
|||||||
file: ./db_password
|
file: ./db_password
|
||||||
```
|
```
|
||||||
|
|
||||||
The content of `db_password`:
|
### Patching existing files
|
||||||
|
|
||||||
ug23u3bg39o-ogADSs
|
JSON path based patches can be applied to one or more existing files by setting the variable `PATCH_DEFINITIONS` to the path of a directory that contains one or more [patch definition json files](https://github.com/itzg/mc-image-helper#patchdefinition) or a [patch set json file](https://github.com/itzg/mc-image-helper#patchset).
|
||||||
|
|
||||||
|
Variable placeholders in the patch values can be restricted by setting `REPLACE_ENV_VARIABLE_PREFIX`, which defaults to "CFG_".
|
||||||
|
|
||||||
|
The following example shows a patch-set file were various fields in the `paper.yaml` configuration file can be modified and added:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"patches": [
|
||||||
|
{
|
||||||
|
"file": "/data/paper.yml",
|
||||||
|
"ops": [
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"path": "$.verbose",
|
||||||
|
"value": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"path": "$.settings['velocity-support'].enabled",
|
||||||
|
"value": "${CFG_VELOCITY_ENABLED}",
|
||||||
|
"value-type": "bool"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$put": {
|
||||||
|
"path": "$.settings",
|
||||||
|
"key": "my-test-setting",
|
||||||
|
"value": "testing"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> **NOTES:** Only JSON and Yaml files can be patched at this time. TOML support is planned to be added next. Removal of comments and other cosmetic changes will occur when patched files are processed.
|
||||||
|
|
||||||
### Running with a custom server JAR
|
### Running with a custom server JAR
|
||||||
|
|
||||||
@@ -1197,26 +1288,41 @@ The values of all three are passed directly to the JVM and support format/units
|
|||||||
|
|
||||||
-e MEMORY=2G
|
-e MEMORY=2G
|
||||||
|
|
||||||
> NOTE: the settings above only set the Java **heap** limits. Memory resource requests and limits on the overall container should also account for non-heap memory usage. An extra 25% is [a general best practice](https://dzone.com/articles/best-practices-java-memory-arguments-for-container).
|
To let the JVM calculate the heap size from the container declared memory limit, unset `MEMORY` with an empty value, such as `-e MEMORY=""`. By default, the JVM will use 25% of the container memory limit as the heap limit; however, as an example the following would tell the JVM to use 75% of the container limit of 2GB of memory:
|
||||||
|
|
||||||
|
-e MEMORY="" -e JVM_XX_OPTS="-XX:MaxRAMPercentage=75" -m 2000M
|
||||||
|
|
||||||
|
> The settings above only set the Java **heap** limits. Memory resource requests and limits on the overall container should also account for non-heap memory usage. An extra 25% is [a general best practice](https://dzone.com/articles/best-practices-java-memory-arguments-for-container).
|
||||||
|
|
||||||
### JVM Options
|
### JVM Options
|
||||||
|
|
||||||
General JVM options can be passed to the Minecraft Server invocation by passing a `JVM_OPTS`
|
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
|
environment variable. The JVM requires `-XX` options to precede `-X` options, so those can be declared in `JVM_XX_OPTS`. Both variables are space-delimited, raw JVM arguments.
|
||||||
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:
|
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`.
|
`JVM_DD_OPTS=fml.queryResult:confirm`, and will be converted to `-Dfml.queryResult=confirm`.
|
||||||
|
|
||||||
### Interactive and Color Console
|
### Interactive and Color Console
|
||||||
|
|
||||||
If you would like to attach to the Minecraft server console with color and interactive capabilities, then add
|
If you would like to `docker attach` to the Minecraft server console with color and interactive capabilities, then add
|
||||||
|
|
||||||
```
|
```
|
||||||
-e EXEC_DIRECTLY=true
|
-e EXEC_DIRECTLY=true
|
||||||
```
|
```
|
||||||
|
|
||||||
> **NOTE** this will bypass graceful server shutdown handling when using `docker stop`, so be sure to use `rcon-cli` or console commands to `stop` the server.
|
> **NOTES**
|
||||||
|
>
|
||||||
|
> This feature doesn't work via rcon, so you will need to `docker attach` to the container. Use the sequence Ctrl-P, Ctrl-Q to detach.
|
||||||
|
>
|
||||||
|
> This will bypass graceful server shutdown handling when using `docker stop`, so be sure the server console's `stop` command.
|
||||||
|
>
|
||||||
|
> Make to enable stdin and tty with `-it` when using `docker run` or `stdin_open: true` and `tty: true` when using docker compose.
|
||||||
|
|
||||||
|
### Server Shutdown Options
|
||||||
|
|
||||||
|
To allow time for players to finish what they're doing during a graceful server shutdown, set `STOP_SERVER_ANNOUNCE_DELAY` to a number of seconds to delay after an announcement is posted by the server.
|
||||||
|
|
||||||
|
> **NOTE** be sure to adjust Docker's shutdown timeout accordingly, such as using [the -t option on docker-compose down](https://docs.docker.com/compose/reference/down/).
|
||||||
|
|
||||||
### OpenJ9 Specific Options
|
### OpenJ9 Specific Options
|
||||||
|
|
||||||
@@ -1237,7 +1343,7 @@ By default the vanilla log file will grow without limit. The logger can be recon
|
|||||||
|
|
||||||
> **NOTE** this will interfere with interactive/color consoles [as described in the section above](#interactive-and-color-console)
|
> **NOTE** this will interfere with interactive/color consoles [as described in the section above](#interactive-and-color-console)
|
||||||
|
|
||||||
## Timezone Configuration
|
### Timezone Configuration
|
||||||
|
|
||||||
You can configure the timezone to match yours by setting the `TZ` environment variable:
|
You can configure the timezone to match yours by setting the `TZ` environment variable:
|
||||||
|
|
||||||
@@ -1294,7 +1400,11 @@ disable that by passing `-e GUI=FALSE`.
|
|||||||
|
|
||||||
### Stop Duration
|
### Stop Duration
|
||||||
|
|
||||||
When the container is signalled to stop, the Minecraft process wrapper will attempt to send a "stop" command via RCON or console and waits for the process to gracefully finish. By defaul it waits 60 seconds, but that duration can be configured by setting the environment variable `STOP_DURATION` to the number of seconds.
|
When the container is signalled to stop, the Minecraft process wrapper will attempt to send a "stop" command via RCON or console and waits for the process to gracefully finish. By default it waits 60 seconds, but that duration can be configured by setting the environment variable `STOP_DURATION` to the number of seconds.
|
||||||
|
|
||||||
|
### Setup only
|
||||||
|
|
||||||
|
If you are using a host-attached data directory, then you can have the image setup the Minecraft server files and stop prior to launching the server process by setting `SETUP_ONLY` to `true`.
|
||||||
|
|
||||||
## Autopause
|
## Autopause
|
||||||
|
|
||||||
@@ -1308,7 +1418,7 @@ Of course, even loaded chunks are not ticked when the process is stopped.
|
|||||||
|
|
||||||
**You must greatly increase or disable max-tick-time watchdog functionality.** From the server's point of view, the pausing causes a single tick to take as long as the process is stopped, so the server watchdog might intervene after the process is continued, possibly forcing a container restart. To prevent this, ensure that the `max-tick-time` in the `server.properties` file is set to a very large value or -1 to disable it entirely, which is highly recommended. That can be set with `MAX_TICK_TIME` as described in [the section below](#max-tick-time).
|
**You must greatly increase or disable max-tick-time watchdog functionality.** From the server's point of view, the pausing causes a single tick to take as long as the process is stopped, so the server watchdog might intervene after the process is continued, possibly forcing a container restart. To prevent this, ensure that the `max-tick-time` in the `server.properties` file is set to a very large value or -1 to disable it entirely, which is highly recommended. That can be set with `MAX_TICK_TIME` as described in [the section below](#max-tick-time).
|
||||||
|
|
||||||
> **NOTE:** Non-vanilla versions might have their own configuration file, you might have to disable their watchdogs separately (e.g. PAPER Servers).
|
> **NOTE:** Non-vanilla versions might have their own configuration file, you might have to disable their watchdogs separately. For PaperMC servers, you need to send the JVM flag `-Ddisable.watchdog=true`, this can be done with the docker env variable `-e JVM_DD_OPTS=disable.watchdog:true`
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
@@ -1343,3 +1453,7 @@ To run this image on a RaspberryPi 3 B+, 4, or newer, use any of the image tags
|
|||||||
> NOTE: you may need to lower the memory allocation, such as `-e MEMORY=750m`
|
> NOTE: you may need to lower the memory allocation, such as `-e MEMORY=750m`
|
||||||
|
|
||||||
> If experiencing issues such as "sleep: cannot read realtime clock: Operation not permitted", ensure `libseccomp` is up to date on your host. In some cases adding `:Z` flag to the `/data` mount may be needed, [but use cautiously](https://docs.docker.com/storage/bind-mounts/#configure-the-selinux-label).
|
> If experiencing issues such as "sleep: cannot read realtime clock: Operation not permitted", ensure `libseccomp` is up to date on your host. In some cases adding `:Z` flag to the `/data` mount may be needed, [but use cautiously](https://docs.docker.com/storage/bind-mounts/#configure-the-selinux-label).
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
See [Development](DEVELOPMENT.md) and [Building](BUILDING.md).
|
||||||
|
|||||||
5
health.sh → bin/mc-health
Normal file → Executable file
5
health.sh → bin/mc-health
Normal file → Executable file
@@ -1,6 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
# shellcheck source=../scripts/start-utils
|
||||||
|
. "${SCRIPTS:-/}start-utils"
|
||||||
|
|
||||||
if isTrue "${DISABLE_HEALTHCHECK}"; then
|
if isTrue "${DISABLE_HEALTHCHECK}"; then
|
||||||
echo "Healthcheck disabled"
|
echo "Healthcheck disabled"
|
||||||
@@ -9,6 +10,6 @@ elif isTrue "${ENABLE_AUTOPAUSE}" && [[ "$( ps -ax -o stat,comm | grep 'java' |
|
|||||||
echo "Java process suspended by Autopause function"
|
echo "Java process suspended by Autopause function"
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
mc-monitor status --host localhost --port $SERVER_PORT
|
mc-monitor status --host localhost --port "${SERVER_PORT:-25565}"
|
||||||
exit $?
|
exit $?
|
||||||
fi
|
fi
|
||||||
15
bin/mc-send-to-console
Executable file
15
bin/mc-send-to-console
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
: "${CONSOLE_IN_NAMED_PIPE:=/tmp/minecraft-console-in}"
|
||||||
|
|
||||||
|
if [ $# = 0 ]; then
|
||||||
|
echo "ERROR: pass console commands as arguments"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -p "${CONSOLE_IN_NAMED_PIPE}" ]; then
|
||||||
|
echo "ERROR: named pipe ${CONSOLE_IN_NAMED_PIPE} is missing"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$@" > "${CONSOLE_IN_NAMED_PIPE:-/tmp/minecraft-console-in}"
|
||||||
@@ -9,7 +9,7 @@ branches_list=(
|
|||||||
'java11-openj9'
|
'java11-openj9'
|
||||||
'java16'
|
'java16'
|
||||||
'java16-openj9'
|
'java16-openj9'
|
||||||
'multiarch-latest'
|
'java17'
|
||||||
)
|
)
|
||||||
|
|
||||||
function TrapExit {
|
function TrapExit {
|
||||||
|
|||||||
BIN
docs/motd-example.png
Normal file
BIN
docs/motd-example.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 985 B |
1
examples/.gitignore
vendored
Normal file
1
examples/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/data/
|
||||||
@@ -12,7 +12,10 @@ services:
|
|||||||
ENABLE_AUTOPAUSE: "TRUE"
|
ENABLE_AUTOPAUSE: "TRUE"
|
||||||
OVERRIDE_SERVER_PROPERTIES: "TRUE"
|
OVERRIDE_SERVER_PROPERTIES: "TRUE"
|
||||||
MAX_TICK_TIME: "-1"
|
MAX_TICK_TIME: "-1"
|
||||||
restart: always
|
# More aggressive settings for demo purposes
|
||||||
|
AUTOPAUSE_TIMEOUT_INIT: "30"
|
||||||
|
AUTOPAUSE_TIMEOUT_EST: "10"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
mc: {}
|
mc: {}
|
||||||
|
|||||||
@@ -2,12 +2,18 @@ version: '3.8'
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
mc:
|
mc:
|
||||||
image: itzg/minecraft-server:java8
|
image: itzg/minecraft-server:${IMAGE_TAG:-java8}
|
||||||
volumes:
|
volumes:
|
||||||
- ./modpacks:/modpacks:ro
|
- ./modpacks:/modpacks:ro
|
||||||
|
- data:/data
|
||||||
environment:
|
environment:
|
||||||
EULA: "true"
|
EULA: "true"
|
||||||
TYPE: CURSEFORGE
|
TYPE: CURSEFORGE
|
||||||
CF_SERVER_MOD: /modpacks/SkyFactory_4_Server_4.1.0.zip
|
CF_SERVER_MOD: https://media.forgecdn.net/files/3482/169/Valhelsia+3-3.4.4-SERVER.zip
|
||||||
|
# CF_SERVER_MOD: https://media.forgecdn.net/files/3012/800/SkyFactory-4_Server_4.2.2.zip
|
||||||
|
# CF_SERVER_MOD: /modpacks/${MODPACK:-SkyFactory_4_Server_4.1.0.zip}
|
||||||
ports:
|
ports:
|
||||||
- 25565:25565
|
- "25565:25565"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data: {}
|
||||||
15
examples/docker-compose-fabric.yml
Normal file
15
examples/docker-compose-fabric.yml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
mc:
|
||||||
|
image: ${IMAGE:-itzg/minecraft-server}
|
||||||
|
environment:
|
||||||
|
EULA: "true"
|
||||||
|
TYPE: FABRIC
|
||||||
|
ports:
|
||||||
|
- 25565:25565
|
||||||
|
volumes:
|
||||||
|
- fabric:/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
fabric: {}
|
||||||
@@ -2,15 +2,16 @@ version: "3.8"
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
mc:
|
mc:
|
||||||
image: itzg/minecraft-server:java8
|
image: itzg/minecraft-server
|
||||||
ports:
|
ports:
|
||||||
# expose the Minecraft server port outside of container
|
# expose the Minecraft server port outside of container
|
||||||
- 25565:25565
|
- "25565:25565"
|
||||||
environment:
|
environment:
|
||||||
# REQUIRED for all types
|
# REQUIRED for all types
|
||||||
EULA: "TRUE"
|
EULA: "TRUE"
|
||||||
# Set server type (vs the default of vanilla)
|
# Set server type (vs the default of vanilla)
|
||||||
TYPE: FORGE
|
TYPE: FORGE
|
||||||
|
DEBUG: "true"
|
||||||
volumes:
|
volumes:
|
||||||
# use a named, managed volume for data volume
|
# use a named, managed volume for data volume
|
||||||
- mc_forge:/data
|
- mc_forge:/data
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ version: "3.8"
|
|||||||
services:
|
services:
|
||||||
mc:
|
mc:
|
||||||
# FTBA support is only available in non-Alpine images
|
# FTBA support is only available in non-Alpine images
|
||||||
image: itzg/minecraft-server:java8-multiarch
|
image: itzg/minecraft-server:${IMAGE_TAG:-java8-multiarch}
|
||||||
ports:
|
ports:
|
||||||
# expose the Minecraft server port outside of container
|
# expose the Minecraft server port outside of container
|
||||||
- 25565:25565
|
- 25565:25565
|
||||||
@@ -14,10 +14,11 @@ services:
|
|||||||
TYPE: FTBA
|
TYPE: FTBA
|
||||||
# Use Pack ID from https://ftb.neptunepowered.org/pack/ftb-presents-direwolf20-1-12/
|
# Use Pack ID from https://ftb.neptunepowered.org/pack/ftb-presents-direwolf20-1-12/
|
||||||
FTB_MODPACK_ID: "31"
|
FTB_MODPACK_ID: "31"
|
||||||
|
FTB_MODPACK_VERSION_ID: ""
|
||||||
volumes:
|
volumes:
|
||||||
# use a named, managed volume for data volume
|
# use a named, managed volume for data volume
|
||||||
- mc_ftb:/data
|
- ftba:/data
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
# declared the named volume, but use default/local storage engine
|
# declared the named volume, but use default/local storage engine
|
||||||
mc_ftb: {}
|
ftba: {}
|
||||||
|
|||||||
20
examples/docker-compose-generic-pack.yml
Normal file
20
examples/docker-compose-generic-pack.yml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
mc:
|
||||||
|
image: itzg/minecraft-server:${IMAGE_TAG:-latest}
|
||||||
|
volumes:
|
||||||
|
- data:/data
|
||||||
|
- ./modpacks:/modpacks:ro
|
||||||
|
environment:
|
||||||
|
EULA: "true"
|
||||||
|
TYPE: FORGE
|
||||||
|
DEBUG: "${DEBUG:-false}"
|
||||||
|
VERSION: ${VERSION:-1.17.1}
|
||||||
|
FORGEVERSION: ${FORGEVERSION:-37.0.90}
|
||||||
|
GENERIC_PACK: /modpacks/${MODPACK:-Server-Files-0.0.21.zip}
|
||||||
|
ports:
|
||||||
|
- "25565:25565"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data: {}
|
||||||
19
examples/docker-compose-mods-file.yml
Normal file
19
examples/docker-compose-mods-file.yml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
mc:
|
||||||
|
image: itzg/minecraft-server
|
||||||
|
environment:
|
||||||
|
EULA: "true"
|
||||||
|
TYPE: FORGE
|
||||||
|
VERSION: 1.15.2
|
||||||
|
MODS_FILE: /extras/mods.txt
|
||||||
|
REMOVE_OLD_MODS: "true"
|
||||||
|
ports:
|
||||||
|
- 25565:25565
|
||||||
|
volumes:
|
||||||
|
- data:/data
|
||||||
|
- ./mods.txt:/extras/mods.txt:ro
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data:
|
||||||
17
examples/docker-compose-mohist.yml
Normal file
17
examples/docker-compose-mohist.yml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
mc:
|
||||||
|
image: itzg/minecraft-server
|
||||||
|
ports:
|
||||||
|
- "25565:25565"
|
||||||
|
environment:
|
||||||
|
EULA: "TRUE"
|
||||||
|
TYPE: MOHIST
|
||||||
|
VERSION: 1.12.2
|
||||||
|
DEBUG: "true"
|
||||||
|
volumes:
|
||||||
|
- data:/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data: {}
|
||||||
27
examples/docker-compose-rlcraft.yml
Normal file
27
examples/docker-compose-rlcraft.yml
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
rlcraft:
|
||||||
|
image: itzg/minecraft-server:java8
|
||||||
|
container_name: rlcraft
|
||||||
|
volumes:
|
||||||
|
- rlcraft-modpack:/modpacks:ro
|
||||||
|
- rlcraft-data:/data
|
||||||
|
environment:
|
||||||
|
EULA: "true"
|
||||||
|
TYPE: "FORGE"
|
||||||
|
VERSION: "1.12.2"
|
||||||
|
FORGEVERSION: "14.23.5.2855"
|
||||||
|
DIFFICULTY: "hard"
|
||||||
|
MAX_TICK_TIME: "-1"
|
||||||
|
VIEW_DISTANCE: "6"
|
||||||
|
ALLOW_FLIGHT: "true"
|
||||||
|
MEMORY: "4G"
|
||||||
|
GENERIC_PACK: "/modpacks/RLCraft_Server_Pack_1.12.2_Beta_v2.8.2.zip"
|
||||||
|
ports:
|
||||||
|
- 25565:25565
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
rlcraft-data:
|
||||||
|
rlcraft-modpack:
|
||||||
17
examples/docker-compose-spiget.yml
Normal file
17
examples/docker-compose-spiget.yml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
mc:
|
||||||
|
# Only using IMAGE variable to allow for local testing
|
||||||
|
image: ${IMAGE:-itzg/minecraft-server}
|
||||||
|
ports:
|
||||||
|
- 25565:25565
|
||||||
|
environment:
|
||||||
|
EULA: "TRUE"
|
||||||
|
TYPE: SPIGOT
|
||||||
|
SPIGET_RESOURCES: 9089,34315,3836
|
||||||
|
volumes:
|
||||||
|
- data:/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data: {}
|
||||||
80
examples/mods.txt
Normal file
80
examples/mods.txt
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
https://edge.forgecdn.net/files/2965/233/Bookshelf-1.15.2-5.6.40.jar
|
||||||
|
https://edge.forgecdn.net/files/2926/27/ProgressiveBosses-2.1.5-mc1.15.2.jar
|
||||||
|
https://edge.forgecdn.net/files/3248/905/goblintraders-1.3.1-1.15.2.jar
|
||||||
|
https://edge.forgecdn.net/files/3272/32/jei-1.15.2-6.0.3.16.jar
|
||||||
|
https://edge.forgecdn.net/files/2871/647/ToastControl-1.15.2-3.0.1.jar
|
||||||
|
https://edge.forgecdn.net/files/3101/903/Druidcraft-1.15-0.4.45.jar
|
||||||
|
https://edge.forgecdn.net/files/2880/426/DefaultOptions_1.15.2-11.0.1.jar
|
||||||
|
https://edge.forgecdn.net/files/2996/535/MekanismAdditions-1.15.2-9.10.9.422.jar
|
||||||
|
https://edge.forgecdn.net/files/3147/275/blockcarpentry-1.15-0.8.2.jar
|
||||||
|
https://edge.forgecdn.net/files/3005/715/refinedstorageaddons-0.6.3.jar
|
||||||
|
https://edge.forgecdn.net/files/3140/146/rftoolsbase-1.15-1.1.10.jar
|
||||||
|
https://edge.forgecdn.net/files/3236/649/cc-tweaked-1.15.2-1.95.3.jar
|
||||||
|
https://edge.forgecdn.net/files/3048/970/light-overlay-4.7.2.jar
|
||||||
|
https://edge.forgecdn.net/files/3015/904/randompatches-1.15.2-1.22.1.1.jar
|
||||||
|
https://edge.forgecdn.net/files/3131/439/engineersdecor-1.15.2-1.1.4.jar
|
||||||
|
https://edge.forgecdn.net/files/3051/255/carryon-1.15.2-1.13.0.5.jar
|
||||||
|
https://edge.forgecdn.net/files/3175/752/EnderStorage-1.15.2-2.5.2.164-universal.jar
|
||||||
|
https://edge.forgecdn.net/files/2997/84/Savage-and-Ravage-1.15.2-1.1.4.jar
|
||||||
|
https://edge.forgecdn.net/files/3053/840/PackMenu-1.15.2-1.2.8.jar
|
||||||
|
https://edge.forgecdn.net/files/3003/397/JEITweaker-1.15.2-1.0.1.3.jar
|
||||||
|
https://edge.forgecdn.net/files/3069/489/absentbydesign-1.15.2-1.1.1.jar
|
||||||
|
https://edge.forgecdn.net/files/2997/601/Upgrade-Aquatic-1.15.2-1.7.1.jar
|
||||||
|
https://edge.forgecdn.net/files/2950/766/ReAuth-1.14-1.15-3.8.1.jar
|
||||||
|
https://edge.forgecdn.net/files/3024/179/Powah-1.15.2-1.1.15.jar
|
||||||
|
https://edge.forgecdn.net/files/3092/975/StorageDrawers-1.15.2-7.0.3.jar
|
||||||
|
https://edge.forgecdn.net/files/2853/267/furniture-7.0.0-pre16-1.15.1.jar
|
||||||
|
https://edge.forgecdn.net/files/2987/251/AppleSkin-mc1.15.2-forge-1.0.14.jar
|
||||||
|
https://edge.forgecdn.net/files/2980/323/industrial-foregoing-1.15.2-2.3.3-e356e61.jar
|
||||||
|
https://edge.forgecdn.net/files/3024/178/Lollipop-1.15.2-1.0.16.jar
|
||||||
|
https://edge.forgecdn.net/files/3210/106/tablechair-1.4.jar
|
||||||
|
https://edge.forgecdn.net/files/3047/358/xercapaint-1.15.2-3.3.jar
|
||||||
|
https://edge.forgecdn.net/files/2873/657/BonsaiTrees-2.1.2.6.jar
|
||||||
|
https://edge.forgecdn.net/files/2938/583/config-2-3.0.jar
|
||||||
|
https://edge.forgecdn.net/files/2991/235/Waystones_1.15.2-6.0.2.jar
|
||||||
|
https://edge.forgecdn.net/files/2957/23/OpenLoader-1.15.2-4.0.5.jar
|
||||||
|
https://edge.forgecdn.net/files/3275/718/XaerosWorldMap_1.13.2_Forge_1.15.2.jar
|
||||||
|
https://edge.forgecdn.net/files/2876/104/AI-Improvements-1.15.2-0.3.0.jar
|
||||||
|
https://edge.forgecdn.net/files/3005/515/mysticallib-1.15.2-2.0.1.jar
|
||||||
|
https://edge.forgecdn.net/files/3008/867/WAWLA-1.15.2-3.0.4.jar
|
||||||
|
https://edge.forgecdn.net/files/2964/474/WailaHarvestability-mc1.15.2-1.1.12.jar
|
||||||
|
https://edge.forgecdn.net/files/3103/508/Kiwi-1.15.2-2.8.5.jar
|
||||||
|
https://edge.forgecdn.net/files/3128/662/Atum-1.15.2-2.1.12.jar
|
||||||
|
https://edge.forgecdn.net/files/2988/910/Buzzier-Bees-1.15.2-1.5.2.jar
|
||||||
|
https://edge.forgecdn.net/files/3030/627/u_team_core-1.15.2-3.0.2.169.jar
|
||||||
|
https://edge.forgecdn.net/files/3003/984/SilentLib-1.15.2-4.6.6+59.jar
|
||||||
|
https://edge.forgecdn.net/files/2968/353/refinedpipes-0.4.2.jar
|
||||||
|
https://edge.forgecdn.net/files/3140/149/rftoolsbuilder-1.15-2.1.16.jar
|
||||||
|
https://edge.forgecdn.net/files/3067/203/mightyarchitect-mc1.15.2_v0.5.jar
|
||||||
|
https://edge.forgecdn.net/files/2980/153/EquipmentTooltips-1.15.2-1.4.3+14.jar
|
||||||
|
https://edge.forgecdn.net/files/3103/510/FruitTrees-1.15.2-1.7.0.jar
|
||||||
|
https://edge.forgecdn.net/files/2989/38/Atmospheric-1.15.2-1.4.1.jar
|
||||||
|
https://edge.forgecdn.net/files/3096/836/rftoolscontrol-1.15-3.0.9.jar
|
||||||
|
https://edge.forgecdn.net/files/2989/662/Enhanced-Mushrooms-1.15.2-v1.2.2.jar
|
||||||
|
https://edge.forgecdn.net/files/3227/891/SimpleStorageNetwork-1.15.2-1.0.2.jar
|
||||||
|
https://edge.forgecdn.net/files/3217/290/minecolonies-0.13.645-RELEASE-universal.jar
|
||||||
|
https://edge.forgecdn.net/files/2935/384/SnowRealMagic-1.15.2-1.7.5.jar
|
||||||
|
https://edge.forgecdn.net/files/2988/584/aiotbotania-1.15.2-1.2.3.jar
|
||||||
|
https://edge.forgecdn.net/files/3255/408/mowziesmobs-1.5.15.jar
|
||||||
|
https://edge.forgecdn.net/files/3062/510/HealthOverlay-1.15.2-1.0.2.jar
|
||||||
|
https://edge.forgecdn.net/files/3023/121/neoncraft-1.1.jar
|
||||||
|
https://edge.forgecdn.net/files/2997/617/Swamp-Expansion-1.15.2-1.7.3.jar
|
||||||
|
https://edge.forgecdn.net/files/2980/252/titanium-1.15.2-2.4.2.jar
|
||||||
|
https://edge.forgecdn.net/files/3152/946/rftoolsutility-1.15-2.1.20.jar
|
||||||
|
https://edge.forgecdn.net/files/3083/277/swingthroughgrass-1.15.2-1.4.1.jar
|
||||||
|
https://edge.forgecdn.net/files/3138/530/SilentGear-1.15.2-1.11.4+187.jar
|
||||||
|
https://edge.forgecdn.net/files/3105/429/DarkUtilities-1.15.2-3.1.9.jar
|
||||||
|
https://edge.forgecdn.net/files/3099/23/ImmersiveEngineering-1.15.2-4.1.1-125.jar
|
||||||
|
https://edge.forgecdn.net/files/2856/529/FastFurnace-1.15.1-3.0.0.jar
|
||||||
|
https://edge.forgecdn.net/files/2988/999/BiomesOPlenty-1.15.2-10.0.0.366-universal.jar
|
||||||
|
https://edge.forgecdn.net/files/2989/95/The-Endergetic-Expansion-1.15.2-v1.3.2.jar
|
||||||
|
https://edge.forgecdn.net/files/2993/960/FluxNetworks-1.15.2-5.0.3-4.jar
|
||||||
|
https://edge.forgecdn.net/files/3028/611/ServerTabInfo-1.15.2-1.2.8.jar
|
||||||
|
https://edge.forgecdn.net/files/3134/277/fairylights-3.0.15-1.15.2.jar
|
||||||
|
https://edge.forgecdn.net/files/3048/54/useful_backpacks-1.15.2-1.10.3.77.jar
|
||||||
|
https://edge.forgecdn.net/files/3273/515/mcw-trapdoors-1.0.2-mc1.15.2.jar
|
||||||
|
https://edge.forgecdn.net/files/2986/639/CraftingTweaks_1.15.2-11.0.1.jar
|
||||||
|
https://edge.forgecdn.net/files/3261/454/create-mc1.15.2_v0.3.1a.jar
|
||||||
|
https://edge.forgecdn.net/files/3211/10/supermartijn642configlib-1.0.5-mc1.15.jar
|
||||||
|
https://edge.forgecdn.net/files/2995/786/TerraForged-1.15.2-0.0.15.jar
|
||||||
|
https://edge.forgecdn.net/files/2892/562/leavesdecayonotherleaves-1.1.jar
|
||||||
0
files/autopause/autopause-daemon.sh
Normal file → Executable file
0
files/autopause/autopause-daemon.sh
Normal file → Executable file
25
files/autopause/autopause-fcns.sh
Normal file → Executable file
25
files/autopause/autopause-fcns.sh
Normal file → Executable file
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
current_uptime() {
|
current_uptime() {
|
||||||
echo $(awk '{print $1}' /proc/uptime | cut -d . -f 1)
|
awk '{print $1}' /proc/uptime | cut -d . -f 1
|
||||||
}
|
}
|
||||||
|
|
||||||
java_running() {
|
java_running() {
|
||||||
@@ -17,26 +17,15 @@ rcon_client_exists() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mc_server_listening() {
|
mc_server_listening() {
|
||||||
[[ -n $(netstat -tln | grep -e "0.0.0.0:$SERVER_PORT" -e ":::$SERVER_PORT" | grep LISTEN) ]]
|
mc-monitor status --host localhost --port "$SERVER_PORT" --timeout 10s >& /dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
java_clients_connected() {
|
java_clients_connected() {
|
||||||
local connections
|
local connections
|
||||||
connections=$(netstat -tn | grep ":$SERVER_PORT" | grep ESTABLISHED)
|
if java_running ; then
|
||||||
if [[ -z "$connections" ]] ; then
|
connections=$(mc-monitor status --host localhost --port "$SERVER_PORT" --show-player-count)
|
||||||
return 1
|
else
|
||||||
|
connections=0
|
||||||
fi
|
fi
|
||||||
IFS=$'\n'
|
(( connections > 0 ))
|
||||||
connections=($connections)
|
|
||||||
unset IFS
|
|
||||||
# check that at least one external address is not localhost
|
|
||||||
# remember, that the host network mode does not work with autopause because of the knockd utility
|
|
||||||
for (( i=0; i<${#connections[@]}; i++ ))
|
|
||||||
do
|
|
||||||
if [[ ! $(echo "${connections[$i]}" | awk '{print $5}') =~ ^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$ ]] ; then
|
|
||||||
# not localhost
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 1
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,3 +10,6 @@
|
|||||||
seq_timeout = 1
|
seq_timeout = 1
|
||||||
command = /usr/sbin/gosu minecraft:minecraft /autopause/resume.sh
|
command = /usr/sbin/gosu minecraft:minecraft /autopause/resume.sh
|
||||||
tcpflags = syn
|
tcpflags = syn
|
||||||
|
[unpauseMCServer-bedrock]
|
||||||
|
sequence = 19132:udp
|
||||||
|
command = /usr/sbin/gosu minecraft:minecraft /autopause/resume.sh
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<Console name="SysOut" target="SYSTEM_OUT">
|
<Console name="SysOut" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
|
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
|
||||||
</Console>
|
</Console>
|
||||||
<Queue name="ServerGuiConsole">
|
<Queue name="TerminalConsole">
|
||||||
<PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n" />
|
<PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n" />
|
||||||
</Queue>
|
</Queue>
|
||||||
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
|
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
</filters>
|
</filters>
|
||||||
<AppenderRef ref="SysOut"/>
|
<AppenderRef ref="SysOut"/>
|
||||||
<AppenderRef ref="File"/>
|
<AppenderRef ref="File"/>
|
||||||
<AppenderRef ref="ServerGuiConsole"/>
|
<AppenderRef ref="TerminalConsole"/>
|
||||||
</Root>
|
</Root>
|
||||||
</Loggers>
|
</Loggers>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# Moved to top-level
|
|
||||||
|
|
||||||
The contents of this directory have now been moved to the top level of
|
|
||||||
[itzg/docker-minecraft-server](https://github.com/itzg/docker-minecraft-server).
|
|
||||||
0
start → scripts/start
Normal file → Executable file
0
start → scripts/start
Normal file → Executable file
@@ -1,9 +1,15 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
# shellcheck source=start-utils
|
||||||
|
. "${SCRIPTS:-/}start-utils"
|
||||||
|
|
||||||
|
: "${SERVER_PORT:=25565}"
|
||||||
|
export SERVER_PORT
|
||||||
|
|
||||||
log "Autopause functionality enabled"
|
log "Autopause functionality enabled"
|
||||||
|
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
cp /autopause/knockd-config.cfg /tmp/knockd-config.cfg
|
cp /autopause/knockd-config.cfg /tmp/knockd-config.cfg
|
||||||
|
|
||||||
# update server port to listen to
|
# update server port to listen to
|
||||||
59
start-configuration → scripts/start-configuration
Normal file → Executable file
59
start-configuration → scripts/start-configuration
Normal file → Executable file
@@ -2,14 +2,17 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
# shellcheck source=start-utils
|
||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
: ${EULA:=}
|
: "${EULA:=}"
|
||||||
: ${PROXY:=}
|
: "${PROXY:=}"
|
||||||
: ${RCON_PASSWORD_FILE:=}
|
: "${RCON_PASSWORD_FILE:=}"
|
||||||
|
|
||||||
shopt -s nullglob
|
shopt -s nullglob
|
||||||
|
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
#umask 002
|
#umask 002
|
||||||
export HOME=/data
|
export HOME=/data
|
||||||
|
|
||||||
@@ -63,10 +66,16 @@ export VERSIONS_JSON=https://launchermeta.mojang.com/mc/game/version_manifest.js
|
|||||||
|
|
||||||
case "X$VERSION" in
|
case "X$VERSION" in
|
||||||
X|XLATEST|Xlatest)
|
X|XLATEST|Xlatest)
|
||||||
VANILLA_VERSION=$(curl -fsSL $VERSIONS_JSON | jq -r '.latest.release')
|
if ! VANILLA_VERSION=$(get --json-path '$.latest.release' "$VERSIONS_JSON"); then
|
||||||
|
log "ERROR: version lookup failed: $VANILLA_VERSION"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
XSNAPSHOT|Xsnapshot)
|
XSNAPSHOT|Xsnapshot)
|
||||||
VANILLA_VERSION=$(curl -fsSL $VERSIONS_JSON | jq -r '.latest.snapshot')
|
if ! VANILLA_VERSION=$(get --json-path '$.latest.snapshot' "$VERSIONS_JSON"); then
|
||||||
|
log "ERROR: version lookup failed: $VANILLA_VERSION"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
VANILLA_VERSION=$VERSION
|
VANILLA_VERSION=$VERSION
|
||||||
@@ -93,17 +102,15 @@ case "${TYPE^^}" in
|
|||||||
exec ${SCRIPTS:-/}start-deployPaper "$@"
|
exec ${SCRIPTS:-/}start-deployPaper "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
TUINITY)
|
|
||||||
exec ${SCRIPTS:-/}start-deployTuinity "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
FORGE)
|
FORGE)
|
||||||
|
if versionLessThan 1.17; then
|
||||||
log "**********************************************************************"
|
log "**********************************************************************"
|
||||||
log "WARNING: The image tag itzg/minecraft-server:java8 is recommended"
|
log "WARNING: The image tag itzg/minecraft-server:java8 is recommended"
|
||||||
log " since some mods require Java 8"
|
log " since some mods require Java 8"
|
||||||
log " Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader"
|
log " Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader"
|
||||||
log " can be fixed with java8"
|
log " can be fixed with java8"
|
||||||
log "**********************************************************************"
|
log "**********************************************************************"
|
||||||
|
fi
|
||||||
exec ${SCRIPTS:-/}start-deployForge "$@"
|
exec ${SCRIPTS:-/}start-deployForge "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -117,16 +124,14 @@ case "${TYPE^^}" in
|
|||||||
|
|
||||||
FTB|CURSEFORGE)
|
FTB|CURSEFORGE)
|
||||||
log "**********************************************************************"
|
log "**********************************************************************"
|
||||||
log "WARNING: The image tag itzg/minecraft-server:java8 is recommended"
|
log "NOTE: Some mods and modpacks may require Java 8."
|
||||||
log " since some mods require Java 8"
|
log " If so, use itzg/minecraft-server:java8"
|
||||||
log " Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader"
|
|
||||||
log " can be fixed with java8"
|
|
||||||
log "**********************************************************************"
|
log "**********************************************************************"
|
||||||
exec ${SCRIPTS:-/}start-deployCF "$@"
|
exec ${SCRIPTS:-/}start-deployCF "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
VANILLA)
|
VANILLA)
|
||||||
exec ${SCRIPTS:-/}start-deployVanilla "$@"
|
exec "${SCRIPTS:-/}start-deployVanilla" "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
SPONGEVANILLA)
|
SPONGEVANILLA)
|
||||||
@@ -137,10 +142,6 @@ case "${TYPE^^}" in
|
|||||||
exec ${SCRIPTS:-/}start-deployCustom "$@"
|
exec ${SCRIPTS:-/}start-deployCustom "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
CURSE_INSTANCE)
|
|
||||||
exec ${SCRIPTS:-/}start-validateCurseInstance "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
MAGMA)
|
MAGMA)
|
||||||
exec ${SCRIPTS:-/}start-deployMagma "$@"
|
exec ${SCRIPTS:-/}start-deployMagma "$@"
|
||||||
;;
|
;;
|
||||||
@@ -157,10 +158,6 @@ case "${TYPE^^}" in
|
|||||||
exec ${SCRIPTS:-/}start-deployPurpur "$@"
|
exec ${SCRIPTS:-/}start-deployPurpur "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
YATOPIA)
|
|
||||||
exec ${SCRIPTS:-/}start-deployYatopia "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
AIRPLANE)
|
AIRPLANE)
|
||||||
exec ${SCRIPTS:-/}start-deployAirplane "$@"
|
exec ${SCRIPTS:-/}start-deployAirplane "$@"
|
||||||
;;
|
;;
|
||||||
@@ -169,11 +166,25 @@ case "${TYPE^^}" in
|
|||||||
exec ${SCRIPTS:-/}start-deployCanyon "$@"
|
exec ${SCRIPTS:-/}start-deployCanyon "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
LIMBO)
|
||||||
|
exec ${SCRIPTS:-/}start-deployLimbo "$@"
|
||||||
|
;;
|
||||||
|
|
||||||
|
CRUCIBLE)
|
||||||
|
log "**********************************************************************"
|
||||||
|
log "WARNING: The image tag itzg/minecraft-server:java8 is recommended"
|
||||||
|
log " since some mods require Java 8"
|
||||||
|
log " Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader"
|
||||||
|
log " can be fixed with java8"
|
||||||
|
log "**********************************************************************"
|
||||||
|
exec "${SCRIPTS:-/}start-deployCrucible" "$@"
|
||||||
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
log "Invalid type: '$TYPE'"
|
log "Invalid type: '$TYPE'"
|
||||||
log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTBA (multiarch-only),"
|
log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTBA (multiarch-only),"
|
||||||
log " CURSE_INSTANCE, CURSEFORGE, SPONGEVANILLA, TUINITY, PURPUR"
|
log " CURSEFORGE, SPONGEVANILLA, PURPUR, CUSTOM,"
|
||||||
log " CUSTOM, MAGMA, MOHIST, CATSERVER, YATOPIA, AIRPLANE, CANYON"
|
log " MAGMA, MOHIST, CATSERVER, AIRPLANE, CANYON, LIMBO, CRUCIBLE"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
|
|
||||||
52
scripts/start-deployAirplane
Executable file
52
scripts/start-deployAirplane
Executable file
@@ -0,0 +1,52 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
if [ "${VERSION}" != "LATEST" ] && [ "${VERSION}" != "1.16" ] && [ "${VERSION}" != "1.17" ] && [ "${VERSION}" != "PURPUR" ] && [ "${VERSION}" != "PURPUR-1.16" ] ; then
|
||||||
|
log "ERROR: Airplane server type only supports VERSION=LATEST, VERSION=1.17, VERSION=1.16, VERSION=PURPUR or VERSION=PURPUR-1.16. Note that these are branches, not #.#.# versions."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
: ${AIRPLANE_BUILD:=lastSuccessfulBuild}
|
||||||
|
: ${AIRPLANE_TYPE:=airplane}
|
||||||
|
|
||||||
|
if [ "${VERSION}" = "LATEST" ] || [ "${VERSION}" = "1.17" ]; then
|
||||||
|
AIRPLANE_BRANCH="1.17"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${VERSION}" = "1.16" ]; then
|
||||||
|
AIRPLANE_BRANCH="1.16"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${VERSION}" = "PURPUR" ]; then
|
||||||
|
AIRPLANE_BRANCH="Purpur-1.17"
|
||||||
|
AIRPLANE_TYPE="airplanepurpur"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${VERSION}" = "PURPUR-1.16" ]; then
|
||||||
|
AIRPLANE_BRANCH="Purpur-1.16"
|
||||||
|
AIRPLANE_TYPE="airplanepurpur"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Using Airplane-${AIRPLANE_BRANCH} branch"
|
||||||
|
|
||||||
|
export SERVER=airplane-${AIRPLANE_BRANCH}-${AIRPLANE_BUILD}.jar
|
||||||
|
|
||||||
|
if [ ! -f "$SERVER" ] || isTrue "${FORCE_REDOWNLOAD:-false}"; then
|
||||||
|
downloadUrl="https://ci.tivy.ca/job/Airplane-${AIRPLANE_BRANCH}/${AIRPLANE_BUILD}/artifact/launcher-${AIRPLANE_TYPE}.jar"
|
||||||
|
log "Downloading Airplane from $downloadUrl ..."
|
||||||
|
curl -fsSL -o "$SERVER" "$downloadUrl"
|
||||||
|
if [ ! -f "$SERVER" ]; then
|
||||||
|
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Normalize on Spigot for later operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-spiget "$@"
|
||||||
4
start-deployBukkitSpigot → scripts/start-deployBukkitSpigot
Normal file → Executable file
4
start-deployBukkitSpigot → scripts/start-deployBukkitSpigot
Normal file → Executable file
@@ -64,7 +64,11 @@ function downloadSpigot {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -z $downloadUrl ]]; then
|
if [[ -z $downloadUrl ]]; then
|
||||||
|
if versionLessThan 1.16.5; then
|
||||||
downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar"
|
downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar"
|
||||||
|
else
|
||||||
|
downloadUrl="https://download.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
setServerVar
|
setServerVar
|
||||||
86
start-deployCF → scripts/start-deployCF
Normal file → Executable file
86
start-deployCF → scripts/start-deployCF
Normal file → Executable file
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
# shellcheck source=start-utils
|
||||||
|
. "${SCRIPTS:-/}start-utils"
|
||||||
|
|
||||||
loadForgeVars() {
|
loadForgeVars() {
|
||||||
cfgFile=${1?}
|
cfgFile=${1?}
|
||||||
@@ -23,7 +24,7 @@ loadForgeVars() {
|
|||||||
|
|
||||||
isDebugging && set -x
|
isDebugging && set -x
|
||||||
|
|
||||||
: ${FTB_BASE_DIR:=${CF_BASE_DIR:-/data/FeedTheBeast}}
|
: "${FTB_BASE_DIR:=${CF_BASE_DIR:-/data/FeedTheBeast}}"
|
||||||
export FTB_BASE_DIR
|
export FTB_BASE_DIR
|
||||||
|
|
||||||
legacyJavaFixerUrl=https://ftb.forgecdn.net/FTB2/maven/net/minecraftforge/lex/legacyjavafixer/1.0/legacyjavafixer-1.0.jar
|
legacyJavaFixerUrl=https://ftb.forgecdn.net/FTB2/maven/net/minecraftforge/lex/legacyjavafixer/1.0/legacyjavafixer-1.0.jar
|
||||||
@@ -34,7 +35,7 @@ FTB_SERVER_MOD=${FTB_SERVER_MOD:-$CF_SERVER_MOD}
|
|||||||
log "Looking for Feed-The-Beast / CurseForge server modpack."
|
log "Looking for Feed-The-Beast / CurseForge server modpack."
|
||||||
requireVar FTB_SERVER_MOD
|
requireVar FTB_SERVER_MOD
|
||||||
|
|
||||||
if ! isTrue ${USE_MODPACK_START_SCRIPT:-true}; then
|
if ! isTrue "${USE_MODPACK_START_SCRIPT:-true}"; then
|
||||||
if ! [ -f "${FTB_SERVER_MOD}" ]; then
|
if ! [ -f "${FTB_SERVER_MOD}" ]; then
|
||||||
log "ERROR unable to find requested modpack file ${FTB_SERVER_MOD}"
|
log "ERROR unable to find requested modpack file ${FTB_SERVER_MOD}"
|
||||||
exit 2
|
exit 2
|
||||||
@@ -46,9 +47,9 @@ if ! isTrue ${USE_MODPACK_START_SCRIPT:-true}; then
|
|||||||
if [ "$(cat $installMarker)" != "${FTB_SERVER_MOD}" ]; then
|
if [ "$(cat $installMarker)" != "${FTB_SERVER_MOD}" ]; then
|
||||||
log "Upgrading modpack"
|
log "Upgrading modpack"
|
||||||
|
|
||||||
serverJar=$(find ${FTB_BASE_DIR} -not -name "forge*installer.jar" -name "forge*.jar")
|
serverJar=$(find "${FTB_BASE_DIR}" -not -name "forge*installer.jar" -name "forge*.jar")
|
||||||
if [[ "${serverJar}" ]]; then
|
if [[ "${serverJar}" ]]; then
|
||||||
rm -rf $(dirname "${serverJar}")/{mods,*.jar,libraries,resources,scripts,config}
|
rm -rf "$(dirname "${serverJar}")"/{mods,*.jar,libraries,resources,scripts,config}
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
needsInstall=false
|
needsInstall=false
|
||||||
@@ -57,10 +58,10 @@ if ! isTrue ${USE_MODPACK_START_SCRIPT:-true}; then
|
|||||||
|
|
||||||
if $needsInstall; then
|
if $needsInstall; then
|
||||||
log "Unpacking FTB server modpack ${FTB_SERVER_MOD} ..."
|
log "Unpacking FTB server modpack ${FTB_SERVER_MOD} ..."
|
||||||
mkdir -p ${FTB_BASE_DIR}
|
mkdir -p "${FTB_BASE_DIR}"
|
||||||
unzip -o "${FTB_SERVER_MOD}" -d ${FTB_BASE_DIR} | awk '{printf "."} END {print ""}'
|
unzip -o "${FTB_SERVER_MOD}" -d "${FTB_BASE_DIR}" | awk '{printf "."} END {print ""}'
|
||||||
|
|
||||||
serverJar=$(find ${FTB_BASE_DIR} -type f \( -path "*/libraries/*" -o -path "*/mods/*" \) -prune -o -name "forge*.jar" -not -name "forge*installer.jar" -print)
|
serverJar=$(find "${FTB_BASE_DIR}" -type f \( -path "*/libraries/*" -o -path "*/mods/*" \) -prune -o -name "forge*.jar" -not -name "forge*installer.jar" -print)
|
||||||
if [[ -z "$serverJar" ]]; then
|
if [[ -z "$serverJar" ]]; then
|
||||||
|
|
||||||
if [ -f "${FTB_BASE_DIR}/settings.cfg" ]; then
|
if [ -f "${FTB_BASE_DIR}/settings.cfg" ]; then
|
||||||
@@ -86,22 +87,24 @@ if ! isTrue ${USE_MODPACK_START_SCRIPT:-true}; then
|
|||||||
|
|
||||||
log "Installing forge server"
|
log "Installing forge server"
|
||||||
dirOfInstaller=$(dirname "${forgeInstallerJar}")
|
dirOfInstaller=$(dirname "${forgeInstallerJar}")
|
||||||
(cd "${dirOfInstaller}"; java -jar $(basename "${forgeInstallerJar}") --installServer)
|
(cd "${dirOfInstaller}"; java -jar "$(basename "${forgeInstallerJar}")" --installServer)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "${FTB_SERVER_MOD}" > $installMarker
|
echo "${FTB_SERVER_MOD}" > $installMarker
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export SERVER=$(find ${FTB_BASE_DIR} -type f \( -path "/libraries/*" -o -path "/mods/*" \) -prune -o -name "forge*.jar" -not -name "forge*installer.jar" -maxdepth 2 -print)
|
SERVER=$(find "${FTB_BASE_DIR}" -maxdepth 2 -type f \( -path "/libraries/*" -o -path "/mods/*" \) -prune -o -name "forge*.jar" -not -name "forge*installer.jar" -print)
|
||||||
if [[ -z "${SERVER}" || ! -f "${SERVER}" ]]; then
|
if [[ -z "${SERVER}" || ! -f "${SERVER}" ]]; then
|
||||||
log "ERROR unable to locate installed forge server jar"
|
log "ERROR unable to locate installed forge server jar"
|
||||||
isDebugging && find ${FTB_BASE_DIR} -name "forge*.jar"
|
isDebugging && find "${FTB_BASE_DIR}" -name "forge*.jar"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
export SERVER
|
||||||
|
|
||||||
export FTB_DIR=$(dirname "${SERVER}")
|
FTB_DIR=$(dirname "${SERVER}")
|
||||||
|
export FTB_DIR
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
exec "${SCRIPTS:-/}start-setupWorld" "$@"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
entryScriptExpr="
|
entryScriptExpr="
|
||||||
@@ -116,8 +119,8 @@ entryScriptExpr="
|
|||||||
"
|
"
|
||||||
|
|
||||||
if [[ -d ${FTB_BASE_DIR} ]]; then
|
if [[ -d ${FTB_BASE_DIR} ]]; then
|
||||||
startScriptCount=$(find ${FTB_BASE_DIR} $entryScriptExpr |wc -l)
|
startScriptCount=$(find "${FTB_BASE_DIR}" $entryScriptExpr |wc -l)
|
||||||
if [[ $startScriptCount > 1 ]]; then
|
if (( startScriptCount > 1 )); then
|
||||||
log "Conflicting FTB/CurseForge packages have been installed. Please cleanup ${FTB_BASE_DIR}"
|
log "Conflicting FTB/CurseForge packages have been installed. Please cleanup ${FTB_BASE_DIR}"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
@@ -131,22 +134,11 @@ fi
|
|||||||
if [[ $startScriptCount = 0 ]]; then
|
if [[ $startScriptCount = 0 ]]; then
|
||||||
srv_modpack=${FTB_SERVER_MOD}
|
srv_modpack=${FTB_SERVER_MOD}
|
||||||
if isURL "${srv_modpack}"; then
|
if isURL "${srv_modpack}"; then
|
||||||
case $srv_modpack in
|
log "Downloading modpack from ${srv_modpack}..."
|
||||||
https://www.feed-the-beast.com/*/download|https://www.curseforge.com/minecraft/modpacks/*/download/*/file)
|
if ! srv_modpack=$(get -o /data --output-filename --skip-existing "${srv_modpack}"); then
|
||||||
;;
|
log "ERROR: failed to download modpack"
|
||||||
https://www.curseforge.com/minecraft/modpacks/*/download/*)
|
exit 1
|
||||||
srv_modpack=${srv_modpack}/file;;
|
|
||||||
https://www.feed-the-beast.com/*)
|
|
||||||
srv_modpack=${srv_modpack}/download;;
|
|
||||||
esac
|
|
||||||
file=$(basename $(dirname $srv_modpack))
|
|
||||||
downloaded=/data/${file}.zip
|
|
||||||
if [ ! -e $downloaded ]; then
|
|
||||||
log "Downloading FTB modpack...
|
|
||||||
$srv_modpack -> $downloaded"
|
|
||||||
curl -sSL -o $downloaded $srv_modpack
|
|
||||||
fi
|
fi
|
||||||
srv_modpack=$downloaded
|
|
||||||
fi
|
fi
|
||||||
if [[ "${srv_modpack:0:5}" == "data/" ]]; then
|
if [[ "${srv_modpack:0:5}" == "data/" ]]; then
|
||||||
# Prepend with "/"
|
# Prepend with "/"
|
||||||
@@ -167,8 +159,8 @@ if [[ $startScriptCount = 0 ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
log "Unpacking FTB server modpack ${srv_modpack} ..."
|
log "Unpacking FTB server modpack ${srv_modpack} ..."
|
||||||
mkdir -p ${FTB_BASE_DIR}
|
mkdir -p "${FTB_BASE_DIR}"
|
||||||
unzip -o "${srv_modpack}" -d ${FTB_BASE_DIR} | awk '{printf "."} END {print ""}'
|
unzip -o "${srv_modpack}" -d "${FTB_BASE_DIR}" | awk '{printf "."} END {print ""}'
|
||||||
|
|
||||||
installScript=$(find "${FTB_BASE_DIR}" -maxdepth 2 -type f -name install.sh)
|
installScript=$(find "${FTB_BASE_DIR}" -maxdepth 2 -type f -name install.sh)
|
||||||
if [[ "$installScript" ]]; then
|
if [[ "$installScript" ]]; then
|
||||||
@@ -181,13 +173,14 @@ if [[ $startScriptCount = 0 ]]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $(find ${FTB_BASE_DIR} $entryScriptExpr | wc -l) = 0 ]]; then
|
if [[ $(find "${FTB_BASE_DIR}" $entryScriptExpr | wc -l) = 0 ]]; then
|
||||||
|
|
||||||
# Allow up to 2 levels since some modpacks have a top-level directory named
|
# Allow up to 2 levels since some modpacks have a top-level directory named
|
||||||
# for the modpack
|
# for the modpack
|
||||||
forgeJar=$(find ${FTB_BASE_DIR} -type f \( -path "/libraries/*" -o -path "/mods/*" \) -prune -o -name "forge*.jar" -not -name "forge*installer.jar" -maxdepth 2 -print)
|
forgeJar=$(find "${FTB_BASE_DIR}" -maxdepth 2 -type f \( -path "/libraries/*" -o -path "/mods/*" \) -prune -o -name "forge*.jar" -not -name "forge*installer.jar" -print)
|
||||||
if [[ "$forgeJar" ]]; then
|
if [[ "$forgeJar" ]]; then
|
||||||
export FTB_BASE_DIR=$(dirname "${forgeJar}")
|
FTB_BASE_DIR=$(dirname "${forgeJar}")
|
||||||
|
export FTB_BASE_DIR
|
||||||
log "No entry script found, so building one for ${forgeJar}"
|
log "No entry script found, so building one for ${forgeJar}"
|
||||||
cat > "${FTB_BASE_DIR}/ServerStart.sh" <<EOF
|
cat > "${FTB_BASE_DIR}/ServerStart.sh" <<EOF
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
@@ -205,25 +198,29 @@ scriptCount=$(find "${FTB_BASE_DIR}" $entryScriptExpr | wc -l)
|
|||||||
if [[ $scriptCount = 0 ]]; then
|
if [[ $scriptCount = 0 ]]; then
|
||||||
log "Please make sure you are using the server version of the FTB modpack!"
|
log "Please make sure you are using the server version of the FTB modpack!"
|
||||||
exit 2
|
exit 2
|
||||||
elif [[ $scriptCount > 1 ]]; then
|
elif (( scriptCount > 1 )); then
|
||||||
log "Ambigous startup scripts in FTB modpack!"
|
log "Ambiguous startup scripts in FTB modpack! Found:"
|
||||||
log "found:"
|
find "${FTB_BASE_DIR}" $entryScriptExpr
|
||||||
find ${FTB_BASE_DIR} $entryScriptExpr
|
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export FTB_SERVER_START=$(find "${FTB_BASE_DIR}" $entryScriptExpr)
|
FTB_SERVER_START=$(find "${FTB_BASE_DIR}" $entryScriptExpr)
|
||||||
|
export FTB_SERVER_START
|
||||||
|
|
||||||
export FTB_DIR=$(dirname "${FTB_SERVER_START}")
|
FTB_DIR=$(dirname "${FTB_SERVER_START}")
|
||||||
|
export FTB_DIR
|
||||||
chmod a+x "${FTB_SERVER_START}"
|
chmod a+x "${FTB_SERVER_START}"
|
||||||
grep fml.queryResult=confirm "${FTB_SERVER_START}" > /dev/null || \
|
grep fml.queryResult=confirm "${FTB_SERVER_START}" > /dev/null || \
|
||||||
sed -i 's/-jar/-Dfml.queryResult=confirm -jar/' "${FTB_SERVER_START}"
|
sed -i 's/-jar/-Dfml.queryResult=confirm -jar/' "${FTB_SERVER_START}"
|
||||||
sed -i 's/.*read.*Restart now/#\0/' "${FTB_SERVER_START}"
|
sed -i 's/.*read.*Restart now/#\0/' "${FTB_SERVER_START}"
|
||||||
legacyJavaFixerPath="${FTB_DIR}/mods/legacyjavafixer.jar"
|
legacyJavaFixerPath="${FTB_DIR}/mods/legacyjavafixer.jar"
|
||||||
|
|
||||||
if isTrue ${FTB_LEGACYJAVAFIXER} && [ ! -e "${legacyJavaFixerPath}" ]; then
|
if isTrue "${FTB_LEGACYJAVAFIXER}" && [ ! -e "${legacyJavaFixerPath}" ]; then
|
||||||
log "Installing legacy java fixer to ${legacyJavaFixerPath}"
|
log "Installing legacy java fixer to ${legacyJavaFixerPath}"
|
||||||
curl -sSL -o "${legacyJavaFixerPath}" ${legacyJavaFixerUrl}
|
if ! get -o "${legacyJavaFixerPath}" ${legacyJavaFixerUrl}; then
|
||||||
|
log "ERROR failed to download legacy java fixer from ${legacyJavaFixerUrl}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -e "${FTB_DIR}/FTBInstall.sh" ]; then
|
if [ -e "${FTB_DIR}/FTBInstall.sh" ]; then
|
||||||
@@ -236,5 +233,4 @@ elif [ -e "${FTB_DIR}/Install.sh" ]; then
|
|||||||
popd
|
popd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Continue to Final Setup
|
exec "${SCRIPTS:-/}start-setupWorld" "$@"
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
|
||||||
0
start-deployCanyon → scripts/start-deployCanyon
Normal file → Executable file
0
start-deployCanyon → scripts/start-deployCanyon
Normal file → Executable file
2
start-deployCatserver → scripts/start-deployCatserver
Normal file → Executable file
2
start-deployCatserver → scripts/start-deployCatserver
Normal file → Executable file
@@ -29,4 +29,4 @@ fi
|
|||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
# Continue to Final Setup
|
# Continue to Final Setup
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld "$@"
|
exec ${SCRIPTS:-/}start-setupWorld "$@"
|
||||||
60
scripts/start-deployCrucible
Executable file
60
scripts/start-deployCrucible
Executable file
@@ -0,0 +1,60 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# shellcheck source=start-utils
|
||||||
|
. "${SCRIPTS:-$(dirname "$0")}/start-utils"
|
||||||
|
set -o pipefail
|
||||||
|
set -e
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
requireVar VANILLA_VERSION
|
||||||
|
: "${CRUCIBLE_RELEASE:=latest}"
|
||||||
|
|
||||||
|
crucibleReleasesUrl=https://api.github.com/repos/CrucibleMC/Crucible/releases
|
||||||
|
if [[ ${CRUCIBLE_RELEASE^^} = LATEST ]]; then
|
||||||
|
crucibleReleaseUrl=${crucibleReleasesUrl}/latest
|
||||||
|
else
|
||||||
|
crucibleReleaseUrl=${crucibleReleasesUrl}/tags/${CRUCIBLE_RELEASE}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! downloadUrl=$(get --json-path "$.assets[?(@.name =~ /Crucible-${VANILLA_VERSION}-.*\.jar/)].browser_download_url" \
|
||||||
|
--accept "application/vnd.github.v3+json" "$crucibleReleaseUrl"); then
|
||||||
|
log "ERROR: failed to access ${CRUCIBLE_RELEASE} release of Crucible"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $downloadUrl = null ]]; then
|
||||||
|
log "ERROR: failed to locate Crucible jar for $VANILLA_VERSION from ${CRUCIBLE_RELEASE}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Downloading Crucible from $downloadUrl"
|
||||||
|
if ! SERVER=$(get --skip-existing --output-filename -o /data "$downloadUrl"); then
|
||||||
|
log "ERROR: failed to download Crucible jar from $downloadUrl"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
librariesDir=/data/libraries
|
||||||
|
if [ ! -d "$librariesDir" ]; then
|
||||||
|
if ! librariesUrl=$(get --json-path "$.assets[?(@.name == 'libraries.zip')].browser_download_url" \
|
||||||
|
--accept "application/vnd.github.v3+json" "$crucibleReleaseUrl"); then
|
||||||
|
log "ERROR: failed to access ${CRUCIBLE_RELEASE} release of Crucible for libraries"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Downloading Crucible libraries"
|
||||||
|
if ! get -o /tmp/libraries.zip "$librariesUrl"; then
|
||||||
|
log "ERROR: failed to download Crucible libraries from $librariesUrl"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! unzip /tmp/libraries.zip -d "$librariesDir"; then
|
||||||
|
log "ERROR: failed to unzip Crucible libraries"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
rm /tmp/libraries.zip
|
||||||
|
fi
|
||||||
|
|
||||||
|
export SERVER
|
||||||
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
exec "${SCRIPTS:-$(dirname "$0")}/start-setupWorld" "$@"
|
||||||
3
start-deployCustom → scripts/start-deployCustom
Normal file → Executable file
3
start-deployCustom → scripts/start-deployCustom
Normal file → Executable file
@@ -32,5 +32,4 @@ fi
|
|||||||
|
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
# Continue to Final Setup
|
exec ${SCRIPTS:-/}start-setupWorld $@
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
|
||||||
15
start-deployFTBA → scripts/start-deployFTBA
Normal file → Executable file
15
start-deployFTBA → scripts/start-deployFTBA
Normal file → Executable file
@@ -16,7 +16,7 @@ if ! [[ ${FTB_MODPACK_ID} =~ [0-9]+ ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! [[ -v FTB_MODPACK_VERSION_ID ]]; then
|
if [[ ! $FTB_MODPACK_VERSION_ID ]]; then
|
||||||
if ! FTB_MODPACK_VERSION_ID=$(curl -fsSL https://api.modpacks.ch/public/modpack/${FTB_MODPACK_ID} | jq -r '.versions | sort_by(.updated)[-1].id'); then
|
if ! FTB_MODPACK_VERSION_ID=$(curl -fsSL https://api.modpacks.ch/public/modpack/${FTB_MODPACK_ID} | jq -r '.versions | sort_by(.updated)[-1].id'); then
|
||||||
log "ERROR unable to resolve latest modpack version ID for modpack ${FTB_MODPACK_ID}"
|
log "ERROR unable to resolve latest modpack version ID for modpack ${FTB_MODPACK_ID}"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -30,7 +30,13 @@ if ! [ -f "${ftbInstallMarker}" ] || [ $(cat "${ftbInstallMarker}") != "${FTB_MO
|
|||||||
ftbInstaller=/data/ftb-installer
|
ftbInstaller=/data/ftb-installer
|
||||||
if ! [[ -f "${ftbInstaller}" ]]; then
|
if ! [[ -f "${ftbInstaller}" ]]; then
|
||||||
log "Downloading FTB installer"
|
log "Downloading FTB installer"
|
||||||
|
if [ "$(uname -m)" == "aarch64" ]; then
|
||||||
|
log "Downloading ARM installer"
|
||||||
|
curl -fsSL https://api.modpacks.ch/public/modpack/1/1/server/arm/linux -o "${ftbInstaller}"
|
||||||
|
else
|
||||||
|
log "Downloading x86 installer"
|
||||||
curl -fsSL https://api.modpacks.ch/public/modpack/1/1/server/linux -o "${ftbInstaller}"
|
curl -fsSL https://api.modpacks.ch/public/modpack/1/1/server/linux -o "${ftbInstaller}"
|
||||||
|
fi
|
||||||
chmod +x "${ftbInstaller}"
|
chmod +x "${ftbInstaller}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -52,12 +58,14 @@ fi
|
|||||||
|
|
||||||
isDebugging && cat version.json
|
isDebugging && cat version.json
|
||||||
forgeVersion=$(jq -r '.targets|unique[] | select(.name == "forge") | .version' version.json)
|
forgeVersion=$(jq -r '.targets|unique[] | select(.name == "forge") | .version' version.json)
|
||||||
|
fabricVersion=$(jq -r '.targets|unique[] | select(.name == "fabric") | .version' version.json)
|
||||||
mcVersion=$(jq -r '.targets|unique[] | select(.name == "minecraft") | .version' version.json)
|
mcVersion=$(jq -r '.targets|unique[] | select(.name == "minecraft") | .version' version.json)
|
||||||
|
|
||||||
variants=(
|
variants=(
|
||||||
forge-${mcVersion}-${forgeVersion}.jar
|
forge-${mcVersion}-${forgeVersion}.jar
|
||||||
forge-${mcVersion}-${forgeVersion}-universal.jar
|
forge-${mcVersion}-${forgeVersion}-universal.jar
|
||||||
forge-${mcVersion}-${forgeVersion}-${mcVersion}-universal.jar
|
forge-${mcVersion}-${forgeVersion}-${mcVersion}-universal.jar
|
||||||
|
fabric-${mcVersion}-${fabricVersion}-server-launch.jar
|
||||||
)
|
)
|
||||||
for f in ${variants[@]}; do
|
for f in ${variants[@]}; do
|
||||||
if [ -f $f ]; then
|
if [ -f $f ]; then
|
||||||
@@ -66,10 +74,9 @@ for f in ${variants[@]}; do
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
if ! [ -v SERVER ]; then
|
if ! [ -v SERVER ]; then
|
||||||
log "ERROR unable to locate the installed forge server jar"
|
log "ERROR unable to locate the installed FTB server jar"
|
||||||
ls *.jar
|
ls *.jar
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Continue to Final Setup
|
exec ${SCRIPTS:-/}start-setupWorld $@
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
|
||||||
72
scripts/start-deployFabric
Executable file
72
scripts/start-deployFabric
Executable file
@@ -0,0 +1,72 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# shellcheck source=start-utils
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
|
requireVar VANILLA_VERSION
|
||||||
|
export TYPE=FABRIC
|
||||||
|
export SERVER=fabric-server-${VANILLA_VERSION}.jar
|
||||||
|
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
if [[ ! -e ${SERVER} ]]; then
|
||||||
|
|
||||||
|
: ${FABRIC_INSTALLER:=}
|
||||||
|
: ${FABRIC_INSTALLER_URL:=}
|
||||||
|
: ${FABRIC_LOADER_VERSION:=LATEST}
|
||||||
|
: ${FABRIC_INSTALLER_VERSION:=${FABRICVERSION:-LATEST}}
|
||||||
|
|
||||||
|
if [[ -z $FABRIC_INSTALLER && -z $FABRIC_INSTALLER_URL ]]; then
|
||||||
|
log "Checking Fabric version information."
|
||||||
|
if [[ ${FABRIC_INSTALLER_VERSION^^} = LATEST ]]; then
|
||||||
|
FABRIC_INSTALLER_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml)
|
||||||
|
fi
|
||||||
|
|
||||||
|
FABRIC_INSTALLER="fabric-installer-${FABRIC_INSTALLER_VERSION}.jar"
|
||||||
|
FABRIC_INSTALLER_URL="https://maven.fabricmc.net/net/fabricmc/fabric-installer/${FABRIC_INSTALLER_VERSION}/fabric-installer-${FABRIC_INSTALLER_VERSION}.jar"
|
||||||
|
elif [[ -z $FABRIC_INSTALLER ]]; then
|
||||||
|
FABRIC_INSTALLER="fabric-installer.jar"
|
||||||
|
elif [[ ! -e $FABRIC_INSTALLER ]]; then
|
||||||
|
log "ERROR: the given Fabric installer doesn't exist : $FABRIC_INSTALLER"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z $FABRIC_LOADER_VERSION || ${FABRIC_LOADER_VERSION^^} = LATEST ]]; then
|
||||||
|
log "Checking Fabric Loader version information."
|
||||||
|
|
||||||
|
FABRIC_LOADER_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-loader/maven-metadata.xml)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -e $FABRIC_INSTALLER ]]; then
|
||||||
|
log "Downloading $FABRIC_INSTALLER_URL ..."
|
||||||
|
if ! get -o "$FABRIC_INSTALLER" "$FABRIC_INSTALLER_URL"; then
|
||||||
|
log "Failed to download from given location $FABRIC_INSTALLER_URL"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Installing Fabric ${VANILLA_VERSION} using $FABRIC_INSTALLER with loader version $FABRIC_LOADER_VERSION"
|
||||||
|
|
||||||
|
tries=3
|
||||||
|
set +e
|
||||||
|
while ((--tries >= 0)); do
|
||||||
|
java -jar $FABRIC_INSTALLER server \
|
||||||
|
-mcversion $VANILLA_VERSION \
|
||||||
|
-loader $FABRIC_LOADER_VERSION \
|
||||||
|
-downloadMinecraft \
|
||||||
|
-dir /data
|
||||||
|
if [[ $? == 0 ]]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
set -e
|
||||||
|
if (($tries < 0)); then
|
||||||
|
log "Fabric failed to install after several tries." >&2
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv fabric-server-launch.jar "${SERVER}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-setupWorld "$@"
|
||||||
150
scripts/start-deployForge
Executable file
150
scripts/start-deployForge
Executable file
@@ -0,0 +1,150 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
: "${FORGEVERSION:=RECOMMENDED}"
|
||||||
|
|
||||||
|
# shellcheck source=start-utils
|
||||||
|
. "${SCRIPTS:-$(dirname "$0")}/start-utils"
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
get_installer() {
|
||||||
|
if [[ -z $FORGE_INSTALLER_URL ]]; then
|
||||||
|
log "Downloading $normForgeVersion"
|
||||||
|
|
||||||
|
forgeFileNames="
|
||||||
|
$normForgeVersion/forge-$normForgeVersion-installer.jar
|
||||||
|
$shortForgeVersion/forge-$shortForgeVersion-installer.jar
|
||||||
|
"
|
||||||
|
|
||||||
|
for fn in $forgeFileNames; do
|
||||||
|
downloadUrl=https://maven.minecraftforge.net/net/minecraftforge/forge/$fn
|
||||||
|
log "...trying $downloadUrl"
|
||||||
|
if get -o "$FORGE_INSTALLER" "$downloadUrl"; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
log "Unable to locate usable URL for $normForgeVersion"
|
||||||
|
exit 2
|
||||||
|
else
|
||||||
|
log "Downloading $FORGE_INSTALLER_URL ..."
|
||||||
|
if ! get -o "$FORGE_INSTALLER" "$FORGE_INSTALLER_URL"; then
|
||||||
|
log "Failed to download from given location $FORGE_INSTALLER_URL"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
install() {
|
||||||
|
if [ ! -e "$FORGE_INSTALLER" ]; then
|
||||||
|
get_installer "$normForgeVersion" "$shortForgeVersion"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Installing Forge $shortForgeVersion using $FORGE_INSTALLER"
|
||||||
|
mkdir -p mods
|
||||||
|
tries=3
|
||||||
|
while ((--tries >= 0)); do
|
||||||
|
if java -jar "$FORGE_INSTALLER" --installServer; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if ((tries < 0)); then
|
||||||
|
log "Forge failed to install after several tries." >&2
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
# NOTE $shortForgeVersion will be empty if installer location was given to us
|
||||||
|
log "Finding installed server jar..."
|
||||||
|
unset -v latest
|
||||||
|
# 1.17+ ?
|
||||||
|
if [ -f /data/run.sh ]; then
|
||||||
|
latest=/data/run.sh
|
||||||
|
# else pre 1.17
|
||||||
|
else
|
||||||
|
for file in *forge*.jar; do
|
||||||
|
if ! [[ $file =~ installer ]]; then
|
||||||
|
if [[ -z $latest ]] || [[ $file -nt $latest ]]; then
|
||||||
|
latest=$file
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if [[ -z $latest ]]; then
|
||||||
|
log "Unable to derive server jar for Forge"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
export SERVER=$latest
|
||||||
|
log "Using server $SERVER"
|
||||||
|
debug "Writing install marker at $installMarker"
|
||||||
|
echo "$SERVER" > "$installMarker"
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve_versions() {
|
||||||
|
if [[ -z $FORGE_INSTALLER && -z $FORGE_INSTALLER_URL ]]; then
|
||||||
|
norm=$VANILLA_VERSION
|
||||||
|
|
||||||
|
case $VANILLA_VERSION in
|
||||||
|
*.*.*)
|
||||||
|
norm=$VANILLA_VERSION ;;
|
||||||
|
*.*)
|
||||||
|
norm=${VANILLA_VERSION}.0 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
#################################################################################
|
||||||
|
promosUrl=http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json
|
||||||
|
|
||||||
|
log "Checking Forge version information."
|
||||||
|
case $FORGEVERSION in
|
||||||
|
LATEST)
|
||||||
|
if ! FORGE_VERSION=$(get --json-path ".promos['$VANILLA_VERSION-latest']" "$promosUrl"); then
|
||||||
|
log "ERROR: Version $VANILLA_VERSION is not supported by Forge"
|
||||||
|
log " Refer to http://files.minecraftforge.net/ for supported versions"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
RECOMMENDED)
|
||||||
|
if ! FORGE_VERSION=$(get --json-path ".promos['$VANILLA_VERSION-recommended']" "$promosUrl"); then
|
||||||
|
if ! FORGE_VERSION=$(get --json-path ".promos['$VANILLA_VERSION-latest']" "$promosUrl"); then
|
||||||
|
log "ERROR: Version $VANILLA_VERSION is not supported by Forge"
|
||||||
|
log " 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
|
||||||
|
log "ERROR: the given Forge installer doesn't exist : $FORGE_INSTALLER"
|
||||||
|
exit 2
|
||||||
|
else
|
||||||
|
shortForgeVersion=$VANILLA_VERSION-${FORGE_INSTALLER_CUSTOM_VERSION:-custom}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
### main
|
||||||
|
|
||||||
|
resolve_versions
|
||||||
|
|
||||||
|
installMarker="/data/.forge-installed-$shortForgeVersion"
|
||||||
|
|
||||||
|
if [ ! -e "$installMarker" ] || isTrue "${FORCE_REINSTALL:-false}"; then
|
||||||
|
install
|
||||||
|
else
|
||||||
|
SERVER=$(cat "$installMarker")
|
||||||
|
export SERVER
|
||||||
|
if [ ! -e "$SERVER" ]; then
|
||||||
|
rm "$installMarker"
|
||||||
|
install
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec "${SCRIPTS:-/}start-setupWorld" "$@"
|
||||||
63
scripts/start-deployLimbo
Executable file
63
scripts/start-deployLimbo
Executable file
@@ -0,0 +1,63 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
: ${LIMBO_BUILD:=LATEST}
|
||||||
|
: ${FORCE_REDOWNLOAD:=false}
|
||||||
|
: ${LIMBO_SCHEMA_FILENAME:=default.schem}
|
||||||
|
: ${LEVEL:=Default;${LIMBO_SCHEMA_FILENAME}}
|
||||||
|
# defaults to localhost, if this is not set
|
||||||
|
: ${SERVER_IP:=0.0.0.0}
|
||||||
|
|
||||||
|
export LEVEL SERVER_IP
|
||||||
|
|
||||||
|
if [[ ${LIMBO_BUILD^^} == LATEST ]]; then
|
||||||
|
LIMBO_BUILD=lastStableBuild
|
||||||
|
fi
|
||||||
|
|
||||||
|
baseUrl="https://ci.loohpjames.com/job/Limbo/${LIMBO_BUILD}"
|
||||||
|
buildInfoUrl="${baseUrl}/api/json"
|
||||||
|
buildJson=$(curl -fsSL "${buildInfoUrl}")
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
log "ERROR failed to get build info from ${buildInfoUrl} (status=$?)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ${LIMBO_BUILD} = lastStableBuild ]]; then
|
||||||
|
LIMBO_BUILD=$(jq -r '.number' <<<${buildJson})
|
||||||
|
log "Resolved latest Limbo build to ${LIMBO_BUILD}"
|
||||||
|
fi
|
||||||
|
artifactPath=$(jq -r '.artifacts[] | select(.fileName|test("^Limbo-")) | .relativePath' <<<${buildJson})
|
||||||
|
defaultSchemaPath=$(jq -r '.artifacts[] | select(.fileName|test(".*\\.schem")) | .relativePath' <<<${buildJson})
|
||||||
|
|
||||||
|
export SERVER="limbo-${LIMBO_BUILD}.jar"
|
||||||
|
|
||||||
|
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
||||||
|
downloadUrl="${baseUrl}/artifact/${artifactPath}"
|
||||||
|
log "Downloading Limbo from $downloadUrl ..."
|
||||||
|
if ! curl -fsSL -o "$SERVER" "$downloadUrl"; then
|
||||||
|
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "${LIMBO_SCHEMA_FILENAME}" ]; then
|
||||||
|
log "Downloading default schem file"
|
||||||
|
if ! curl -o "${LIMBO_SCHEMA_FILENAME}" -fsSL "${baseUrl}/artifact/${defaultSchemaPath}"; then
|
||||||
|
log "ERROR: failed to download schema file $baseUrl (status=$?)"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ${LEVEL} != *\;* ]]; then
|
||||||
|
LEVEL="${LEVEL};${LIMBO_SCHEMA_FILENAME}"
|
||||||
|
fi
|
||||||
|
export LEVEL
|
||||||
|
|
||||||
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-setupWorld $@
|
||||||
92
scripts/start-deployMagma
Executable file
92
scripts/start-deployMagma
Executable file
@@ -0,0 +1,92 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
: ${VANILLA_VERSION?}
|
||||||
|
# stable, dev
|
||||||
|
: ${MAGMA_CHANNEL:=stable}
|
||||||
|
|
||||||
|
|
||||||
|
magmaDownloadServer() {
|
||||||
|
url=${1?}
|
||||||
|
tagName=${2?}
|
||||||
|
markerFile=${3?}
|
||||||
|
|
||||||
|
export SERVER="/data/magma-server-${VANILLA_VERSION}.jar"
|
||||||
|
|
||||||
|
log "Downloading Magma server file for ${VANILLA_VERSION} @ ${tagName}"
|
||||||
|
if ! curl -o /data/magma-server-${VANILLA_VERSION}.jar -fsSL "$url"; then
|
||||||
|
log "ERROR failed to download Magma server from $url (status=$?)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "$SERVER" > "$markerFile"
|
||||||
|
}
|
||||||
|
|
||||||
|
magmaHandleInstaller() {
|
||||||
|
url=${1?}
|
||||||
|
tagName=${2?}
|
||||||
|
markerFile=${3?}
|
||||||
|
|
||||||
|
installerFile="magma-installer-${VANILLA_VERSION}-${tagName}.jar"
|
||||||
|
log "Downloading Magma installer file for ${VANILLA_VERSION} @ ${tagName}"
|
||||||
|
if ! curl -o "$installerFile" -fsSL "$url"; then
|
||||||
|
log "ERROR failed to download Magma installer from $url (status=$?)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "forge" > "$markerFile"
|
||||||
|
|
||||||
|
export FORGE_INSTALLER="$installerFile"
|
||||||
|
export FORGE_INSTALLER_CUSTOM_VERSION="$tagName"
|
||||||
|
|
||||||
|
# now hand off the rest to forge
|
||||||
|
exec ${SCRIPTS:-/}start-deployForge "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
latestMeta=$(curl -fsSL https://api.magmafoundation.org/api/resources/Magma/${VANILLA_VERSION}/${MAGMA_CHANNEL}/latest || exit $?)
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
log "ERROR failed to locate latest Magma info for ${VANILLA_VERSION} in channel ${MAGMA_CHANNEL} (error=$?)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
tagName=$(echo "${latestMeta}" | jq -r '.tag_name')
|
||||||
|
markerFile=".magma-installed-${VANILLA_VERSION}-${tagName}"
|
||||||
|
if [ -f "${markerFile}" ]; then
|
||||||
|
installedTagName=$(cat "${markerFile}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "${markerFile}" ]; then
|
||||||
|
|
||||||
|
if versionLessThan 1.16; then
|
||||||
|
assetType=server
|
||||||
|
else
|
||||||
|
assetType=installer
|
||||||
|
fi
|
||||||
|
|
||||||
|
assetUrl=$(echo "${latestMeta}" | jq -r ".assets | .[].browser_download_url | select(test(\"${assetType}\"))")
|
||||||
|
if [ $? != 0 ] || [ -z "$assetUrl" ]; then
|
||||||
|
log "ERROR failed to extract ${assetType} asset type for ${VANILLA_VERSION} in channel ${MAGMA_CHANNEL}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ${assetType} = server ]]; then
|
||||||
|
magmaDownloadServer "$assetUrl" "$tagName" "$markerFile"
|
||||||
|
else
|
||||||
|
magmaHandleInstaller "$assetUrl" "$tagName" "$markerFile"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
export SERVER=$(cat "${markerFile}")
|
||||||
|
|
||||||
|
if [[ $SERVER == "forge" ]]; then
|
||||||
|
export FORGE_INSTALLER="magma-installer-${VANILLA_VERSION}-${tagName}.jar"
|
||||||
|
export FORGE_INSTALLER_CUSTOM_VERSION="$tagName"
|
||||||
|
# now hand off the rest to forge
|
||||||
|
exec ${SCRIPTS:-/}start-deployForge "$@"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-setupWorld $@
|
||||||
17
start-deployMohist → scripts/start-deployMohist
Normal file → Executable file
17
start-deployMohist → scripts/start-deployMohist
Normal file → Executable file
@@ -1,17 +1,18 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
# shellcheck source=start-utils
|
||||||
|
. "${SCRIPTS:-$(dirname "$0")}/start-utils"
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
set -e
|
set -e
|
||||||
isDebugging && set -x
|
isDebugging && set -x
|
||||||
|
|
||||||
requireVar VANILLA_VERSION
|
requireVar VANILLA_VERSION
|
||||||
: ${MOHIST_BUILD:=lastSuccessfulBuild}
|
: "${MOHIST_BUILD:=lastSuccessfulBuild}"
|
||||||
|
|
||||||
mohistJobs=https://ci.codemc.io/job/MohistMC/job/
|
mohistJobs=https://ci.codemc.io/job/MohistMC/job/
|
||||||
mohistJob=${mohistJobs}Mohist-${VANILLA_VERSION}/
|
mohistJob=${mohistJobs}Mohist-${VANILLA_VERSION}/
|
||||||
|
|
||||||
if ! curl -X HEAD -o /dev/null -fsSL "${mohistJob}"; then
|
if ! get --exists "${mohistJob}"; then
|
||||||
log "ERROR: mohist builds do not exist for ${VANILLA_VERSION}"
|
log "ERROR: mohist builds do not exist for ${VANILLA_VERSION}"
|
||||||
log " check https://ci.codemc.io/job/MohistMC/ for available versions"
|
log " check https://ci.codemc.io/job/MohistMC/ for available versions"
|
||||||
log " and set VERSION accordingly"
|
log " and set VERSION accordingly"
|
||||||
@@ -19,8 +20,7 @@ if ! curl -X HEAD -o /dev/null -fsSL "${mohistJob}"; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
buildRelPath=$(
|
buildRelPath=$(
|
||||||
curl -fsSL "${mohistJob}${MOHIST_BUILD}/api/json" |
|
get --json-path '$.artifacts[0].relativePath' "${mohistJob}${MOHIST_BUILD}/api/json"
|
||||||
jq -r '.artifacts[0].relativePath'
|
|
||||||
)
|
)
|
||||||
|
|
||||||
baseName=$(basename "${buildRelPath}")
|
baseName=$(basename "${buildRelPath}")
|
||||||
@@ -33,12 +33,11 @@ fi
|
|||||||
|
|
||||||
export SERVER="/data/${baseName}"
|
export SERVER="/data/${baseName}"
|
||||||
|
|
||||||
if [ ! -f ${SERVER} ]; then
|
if [ ! -f "${SERVER}" ]; then
|
||||||
log "Downloading ${baseName}"
|
log "Downloading ${baseName}"
|
||||||
curl -o "${SERVER}" -fsSL "${mohistJob}${MOHIST_BUILD}/artifact/${buildRelPath}"
|
get -o "${SERVER}" "${mohistJob}${MOHIST_BUILD}/artifact/${buildRelPath}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
# Continue to Final Setup
|
exec "${SCRIPTS:-$(dirname "$0")}/start-setupWorld" "$@"
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld "$@"
|
|
||||||
0
start-deployPaper → scripts/start-deployPaper
Normal file → Executable file
0
start-deployPaper → scripts/start-deployPaper
Normal file → Executable file
@@ -10,7 +10,7 @@ isDebugging && set -x
|
|||||||
: ${FORCE_REDOWNLOAD:=false}
|
: ${FORCE_REDOWNLOAD:=false}
|
||||||
|
|
||||||
if [[ ${PURPUR_BUILD} == LATEST ]]; then
|
if [[ ${PURPUR_BUILD} == LATEST ]]; then
|
||||||
PURPUR_BUILD=$(curl -fsSL "https://purpur.pl3x.net/api/v1/purpur/${VANILLA_VERSION}" |
|
PURPUR_BUILD=$(curl -fsSL "https://api.pl3x.net/v2/purpur/${VANILLA_VERSION}" |
|
||||||
jq -r '.builds.latest' || echo "")
|
jq -r '.builds.latest' || echo "")
|
||||||
if [[ -z ${PURPUR_BUILD} ]]; then
|
if [[ -z ${PURPUR_BUILD} ]]; then
|
||||||
log "ERROR: Failed to locate a Purpur build for ${VANILLA_VERSION}."
|
log "ERROR: Failed to locate a Purpur build for ${VANILLA_VERSION}."
|
||||||
@@ -22,7 +22,7 @@ fi
|
|||||||
export SERVER="purpur-${VANILLA_VERSION}-${PURPUR_BUILD}.jar"
|
export SERVER="purpur-${VANILLA_VERSION}-${PURPUR_BUILD}.jar"
|
||||||
|
|
||||||
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
||||||
downloadUrl="https://purpur.pl3x.net/api/v1/purpur/${VANILLA_VERSION}/${PURPUR_BUILD}/download"
|
downloadUrl="https://api.pl3x.net/v2/purpur/${VANILLA_VERSION}/${PURPUR_BUILD}/download"
|
||||||
log "Downloading Purpur from $downloadUrl ..."
|
log "Downloading Purpur from $downloadUrl ..."
|
||||||
if ! curl -fsSL -o "$SERVER" "$downloadUrl"; then
|
if ! curl -fsSL -o "$SERVER" "$downloadUrl"; then
|
||||||
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
||||||
3
start-deploySpongeVanilla → scripts/start-deploySpongeVanilla
Normal file → Executable file
3
start-deploySpongeVanilla → scripts/start-deploySpongeVanilla
Normal file → Executable file
@@ -37,5 +37,4 @@ if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
|||||||
curl -sSL -o $SERVER https://repo.spongepowered.org/maven/org/spongepowered/$TYPE/$SPONGEVERSION/$SERVER
|
curl -sSL -o $SERVER https://repo.spongepowered.org/maven/org/spongepowered/$TYPE/$SPONGEVERSION/$SERVER
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Continue to Final Setup
|
exec ${SCRIPTS:-/}start-setupWorld $@
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
|
||||||
56
scripts/start-deployVanilla
Executable file
56
scripts/start-deployVanilla
Executable file
@@ -0,0 +1,56 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# shellcheck source=start-utils
|
||||||
|
. "${SCRIPTS:-/}start-utils"
|
||||||
|
isDebugging && set -x
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
export SERVER="minecraft_server.${VANILLA_VERSION// /_}.jar"
|
||||||
|
|
||||||
|
if [ ! -e "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
||||||
|
log "Downloading $SERVER ..."
|
||||||
|
debug "Finding version manifest for $VANILLA_VERSION"
|
||||||
|
versionManifestUrl=$(get 'https://launchermeta.mojang.com/mc/game/version_manifest.json' | jq --arg VANILLA_VERSION "$VANILLA_VERSION" --raw-output '[.versions[]|select(.id == $VANILLA_VERSION)][0].url')
|
||||||
|
result=$?
|
||||||
|
if [ $result != 0 ]; then
|
||||||
|
log "ERROR failed to obtain version manifest URL ($result)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ "$versionManifestUrl" = "null" ]; then
|
||||||
|
log "ERROR couldn't find a matching manifest entry for $VANILLA_VERSION"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
debug "Found version manifest at $versionManifestUrl"
|
||||||
|
|
||||||
|
serverDownloadUrl=$(get --json-path '$.downloads.server.url' "${versionManifestUrl}")
|
||||||
|
result=$?
|
||||||
|
if [ $result != 0 ]; then
|
||||||
|
log "ERROR failed to obtain version manifest from $versionManifestUrl ($result)"
|
||||||
|
exit 1
|
||||||
|
elif [ "$serverDownloadUrl" = "null" ]; then
|
||||||
|
log "ERROR version $VANILLA_VERSION does not provide a server download"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
debug "Downloading server from $serverDownloadUrl"
|
||||||
|
get -o "$SERVER" "$serverDownloadUrl"
|
||||||
|
result=$?
|
||||||
|
if [ $result != 0 ]; then
|
||||||
|
log "ERROR failed to download server from $serverDownloadUrl ($result)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if versionLessThan 1.6; then
|
||||||
|
if ! [[ -L /data/minecraft_server.jar && /data/minecraft_server.jar -ef "/data/$SERVER" ]]; then
|
||||||
|
rm -f /data/minecraft_server.jar
|
||||||
|
ln -s "/data/$SERVER" /data/minecraft_server.jar
|
||||||
|
fi
|
||||||
|
SERVER=minecraft_server.jar
|
||||||
|
elif [[ -L /data/minecraft_server.jar ]]; then
|
||||||
|
rm -f /data/minecraft_server.jar
|
||||||
|
fi
|
||||||
|
|
||||||
|
isDebugging && ls -l
|
||||||
|
|
||||||
|
exec "${SCRIPTS:-/}start-setupWorld" "$@"
|
||||||
66
start-minecraftFinalSetup → scripts/start-finalExec
Normal file → Executable file
66
start-minecraftFinalSetup → scripts/start-finalExec
Normal file → Executable file
@@ -70,8 +70,8 @@ if [[ ${GUI} = false || ${GUI} = FALSE ]]; then
|
|||||||
EXTRA_ARGS+=" nogui"
|
EXTRA_ARGS+=" nogui"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# put these prior JVM_OPTS at the end to give any memory settings there higher precedence
|
: "${INIT_MEMORY:=${MEMORY}}"
|
||||||
log "Setting initial memory to ${INIT_MEMORY:=${MEMORY}} and max to ${MAX_MEMORY:=${MEMORY}}"
|
: "${MAX_MEMORY:=${MEMORY}}"
|
||||||
|
|
||||||
expandedDOpts=
|
expandedDOpts=
|
||||||
if [ -n "$JVM_DD_OPTS" ]; then
|
if [ -n "$JVM_DD_OPTS" ]; then
|
||||||
@@ -157,7 +157,15 @@ if isTrue "${DEBUG_MEMORY}"; then
|
|||||||
free -m
|
free -m
|
||||||
fi
|
fi
|
||||||
|
|
||||||
JVM_OPTS="-Xms${INIT_MEMORY} -Xmx${MAX_MEMORY} ${JVM_OPTS}"
|
if [[ ${INIT_MEMORY} || ${MAX_MEMORY} ]]; then
|
||||||
|
log "Setting initial memory to ${INIT_MEMORY:=${MEMORY}} and max to ${MAX_MEMORY:=${MEMORY}}"
|
||||||
|
if [[ ${INIT_MEMORY} ]]; then
|
||||||
|
JVM_OPTS="-Xms${INIT_MEMORY} ${JVM_OPTS}"
|
||||||
|
fi
|
||||||
|
if [[ ${MAX_MEMORY} ]]; then
|
||||||
|
JVM_OPTS="-Xmx${MAX_MEMORY} ${JVM_OPTS}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
function copyFilesForCurseForge() {
|
function copyFilesForCurseForge() {
|
||||||
# copy player modification files unconditionally since their
|
# copy player modification files unconditionally since their
|
||||||
@@ -172,48 +180,46 @@ function copyFilesForCurseForge() {
|
|||||||
cp -f /data/eula.txt "${FTB_DIR}/"
|
cp -f /data/eula.txt "${FTB_DIR}/"
|
||||||
}
|
}
|
||||||
|
|
||||||
mcServerRunnerArgs="--stop-duration ${STOP_DURATION:-60}s"
|
mcServerRunnerArgs=(
|
||||||
if [[ ${TYPE} == "CURSE_INSTANCE" ]]; then
|
--stop-duration "${STOP_DURATION:-60}s"
|
||||||
if isTrue ${DEBUG_EXEC}; then
|
--named-pipe "${CONSOLE_IN_NAMED_PIPE:-/tmp/minecraft-console-in}"
|
||||||
set -x
|
)
|
||||||
|
if [[ ${STOP_SERVER_ANNOUNCE_DELAY} ]]; then
|
||||||
|
mcServerRunnerArgs+=(--stop-server-announce-delay "${STOP_SERVER_ANNOUNCE_DELAY}s")
|
||||||
fi
|
fi
|
||||||
exec mc-server-runner ${mcServerRunnerArgs} \
|
|
||||||
--cf-instance-file "${CURSE_INSTANCE_JSON}" \
|
if [[ ${TYPE} == "CURSEFORGE" && "${SERVER}" ]]; then
|
||||||
java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar _SERVERJAR_ "$@" $EXTRA_ARGS
|
|
||||||
elif [[ ${TYPE} == "CURSEFORGE" && "${SERVER}" ]]; then
|
|
||||||
copyFilesForCurseForge
|
copyFilesForCurseForge
|
||||||
|
|
||||||
cd "${FTB_DIR}"
|
cd "${FTB_DIR}" || (log "ERROR: can't go into ${FTB_DIR}"; exit 1)
|
||||||
log "Starting CurseForge server in ${FTB_DIR}..."
|
log "Starting CurseForge server in ${FTB_DIR}..."
|
||||||
if isTrue ${DEBUG_EXEC}; then
|
if isTrue ${DEBUG_EXEC}; then
|
||||||
set -x
|
set -x
|
||||||
fi
|
fi
|
||||||
exec mc-server-runner ${bootstrapArgs} ${mcServerRunnerArgs} java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar $(basename "${SERVER}") "$@" $EXTRA_ARGS
|
exec mc-server-runner ${bootstrapArgs} "${mcServerRunnerArgs[@]}" java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar $(basename "${SERVER}") "$@" $EXTRA_ARGS
|
||||||
elif [[ ${TYPE} == "CURSEFORGE" ]]; then
|
elif [[ ${TYPE} == "CURSEFORGE" ]]; then
|
||||||
mcServerRunnerArgs="${mcServerRunnerArgs} --shell bash"
|
mcServerRunnerArgs+=(--shell bash)
|
||||||
|
|
||||||
copyFilesForCurseForge
|
copyFilesForCurseForge
|
||||||
|
|
||||||
cat > "${FTB_DIR}/settings-local.sh" <<EOF
|
cat > "${FTB_DIR}/settings-local.sh" <<EOF
|
||||||
export MIN_RAM="${INIT_MEMORY}"
|
export MIN_RAM="${INIT_MEMORY}"
|
||||||
export MAX_RAM="${MAX_MEMORY}"
|
export MAX_RAM="${MAX_MEMORY}"
|
||||||
export JAVA_PARAMETERS="${JVM_XX_OPTS} -Xms${INIT_MEMORY} ${JVM_OPTS} $expandedDOpts"
|
export JAVA_PARAMETERS="${JVM_XX_OPTS} ${JVM_OPTS} $expandedDOpts"
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# patch CurseForge cfg file, if present
|
# patch CurseForge cfg file, if present
|
||||||
if [ -f "${FTB_DIR}/settings.cfg" ]; then
|
if [ -f "${FTB_DIR}/settings.cfg" ] && [[ ${MAX_MEMORY} ]]; then
|
||||||
sed -i "s/MAX_RAM=[^;]*/MAX_RAM=${MAX_MEMORY}/" "${FTB_DIR}/settings.cfg"
|
sed -i "s/MAX_RAM=[^;]*/MAX_RAM=${MAX_MEMORY}/" "${FTB_DIR}/settings.cfg"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd "${FTB_DIR}"
|
cd "${FTB_DIR}" || (log "ERROR: can't go into ${FTB_DIR}"; exit 1)
|
||||||
log "Running FTB ${FTB_SERVER_START} in ${FTB_DIR} ..."
|
log "Running FTB ${FTB_SERVER_START} in ${FTB_DIR} ..."
|
||||||
|
|
||||||
finalArgs=(
|
finalArgs="${FTB_SERVER_START}"
|
||||||
"${FTB_SERVER_START}"
|
|
||||||
)
|
|
||||||
|
|
||||||
if isTrue ${SETUP_ONLY:=false}; then
|
if isTrue "${SETUP_ONLY:=false}"; then
|
||||||
echo "SETUP_ONLY: ${finalArgs[@]}"
|
echo "SETUP_ONLY: ${finalArgs}"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -223,8 +229,12 @@ EOF
|
|||||||
if isTrue ${EXEC_DIRECTLY:-false}; then
|
if isTrue ${EXEC_DIRECTLY:-false}; then
|
||||||
"${finalArgs[@]}"
|
"${finalArgs[@]}"
|
||||||
else
|
else
|
||||||
exec mc-server-runner ${mcServerRunnerArgs} "${finalArgs[@]}"
|
exec mc-server-runner "${mcServerRunnerArgs[@]}" "${finalArgs[@]}"
|
||||||
fi
|
fi
|
||||||
|
elif [[ -x run.sh ]]; then
|
||||||
|
log "Using Forge supplied run.sh script..."
|
||||||
|
echo $JVM_XX_OPTS $JVM_OPTS $expandedDOpts > user_jvm_args.txt
|
||||||
|
exec mc-server-runner "${mcServerRunnerArgs[@]}" --shell bash run.sh
|
||||||
else
|
else
|
||||||
# If we have a bootstrap.txt file... feed that in to the server stdin
|
# If we have a bootstrap.txt file... feed that in to the server stdin
|
||||||
if [ -f /data/bootstrap.txt ]; then
|
if [ -f /data/bootstrap.txt ]; then
|
||||||
@@ -237,23 +247,23 @@ else
|
|||||||
$JVM_XX_OPTS
|
$JVM_XX_OPTS
|
||||||
$JVM_OPTS
|
$JVM_OPTS
|
||||||
$expandedDOpts
|
$expandedDOpts
|
||||||
-jar $SERVER
|
-jar "$SERVER"
|
||||||
"$@" $EXTRA_ARGS
|
"$@" $EXTRA_ARGS
|
||||||
)
|
)
|
||||||
|
|
||||||
if isTrue ${SETUP_ONLY:=false}; then
|
if isTrue ${SETUP_ONLY:=false}; then
|
||||||
echo "SETUP_ONLY: java ${finalArgs[@]}"
|
echo "SETUP_ONLY: java ${finalArgs[*]}"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if isTrue ${DEBUG_EXEC}; then
|
if isTrue "${DEBUG_EXEC}"; then
|
||||||
set -x
|
set -x
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if isTrue ${EXEC_DIRECTLY:-false}; then
|
if isTrue "${EXEC_DIRECTLY:-false}"; then
|
||||||
exec java "${finalArgs[@]}"
|
exec java "${finalArgs[@]}"
|
||||||
else
|
else
|
||||||
exec mc-server-runner ${bootstrapArgs} ${mcServerRunnerArgs} java "${finalArgs[@]}"
|
exec mc-server-runner ${bootstrapArgs} "${mcServerRunnerArgs[@]}" java "${finalArgs[@]}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
35
scripts/start-setupEnvVariables
Executable file
35
scripts/start-setupEnvVariables
Executable file
@@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# shellcheck source=start-utils
|
||||||
|
. "${SCRIPTS:-/}start-utils"
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
: "${REPLACE_ENV_IN_PLACE:=${REPLACE_ENV_VARIABLES:-false}}"
|
||||||
|
: "${REPLACE_ENV_PATHS:=/data}"
|
||||||
|
: "${REPLACE_ENV_SUFFIXES:=yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml}"
|
||||||
|
: "${REPLACE_ENV_VARIABLE_PREFIX:=${ENV_VARIABLE_PREFIX:-CFG_}}"
|
||||||
|
: "${REPLACE_ENV_VARIABLES_EXCLUDES:=}"
|
||||||
|
: "${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}"
|
||||||
|
: "${PATCH_DEFINITIONS:=}"
|
||||||
|
: "${DEBUG:=false}"
|
||||||
|
|
||||||
|
if isTrue "${REPLACE_ENV_IN_PLACE}"; then
|
||||||
|
log "Replacing env variables in ${REPLACE_ENV_PATHS} that match the prefix $REPLACE_ENV_VARIABLE_PREFIX ..."
|
||||||
|
|
||||||
|
mc-image-helper --debug=${DEBUG} interpolate \
|
||||||
|
--replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \
|
||||||
|
--replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \
|
||||||
|
--replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \
|
||||||
|
--replace-env-prefix="${REPLACE_ENV_VARIABLE_PREFIX}" \
|
||||||
|
"${REPLACE_ENV_PATHS[@]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ${PATCH_DEFINITIONS} ]]; then
|
||||||
|
log "Applying patch definitions from ${PATCH_DEFINITIONS}"
|
||||||
|
mc-image-helper --debug=${DEBUG} patch \
|
||||||
|
--patch-env-prefix="${REPLACE_ENV_VARIABLE_PREFIX}" \
|
||||||
|
"${PATCH_DEFINITIONS}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec "${SCRIPTS:-/}start-finalExec" "$@"
|
||||||
2
start-finalSetupModconfig → scripts/start-setupModconfig
Normal file → Executable file
2
start-finalSetupModconfig → scripts/start-setupModconfig
Normal file → Executable file
@@ -24,4 +24,4 @@ case "X$MODCONFIG" in
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupMounts $@
|
exec ${SCRIPTS:-/}start-setupMounts $@
|
||||||
154
start-finalSetupModpack → scripts/start-setupModpack
Normal file → Executable file
154
start-finalSetupModpack → scripts/start-setupModpack
Normal file → Executable file
@@ -2,16 +2,20 @@
|
|||||||
|
|
||||||
set -e -o pipefail
|
set -e -o pipefail
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
: "${REMOVE_OLD_MODS:=false}"
|
||||||
if isDebugging; then
|
: "${MODS_FILE:=}"
|
||||||
set -x
|
: "${REMOVE_OLD_MODS_DEPTH:=1} "
|
||||||
fi
|
: "${REMOVE_OLD_MODS_INCLUDE:=*.jar}"
|
||||||
|
|
||||||
|
# shellcheck source=start-utils
|
||||||
|
. "${SCRIPTS:-/}start-utils"
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
# CURSE_URL_BASE used in manifest downloads below
|
# CURSE_URL_BASE used in manifest downloads below
|
||||||
CURSE_URL_BASE=${CURSE_URL_BASE:-https://minecraft.curseforge.com/projects}
|
CURSE_URL_BASE=${CURSE_URL_BASE:-https://minecraft.curseforge.com/projects}
|
||||||
|
|
||||||
# Remove old mods/plugins
|
# Remove old mods/plugins
|
||||||
if isTrue ${REMOVE_OLD_MODS:-false}; then
|
if isTrue "${REMOVE_OLD_MODS}" && [ -z "${MODS_FILE}" ]; then
|
||||||
removeOldMods /data/mods
|
removeOldMods /data/mods
|
||||||
removeOldMods /data/plugins
|
removeOldMods /data/plugins
|
||||||
fi
|
fi
|
||||||
@@ -19,25 +23,13 @@ fi
|
|||||||
# If supplied with a URL for a modpack (simple zip of jars), download it and unpack
|
# If supplied with a URL for a modpack (simple zip of jars), download it and unpack
|
||||||
if [[ "$MODPACK" ]]; then
|
if [[ "$MODPACK" ]]; then
|
||||||
if isURL "${MODPACK}"; then
|
if isURL "${MODPACK}"; then
|
||||||
if [[ "${MODPACK}" == *.zip ]]; then
|
|
||||||
downloadUrl="${MODPACK}"
|
|
||||||
else
|
|
||||||
downloadUrl=$(curl -Ls -o /dev/null -w %{effective_url} $MODPACK)
|
|
||||||
if ! [[ $downloadUrl == *.zip ]]; then
|
|
||||||
log "ERROR Invalid URL given for MODPACK: $downloadUrl resolved from $MODPACK"
|
|
||||||
log " Must be HTTP, HTTPS or FTP and a ZIP file"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "Downloading mod/plugin pack"
|
log "Downloading mod/plugin pack"
|
||||||
log " from $downloadUrl ..."
|
if ! get -o /tmp/modpack.zip "${MODPACK}"; then
|
||||||
if ! curl -sSL -o /tmp/modpack.zip "$downloadUrl"; then
|
log "ERROR: failed to download from ${MODPACK}"
|
||||||
log "ERROR: failed to download from $downloadUrl"
|
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
elif [[ "$MODPACK" =~ .*\.zip ]]; then
|
elif [[ "$MODPACK" =~ .*\.zip ]]; then
|
||||||
if ! cp $MODPACK /tmp/modpack.zip; then
|
if ! cp "$MODPACK" /tmp/modpack.zip; then
|
||||||
log "ERROR: failed to copy from $MODPACK"
|
log "ERROR: failed to copy from $MODPACK"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
@@ -49,19 +41,17 @@ if [[ "$MODPACK" ]]; then
|
|||||||
if [ "$TYPE" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
mkdir -p /data/plugins
|
mkdir -p /data/plugins
|
||||||
if ! unzip -o -d /data/plugins /tmp/modpack.zip; then
|
if ! unzip -o -d /data/plugins /tmp/modpack.zip; then
|
||||||
log "ERROR: failed to unzip the modpack from $downloadUrl"
|
log "ERROR: failed to unzip the modpack from ${MODPACK}"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
mkdir -p /data/mods
|
mkdir -p /data/mods
|
||||||
if ! unzip -o -d /data/mods /tmp/modpack.zip; then
|
if ! unzip -o -d /data/mods /tmp/modpack.zip; then
|
||||||
log "ERROR: failed to unzip the modpack from $downloadUrl"
|
log "ERROR: failed to unzip the modpack from ${MODPACK}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
rm -f /tmp/modpack.zip
|
rm -f /tmp/modpack.zip
|
||||||
fi
|
|
||||||
|
|
||||||
# If supplied with a URL for a plugin download it.
|
elif [[ "$MODS" ]]; then
|
||||||
if [[ "$MODS" ]]; then
|
|
||||||
if [ "$TYPE" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
out_dir=/data/plugins
|
out_dir=/data/plugins
|
||||||
else
|
else
|
||||||
@@ -71,26 +61,12 @@ if [[ "$MODS" ]]; then
|
|||||||
|
|
||||||
for i in ${MODS//,/ }
|
for i in ${MODS//,/ }
|
||||||
do
|
do
|
||||||
if isURL $i; then
|
if isURL "$i"; then
|
||||||
log "Downloading mod/plugin $i ..."
|
log "Downloading mod/plugin $i ..."
|
||||||
if isValidFileURL jar "$i"; then
|
if ! get -o "${out_dir}" "$i"; then
|
||||||
if ! curl -fsSL -o "${out_dir}/$(getFilenameFromUrl "${i}")" "${i}"; then
|
|
||||||
log "ERROR: failed to download from $i into $out_dir"
|
log "ERROR: failed to download from $i into $out_dir"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
else
|
|
||||||
effective_url=$(resolveEffectiveUrl "$i")
|
|
||||||
if isValidFileURL jar "${effective_url}"; then
|
|
||||||
out_file=$(getFilenameFromUrl "${effective_url}")
|
|
||||||
if ! curl -fsSL -o "${out_dir}/$out_file" "${effective_url}"; then
|
|
||||||
log "ERROR: failed to download from $i into $out_dir"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log "ERROR: $effective_url resolved from $i is not a valid jar URL"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
elif [[ -f "$i" && "$i" =~ .*\.jar ]]; then
|
elif [[ -f "$i" && "$i" =~ .*\.jar ]]; then
|
||||||
log "Copying plugin located at $i ..."
|
log "Copying plugin located at $i ..."
|
||||||
out_file=$(basename "$i")
|
out_file=$(basename "$i")
|
||||||
@@ -106,6 +82,37 @@ if [[ "$MODS" ]]; then
|
|||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
elif [[ "$MODS_FILE" ]]; then
|
||||||
|
if [ ! -f "$MODS_FILE" ]; then
|
||||||
|
log "ERROR: given MODS_FILE file does not exist"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
|
out_dir=/data/plugins
|
||||||
|
else
|
||||||
|
out_dir=/data/mods
|
||||||
|
fi
|
||||||
|
mkdir -p "$out_dir"
|
||||||
|
|
||||||
|
args=(
|
||||||
|
-o "${out_dir}"
|
||||||
|
--log-progress-each
|
||||||
|
--skip-existing
|
||||||
|
--uris-file "${MODS_FILE}"
|
||||||
|
)
|
||||||
|
if isTrue "${REMOVE_OLD_MODS}"; then
|
||||||
|
args+=(
|
||||||
|
--prune-others "${REMOVE_OLD_MODS_INCLUDE}"
|
||||||
|
--prune-depth "${REMOVE_OLD_MODS_DEPTH}"
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! get "${args[@]}" ; then
|
||||||
|
log "ERROR: failed to retrieve one or more mods"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$MANIFEST" ]]; then
|
if [[ "$MANIFEST" ]]; then
|
||||||
@@ -142,7 +149,7 @@ case "X$EFFECTIVE_MANIFEST_FILE" in
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
log "Could not find manifest file, unsufficient privs, or malformed path."
|
log "Could not find manifest file, insufficient privileges, or malformed path."
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -151,38 +158,63 @@ case "X$EFFECTIVE_MANIFEST_FILE" in
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "${GENERIC_PACK}" ]]; then
|
: "${GENERIC_PACKS:=${GENERIC_PACK}}"
|
||||||
if isURL "${GENERIC_PACK}"; then
|
|
||||||
log "Downloading generic pack ..."
|
if [[ "${GENERIC_PACKS}" ]]; then
|
||||||
curl -fsSL -o /tmp/generic_pack.zip "${GENERIC_PACK}"
|
IFS=',' read -ra packs <<< "${GENERIC_PACKS}"
|
||||||
GENERIC_PACK=/tmp/generic_pack.zip
|
|
||||||
|
packFiles=()
|
||||||
|
for pack in "${packs[@]}"; do
|
||||||
|
if isURL "$pack"; then
|
||||||
|
mkdir -p /data/packs
|
||||||
|
if ! outfile=$(get -o /data/packs --output-filename --skip-existing "$pack"); then
|
||||||
|
log "ERROR: failed to download $pack"
|
||||||
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
packFiles+=("$outfile")
|
||||||
|
else
|
||||||
|
packFiles+=("$pack")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
sum_file=/data/.generic_pack.sum
|
sum_file=/data/.generic_pack.sum
|
||||||
if ! sha256sum -c ${sum_file} -s 2> /dev/null; then
|
isDebugging && [ -f "$sum_file}" ] && cat "$sum_file"
|
||||||
|
if ! sha256sum -c "${sum_file}" --status 2> /dev/null; then
|
||||||
base_dir=/tmp/generic_pack_base
|
base_dir=/tmp/generic_pack_base
|
||||||
mkdir -p ${base_dir}
|
mkdir -p ${base_dir}
|
||||||
isDebugging && ls -l "${GENERIC_PACK}"
|
for pack in "${packFiles[@]}"; do
|
||||||
unzip -q -d ${base_dir} "${GENERIC_PACK}"
|
isDebugging && ls -l "${pack}"
|
||||||
|
unzip -q -d ${base_dir} "${pack}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# recalculate the actual base directory of content
|
||||||
|
base_dir=$(find "$base_dir" -type d \( -name mods -o -name plugins -o -name config \) -printf '%h' -quit)
|
||||||
|
if [[ ! $base_dir ]]; then
|
||||||
|
log "ERROR: Unable to find content base of generic packs ${GENERIC_PACKS}. Directories:"
|
||||||
|
find /tmp/generic_pack_base -type d -printf ' - %P\n'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -f /data/manifest.txt ]; then
|
if [ -f /data/manifest.txt ]; then
|
||||||
log "Manifest exists from older generic pack, cleaning up ..."
|
log "Manifest exists from older generic pack, cleaning up ..."
|
||||||
while read f; do
|
while read -r f; do
|
||||||
rm -rf "/data/${f}"
|
rm -rf "/data/${f}"
|
||||||
done < /data/manifest.txt
|
done < /data/manifest.txt
|
||||||
find /data/* -type d -exec rmdir --ignore-fail-on-non-empty {} +
|
# prune empty dirs
|
||||||
|
find /data -mindepth 1 -depth -type d -empty -delete
|
||||||
rm -f /data/manifest.txt
|
rm -f /data/manifest.txt
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Writing generic pack manifest ... "
|
log "Writing generic pack manifest ... "
|
||||||
find ${base_dir} -type f -print0 | xargs -0 -I {} echo "{}" | sed "s#${base_dir}/##" > /data/manifest.txt
|
find "${base_dir}" -type f -printf "%P\n" > /data/manifest.txt
|
||||||
|
|
||||||
log "Applying generic pack ..."
|
log "Applying generic pack ..."
|
||||||
IFS='
|
cp -R -f "${base_dir}"/* /data
|
||||||
'
|
rm -rf /tmp/generic_pack_base
|
||||||
set -f
|
|
||||||
for d in $(find ${base_dir} -type d); do mkdir -p "$(sed "s#${base_dir}#/data#" <<< $d)"; done
|
sha256sum "${packFiles[@]}" > "${sum_file}"
|
||||||
for f in $(find ${base_dir} -type f); do cp -f "$f" "$(sed "s#${base_dir}#/data#" <<< $f)"; done
|
isDebugging && cat "$sum_file"
|
||||||
rm -rf ${base_dir}
|
|
||||||
sha256sum "${GENERIC_PACK}" > ${sum_file}
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupModconfig $@
|
exec "${SCRIPTS:-/}start-setupModconfig" "$@"
|
||||||
69
scripts/start-setupMounts
Executable file
69
scripts/start-setupMounts
Executable file
@@ -0,0 +1,69 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
|
: ${SYNC_SKIP_NEWER_IN_DESTINATION:=${PLUGINS_SYNC_UPDATE:-true}}
|
||||||
|
: ${REPLACE_ENV_DURING_SYNC:=true}
|
||||||
|
: ${REPLACE_ENV_SUFFIXES:=yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml}
|
||||||
|
: ${REPLACE_ENV_VARIABLE_PREFIX:=${ENV_VARIABLE_PREFIX:-CFG_}}
|
||||||
|
: ${REPLACE_ENV_VARIABLES_EXCLUDES:=}
|
||||||
|
: ${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}
|
||||||
|
: ${DEBUG:=false}
|
||||||
|
|
||||||
|
set -e
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
if isTrue ${SYNC_SKIP_NEWER_IN_DESTINATION}; then
|
||||||
|
updateArg="--skip-newer-in-destination"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if isTrue ${REPLACE_ENV_DURING_SYNC}; then
|
||||||
|
subcommand=sync-and-interpolate
|
||||||
|
else
|
||||||
|
subcommand=sync
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d /plugins ]; then
|
||||||
|
case ${TYPE} in
|
||||||
|
SPIGOT|BUKKIT|PAPER|MAGMA)
|
||||||
|
mkdir -p /data/plugins
|
||||||
|
log "Copying plugins over..."
|
||||||
|
mc-image-helper \
|
||||||
|
--debug=${DEBUG} ${subcommand} $updateArg \
|
||||||
|
--replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \
|
||||||
|
--replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \
|
||||||
|
--replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \
|
||||||
|
--replace-env-prefix=${REPLACE_ENV_VARIABLE_PREFIX} \
|
||||||
|
/plugins /data/plugins
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If any modules have been provided, copy them over
|
||||||
|
: ${COPY_MODS_DEST:="/data/mods"}
|
||||||
|
|
||||||
|
if [ -d /mods ]; then
|
||||||
|
log "Copying any mods over..."
|
||||||
|
mc-image-helper \
|
||||||
|
--debug=${DEBUG} ${subcommand} $updateArg \
|
||||||
|
--replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \
|
||||||
|
--replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \
|
||||||
|
--replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \
|
||||||
|
--replace-env-prefix=${REPLACE_ENV_VARIABLE_PREFIX} \
|
||||||
|
/mods "${COPY_MODS_DEST}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
: ${COPY_CONFIG_DEST:="/data/config"}
|
||||||
|
|
||||||
|
if [ -d /config ]; then
|
||||||
|
log "Copying any configs from /config to ${COPY_CONFIG_DEST}"
|
||||||
|
mc-image-helper \
|
||||||
|
--debug=${DEBUG} ${subcommand} $updateArg \
|
||||||
|
--replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \
|
||||||
|
--replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \
|
||||||
|
--replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \
|
||||||
|
--replace-env-prefix=${REPLACE_ENV_VARIABLE_PREFIX} \
|
||||||
|
/config "${COPY_CONFIG_DEST}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-setupServerProperties $@
|
||||||
230
scripts/start-setupServerProperties
Executable file
230
scripts/start-setupServerProperties
Executable file
@@ -0,0 +1,230 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# shellcheck source=start-utils
|
||||||
|
. "${SCRIPTS:-/}start-utils"
|
||||||
|
|
||||||
|
: "${SERVER_PROPERTIES:=/data/server.properties}"
|
||||||
|
|
||||||
|
# FUNCTIONS
|
||||||
|
function setServerPropValue {
|
||||||
|
local prop=$1
|
||||||
|
local value=$2
|
||||||
|
# normalize booleans
|
||||||
|
case ${value^^} in
|
||||||
|
TRUE|FALSE)
|
||||||
|
value=${value,,} ;;
|
||||||
|
esac
|
||||||
|
if grep "${prop}" "$SERVER_PROPERTIES" > /dev/null; then
|
||||||
|
log "Setting ${prop} to '${value}' in ${SERVER_PROPERTIES}"
|
||||||
|
sed -i "/^${prop}\s*=/ c ${prop}=${value//\\/\\\\}" "$SERVER_PROPERTIES"
|
||||||
|
else
|
||||||
|
log "Adding ${prop} with '${value}' in ${SERVER_PROPERTIES}"
|
||||||
|
echo "${prop}=${value}" >> "$SERVER_PROPERTIES"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function setServerProp {
|
||||||
|
local prop=$1
|
||||||
|
local varName=$2
|
||||||
|
|
||||||
|
if [ -v $varName ]; then
|
||||||
|
setServerPropValue "$prop" "${!varName}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function customizeServerProps {
|
||||||
|
if [ -n "$WHITELIST" ] || isTrue "${ENABLE_WHITELIST:-false}"; then
|
||||||
|
log "Creating whitelist"
|
||||||
|
setServerPropValue "whitelist" "true"
|
||||||
|
setServerPropValue "white-list" "true"
|
||||||
|
else
|
||||||
|
log "Disabling whitelist"
|
||||||
|
setServerPropValue "whitelist" "false"
|
||||||
|
setServerPropValue "white-list" "false"
|
||||||
|
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-name" SERVER_NAME
|
||||||
|
setServerProp "server-ip" SERVER_IP
|
||||||
|
setServerProp "server-port" SERVER_PORT
|
||||||
|
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 "spawn-protection" SPAWN_PROTECTION
|
||||||
|
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
|
||||||
|
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
|
||||||
|
setServerProp "simulation-distance" SIMULATION_DISTANCE
|
||||||
|
setServerPropValue "motd" "$(echo "$MOTD" | mc-image-helper asciify)"
|
||||||
|
[[ $LEVEL_TYPE ]] && setServerPropValue "level-type" "${LEVEL_TYPE^^}"
|
||||||
|
|
||||||
|
if [ -n "$DIFFICULTY" ]; then
|
||||||
|
case ${DIFFICULTY,,} in
|
||||||
|
peaceful|0)
|
||||||
|
if versionLessThan 1.13; then
|
||||||
|
DIFFICULTY=0
|
||||||
|
else
|
||||||
|
DIFFICULTY=peaceful
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
easy|1)
|
||||||
|
if versionLessThan 1.13; then
|
||||||
|
DIFFICULTY=1
|
||||||
|
else
|
||||||
|
DIFFICULTY=easy
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
normal|2)
|
||||||
|
if versionLessThan 1.13; then
|
||||||
|
DIFFICULTY=2
|
||||||
|
else
|
||||||
|
DIFFICULTY=normal
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
hard|3)
|
||||||
|
if versionLessThan 1.13; then
|
||||||
|
DIFFICULTY=3
|
||||||
|
else
|
||||||
|
DIFFICULTY=hard
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log "DIFFICULTY must be peaceful, easy, normal, or hard."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
setServerPropValue "difficulty" "$DIFFICULTY"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$MODE" ]; then
|
||||||
|
log "Setting mode"
|
||||||
|
case ${MODE,,} in
|
||||||
|
su*|0)
|
||||||
|
if versionLessThan 1.13; then
|
||||||
|
MODE=0
|
||||||
|
else
|
||||||
|
MODE=survival
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
c*|1)
|
||||||
|
if versionLessThan 1.13; then
|
||||||
|
MODE=1
|
||||||
|
else
|
||||||
|
MODE=creative
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
a*|2)
|
||||||
|
if versionLessThan 1.13; then
|
||||||
|
MODE=2
|
||||||
|
else
|
||||||
|
MODE=adventure
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
sp*|3)
|
||||||
|
if versionLessThan 1.13; then
|
||||||
|
MODE=3
|
||||||
|
else
|
||||||
|
MODE=spectator
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log "ERROR: Invalid game mode: $MODE"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
setServerPropValue "gamemode" "$MODE"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Deploy server.properties file
|
||||||
|
if [[ ${TYPE} == "CURSEFORGE" ]]; then
|
||||||
|
export SERVER_PROPERTIES="${FTB_DIR}/server.properties"
|
||||||
|
log "detected FTB, changing properties path to ${SERVER_PROPERTIES}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! isTrue "${SKIP_SERVER_PROPERTIES:-false}"; then
|
||||||
|
if [ ! -e "$SERVER_PROPERTIES" ]; then
|
||||||
|
log "Creating server.properties in ${SERVER_PROPERTIES}"
|
||||||
|
cp /tmp/server.properties "$SERVER_PROPERTIES"
|
||||||
|
customizeServerProps
|
||||||
|
elif [ -n "${OVERRIDE_SERVER_PROPERTIES}" ]; then
|
||||||
|
case ${OVERRIDE_SERVER_PROPERTIES^^} in
|
||||||
|
TRUE|1)
|
||||||
|
customizeServerProps
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log "server.properties already created, skipping"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
log "server.properties already created, skipping"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "Skipping setup of server.properties"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if isTrue "${ENABLE_AUTOPAUSE}"; then
|
||||||
|
current_max_tick=$( grep 'max-tick-time' "$SERVER_PROPERTIES" | sed -r 's/( )+//g' | awk -F= '{print $2}' )
|
||||||
|
if (( current_max_tick > 0 && current_max_tick < 86400000 )); then
|
||||||
|
log "Warning: The server.properties for the server doesn't have the Server Watchdog (effectively) disabled."
|
||||||
|
log "Warning (cont): Autopause functionality resuming the process might trigger the Watchdog and restart the server completely."
|
||||||
|
log "Warning (cont): Set the max-tick-time property to a high value (or disable the Watchdog with value -1 for versions 1.8.1+)."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if isDebugging && [ -f "${SERVER_PROPERTIES}" ]; then
|
||||||
|
log "DEBUG Dumping server.properties"
|
||||||
|
cat "${SERVER_PROPERTIES}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec "${SCRIPTS:-/}start-setupEnvVariables" "$@"
|
||||||
12
start-finalSetupWorld → scripts/start-setupWorld
Normal file → Executable file
12
start-finalSetupWorld → scripts/start-setupWorld
Normal file → Executable file
@@ -1,16 +1,14 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
# shellcheck source=start-utils
|
||||||
|
. "${SCRIPTS:-/}start-utils"
|
||||||
set -e
|
set -e
|
||||||
isDebugging && set -x
|
isDebugging && set -x
|
||||||
|
|
||||||
: ${LEVEL:=world}
|
|
||||||
export LEVEL
|
|
||||||
|
|
||||||
if [ $TYPE = "CURSEFORGE" ]; then
|
if [ $TYPE = "CURSEFORGE" ]; then
|
||||||
worldDest=$FTB_DIR/$LEVEL
|
worldDest=$FTB_DIR/${LEVEL:-world}
|
||||||
else
|
else
|
||||||
worldDest=/data/$LEVEL
|
worldDest=/data/${LEVEL:-world}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] ); then
|
if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] ); then
|
||||||
@@ -71,4 +69,4 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupModpack $@
|
exec "${SCRIPTS:-/}start-setupModpack" "$@"
|
||||||
104
scripts/start-spiget
Executable file
104
scripts/start-spiget
Executable file
@@ -0,0 +1,104 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
handleDebugMode
|
||||||
|
|
||||||
|
: ${SPIGET_RESOURCES:=}
|
||||||
|
: ${SPIGET_DOWNLOAD_TOLERANCE:=5} # in minutes
|
||||||
|
|
||||||
|
containsJars() {
|
||||||
|
file=${1?}
|
||||||
|
|
||||||
|
pat='\.jar$'
|
||||||
|
|
||||||
|
while read -r line; do
|
||||||
|
if [[ $line =~ $pat ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done <<<$(unzip -l "$file")
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
getResourceFromSpiget() {
|
||||||
|
resource=${1?}
|
||||||
|
|
||||||
|
log "Downloading resource ${resource} ..."
|
||||||
|
|
||||||
|
mkdir -p /data/plugins
|
||||||
|
|
||||||
|
versionfile="/data/plugins/.${resource}-version.json"
|
||||||
|
versionfileNew="/tmp/.${resource}-version.json"
|
||||||
|
|
||||||
|
if [ -f "$versionfile" ]; then
|
||||||
|
if [[ -n $(find "$versionfile" -mmin +${SPIGET_DOWNLOAD_TOLERANCE}) ]]; then
|
||||||
|
urlVersion="https://api.spiget.org/v2/resources/${resource}/versions/latest"
|
||||||
|
if ! curl -o "${versionfileNew}" -fsSL -H "User-Agent: itzg/minecraft-server" "${extraCurlArgs[@]}" "${urlVersion}"; then
|
||||||
|
log "ERROR failed to download resource version meta data '${resource}' from ${urlVersion}"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
installedVersion=$(jq -r '.name' $versionfile)
|
||||||
|
newVersion=$(jq -r '.name' $versionfileNew)
|
||||||
|
|
||||||
|
if [ "$installedVersion" = "$newVersion" ]; then
|
||||||
|
log "resource '${resource}' not downloaded because installed version '${installedVersion}' already up to date ('${newVersion}')"
|
||||||
|
mv "${versionfileNew}" "${versionfile}"
|
||||||
|
else
|
||||||
|
if downloadResourceFromSpiget "${resource}"; then
|
||||||
|
mv "${versionfileNew}" "${versionfile}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "resource '${resource}' not checked because version meta file newer than '${SPIGET_DOWNLOAD_TOLERANCE}' minutes"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if downloadResourceFromSpiget "${resource}"; then
|
||||||
|
urlVersion="https://api.spiget.org/v2/resources/${resource}/versions/latest"
|
||||||
|
if ! curl -o "${versionfileNew}" -fsSL -H "User-Agent: itzg/minecraft-server" "${extraCurlArgs[@]}" "${urlVersion}"; then
|
||||||
|
log "ERROR failed to download resource version meta data '${resource}' from ${urlVersion}"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
mv "${versionfileNew}" "${versionfile}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadResourceFromSpiget() {
|
||||||
|
resource=${1?}
|
||||||
|
|
||||||
|
tmpfile="/tmp/${resource}.zip"
|
||||||
|
url="https://api.spiget.org/v2/resources/${resource}/download"
|
||||||
|
if ! curl -o "${tmpfile}" -fsSL -H "User-Agent: itzg/minecraft-server" "${extraCurlArgs[@]}" "${url}"; then
|
||||||
|
log "ERROR failed to download resource '${resource}' from ${url}"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if containsJars "${tmpfile}"; then
|
||||||
|
log "Extracting contents of resource ${resource} into plugins"
|
||||||
|
unzip -o -q -d /data/plugins "${tmpfile}"
|
||||||
|
rm "${tmpfile}"
|
||||||
|
else
|
||||||
|
log "Moving resource ${resource} into plugins"
|
||||||
|
mv "${tmpfile}" "/data/plugins/${resource}.jar"
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ ${SPIGET_RESOURCES} ]]; then
|
||||||
|
if isTrue ${REMOVE_OLD_MODS:-false}; then
|
||||||
|
removeOldMods /data/plugins
|
||||||
|
REMOVE_OLD_MODS=false
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Getting plugins via Spiget"
|
||||||
|
IFS=',' read -r -a resources <<<"${SPIGET_RESOURCES}"
|
||||||
|
for resource in "${resources[@]}"; do
|
||||||
|
getResourceFromSpiget "${resource}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-setupWorld $@
|
||||||
8
start-utils → scripts/start-utils
Normal file → Executable file
8
start-utils → scripts/start-utils
Normal file → Executable file
@@ -180,3 +180,11 @@ function removeOldMods {
|
|||||||
find "$1" -mindepth 1 -maxdepth ${REMOVE_OLD_MODS_DEPTH:-16} -wholename "${REMOVE_OLD_MODS_INCLUDE:-*}" -not -wholename "${REMOVE_OLD_MODS_EXCLUDE:-}" -delete
|
find "$1" -mindepth 1 -maxdepth ${REMOVE_OLD_MODS_DEPTH:-16} -wholename "${REMOVE_OLD_MODS_INCLUDE:-*}" -not -wholename "${REMOVE_OLD_MODS_EXCLUDE:-}" -delete
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function get() {
|
||||||
|
local flags=()
|
||||||
|
if isTrue "${DEBUG_GET:-false}"; then
|
||||||
|
flags+=("--debug")
|
||||||
|
fi
|
||||||
|
mc-image-helper "${flags[@]}" get "$@"
|
||||||
|
}
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -euo pipefail
|
|
||||||
IFS=$'\n\t'
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
isDebugging && set -x
|
|
||||||
|
|
||||||
JAVA_VER=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1)
|
|
||||||
|
|
||||||
if [ "${JAVA_VER}" != "8" ] && [ "${JAVA_VER}" != "11" ]; then
|
|
||||||
log "ERROR: Airplane server type only supports Java versions 8 and 11"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${VERSION}" != "LATEST" ]; then
|
|
||||||
log "ERROR: Airplane server type only supports VERSION=LATEST"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
export SERVER=airplane-${VANILLA_VERSION}-jdk${JAVA_VER}.jar
|
|
||||||
|
|
||||||
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
|
||||||
downloadUrl="https://dl.airplane.gg/latest/Airplane-JDK${JAVA_VER}/launcher-airplane.jar"
|
|
||||||
log "Downloading Airplane from $downloadUrl ..."
|
|
||||||
curl -fsSL -o "$SERVER" "$downloadUrl"
|
|
||||||
if [ ! -f "$SERVER" ]; then
|
|
||||||
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
|
||||||
exit 3
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Normalize on Spigot for later operations
|
|
||||||
export TYPE=SPIGOT
|
|
||||||
export SKIP_LOG4J_CONFIG=true
|
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-spiget "$@"
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
|
|
||||||
export TYPE=FABRIC
|
|
||||||
|
|
||||||
FABRIC_INSTALLER=${FABRIC_INSTALLER:-}
|
|
||||||
FABRIC_INSTALLER_URL=${FABRIC_INSTALLER_URL:-}
|
|
||||||
FABRIC_INSTALLER_VERSION=${FABRIC_INSTALLER_VERSION:-${FABRICVERSION:-LATEST}}
|
|
||||||
if [[ -z $FABRIC_INSTALLER && -z $FABRIC_INSTALLER_URL ]]; then
|
|
||||||
log "Checking Fabric version information."
|
|
||||||
case $FABRIC_INSTALLER_VERSION in
|
|
||||||
LATEST)
|
|
||||||
FABRIC_INSTALLER_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
FABRIC_INSTALLER="/tmp/fabric-installer-${FABRIC_INSTALLER_VERSION}.jar"
|
|
||||||
markerVersion=$FABRIC_INSTALLER_VERSION
|
|
||||||
|
|
||||||
elif [[ -z $FABRIC_INSTALLER ]]; then
|
|
||||||
FABRIC_INSTALLER="/tmp/fabric-installer.jar"
|
|
||||||
markerVersion=custom
|
|
||||||
elif [[ ! -e $FABRIC_INSTALLER ]]; then
|
|
||||||
log "ERROR: the given Fabric installer doesn't exist : $FABRIC_INSTALLER"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
installMarker="/data/.fabric-installed-${VANILLA_VERSION}-${markerVersion}"
|
|
||||||
|
|
||||||
debug Checking for installMarker ${installMarker}
|
|
||||||
if [[ ! -e $installMarker ]]; then
|
|
||||||
if [[ ! -e $FABRIC_INSTALLER ]]; then
|
|
||||||
if [[ -z $FABRIC_INSTALLER_URL ]]; then
|
|
||||||
log "Downloading installer version $FABRIC_INSTALLER_VERSION"
|
|
||||||
downloadUrl="https://maven.fabricmc.net/net/fabricmc/fabric-installer/${FABRIC_INSTALLER_VERSION}/fabric-installer-${FABRIC_INSTALLER_VERSION}.jar"
|
|
||||||
log "...trying $downloadUrl"
|
|
||||||
curl -o $FABRIC_INSTALLER -fsSL $downloadUrl
|
|
||||||
else
|
|
||||||
log "Downloading $FABRIC_INSTALLER_URL ..."
|
|
||||||
if ! curl -o $FABRIC_INSTALLER -fsSL $FABRIC_INSTALLER_URL; then
|
|
||||||
log "Failed to download from given location $FABRIC_INSTALLER_URL"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if isDebugging; then
|
|
||||||
debug "Installing Fabric ${VANILLA_VERSION} using $FABRIC_INSTALLER"
|
|
||||||
else
|
|
||||||
log "Installing Fabric using $FABRIC_INSTALLER"
|
|
||||||
fi
|
|
||||||
tries=3
|
|
||||||
set +e
|
|
||||||
while ((--tries >= 0)); do
|
|
||||||
java -jar $FABRIC_INSTALLER server \
|
|
||||||
-mcversion $VANILLA_VERSION \
|
|
||||||
-downloadMinecraft \
|
|
||||||
-dir /data
|
|
||||||
if [[ $? == 0 ]]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
set -e
|
|
||||||
if (($tries < 0)); then
|
|
||||||
log "Fabric failed to install after several tries." >&2
|
|
||||||
exit 10
|
|
||||||
fi
|
|
||||||
export SERVER=fabric-server-launch.jar
|
|
||||||
log "Using server $SERVER"
|
|
||||||
echo $SERVER > $installMarker
|
|
||||||
|
|
||||||
else
|
|
||||||
export SERVER=$(< $installMarker)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Contineut to Final Setup
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
export TYPE=FORGE
|
|
||||||
: ${FORGEVERSION:=RECOMMENDED}
|
|
||||||
isDebugging && set -x
|
|
||||||
|
|
||||||
if [[ -z $FORGE_INSTALLER && -z $FORGE_INSTALLER_URL ]]; then
|
|
||||||
norm=$VANILLA_VERSION
|
|
||||||
|
|
||||||
case $VANILLA_VERSION in
|
|
||||||
*.*.*)
|
|
||||||
norm=$VANILLA_VERSION ;;
|
|
||||||
*.*)
|
|
||||||
norm=${VANILLA_VERSION}.0 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
#################################################################################
|
|
||||||
|
|
||||||
log "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
|
|
||||||
log "ERROR: Version $VANILLA_VERSION is not supported by Forge"
|
|
||||||
log " 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
|
|
||||||
log "ERROR: the given Forge installer doesn't exist : $FORGE_INSTALLER"
|
|
||||||
exit 2
|
|
||||||
else
|
|
||||||
shortForgeVersion=$VANILLA_VERSION-custom
|
|
||||||
fi
|
|
||||||
|
|
||||||
installMarker="/data/.forge-installed-$shortForgeVersion"
|
|
||||||
|
|
||||||
if [ ! -e $installMarker ]; then
|
|
||||||
if [ ! -e $FORGE_INSTALLER ]; then
|
|
||||||
|
|
||||||
if [[ -z $FORGE_INSTALLER_URL ]]; then
|
|
||||||
log "Downloading $normForgeVersion"
|
|
||||||
|
|
||||||
forgeFileNames="
|
|
||||||
$normForgeVersion/forge-$normForgeVersion-installer.jar
|
|
||||||
$shortForgeVersion/forge-$shortForgeVersion-installer.jar
|
|
||||||
END
|
|
||||||
"
|
|
||||||
for fn in $forgeFileNames; do
|
|
||||||
if [ $fn == END ]; then
|
|
||||||
log "Unable to compute URL for $normForgeVersion"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
downloadUrl=https://maven.minecraftforge.net/net/minecraftforge/forge/$fn
|
|
||||||
log "...trying $downloadUrl"
|
|
||||||
if curl -o $FORGE_INSTALLER -fsSL $downloadUrl; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
log "Downloading $FORGE_INSTALLER_URL ..."
|
|
||||||
if ! curl -o $FORGE_INSTALLER -fsSL $FORGE_INSTALLER_URL; then
|
|
||||||
log "Failed to download from given location $FORGE_INSTALLER_URL"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "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
|
|
||||||
log "Forge failed to install after several tries." >&2
|
|
||||||
exit 10
|
|
||||||
fi
|
|
||||||
# NOTE $shortForgeVersion will be empty if installer location was given to us
|
|
||||||
log "Finding installed server jar..."
|
|
||||||
unset -v latest
|
|
||||||
for file in *forge*.jar; do
|
|
||||||
if ! [[ $file =~ installer ]]; then
|
|
||||||
if [[ -z $latest ]] || [[ $file -nt $latest ]]; then
|
|
||||||
latest=$file
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [[ -z $latest ]]; then
|
|
||||||
log "Unable to derive server jar for Forge"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
export SERVER=$latest
|
|
||||||
log "Using server $SERVER"
|
|
||||||
echo $SERVER > $installMarker
|
|
||||||
|
|
||||||
else
|
|
||||||
export SERVER=$(cat $installMarker)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Continue to Final Setup
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
|
|
||||||
export SERVER="/data/magma-server-${VANILLA_VERSION}.jar"
|
|
||||||
|
|
||||||
# Always download since new updates of each base version are published frequently
|
|
||||||
if ! curl -o /data/magma-server-${VANILLA_VERSION}.jar -fsSL \
|
|
||||||
https://api.magmafoundation.org/api/resources/Magma/${VANILLA_VERSION}/stable/latest/download; then
|
|
||||||
log "ERROR unable to download version ${VANILLA_VERSION} of Magma"
|
|
||||||
log " Check https://magmafoundation.org/ for available versions"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
export SKIP_LOG4J_CONFIG=true
|
|
||||||
|
|
||||||
# Continue to Final Setup
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
|
|
||||||
if [ "${VERSION}" != "LATEST" ]; then
|
|
||||||
log "ERROR: Tunity server type only supports VERSION=LATEST"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
: ${TUNITY_BUILD:=lastSuccessfulBuild}
|
|
||||||
export SERVER=tunity-${VANILLA_VERSION}-${TUNITY_BUILD}.jar
|
|
||||||
|
|
||||||
if [ ! -f "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
|
||||||
downloadUrl="https://ci.codemc.io/job/Spottedleaf/job/Tuinity/${TUNITY_BUILD}/artifact/tuinity-paperclip.jar"
|
|
||||||
log "Downloading Tunity (build $TUNITY_BUILD) from $downloadUrl ..."
|
|
||||||
curl -fsSL -o "$SERVER" "$downloadUrl"
|
|
||||||
if [ ! -f "$SERVER" ]; then
|
|
||||||
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
|
||||||
exit 3
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Normalize on Spigot for later operations
|
|
||||||
export TYPE=SPIGOT
|
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-spiget "$@"
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
isDebugging && set -x
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
export SERVER="minecraft_server.${VANILLA_VERSION// /_}.jar"
|
|
||||||
|
|
||||||
if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
|
||||||
log "Downloading $SERVER ..."
|
|
||||||
debug "Finding version manifest for $VANILLA_VERSION"
|
|
||||||
versionManifestUrl=$(curl -fsSL 'https://launchermeta.mojang.com/mc/game/version_manifest.json' | jq --arg VANILLA_VERSION "$VANILLA_VERSION" --raw-output '[.versions[]|select(.id == $VANILLA_VERSION)][0].url')
|
|
||||||
result=$?
|
|
||||||
if [ $result != 0 ]; then
|
|
||||||
log "ERROR failed to obtain version manifest URL ($result)"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if [ $versionManifestUrl = "null" ]; then
|
|
||||||
log "ERROR couldn't find a matching manifest entry for $VANILLA_VERSION"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
debug "Found version manifest at $versionManifestUrl"
|
|
||||||
|
|
||||||
serverDownloadUrl=$(curl -fsSL ${versionManifestUrl} | jq --raw-output '.downloads.server.url')
|
|
||||||
result=$?
|
|
||||||
if [ $result != 0 ]; then
|
|
||||||
log "ERROR failed to obtain version manifest from $versionManifestUrl ($result)"
|
|
||||||
exit 1
|
|
||||||
elif [ $serverDownloadUrl = null ]; then
|
|
||||||
log "ERROR version $VANILLA_VERSION does not provide a server download"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
debug "Downloading server from $serverDownloadUrl"
|
|
||||||
if isDebugging; then
|
|
||||||
verbose=-v
|
|
||||||
fi
|
|
||||||
curl $verbose -fsSL -o $SERVER $serverDownloadUrl
|
|
||||||
result=$?
|
|
||||||
if [ $result != 0 ]; then
|
|
||||||
log "ERROR failed to download server from $serverDownloadUrl ($result)"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
isDebugging && ls -l
|
|
||||||
|
|
||||||
# Continue to Final Setup
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -euo pipefail
|
|
||||||
IFS=$'\n\t'
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
isDebugging && set -x
|
|
||||||
|
|
||||||
: ${VANILLA_VERSION:?}
|
|
||||||
: ${RELEASE:=stable}
|
|
||||||
: ${FORCE_REDOWNLOAD:=false}
|
|
||||||
|
|
||||||
requireEnum RELEASE stable latest
|
|
||||||
|
|
||||||
export SERVER="yatopia-${RELEASE}-${VANILLA_VERSION}.jar"
|
|
||||||
|
|
||||||
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
|
||||||
downloadUrl="https://api.yatopiamc.org/v2/${RELEASE}Build/download?branch=ver/${VANILLA_VERSION}"
|
|
||||||
log "Downloading Yatopia from $downloadUrl ..."
|
|
||||||
if ! curl -fsSL -o "$SERVER" "$downloadUrl"; then
|
|
||||||
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
|
||||||
exit 3
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Normalize on Spigot for later operations
|
|
||||||
export TYPE=SPIGOT
|
|
||||||
export SKIP_LOG4J_CONFIG=true
|
|
||||||
|
|
||||||
# Continue to Final Setup
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
|
|
||||||
: ${ENV_VARIABLE_PREFIX:=CFG_}
|
|
||||||
|
|
||||||
if isTrue "${REPLACE_ENV_VARIABLES}"; then
|
|
||||||
log "Replacing env variables in configs that match the prefix $ENV_VARIABLE_PREFIX ..."
|
|
||||||
|
|
||||||
# File excludes
|
|
||||||
fileExcludes=
|
|
||||||
for f in ${REPLACE_ENV_VARIABLES_EXCLUDES}; do
|
|
||||||
fileExcludes="${fileExcludes} -not -name $f"
|
|
||||||
done
|
|
||||||
|
|
||||||
# Directory excludes (recursive)
|
|
||||||
dirExcludes=$(join_by " -o -path " ${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS})
|
|
||||||
if [[ $dirExcludes ]]; then
|
|
||||||
dirExcludes=" -type d ( -path ${dirExcludes} ) -prune -o"
|
|
||||||
fi
|
|
||||||
|
|
||||||
isDebugging && echo "Using find file exclusions: $fileExcludes"
|
|
||||||
isDebugging && echo "Using find directory exclusions: $dirExcludes"
|
|
||||||
|
|
||||||
for name in $(compgen -v $ENV_VARIABLE_PREFIX); do
|
|
||||||
# check if name of env variable matches the prefix
|
|
||||||
# sanity check environment variables to avoid code injections
|
|
||||||
# Read content from file environment
|
|
||||||
if [[ $name = *"_FILE" ]]; then
|
|
||||||
value=$(<${!name})
|
|
||||||
name="${name%_FILE}"
|
|
||||||
else
|
|
||||||
value=${!name}
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "Replacing $name with $value ..."
|
|
||||||
|
|
||||||
value=${value//\\/\\\\}
|
|
||||||
value=${value//#/\\#}
|
|
||||||
|
|
||||||
find /data/ \
|
|
||||||
$dirExcludes \
|
|
||||||
-type f \
|
|
||||||
\( -name "*.yml" -or -name "*.yaml" -or -name "*.txt" -or -name "*.cfg" \
|
|
||||||
-or -name "*.conf" -or -name "*.properties" -or -name "*.hjson" -or -name "*.json" \) \
|
|
||||||
$fileExcludes \
|
|
||||||
-exec sed -i 's#${'"$name"'}#'"$value"'#g' {} \;
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-minecraftFinalSetup $@
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
|
|
||||||
: ${PLUGINS_SYNC_UPDATE:=true}
|
|
||||||
|
|
||||||
isDebugging && set -x
|
|
||||||
|
|
||||||
if [ -d /plugins ]; then
|
|
||||||
case ${TYPE} in
|
|
||||||
SPIGOT|BUKKIT|PAPER|MAGMA)
|
|
||||||
mkdir -p /data/plugins
|
|
||||||
log "Copying plugins over..."
|
|
||||||
if isTrue ${PLUGINS_SYNC_UPDATE}; then
|
|
||||||
updateArg="--update"
|
|
||||||
fi
|
|
||||||
# Copy plugins over using rsync to allow deeply nested updates of plugins
|
|
||||||
rsync -a --out-format="update:%f:Last Modified %M" --prune-empty-dirs $updateArg /plugins /data
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If any modules have been provided, copy them over
|
|
||||||
: ${COPY_MODS_DEST:="/data/mods"}
|
|
||||||
|
|
||||||
if [ -d /mods ]; then
|
|
||||||
log "Copying any mods over..."
|
|
||||||
mkdir -p $COPY_MODS_DEST
|
|
||||||
rsync -a --out-format="update:%f:Last Modified %M" "${rsyncArgs[@]}" --prune-empty-dirs --update /mods/ $COPY_MODS_DEST
|
|
||||||
fi
|
|
||||||
|
|
||||||
: ${COPY_CONFIG_DEST:="/data/config"}
|
|
||||||
|
|
||||||
if [ -d /config ]; then
|
|
||||||
log "Copying any configs from /config to $COPY_CONFIG_DEST"
|
|
||||||
mkdir -p $COPY_CONFIG_DEST
|
|
||||||
rsync -a --out-format="update:%f:Last Modified %M" "${rsyncArgs[@]}" --prune-empty-dirs --update /config/ $COPY_CONFIG_DEST
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupServerProperties $@
|
|
||||||
@@ -1,220 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
|
|
||||||
: ${SERVER_PROPERTIES:=/data/server.properties}
|
|
||||||
|
|
||||||
# FUNCTIONS
|
|
||||||
function setServerProp {
|
|
||||||
local prop=$1
|
|
||||||
local var=$2
|
|
||||||
if [ -n "$var" ]; then
|
|
||||||
# normalize booleans
|
|
||||||
case ${var^^} in
|
|
||||||
TRUE|FALSE)
|
|
||||||
var=${var,,} ;;
|
|
||||||
esac
|
|
||||||
if grep "${prop}" "$SERVER_PROPERTIES" > /dev/null; then
|
|
||||||
log "Setting ${prop} to '${var}' in ${SERVER_PROPERTIES}"
|
|
||||||
sed -i "/^${prop}\s*=/ c ${prop}=${var//\\/\\\\}" "$SERVER_PROPERTIES"
|
|
||||||
else
|
|
||||||
log "Adding ${prop} with '${var}' in ${SERVER_PROPERTIES}"
|
|
||||||
echo "${prop}=${var//\\/\\\\}" >> "$SERVER_PROPERTIES"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
isDebugging && log "Skip setting ${prop}"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function customizeServerProps {
|
|
||||||
if [ -n "$WHITELIST" ]; then
|
|
||||||
log "Creating whitelist"
|
|
||||||
setServerProp "whitelist" "true"
|
|
||||||
setServerProp "white-list" "true"
|
|
||||||
else
|
|
||||||
log "Disabling whitelist"
|
|
||||||
setServerProp "whitelist" "false"
|
|
||||||
setServerProp "white-list" "false"
|
|
||||||
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-name" "$SERVER_NAME"
|
|
||||||
setServerProp "server-ip" "$SERVER_IP"
|
|
||||||
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 "spawn-protection" "$SPAWN_PROTECTION"
|
|
||||||
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"
|
|
||||||
setServerProp "level-type" "${LEVEL_TYPE^^}"
|
|
||||||
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
|
|
||||||
peaceful|0)
|
|
||||||
if versionLessThan 1.13; then
|
|
||||||
DIFFICULTY=0
|
|
||||||
else
|
|
||||||
DIFFICULTY=peaceful
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
easy|1)
|
|
||||||
if versionLessThan 1.13; then
|
|
||||||
DIFFICULTY=1
|
|
||||||
else
|
|
||||||
DIFFICULTY=easy
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
normal|2)
|
|
||||||
if versionLessThan 1.13; then
|
|
||||||
DIFFICULTY=2
|
|
||||||
else
|
|
||||||
DIFFICULTY=normal
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
hard|3)
|
|
||||||
if versionLessThan 1.13; then
|
|
||||||
DIFFICULTY=3
|
|
||||||
else
|
|
||||||
DIFFICULTY=hard
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
log "DIFFICULTY must be peaceful, easy, normal, or hard."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
setServerProp "difficulty" "$DIFFICULTY"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$MODE" ]; then
|
|
||||||
log "Setting mode"
|
|
||||||
MODE_LC=$( echo $MODE | tr '[:upper:]' '[:lower:]' )
|
|
||||||
case $MODE_LC in
|
|
||||||
su*|0)
|
|
||||||
if versionLessThan 1.13; then
|
|
||||||
MODE=0
|
|
||||||
else
|
|
||||||
MODE=survival
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
c*|1)
|
|
||||||
if versionLessThan 1.13; then
|
|
||||||
MODE=1
|
|
||||||
else
|
|
||||||
MODE=creative
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
a*|2)
|
|
||||||
if versionLessThan 1.13; then
|
|
||||||
MODE=2
|
|
||||||
else
|
|
||||||
MODE=adventure
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
sp*|3)
|
|
||||||
if versionLessThan 1.13; then
|
|
||||||
MODE=3
|
|
||||||
else
|
|
||||||
MODE=spectator
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
log "ERROR: Invalid game mode: $MODE"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
setServerProp "gamemode" "$MODE"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Deploy server.properties file
|
|
||||||
if [[ ${TYPE} == "CURSEFORGE" ]]; then
|
|
||||||
export SERVER_PROPERTIES="${FTB_DIR}/server.properties"
|
|
||||||
log "detected FTB, changing properties path to ${SERVER_PROPERTIES}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -e "$SERVER_PROPERTIES" ]; then
|
|
||||||
log "Creating server.properties in ${SERVER_PROPERTIES}"
|
|
||||||
cp /tmp/server.properties "$SERVER_PROPERTIES"
|
|
||||||
customizeServerProps
|
|
||||||
elif [ -n "${OVERRIDE_SERVER_PROPERTIES}" ]; then
|
|
||||||
case ${OVERRIDE_SERVER_PROPERTIES^^} in
|
|
||||||
TRUE|1)
|
|
||||||
customizeServerProps
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
log "server.properties already created, skipping"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
log "server.properties already created, skipping"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if isTrue "${ENABLE_AUTOPAUSE}"; then
|
|
||||||
current_max_tick=$( grep 'max-tick-time' "$SERVER_PROPERTIES" | sed -r 's/( )+//g' | awk -F= '{print $2}' )
|
|
||||||
if (( $current_max_tick > 0 && $current_max_tick < 86400000 )); then
|
|
||||||
log "Warning: The server.properties for the server doesn't have the Server Watchdog (effectively) disabled."
|
|
||||||
log "Warning (cont): Autopause functionality resuming the process might trigger the Watchdog and restart the server completely."
|
|
||||||
log "Warning (cont): Set the max-tick-time property to a high value (or disable the Watchdog with value -1 for versions 1.8.1+)."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if isDebugging; then
|
|
||||||
log "DEBUG Dumping server.properties"
|
|
||||||
cat "${SERVER_PROPERTIES}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupEnvVariables $@
|
|
||||||
62
start-spiget
62
start-spiget
@@ -1,62 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -euo pipefail
|
|
||||||
IFS=$'\n\t'
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
handleDebugMode
|
|
||||||
|
|
||||||
: ${SPIGET_RESOURCES:=}
|
|
||||||
|
|
||||||
containsJars() {
|
|
||||||
file=${1?}
|
|
||||||
|
|
||||||
pat='\.jar$'
|
|
||||||
|
|
||||||
while read -r line; do
|
|
||||||
if [[ $line =~ $pat ]]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done <<<$(unzip -l "$file")
|
|
||||||
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
getResourceFromSpiget() {
|
|
||||||
resource=${1?}
|
|
||||||
|
|
||||||
log "Downloading resource ${resource} ..."
|
|
||||||
|
|
||||||
tmpfile="/tmp/${resource}.zip"
|
|
||||||
url="https://api.spiget.org/v2/resources/${resource}/download"
|
|
||||||
if ! curl -o "${tmpfile}" -fsSL -H "User-Agent: itzg/minecraft-server" "${extraCurlArgs[@]}" "${url}"; then
|
|
||||||
log "ERROR failed to download resource '${resource}' from ${url}"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p /data/plugins
|
|
||||||
if containsJars "${tmpfile}"; then
|
|
||||||
log "Extracting contents of resource ${resource} into plugins"
|
|
||||||
unzip -o -q -d /data/plugins "${tmpfile}"
|
|
||||||
rm "${tmpfile}"
|
|
||||||
else
|
|
||||||
log "Moving resource ${resource} into plugins"
|
|
||||||
mv "${tmpfile}" "/data/plugins/${resource}.jar"
|
|
||||||
fi
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if [[ ${SPIGET_RESOURCES} ]]; then
|
|
||||||
if isTrue ${REMOVE_OLD_MODS:-false}; then
|
|
||||||
removeOldMods /data/plugins
|
|
||||||
REMOVE_OLD_MODS=false
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "Getting plugins via Spiget"
|
|
||||||
IFS=',' read -r -a resources <<<"${SPIGET_RESOURCES}"
|
|
||||||
for resource in "${resources[@]}"; do
|
|
||||||
getResourceFromSpiget "${resource}"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Continue to Final Setup
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
|
|
||||||
if ! [[ -v CURSE_INSTANCE_JSON ]]; then
|
|
||||||
log "ERROR: CURSE_INSTANCE_JSON needs to be set"
|
|
||||||
exit 2
|
|
||||||
elif ! [ -f "${CURSE_INSTANCE_JSON}" ] && [ -f "${CURSE_INSTANCE_JSON}/minecraftinstance.json" ]; then
|
|
||||||
CURSE_INSTANCE_JSON="${CURSE_INSTANCE_JSON}/minecraftinstance.json"
|
|
||||||
elif ! [ -f "${CURSE_INSTANCE_JSON}" ]; then
|
|
||||||
log "ERROR: CURSE_INSTANCE_JSON file does not exist: ${CURSE_INSTANCE_JSON}"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "Resolved CURSE_INSTANCE_JSON as ${CURSE_INSTANCE_JSON}"
|
|
||||||
|
|
||||||
# Continue to Final Setup
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetupWorld "$@"
|
|
||||||
15
tests/generic-packs/docker-compose.test.yml
Normal file
15
tests/generic-packs/docker-compose.test.yml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
mc:
|
||||||
|
image: itzg/minecraft-server
|
||||||
|
environment:
|
||||||
|
EULA: "true"
|
||||||
|
GENERIC_PACKS: https://github.com/itzg/mc-image-helper/releases/download/v1.9.5/mc-image-helper-1.9.5.zip,/packs/testing.zip
|
||||||
|
DEBUG: "true"
|
||||||
|
volumes:
|
||||||
|
- ./packs:/packs
|
||||||
|
- data:/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data: {}
|
||||||
BIN
tests/generic-packs/packs/testing.zip
Normal file
BIN
tests/generic-packs/packs/testing.zip
Normal file
Binary file not shown.
Reference in New Issue
Block a user