mirror of
https://github.com/itzg/docker-minecraft-server.git
synced 2026-02-17 15:13:55 +00:00
Compare commits
124 Commits
java17
...
2021.25.0-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
51002c956e | ||
|
|
de62cf8dc7 | ||
|
|
c9d5ad7530 | ||
|
|
1be933bd63 | ||
|
|
99b792dec1 | ||
|
|
ee5267cf41 | ||
|
|
0a46d0382e | ||
|
|
cc61497f7e | ||
|
|
2c2cbadd9a | ||
|
|
bfc29d289d | ||
|
|
84a1313261 | ||
|
|
39bcfddf3c | ||
|
|
e6ea8197aa | ||
|
|
0184c095fc | ||
|
|
524a7e21f3 | ||
|
|
f817cae945 | ||
|
|
675d05920b | ||
|
|
106a7132d4 | ||
|
|
0e04a10efa | ||
|
|
0d8df635d6 | ||
|
|
e0dedc194d | ||
|
|
ef32e8ed4c | ||
|
|
489b583ad7 | ||
|
|
8c4dff22fb | ||
|
|
455f31c9d8 | ||
|
|
bac1bfb5dc | ||
|
|
9994c64b51 | ||
|
|
92079fc01f | ||
|
|
98378130f2 | ||
|
|
42856da49d | ||
|
|
83b05609d3 | ||
|
|
21fab1bf41 | ||
|
|
2849359a11 | ||
|
|
cd337f34da | ||
|
|
7a9aa760a2 | ||
|
|
2fd405ec5b | ||
|
|
cbfe9a069c | ||
|
|
2db61fd72f | ||
|
|
6e2073fda5 | ||
|
|
ae48a8710e | ||
|
|
3b54a9fd67 | ||
|
|
a66efb1a4f | ||
|
|
83938d8989 | ||
|
|
8335b81bd8 | ||
|
|
b9c379ec6c | ||
|
|
b9ecbf7497 | ||
|
|
eca00e88bf | ||
|
|
2a3169344d | ||
|
|
8ec4f0d244 | ||
|
|
d45250ebf2 | ||
|
|
03110aef99 | ||
|
|
f344e7e823 | ||
|
|
c7fcaf1ec6 | ||
|
|
9d700041a7 | ||
|
|
4af4ed69a5 | ||
|
|
d215c14996 | ||
|
|
4716254b5b | ||
|
|
3c2b7f0718 | ||
|
|
0fd43f5a05 | ||
|
|
fae6479453 | ||
|
|
d9df5bf773 | ||
|
|
13d7248c38 | ||
|
|
3c54954057 | ||
|
|
84823a559d | ||
|
|
d543df768b | ||
|
|
74968389a2 | ||
|
|
1701718515 | ||
|
|
ed6937654c | ||
|
|
73eb6e2e45 | ||
|
|
8b982472a4 | ||
|
|
ab406727d6 | ||
|
|
5fc74a45f7 | ||
|
|
17ecd48cd8 | ||
|
|
4732ce27a6 | ||
|
|
6e10768e7f | ||
|
|
bb47a3705d | ||
|
|
c3e1e92547 | ||
|
|
9ddd768f44 | ||
|
|
62e1ff8ffa | ||
|
|
5f95d135f5 | ||
|
|
8e32d26b0f | ||
|
|
573f064970 | ||
|
|
0bc6f4075b | ||
|
|
4ebcc0ef48 | ||
|
|
57720cf394 | ||
|
|
64b2783f19 | ||
|
|
1dbdd7628a | ||
|
|
4252ec710f | ||
|
|
11d455c284 | ||
|
|
08bc419dc8 | ||
|
|
67c23017d0 | ||
|
|
6e1ba3667c | ||
|
|
0c2f8b903b | ||
|
|
b9335d9cd6 | ||
|
|
0d92092b90 | ||
|
|
e653a41b3f | ||
|
|
82e63c54c4 | ||
|
|
f9c573f598 | ||
|
|
bf8b9cf20d | ||
|
|
0dd5a412d9 | ||
|
|
b389561091 | ||
|
|
6ee055761d | ||
|
|
49f9ff645e | ||
|
|
004cbdb9f7 | ||
|
|
45856a1a81 | ||
|
|
1e615e76e8 | ||
|
|
1c85a685de | ||
|
|
7cd207f40b | ||
|
|
140a8aa90c | ||
|
|
76dcff9d18 | ||
|
|
a9a86d249b | ||
|
|
595760d301 | ||
|
|
6d3f194ce3 | ||
|
|
21c1620f0c | ||
|
|
e78e5af96d | ||
|
|
0fb9700fc7 | ||
|
|
18925ef32c | ||
|
|
f06b990f8a | ||
|
|
75844ae81a | ||
|
|
6bb2323c46 | ||
|
|
7814ca21b5 | ||
|
|
b8806629ec | ||
|
|
4a7f838a0f | ||
|
|
2d07dee4df |
4
.github/release.yml
vendored
4
.github/release.yml
vendored
@@ -1,4 +0,0 @@
|
|||||||
changelog:
|
|
||||||
exclude:
|
|
||||||
authors:
|
|
||||||
- dependabot
|
|
||||||
9
.github/workflows/build-multiarch.yml
vendored
9
.github/workflows/build-multiarch.yml
vendored
@@ -8,7 +8,8 @@ on:
|
|||||||
- java11*
|
- java11*
|
||||||
- java16*
|
- java16*
|
||||||
- java17*
|
- java17*
|
||||||
- test/**
|
- test/*
|
||||||
|
- fix/*
|
||||||
tags:
|
tags:
|
||||||
- "[0-9]+.[0-9]+.[0-9]+"
|
- "[0-9]+.[0-9]+.[0-9]+"
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-java8-multiarch"
|
- "[0-9]+.[0-9]+.[0-9]+-java8-multiarch"
|
||||||
@@ -57,7 +58,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build for test
|
- name: Build for test
|
||||||
uses: docker/build-push-action@v2.7.0
|
uses: docker/build-push-action@v2.7.0
|
||||||
if: github.ref_name == 'master' || startsWith(github.ref_name, 'test/')
|
if: github.ref_name == 'master'
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
platforms: linux/amd64
|
platforms: linux/amd64
|
||||||
@@ -71,7 +72,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
# It is assumed that image variants are merged from master and tested there
|
# It is assumed that image variants are merged from master and tested there
|
||||||
if: github.ref_name == 'master' || startsWith(github.ref_name, 'test/')
|
if: github.ref_name == 'master'
|
||||||
run: |
|
run: |
|
||||||
tests/test.sh
|
tests/test.sh
|
||||||
|
|
||||||
@@ -81,7 +82,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
||||||
push: true
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
# ensure latest base image is used
|
# ensure latest base image is used
|
||||||
pull: true
|
pull: true
|
||||||
|
|||||||
43
.github/workflows/ci.yml
vendored
43
.github/workflows/ci.yml
vendored
@@ -1,43 +0,0 @@
|
|||||||
name: ContinuousIntegration
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- 'dev*'
|
|
||||||
- '!master'
|
|
||||||
- '!java*'
|
|
||||||
- '!multi*'
|
|
||||||
paths-ignore:
|
|
||||||
- "*.md"
|
|
||||||
- "docs/**"
|
|
||||||
- "examples/**"
|
|
||||||
|
|
||||||
env:
|
|
||||||
IMAGE_TO_TEST: ${{ secrets.IMAGE_ORG }}/minecraft-server:test-${{ github.repository_owner }}-${{ github.run_id }}
|
|
||||||
MODS_FORGEAPI_KEY: ${{ secrets.MODS_FORGEAPI_KEY }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2.4.0
|
|
||||||
|
|
||||||
- name: Setup Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v1
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
uses: docker/build-push-action@v2.7.0
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
platforms: linux/amd64
|
|
||||||
tags: ${{ env.IMAGE_TO_TEST }}
|
|
||||||
load: true
|
|
||||||
cache-from: type=gha
|
|
||||||
|
|
||||||
- name: Run Setup Only Tests
|
|
||||||
run: sh tests/setuponlytests/test.sh
|
|
||||||
|
|
||||||
# - name: Run Full Minecraft Service Tests
|
|
||||||
# run: |
|
|
||||||
# tests/fulltests/test.sh
|
|
||||||
26
.github/workflows/discord.yml
vendored
26
.github/workflows/discord.yml
vendored
@@ -1,26 +0,0 @@
|
|||||||
name: discord
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_run:
|
|
||||||
workflows: ["ContinuousIntegration", "Build and Publish", "Build and publish multiarch" ]
|
|
||||||
types:
|
|
||||||
- completed
|
|
||||||
|
|
||||||
env:
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
discord:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 5
|
|
||||||
steps:
|
|
||||||
- name: on-success
|
|
||||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
|
||||||
uses: Ilshidur/action-discord@master
|
|
||||||
with:
|
|
||||||
args: "Github repo: ${{ github.repository }}\n- Branch: ${{ github.event.workflow_run.head_branch }}\n- [Link: to Actions](<${{ github.event.workflow_run.html_url }}>)\n- Status: 🎉 ${{ github.event.workflow_run.conclusion }} 🍏"
|
|
||||||
- name: on-failure
|
|
||||||
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
|
|
||||||
uses: Ilshidur/action-discord@master
|
|
||||||
with:
|
|
||||||
args: "Github repo: ${{ github.repository }}\n- Branch: ${{ github.event.workflow_run.head_branch }}\n- [Link: to Actions](<${{ github.event.workflow_run.html_url }}>)\n- Status: 🤔 ${{ github.event.workflow_run.conclusion }} 💣💥"
|
|
||||||
2
.github/workflows/generate-toc.yml
vendored
2
.github/workflows/generate-toc.yml
vendored
@@ -16,6 +16,6 @@ jobs:
|
|||||||
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.13.1
|
- 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"
|
||||||
17
.github/workflows/issue-label.yml
vendored
17
.github/workflows/issue-label.yml
vendored
@@ -1,17 +0,0 @@
|
|||||||
on:
|
|
||||||
issues:
|
|
||||||
types: [labeled]
|
|
||||||
|
|
||||||
env:
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
labelNotify:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 5
|
|
||||||
steps:
|
|
||||||
- name: notify
|
|
||||||
if: github.event.label.name == 'enhancement' || github.event.label.name == 'bug'
|
|
||||||
uses: Ilshidur/action-discord@master
|
|
||||||
with:
|
|
||||||
args: "[${{ github.event.issue.title }}](<${{ github.event.issue.html_url }}>) added `${{ github.event.label.name }}` label"
|
|
||||||
38
.github/workflows/pr.yml
vendored
38
.github/workflows/pr.yml
vendored
@@ -1,21 +1,15 @@
|
|||||||
name: PullRequest
|
name: Validate PR
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
types: [assigned, opened, synchronize, labeled]
|
|
||||||
paths-ignore:
|
|
||||||
- "*.md"
|
|
||||||
- "docs/**"
|
|
||||||
- "examples/**"
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
IMAGE_TO_TEST: itzg/minecraft-server:test-${{ github.repository_owner }}-${{ github.run_id }}
|
IMAGE_TO_TEST: itzg/minecraft-server:test-${{ github.repository_owner }}-${{ github.run_id }}
|
||||||
MODS_FORGEAPI_KEY: ${{ secrets.MODS_FORGEAPI_KEY }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2.4.0
|
- uses: actions/checkout@v2.4.0
|
||||||
@@ -31,34 +25,8 @@ jobs:
|
|||||||
tags: ${{ env.IMAGE_TO_TEST }}
|
tags: ${{ env.IMAGE_TO_TEST }}
|
||||||
load: true
|
load: true
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: |
|
run: |
|
||||||
tests/test.sh
|
tests/test.sh
|
||||||
|
|
||||||
- name: Gather Docker metadata
|
|
||||||
if: contains(github.event.pull_request.labels.*.name, 'ci/push-image')
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v3
|
|
||||||
with:
|
|
||||||
images: |
|
|
||||||
itzg/minecraft-server
|
|
||||||
|
|
||||||
- name: Login to DockerHub
|
|
||||||
if: contains(github.event.pull_request.labels.*.name, 'ci/push-image')
|
|
||||||
uses: docker/login-action@v1
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_USER }}
|
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Push
|
|
||||||
if: contains(github.event.pull_request.labels.*.name, 'ci/push-image')
|
|
||||||
uses: docker/build-push-action@v2.7.0
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
pull: true
|
|
||||||
push: true
|
|
||||||
cache-from: type=gha
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
|
|||||||
4
.github/workflows/stale-check.yml
vendored
4
.github/workflows/stale-check.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- name: Process Stale Issues
|
- name: Process Stale Issues
|
||||||
uses: actions/stale@v4.1.0
|
uses: actions/stale@v4.0.0
|
||||||
with:
|
with:
|
||||||
stale-issue-label: status/stale
|
stale-issue-label: status/stale
|
||||||
stale-pr-label: status/stale
|
stale-pr-label: status/stale
|
||||||
@@ -21,5 +21,5 @@ jobs:
|
|||||||
Please add a comment describing the reason to keep this issue open.
|
Please add a comment describing the reason to keep this issue open.
|
||||||
days-before-stale: 30
|
days-before-stale: 30
|
||||||
days-before-close: 5
|
days-before-close: 5
|
||||||
exempt-issue-labels: 'enhancement,keep,status/needs triage,priority/high'
|
exempt-issue-labels: 'enhancement,keep,status/needs triage'
|
||||||
|
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,5 +1,4 @@
|
|||||||
.vscode
|
|
||||||
/data/
|
/data/
|
||||||
/.idea/
|
/.idea/
|
||||||
*.iml
|
*.iml
|
||||||
/gh-md-toc
|
/gh-md-toc
|
||||||
82
Dockerfile
82
Dockerfile
@@ -1,31 +1,29 @@
|
|||||||
FROM eclipse-temurin:17-jdk
|
FROM openjdk:8-jdk-alpine
|
||||||
|
|
||||||
LABEL org.opencontainers.image.authors="Geoff Bourne <itzgeoff@gmail.com>"
|
LABEL org.opencontainers.image.authors="Geoff Bourne <itzgeoff@gmail.com>"
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apk add --no-cache -U \
|
||||||
&& DEBIAN_FRONTEND=noninteractive \
|
openssl \
|
||||||
apt-get install -y \
|
imagemagick \
|
||||||
imagemagick \
|
lsof \
|
||||||
file \
|
su-exec \
|
||||||
gosu \
|
shadow \
|
||||||
sudo \
|
bash \
|
||||||
net-tools \
|
curl iputils wget \
|
||||||
iputils-ping \
|
git \
|
||||||
curl \
|
jq \
|
||||||
git \
|
mysql-client \
|
||||||
jq \
|
tzdata \
|
||||||
dos2unix \
|
rsync \
|
||||||
mysql-client \
|
nano \
|
||||||
tzdata \
|
sudo \
|
||||||
rsync \
|
knock \
|
||||||
nano \
|
ttf-dejavu
|
||||||
unzip \
|
|
||||||
knockd \
|
|
||||||
ttf-dejavu \
|
|
||||||
&& apt-get clean
|
|
||||||
|
|
||||||
RUN addgroup --gid 1000 minecraft \
|
RUN addgroup -g 1000 minecraft \
|
||||||
&& adduser --system --shell /bin/false --uid 1000 --ingroup minecraft --home /data minecraft
|
&& adduser -Ss /bin/false -u 1000 -G minecraft -h /home/minecraft minecraft \
|
||||||
|
&& mkdir -m 777 /data \
|
||||||
|
&& chown minecraft:minecraft /data /home/minecraft
|
||||||
|
|
||||||
COPY --chmod=644 files/sudoers* /etc/sudoers.d
|
COPY --chmod=644 files/sudoers* /etc/sudoers.d
|
||||||
|
|
||||||
@@ -33,9 +31,9 @@ EXPOSE 25565 25575
|
|||||||
|
|
||||||
# hook into docker BuildKit --platform support
|
# hook into docker BuildKit --platform support
|
||||||
# see https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope
|
# see https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope
|
||||||
ARG TARGETOS
|
ARG TARGETOS=linux
|
||||||
ARG TARGETARCH
|
ARG TARGETARCH=amd64
|
||||||
ARG TARGETVARIANT
|
ARG TARGETVARIANT=""
|
||||||
|
|
||||||
ARG EASY_ADD_VER=0.7.1
|
ARG EASY_ADD_VER=0.7.1
|
||||||
ADD https://github.com/itzg/easy-add/releases/download/${EASY_ADD_VER}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add
|
ADD https://github.com/itzg/easy-add/releases/download/${EASY_ADD_VER}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add
|
||||||
@@ -46,26 +44,26 @@ 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.5.1 --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.10.3 --var app=mc-monitor --file {{.app}} \
|
--var version=0.10.3 --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.8.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
|
||||||
|
|
||||||
ARG MC_HELPER_VERSION=1.16.0
|
ARG MC_HELPER_VERSION=1.10.0
|
||||||
ARG MC_HELPER_BASE_URL=https://github.com/itzg/mc-image-helper/releases/download/v${MC_HELPER_VERSION}
|
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 \
|
RUN curl -fsSL ${MC_HELPER_BASE_URL}/mc-image-helper-${MC_HELPER_VERSION}.tgz \
|
||||||
| tar -C /usr/share -zxf - \
|
| tar -C /usr/share -zxf - \
|
||||||
&& ln -s /usr/share/mc-image-helper-${MC_HELPER_VERSION}/bin/mc-image-helper /usr/bin
|
&& ln -s /usr/share/mc-image-helper-${MC_HELPER_VERSION}/bin/mc-image-helper /usr/bin
|
||||||
|
|
||||||
VOLUME ["/data"]
|
VOLUME ["/data"]
|
||||||
WORKDIR /data
|
WORKDIR /data
|
||||||
@@ -73,12 +71,11 @@ WORKDIR /data
|
|||||||
STOPSIGNAL SIGTERM
|
STOPSIGNAL SIGTERM
|
||||||
|
|
||||||
ENV UID=1000 GID=1000 \
|
ENV UID=1000 GID=1000 \
|
||||||
MEMORY="1G" \
|
JVM_XX_OPTS="-XX:+UseG1GC" 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 \
|
||||||
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
|
||||||
ENABLE_AUTOSTOP=false AUTOSTOP_TIMEOUT_EST=3600 AUTOSTOP_TIMEOUT_INIT=1800 AUTOSTOP_PERIOD=10
|
|
||||||
|
|
||||||
COPY --chmod=755 scripts/start* /
|
COPY --chmod=755 scripts/start* /
|
||||||
COPY --chmod=755 bin/ /usr/local/bin/
|
COPY --chmod=755 bin/ /usr/local/bin/
|
||||||
@@ -86,9 +83,8 @@ COPY --chmod=755 bin/mc-health /health.sh
|
|||||||
COPY --chmod=644 files/server.properties /tmp/server.properties
|
COPY --chmod=644 files/server.properties /tmp/server.properties
|
||||||
COPY --chmod=644 files/log4j2.xml /tmp/log4j2.xml
|
COPY --chmod=644 files/log4j2.xml /tmp/log4j2.xml
|
||||||
COPY --chmod=755 files/autopause /autopause
|
COPY --chmod=755 files/autopause /autopause
|
||||||
COPY --chmod=755 files/autostop /autostop
|
|
||||||
|
|
||||||
RUN dos2unix /start* /autopause/* /autostop/*
|
RUN dos2unix /start* /autopause/*
|
||||||
|
|
||||||
ENTRYPOINT [ "/start" ]
|
ENTRYPOINT [ "/start" ]
|
||||||
HEALTHCHECK --start-period=1m CMD mc-health
|
HEALTHCHECK --start-period=1m CMD mc-health
|
||||||
|
|||||||
189
README.md
189
README.md
@@ -24,7 +24,6 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
**TABLE OF CONTENTS**
|
**TABLE OF CONTENTS**
|
||||||
|
|
||||||
<!--ts-->
|
<!--ts-->
|
||||||
* [Mitigated Log4jShell Vulnerability](#mitigated-log4jshell-vulnerability)
|
|
||||||
* [Looking for a Bedrock Dedicated Server](#looking-for-a-bedrock-dedicated-server)
|
* [Looking for a Bedrock Dedicated Server](#looking-for-a-bedrock-dedicated-server)
|
||||||
* [Interacting with the server](#interacting-with-the-server)
|
* [Interacting with the server](#interacting-with-the-server)
|
||||||
* [Data Directory](#data-directory)
|
* [Data Directory](#data-directory)
|
||||||
@@ -46,7 +45,6 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [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 an Airplane server](#running-an-airplane-server)
|
* [Running an Airplane server](#running-an-airplane-server)
|
||||||
* [Running a Pufferfish server](#running-a-pufferfish-server)
|
|
||||||
* [Running a Purpur server](#running-a-purpur-server)
|
* [Running a Purpur server](#running-a-purpur-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)
|
||||||
@@ -68,7 +66,6 @@ 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, Fabric, and Bukkit-like Servers](#downloadable-modplugin-pack-for-forge-fabric-and-bukkit-like-servers)
|
* [Downloadable mod/plugin pack for Forge, Fabric, and Bukkit-like Servers](#downloadable-modplugin-pack-for-forge-fabric-and-bukkit-like-servers)
|
||||||
* [<strong>ForgeAPI</strong> usage to use non-version specific projects](#forgeapi-usage-to-use-non-version-specific-projects)
|
|
||||||
* [Generic pack file](#generic-pack-file)
|
* [Generic pack file](#generic-pack-file)
|
||||||
* [Mod/Plugin URL Listing File](#modplugin-url-listing-file)
|
* [Mod/Plugin URL Listing File](#modplugin-url-listing-file)
|
||||||
* [Remove old mods/plugins](#remove-old-modsplugins)
|
* [Remove old mods/plugins](#remove-old-modsplugins)
|
||||||
@@ -76,8 +73,6 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [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)
|
||||||
* [Datapacks](#datapacks)
|
|
||||||
* [VanillaTweaks](#vanillatweaks)
|
|
||||||
* [Server configuration](#server-configuration)
|
* [Server configuration](#server-configuration)
|
||||||
* [Message of the Day](#message-of-the-day)
|
* [Message of the Day](#message-of-the-day)
|
||||||
* [Difficulty](#difficulty)
|
* [Difficulty](#difficulty)
|
||||||
@@ -133,22 +128,16 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [Explicitly disable GUI](#explicitly-disable-gui)
|
* [Explicitly disable GUI](#explicitly-disable-gui)
|
||||||
* [Stop Duration](#stop-duration)
|
* [Stop Duration](#stop-duration)
|
||||||
* [Setup only](#setup-only)
|
* [Setup only](#setup-only)
|
||||||
* [Enable Flare Flags](#enable-flare-flags)
|
|
||||||
* [Autopause](#autopause)
|
* [Autopause](#autopause)
|
||||||
* [Description](#description)
|
* [Description](#description)
|
||||||
* [Enabling Autopause](#enabling-autopause)
|
* [Enabling Autopause](#enabling-autopause)
|
||||||
* [Autostop](#autostop)
|
|
||||||
* [Running on RaspberryPi](#running-on-raspberrypi)
|
* [Running on RaspberryPi](#running-on-raspberrypi)
|
||||||
* [Contributing](#contributing)
|
* [Contributing](#contributing)
|
||||||
|
|
||||||
<!-- Added by: runner, at: Mon Jan 24 04:19:37 UTC 2022 -->
|
<!-- Added by: runner, at: Sat Dec 11 22:09:10 UTC 2021 -->
|
||||||
|
|
||||||
<!--te-->
|
<!--te-->
|
||||||
|
|
||||||
## Mitigated Log4jShell Vulnerability
|
|
||||||
|
|
||||||
**Please ensure you have pulled the latest image** since [all official mitigations](https://www.minecraft.net/en-us/article/important-message--security-vulnerability-java-edition) are automatically applied by the container startup process.
|
|
||||||
|
|
||||||
## Looking for a Bedrock Dedicated Server
|
## Looking for a Bedrock Dedicated Server
|
||||||
|
|
||||||
For Minecraft clients running on consoles, mobile, or native Windows, you'll need to
|
For Minecraft clients running on consoles, mobile, or native Windows, you'll need to
|
||||||
@@ -292,8 +281,8 @@ When using the image `itzg:/minecraft-server` without a tag, the `latest` image
|
|||||||
| java8-openj9 | 8 | Debian | OpenJ9 | amd64 |
|
| java8-openj9 | 8 | Debian | OpenJ9 | amd64 |
|
||||||
| java11 | 11 | Debian | Hotspot | amd64,arm64,armv7 |
|
| java11 | 11 | Debian | Hotspot | amd64,arm64,armv7 |
|
||||||
| java11-openj9 | 11 | Debian | OpenJ9 | amd64 |
|
| java11-openj9 | 11 | Debian | OpenJ9 | amd64 |
|
||||||
|
| java16-openj9 | 16 | Debian | OpenJ9 | amd64 |
|
||||||
| java17 | 17 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
| java17 | 17 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||||
| java17-openj9 | 17 | Debian | OpenJ9 | amd64 |
|
|
||||||
|
|
||||||
For example, to use Java version 8 on any supported architecture:
|
For example, to use Java version 8 on any supported architecture:
|
||||||
|
|
||||||
@@ -311,7 +300,7 @@ The following image tags have been deprecated and are no longer receiving update
|
|||||||
- adopt15
|
- adopt15
|
||||||
- openj9-nightly
|
- openj9-nightly
|
||||||
- multiarch-latest
|
- multiarch-latest
|
||||||
- java16/java16-openj9
|
- java16
|
||||||
|
|
||||||
## Healthcheck
|
## Healthcheck
|
||||||
|
|
||||||
@@ -463,13 +452,19 @@ Plugins can either be managed within the `plugins` subdirectory of the [data dir
|
|||||||
|
|
||||||
Enable Paper server mode by adding a `-e TYPE=PAPER` to your command-line.
|
Enable Paper server mode by adding a `-e TYPE=PAPER` to your command-line.
|
||||||
|
|
||||||
By default, the container will run the latest build of [Paper server](https://papermc.io/downloads) but you can also choose to run a specific build with `-e PAPERBUILD=205`.
|
By default the container will run the latest build of [Paper server](https://papermc.io/downloads)
|
||||||
|
but you can also choose to run a specific build with `-e PAPERBUILD=205`.
|
||||||
|
|
||||||
docker run -d -v /path/on/host:/data \
|
docker run -d -v /path/on/host:/data \
|
||||||
-e TYPE=PAPER \
|
-e TYPE=PAPER \
|
||||||
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
|
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
|
||||||
|
|
||||||
If you are hosting your own copy of Paper you can override the download URL with `PAPER_DOWNLOAD_URL=<url>`.
|
If you are hosting your own copy of Paper you can override the download URL with:
|
||||||
|
|
||||||
|
- -e PAPER_DOWNLOAD_URL=<url>
|
||||||
|
|
||||||
|
An example compose file is provided at
|
||||||
|
[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](#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.
|
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.
|
||||||
|
|
||||||
@@ -481,24 +476,12 @@ An [Airplane](https://airplane.gg) server, which is "a stable, optimized, well s
|
|||||||
|
|
||||||
-e TYPE=AIRPLANE
|
-e TYPE=AIRPLANE
|
||||||
|
|
||||||
> NOTE: The `VERSION` variable is used to select an Airplane type to download. The available options are "LATEST" and "PURPUR", both 1.17.1. Airplane does not support 1.18 -- use Paper/Pufferfish/Purpur.
|
> 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"
|
||||||
|
|
||||||
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 built-in [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 Pufferfish server
|
|
||||||
|
|
||||||
A [Pufferfish](https://github.com/pufferfish-gg/Pufferfish) server, which is "a highly optimized Paper fork designed for large servers requiring both maximum performance, stability, and "enterprise" features."
|
|
||||||
|
|
||||||
-e TYPE=PUFFERFISH
|
|
||||||
|
|
||||||
> NOTE: The `VERSION` variable is used to select a Pufferfish branch to download from. The available options are "LATEST" and "1.18"
|
|
||||||
|
|
||||||
Extra variables:
|
|
||||||
- `PUFFERFISH_BUILD=lastSuccessfulBuild` : set a specific Pufferfish build to use
|
|
||||||
- `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 built-in [Flare](https://blog.airplane.gg/flare) profiler
|
|
||||||
|
|
||||||
### Running a Purpur server
|
### Running a Purpur server
|
||||||
|
|
||||||
@@ -511,7 +494,7 @@ A [Purpur](https://purpur.pl3x.net/) server, which is "drop-in replacement for P
|
|||||||
Extra variables:
|
Extra variables:
|
||||||
- `PURPUR_BUILD=LATEST` : set a specific Purpur build to use
|
- `PURPUR_BUILD=LATEST` : set a specific Purpur 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 built-in [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 Magma server
|
### Running a Magma server
|
||||||
|
|
||||||
@@ -588,8 +571,6 @@ Configuration options with defaults:
|
|||||||
- `LIMBO_SCHEMA_FILENAME`=default.schem
|
- `LIMBO_SCHEMA_FILENAME`=default.schem
|
||||||
- `LEVEL`="Default;${LIMBO_SCHEMA_FILENAME}"
|
- `LEVEL`="Default;${LIMBO_SCHEMA_FILENAME}"
|
||||||
|
|
||||||
> NOTE: instead of using format codes in the MOTD, Limbo requires [JSON chat content](https://minecraft.fandom.com/wiki/Raw_JSON_text_format#Java_Edition). If a plain string is provided, which is the default, then it gets converted into the required JSON structure.
|
|
||||||
|
|
||||||
### Running a Crucible server
|
### Running a Crucible server
|
||||||
|
|
||||||
A [Crucible](https://github.com/CrucibleMC/Crucible) server can be run by setting `TYPE` to `CRUCIBLE`.
|
A [Crucible](https://github.com/CrucibleMC/Crucible) server can be run by setting `TYPE` to `CRUCIBLE`.
|
||||||
@@ -744,47 +725,6 @@ 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 ...
|
||||||
|
|
||||||
### **ForgeAPI** usage to use non-version specific projects
|
|
||||||
|
|
||||||
**NOTE:** This potentially could lead to unexpected behavior if the Mod recieves an update with unexpected behavior.
|
|
||||||
|
|
||||||
This is more complicated because you will be pulling/using the latest mod for the release of your game. To get started make sure you have a [CursedForge API Key](https://docs.curseforge.com/#getting-started). Then use the environmental parameters in your docker build.
|
|
||||||
|
|
||||||
Parameters to use the ForgeAPI:
|
|
||||||
|
|
||||||
* `MODS_FORGEAPI_KEY` - Required
|
|
||||||
* `MODS_FORGEAPI_FILE` - Required or use MODS_FORGEAPI_PROJECTIDS (Overrides MODS_FORGEAPI_PROJECTIDS)
|
|
||||||
* `MODS_FORGEAPI_PROJECTIDS` - Required or use MODS_FORGEAPI_FILE
|
|
||||||
* `MODS_FORGEAPI_RELEASES` - Default is release, Options: [Release|Beta|Alpha]
|
|
||||||
* `REMOVE_OLD_FORGEAPI_MODS` - Default is False
|
|
||||||
* `REMOVE_OLD_DATAPACKS_DEPTH` - Default is 1
|
|
||||||
* `REMOVE_OLD_DATAPACKS_INCLUDE` - Default is *.jar
|
|
||||||
|
|
||||||
Example of expected forge api project ids, releases, and key:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
MODS_FORGEAPI_PROJECTIDS: 306612,256717
|
|
||||||
MODS_FORGEAPI_RELEASES: Release
|
|
||||||
MODS_FORGEAPI_KEY: $WRX...
|
|
||||||
```
|
|
||||||
|
|
||||||
Example of expected ForgeAPI file format: **Note**: name is currently unused, but can be used to document each entry.
|
|
||||||
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"name": "fabric api",
|
|
||||||
"projectId": "306612",
|
|
||||||
"releaseType": "release"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "fabric voice mod",
|
|
||||||
"projectId": "416089",
|
|
||||||
"releaseType": "beta"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Generic pack file
|
### 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.
|
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.
|
||||||
@@ -829,19 +769,23 @@ before unpacking new content from the MODPACK or MODS.
|
|||||||
|
|
||||||
### Downloadable world
|
### Downloadable world
|
||||||
|
|
||||||
Instead of mounting the `/data` volume, you can instead specify the URL of a ZIP or compressed TAR file containing an archived world. It will be searched for a file `level.dat` and the containing subdirectory moved to the directory named by `$LEVEL`. This means that most of the archived Minecraft worlds downloadable from the Internet will already be in the correct format.
|
Instead of mounting the `/data` volume, you can instead specify the URL of a ZIP file containing an archived world. It will be searched for a file `level.dat` and the containing subdirectory moved to the directory named by `$LEVEL`. This means that most of the archived Minecraft worlds downloadable from the Internet will already be in the correct format.
|
||||||
|
|
||||||
docker run -d -e WORLD=http://www.example.com/worlds/MySave.zip ...
|
docker run -d -e WORLD=http://www.example.com/worlds/MySave.zip ...
|
||||||
|
|
||||||
**NOTE:** This URL must be accessible from inside the container. Therefore, you should use an IP address or a globally resolvable FQDN, or else the name of a linked container.
|
**NOTE:** This URL must be accessible from inside the container. Therefore,
|
||||||
|
you should use an IP address or a globally resolvable FQDN, or else the
|
||||||
|
name of a linked container.
|
||||||
|
|
||||||
**NOTE:** If the archive contains more than one `level.dat`, then the one to select can be picked with `WORLD_INDEX`, which defaults to 1.
|
**NOTE:** If the archive contains more than one `level.dat`, then the one to select can be picked with `WORLD_INDEX`, which defaults to 1.
|
||||||
|
|
||||||
### Cloning world from a container path
|
### Cloning world from a container path
|
||||||
|
|
||||||
The `WORLD` option can also be used to reference a directory, zip file, or compressed tar file that will be used as a source to clone or extract the world directory.
|
The `WORLD` option can also be used to reference a directory or zip file that will be used as a source to clone or unzip the world directory.
|
||||||
|
|
||||||
For example, the following would initially clone the world's content from `/worlds/basic`. Also notice in the example that you should use a read-only volume attachment to ensure the clone source remains pristine.
|
For example, the following would initially clone the world's content
|
||||||
|
from `/worlds/basic`. Also notice in the example that you can use a
|
||||||
|
read-only volume attachment to ensure the clone source remains pristine.
|
||||||
|
|
||||||
```
|
```
|
||||||
docker run ... -v $HOME/worlds:/worlds:ro -e WORLD=/worlds/basic
|
docker run ... -v $HOME/worlds:/worlds:ro -e WORLD=/worlds/basic
|
||||||
@@ -854,57 +798,6 @@ The following diagram shows how this option can be used in a compose deployment
|
|||||||
### 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.
|
||||||
|
|
||||||
### Datapacks
|
|
||||||
Datapacks can be installed in a similar manner to mods/plugins. There are many environment variables which function in the same way they do for [mods](#working-with-mods-and-plugins):
|
|
||||||
* `DATAPACKS`
|
|
||||||
* `DATAPACKS_FILE`
|
|
||||||
* `REMOVE_OLD_DATAPACKS`
|
|
||||||
* `REMOVE_OLD_DATAPACKS_DEPTH`
|
|
||||||
* `REMOVE_OLD_DATAPACKS_INCLUDE`
|
|
||||||
* `REMOVE_OLD_DATAPACKS_EXCLUDE`
|
|
||||||
Datapacks will be placed in `/data/$LEVEL/datapacks`
|
|
||||||
|
|
||||||
### VanillaTweaks
|
|
||||||
|
|
||||||
VanillaTweaks datapacks can be installed with a share code from the website UI **OR** a json file to specify packs to download and install.
|
|
||||||
|
|
||||||
Accepted Parameters:
|
|
||||||
|
|
||||||
- `VANILLATWEAKS_FILE`
|
|
||||||
- `VANILLATWEAKS_SHARECODE`
|
|
||||||
- `REMOVE_OLD_VANILLATWEAKS`
|
|
||||||
- `REMOVE_OLD_VANILLATWEAKS_DEPTH`
|
|
||||||
- `REMOVE_OLD_VANILLATWEAKS_INCLUDE`
|
|
||||||
- `REMOVE_OLD_VANILLATWEAKS_EXCLUDE`
|
|
||||||
|
|
||||||
Example of expected Vanillatweaks sharecode:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
VANILLATWEAKS_SHARECODE: MGr52E
|
|
||||||
```
|
|
||||||
|
|
||||||
Example of expected Vanillatweaks file format:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"version": "1.18",
|
|
||||||
"packs": {
|
|
||||||
"survival": [
|
|
||||||
"graves",
|
|
||||||
"multiplayer sleep",
|
|
||||||
"afk display",
|
|
||||||
"armor statues",
|
|
||||||
"unlock all recipes",
|
|
||||||
"fast leaf decay",
|
|
||||||
"coordinates hud"
|
|
||||||
],
|
|
||||||
"items": ["armored elytra"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Datapacks will be placed in `/data/$LEVEL/datapacks`
|
|
||||||
|
|
||||||
## Server configuration
|
## Server configuration
|
||||||
|
|
||||||
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.
|
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.
|
||||||
@@ -1501,6 +1394,10 @@ To enable remote JMX, such as for profiling with VisualVM or JMC, add the enviro
|
|||||||
|
|
||||||
When `MEMORY` is greater than or equal to 12G, then the Aikar flags will be adjusted according to the article.
|
When `MEMORY` is greater than or equal to 12G, then the Aikar flags will be adjusted according to the article.
|
||||||
|
|
||||||
|
Large page support can also be enabled by adding
|
||||||
|
|
||||||
|
-e USE_LARGE_PAGES=true
|
||||||
|
|
||||||
### HTTP Proxy
|
### HTTP Proxy
|
||||||
|
|
||||||
You may configure the use of an HTTP/HTTPS proxy by passing the proxy's URL via the `PROXY`
|
You may configure the use of an HTTP/HTTPS proxy by passing the proxy's URL via the `PROXY`
|
||||||
@@ -1525,14 +1422,6 @@ When the container is signalled to stop, the Minecraft process wrapper will atte
|
|||||||
### Setup only
|
### 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`.
|
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`.
|
||||||
|
|
||||||
### Enable Flare Flags
|
|
||||||
|
|
||||||
To enable the JVM flags required to fully support the [Flare profiling suite](https://blog.airplane.gg/flare), set the following variable:
|
|
||||||
|
|
||||||
-e USE_FLARE_FLAGS=true
|
|
||||||
|
|
||||||
Flare is built-in to Airplane/Pufferfish/Purpur, and is available in [plugin form](https://github.com/TECHNOVE/FlarePlugin) for other server types.
|
|
||||||
|
|
||||||
## Autopause
|
## Autopause
|
||||||
|
|
||||||
@@ -1564,8 +1453,6 @@ Enable the Autopause functionality by setting:
|
|||||||
|
|
||||||
Autopause is not compatible with `EXEC_DIRECTLY=true` and the two cannot be set together.
|
Autopause is not compatible with `EXEC_DIRECTLY=true` and the two cannot be set together.
|
||||||
|
|
||||||
> When configuring kubernetes readiness/liveness health checks with auto-pause enabled, be sure to reference the `mc-health` wrapper script rather than `mc-status` directly.
|
|
||||||
|
|
||||||
The following environment variables define the behaviour of auto-pausing:
|
The following environment variables define the behaviour of auto-pausing:
|
||||||
* `AUTOPAUSE_TIMEOUT_EST`, default `3600` (seconds)
|
* `AUTOPAUSE_TIMEOUT_EST`, default `3600` (seconds)
|
||||||
describes the time between the last client disconnect and the pausing of the process (read as timeout established)
|
describes the time between the last client disconnect and the pausing of the process (read as timeout established)
|
||||||
@@ -1578,28 +1465,6 @@ The following environment variables define the behaviour of auto-pausing:
|
|||||||
* `AUTOPAUSE_KNOCK_INTERFACE`, default `eth0`
|
* `AUTOPAUSE_KNOCK_INTERFACE`, default `eth0`
|
||||||
<br>Describes the interface passed to the `knockd` daemon. If the default interface does not work, run the `ifconfig` command inside the container and derive the interface receiving the incoming connection from its output. The passed interface must exist inside the container. Using the loopback interface (`lo`) does likely not yield the desired results.
|
<br>Describes the interface passed to the `knockd` daemon. If the default interface does not work, run the `ifconfig` command inside the container and derive the interface receiving the incoming connection from its output. The passed interface must exist inside the container. Using the loopback interface (`lo`) does likely not yield the desired results.
|
||||||
|
|
||||||
## Autostop
|
|
||||||
|
|
||||||
An option to stop the server after a specified time has been added for niche applications (e.g. billing saving on AWS Fargate). The function is incompatible with the Autopause functionality, as they basically cancel out each other.
|
|
||||||
|
|
||||||
Note that the docker container variables have to be set accordingly (restart policy set to "no") and that the container has to be manually restarted.
|
|
||||||
|
|
||||||
A starting, example compose file has been provided in [examples/docker-compose-autostop.yml](examples/docker-compose-autostop.yml).
|
|
||||||
|
|
||||||
Enable the Autostop functionality by setting:
|
|
||||||
|
|
||||||
```
|
|
||||||
-e ENABLE_AUTOSTOP=TRUE
|
|
||||||
```
|
|
||||||
|
|
||||||
The following environment variables define the behaviour of auto-stopping:
|
|
||||||
* `AUTOSTOP_TIMEOUT_EST`, default `3600` (seconds)
|
|
||||||
describes the time between the last client disconnect and the stopping of the server (read as timeout established)
|
|
||||||
* `AUTOSTOP_TIMEOUT_INIT`, default `1800` (seconds)
|
|
||||||
describes the time between server start and the stopping of the server, when no client connects inbetween (read as timeout initialized)
|
|
||||||
* `AUTOSTOP_PERIOD`, default `10` (seconds)
|
|
||||||
describes period of the daemonized state machine, that handles the stopping of the server
|
|
||||||
|
|
||||||
## Running on RaspberryPi
|
## Running on RaspberryPi
|
||||||
|
|
||||||
To run this image on a RaspberryPi 3 B+, 4, or newer, use any of the image tags [list in the Java version section](#running-minecraft-server-on-different-java-version) that specify `armv7` for the architecture, which includes `itzg/minecraft-server:latest`.
|
To run this image on a RaspberryPi 3 B+, 4, or newer, use any of the image tags [list in the Java version section](#running-minecraft-server-on-different-java-version) that specify `armv7` for the architecture, which includes `itzg/minecraft-server:latest`.
|
||||||
|
|||||||
@@ -12,4 +12,4 @@ if [ ! -p "${CONSOLE_IN_NAMED_PIPE}" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
gosu minecraft bash -c "echo $* > '${CONSOLE_IN_NAMED_PIPE:-/tmp/minecraft-console-in}'"
|
echo "$@" > "${CONSOLE_IN_NAMED_PIPE:-/tmp/minecraft-console-in}"
|
||||||
@@ -7,8 +7,8 @@ branches_list=(
|
|||||||
'java8-openj9'
|
'java8-openj9'
|
||||||
'java11'
|
'java11'
|
||||||
'java11-openj9'
|
'java11-openj9'
|
||||||
|
'java16-openj9'
|
||||||
'java17'
|
'java17'
|
||||||
'java17-openj9'
|
|
||||||
)
|
)
|
||||||
|
|
||||||
function TrapExit {
|
function TrapExit {
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
|
||||||
minecraft:
|
|
||||||
image: itzg/minecraft-server
|
|
||||||
ports:
|
|
||||||
- "25565:25565"
|
|
||||||
volumes:
|
|
||||||
- "mc:/data"
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
ENABLE_AUTOSTOP: "TRUE"
|
|
||||||
# More aggressive settings for demo purposes
|
|
||||||
AUTOSTOP_TIMEOUT_INIT: "30"
|
|
||||||
AUTOSTOP_TIMEOUT_EST: "20"
|
|
||||||
# Important not to auto-restart the server!!!
|
|
||||||
restart: "no"
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
mc: {}
|
|
||||||
@@ -13,7 +13,6 @@ services:
|
|||||||
VERSION: ${VERSION:-1.17.1}
|
VERSION: ${VERSION:-1.17.1}
|
||||||
FORGEVERSION: ${FORGEVERSION:-37.0.90}
|
FORGEVERSION: ${FORGEVERSION:-37.0.90}
|
||||||
GENERIC_PACK: /modpacks/${MODPACK:-Server-Files-0.0.21.zip}
|
GENERIC_PACK: /modpacks/${MODPACK:-Server-Files-0.0.21.zip}
|
||||||
REMOVE_OLD_MODS: "${REMOVE_OLD_MODS:-false}"
|
|
||||||
ports:
|
ports:
|
||||||
- "25565:25565"
|
- "25565:25565"
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,18 @@
|
|||||||
version: '3.8'
|
version: '3.8'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
mc:
|
mc:
|
||||||
image: itzg/minecraft-server
|
image: itzg/minecraft-server
|
||||||
container_name: paper
|
|
||||||
environment:
|
environment:
|
||||||
EULA: "true"
|
EULA: "true"
|
||||||
ENABLE_RCON: "true"
|
|
||||||
TYPE: PAPER
|
TYPE: PAPER
|
||||||
VIEW_DISTANCE: 10
|
VERSION: 1.9.4
|
||||||
MEMORY: 2G
|
# needed for Paper versions before 1.14
|
||||||
CONSOLE: "false"
|
CONSOLE: "false"
|
||||||
ports:
|
ports:
|
||||||
- 25565:25565
|
- 25565:25565
|
||||||
volumes:
|
volumes:
|
||||||
- mc-paper:/data
|
- mc-paper:/data
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
volumes:
|
||||||
mc-paper:
|
mc-paper:
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
version: "3.3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
vanillatweaks_file:
|
|
||||||
restart: "no"
|
|
||||||
image: itzg/minecraft-server
|
|
||||||
ports:
|
|
||||||
- "25565:25565/tcp"
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
|
||||||
VANILLATWEAKS_FILE: /config/vanillatweaks-datapacks.json
|
|
||||||
REMOVE_OLD_VANILLATWEAKS: "TRUE"
|
|
||||||
volumes:
|
|
||||||
- data:/data
|
|
||||||
- ./vanillatweaks-datapacks.json:/config/vanillatweaks-datapacks.json:ro
|
|
||||||
vanillatweaks_sharecode:
|
|
||||||
# port is set to 25566 to not conflict with vanillatweaks_file example
|
|
||||||
ports:
|
|
||||||
- "25566:25565/tcp"
|
|
||||||
restart: "no"
|
|
||||||
image: itzg/minecraft-server
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
|
||||||
VANILLATWEAKS_SHARECODE: MGr52E
|
|
||||||
REMOVE_OLD_VANILLATWEAKS: "TRUE"
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "1.18",
|
|
||||||
"packs": {
|
|
||||||
"survival": [
|
|
||||||
"graves",
|
|
||||||
"multiplayer sleep",
|
|
||||||
"afk display",
|
|
||||||
"armor statues",
|
|
||||||
"unlock all recipes",
|
|
||||||
"fast leaf decay",
|
|
||||||
"coordinates hud"
|
|
||||||
],
|
|
||||||
"items": ["armored elytra"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,15 +5,15 @@ current_uptime() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
java_running() {
|
java_running() {
|
||||||
[[ $( ps -ax -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]]
|
[[ $( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
java_process_exists() {
|
java_process_exists() {
|
||||||
[[ -n "$(ps -ax -o comm | grep 'java')" ]]
|
[[ -n "$(ps -a -o comm | grep 'java')" ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
rcon_client_exists() {
|
rcon_client_exists() {
|
||||||
[[ -n "$(ps -ax -o comm | grep 'rcon-cli')" ]]
|
[[ -n "$(ps -a -o comm | grep 'rcon-cli')" ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
mc_server_listening() {
|
mc_server_listening() {
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
[unpauseMCServer-server]
|
[unpauseMCServer-server]
|
||||||
sequence = 25565
|
sequence = 25565
|
||||||
seq_timeout = 1
|
seq_timeout = 1
|
||||||
command = /usr/sbin/gosu minecraft:minecraft /autopause/resume.sh
|
command = /sbin/su-exec minecraft:minecraft /autopause/resume.sh
|
||||||
tcpflags = syn
|
tcpflags = syn
|
||||||
[unpauseMCServer-rcon]
|
[unpauseMCServer-rcon]
|
||||||
sequence = 25575
|
sequence = 25575
|
||||||
seq_timeout = 1
|
seq_timeout = 1
|
||||||
command = /usr/sbin/gosu minecraft:minecraft /autopause/resume.sh
|
command = /sbin/su-exec minecraft:minecraft /autopause/resume.sh
|
||||||
tcpflags = syn
|
tcpflags = syn
|
||||||
[unpauseMCServer-bedrock]
|
[unpauseMCServer-bedrock]
|
||||||
sequence = 19132:udp
|
sequence = 19132:udp
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
. /start-utils
|
. /start-utils
|
||||||
|
|
||||||
if [[ $( ps -ax -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]] ; then
|
if [[ $( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]] ; then
|
||||||
# save world
|
# save world
|
||||||
rcon-cli save-all >/dev/null
|
rcon-cli save-all >/dev/null
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
. /start-utils
|
. /start-utils
|
||||||
|
|
||||||
if [[ $( ps -ax -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^T.*$ ]] ; then
|
if [[ $( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^T.*$ ]] ; then
|
||||||
logAutopauseAction "Knocked, resuming Java process"
|
logAutopauseAction "Knocked, resuming Java process"
|
||||||
pkill -CONT java
|
pkill -CONT java
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,69 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# needed for the clients connected function residing in autopause
|
|
||||||
. /autopause/autopause-fcns.sh
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
|
|
||||||
# wait for java process to be started
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
if java_process_exists ; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
sleep 0.1
|
|
||||||
done
|
|
||||||
|
|
||||||
STATE=INIT
|
|
||||||
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
case X$STATE in
|
|
||||||
XINIT)
|
|
||||||
# Server startup
|
|
||||||
if mc_server_listening ; then
|
|
||||||
TIME_THRESH=$(($(current_uptime)+$AUTOSTOP_TIMEOUT_INIT))
|
|
||||||
logAutostop "MC Server listening for connections - stopping in $AUTOSTOP_TIMEOUT_INIT seconds"
|
|
||||||
STATE=II
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
XII)
|
|
||||||
# Initial idle
|
|
||||||
if java_clients_connected ; then
|
|
||||||
logAutostop "Client connected - waiting for disconnect"
|
|
||||||
STATE=E
|
|
||||||
else
|
|
||||||
if [[ $(current_uptime) -ge $TIME_THRESH ]] ; then
|
|
||||||
logAutostop "No client connected since startup - stopping server"
|
|
||||||
/autostop/stop.sh
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
XE)
|
|
||||||
# Established
|
|
||||||
if ! java_clients_connected ; then
|
|
||||||
TIME_THRESH=$(($(current_uptime)+$AUTOSTOP_TIMEOUT_EST))
|
|
||||||
logAutostop "All clients disconnected - stopping in $AUTOSTOP_TIMEOUT_EST seconds"
|
|
||||||
STATE=I
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
XI)
|
|
||||||
# Idle
|
|
||||||
if java_clients_connected ; then
|
|
||||||
logAutostop "Client reconnected - waiting for disconnect"
|
|
||||||
STATE=E
|
|
||||||
else
|
|
||||||
if [[ $(current_uptime) -ge $TIME_THRESH ]] ; then
|
|
||||||
logAutostop "No client reconnected - stopping"
|
|
||||||
/autostop/stop.sh
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
logAutostop "Error: invalid state: $STATE"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
sleep $AUTOSTOP_PERIOD
|
|
||||||
done
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. /start-utils
|
|
||||||
|
|
||||||
logAutostopAction "Stopping Java process"
|
|
||||||
kill -SIGTERM 1
|
|
||||||
@@ -40,7 +40,7 @@ if ! isTrue "${SKIP_SUDO:-false}" && [ $(id -u) = 0 ]; then
|
|||||||
echo 'hosts: files dns' > /etc/nsswitch.conf
|
echo 'hosts: files dns' > /etc/nsswitch.conf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec gosu ${runAsUser}:${runAsGroup} ${SCRIPTS:-/}start-configuration "$@"
|
exec su-exec ${runAsUser}:${runAsGroup} ${SCRIPTS:-/}start-configuration $@
|
||||||
else
|
else
|
||||||
exec ${SCRIPTS:-/}start-configuration "$@"
|
exec ${SCRIPTS:-/}start-configuration $@
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
|
|
||||||
: "${SERVER_PORT:=25565}"
|
|
||||||
export SERVER_PORT
|
|
||||||
|
|
||||||
log "Autostop functionality enabled"
|
|
||||||
|
|
||||||
isDebugging && set -x
|
|
||||||
|
|
||||||
if ! [[ $AUTOSTOP_PERIOD =~ ^[0-9]+$ ]]; then
|
|
||||||
AUTOSTOP_PERIOD=10
|
|
||||||
export AUTOSTOP_PERIOD
|
|
||||||
log "Warning: AUTOSTOP_PERIOD is not numeric, set to 10 (seconds)"
|
|
||||||
fi
|
|
||||||
if [ "$AUTOSTOP_PERIOD" -eq "0" ] ; then
|
|
||||||
AUTOSTOP_PERIOD=10
|
|
||||||
export AUTOSTOP_PERIOD
|
|
||||||
log "Warning: AUTOSTOP_PERIOD must not be 0, set to 10 (seconds)"
|
|
||||||
fi
|
|
||||||
if ! [[ $AUTOSTOP_TIMEOUT_EST =~ ^[0-9]+$ ]] ; then
|
|
||||||
AUTOSTOP_TIMEOUT_EST=3600
|
|
||||||
export AUTOSTOP_TIMEOUT_EST
|
|
||||||
log "Warning: AUTOSTOP_TIMEOUT_EST is not numeric, set to 3600 (seconds)"
|
|
||||||
fi
|
|
||||||
if ! [[ $AUTOSTOP_TIMEOUT_INIT =~ ^[0-9]+$ ]] ; then
|
|
||||||
AUTOSTOP_TIMEOUT_INIT=1800
|
|
||||||
export AUTOSTOP_TIMEOUT_INIT
|
|
||||||
log "Warning: AUTOSTOP_TIMEOUT_INIT is not numeric, set to 1800 (seconds)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
/autostop/autostop-daemon.sh &
|
|
||||||
@@ -37,11 +37,6 @@ if isTrue "${ENABLE_AUTOPAUSE}" && isTrue "${EXEC_DIRECTLY:-false}"; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if isTrue "${ENABLE_AUTOPAUSE}" && isTrue "${ENABLE_AUTOSTOP}"; then
|
|
||||||
log "ENABLE_AUTOPAUSE=true is incompatible with ENABLE_AUTOSTOP=true"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $PROXY ]]; then
|
if [[ $PROXY ]]; then
|
||||||
export http_proxy="$PROXY"
|
export http_proxy="$PROXY"
|
||||||
export https_proxy="$PROXY"
|
export https_proxy="$PROXY"
|
||||||
@@ -68,7 +63,7 @@ fi
|
|||||||
|
|
||||||
if ! which java > /dev/null; then
|
if ! which java > /dev/null; then
|
||||||
log "Fixing PATH to include java"
|
log "Fixing PATH to include java"
|
||||||
PATH="${PATH}:/opt/java/openjdk/bin"
|
PATH="${PATH}:/usr/bin"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export VERSIONS_JSON=https://launchermeta.mojang.com/mc/game/version_manifest.json
|
export VERSIONS_JSON=https://launchermeta.mojang.com/mc/game/version_manifest.json
|
||||||
@@ -101,10 +96,6 @@ if isTrue "${ENABLE_AUTOPAUSE}"; then
|
|||||||
${SCRIPTS:-/}start-autopause
|
${SCRIPTS:-/}start-autopause
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if isTrue "${ENABLE_AUTOSTOP}"; then
|
|
||||||
${SCRIPTS:-/}start-autostop
|
|
||||||
fi
|
|
||||||
|
|
||||||
if versionLessThan 1.7; then
|
if versionLessThan 1.7; then
|
||||||
echo "
|
echo "
|
||||||
MC_HEALTH_EXTRA_ARGS=(
|
MC_HEALTH_EXTRA_ARGS=(
|
||||||
@@ -124,14 +115,6 @@ case "${TYPE^^}" in
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
FORGE)
|
FORGE)
|
||||||
if versionLessThan 1.17; then
|
|
||||||
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 "**********************************************************************"
|
|
||||||
fi
|
|
||||||
exec ${SCRIPTS:-/}start-deployForge "$@"
|
exec ${SCRIPTS:-/}start-deployForge "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -139,15 +122,7 @@ case "${TYPE^^}" in
|
|||||||
exec ${SCRIPTS:-/}start-deployFabric "$@"
|
exec ${SCRIPTS:-/}start-deployFabric "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
FTBA)
|
|
||||||
exec ${SCRIPTS:-/}start-deployFTBA "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
FTB|CURSEFORGE)
|
FTB|CURSEFORGE)
|
||||||
log "**********************************************************************"
|
|
||||||
log "NOTE: Some mods and modpacks may require Java 8."
|
|
||||||
log " If so, use itzg/minecraft-server:java8"
|
|
||||||
log "**********************************************************************"
|
|
||||||
exec ${SCRIPTS:-/}start-deployCF "$@"
|
exec ${SCRIPTS:-/}start-deployCF "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -183,10 +158,6 @@ case "${TYPE^^}" in
|
|||||||
exec ${SCRIPTS:-/}start-deployAirplane "$@"
|
exec ${SCRIPTS:-/}start-deployAirplane "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
PUFFERFISH)
|
|
||||||
exec ${SCRIPTS:-/}start-deployPufferfish "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
CANYON)
|
CANYON)
|
||||||
exec ${SCRIPTS:-/}start-deployCanyon "$@"
|
exec ${SCRIPTS:-/}start-deployCanyon "$@"
|
||||||
;;
|
;;
|
||||||
@@ -196,12 +167,6 @@ case "${TYPE^^}" in
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
CRUCIBLE)
|
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" "$@"
|
exec "${SCRIPTS:-/}start-deployCrucible" "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -209,7 +174,7 @@ case "${TYPE^^}" in
|
|||||||
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 " CURSEFORGE, SPONGEVANILLA, PURPUR, CUSTOM,"
|
log " CURSEFORGE, SPONGEVANILLA, PURPUR, CUSTOM,"
|
||||||
log " MAGMA, MOHIST, CATSERVER, AIRPLANE, PUFFERFISH, CANYON, LIMBO, CRUCIBLE"
|
log " MAGMA, MOHIST, CATSERVER, AIRPLANE, CANYON, LIMBO, CRUCIBLE"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|||||||
@@ -6,42 +6,55 @@ isDebugging && set -x
|
|||||||
|
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
if [ "${VERSION}" != "LATEST" ] && [ "${VERSION}" != "PURPUR" ] ; then
|
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=PURPUR."
|
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
: ${AIRPLANE_BUILD:=lastSuccessfulBuild}
|
||||||
: ${AIRPLANE_TYPE:=airplane}
|
: ${AIRPLANE_TYPE:=airplane}
|
||||||
|
|
||||||
if [ "${VERSION}" = "LATEST" ] ; then
|
if [ "${VERSION}" = "LATEST" ] || [ "${VERSION}" = "1.17" ]; then
|
||||||
AIRPLANE_TYPE="airplane"
|
AIRPLANE_BRANCH="1.17"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${VERSION}" = "1.16" ]; then
|
||||||
|
AIRPLANE_BRANCH="1.16"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${VERSION}" = "PURPUR" ]; then
|
if [ "${VERSION}" = "PURPUR" ]; then
|
||||||
|
AIRPLANE_BRANCH="Purpur-1.17"
|
||||||
AIRPLANE_TYPE="airplanepurpur"
|
AIRPLANE_TYPE="airplanepurpur"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Using ${AIRPLANE_TYPE} 1.17.1 (1.18 unsupported - use Paper/Pufferfish/Purpur for newer versions)"
|
if [ "${VERSION}" = "PURPUR-1.16" ]; then
|
||||||
|
AIRPLANE_BRANCH="Purpur-1.16"
|
||||||
|
AIRPLANE_TYPE="airplanepurpur"
|
||||||
|
fi
|
||||||
|
|
||||||
export SERVER=${AIRPLANE_TYPE}-1.17.1.jar
|
log "Using Airplane-${AIRPLANE_BRANCH} branch"
|
||||||
|
|
||||||
|
export SERVER=airplane-${AIRPLANE_BRANCH}-${AIRPLANE_BUILD}.jar
|
||||||
|
|
||||||
log "Removing old Airplane versions ..."
|
log "Removing old Airplane versions ..."
|
||||||
shopt -s nullglob
|
shopt -s nullglob
|
||||||
for f in airplane*.jar; do
|
for f in airplane-*.jar; do
|
||||||
[[ $f != $SERVER ]] && rm $f
|
[[ $f != $SERVER ]] && rm $f
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ ! -f "$SERVER" ] || isTrue "${FORCE_REDOWNLOAD:-false}"; then
|
if [ ! -f "$SERVER" ] || isTrue "${FORCE_REDOWNLOAD:-false}"; then
|
||||||
downloadUrl="https://airplane.gg/dl/launcher-${AIRPLANE_TYPE}1.17.1.jar"
|
downloadUrl="https://ci.tivy.ca/job/Airplane-${AIRPLANE_BRANCH}/${AIRPLANE_BUILD}/artifact/launcher-${AIRPLANE_TYPE}.jar"
|
||||||
log "Downloading Airplane from $downloadUrl ..."
|
log "Downloading Airplane from $downloadUrl ..."
|
||||||
if ! get -o "$SERVER" "$downloadUrl"; then
|
curl -fsSL -o "$SERVER" "$downloadUrl"
|
||||||
|
if [ ! -f "$SERVER" ]; then
|
||||||
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
||||||
exit 3
|
exit 3
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for later operations
|
# Normalize on Spigot for later operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
export FAMILY=SPIGOT
|
export FAMILY=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-spiget" "$@"
|
exec ${SCRIPTS:-/}start-spiget "$@"
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for operations below
|
# Normalize on Spigot for operations below
|
||||||
|
export TYPE=SPIGOT
|
||||||
export FAMILY=SPIGOT
|
export FAMILY=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
|||||||
@@ -35,37 +35,11 @@ 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
|
||||||
|
|
||||||
downloadModpack() {
|
|
||||||
srv_modpack=${FTB_SERVER_MOD}
|
|
||||||
if isURL "${srv_modpack}"; then
|
|
||||||
log "Downloading modpack from ${srv_modpack}..."
|
|
||||||
if ! srv_modpack=$(get -o /data --output-filename --skip-existing "${srv_modpack}"); then
|
|
||||||
log "ERROR: failed to download modpack"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if [[ "${srv_modpack:0:5}" == "data/" ]]; then
|
|
||||||
# Prepend with "/"
|
|
||||||
srv_modpack="/${srv_modpack}"
|
|
||||||
fi
|
|
||||||
if [[ ! "${srv_modpack:0:1}" == "/" ]]; then
|
|
||||||
# If not an absolute path, assume file is in "/data"
|
|
||||||
srv_modpack=/data/${srv_modpack}
|
|
||||||
fi
|
|
||||||
if [[ ! -f "${srv_modpack}" ]]; then
|
|
||||||
log "FTB server modpack ${srv_modpack} not found."
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
if [[ ! "${srv_modpack: -4}" == ".zip" ]]; then
|
|
||||||
log "FTB server modpack ${srv_modpack} is not a zip archive."
|
|
||||||
log "Please set FTB_SERVER_MOD to a file with a .zip extension."
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
FTB_SERVER_MOD=${srv_modpack}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ! isTrue "${USE_MODPACK_START_SCRIPT:-true}"; then
|
if ! isTrue "${USE_MODPACK_START_SCRIPT:-true}"; then
|
||||||
downloadModpack
|
if ! [ -f "${FTB_SERVER_MOD}" ]; then
|
||||||
|
log "ERROR unable to find requested modpack file ${FTB_SERVER_MOD}"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
needsInstall=true
|
needsInstall=true
|
||||||
installMarker=/data/.curseforge-installed
|
installMarker=/data/.curseforge-installed
|
||||||
@@ -73,7 +47,7 @@ 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}" -type f \( -path "*/libraries/*" -o -path "*/mods/*" \) -prune -o -name "forge*.jar" -not -name "forge*installer.jar" -print)
|
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
|
||||||
@@ -111,6 +85,8 @@ if ! isTrue "${USE_MODPACK_START_SCRIPT:-true}"; then
|
|||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
forgeInstallerJar=$(ls -t "${forgeInstallerJar}" | head -1)
|
||||||
|
|
||||||
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)
|
||||||
@@ -158,9 +134,32 @@ fi
|
|||||||
# also check for the start script rather than just the folder
|
# also check for the start script rather than just the folder
|
||||||
# this allows saving just the world separate from the rest of the data directory
|
# this allows saving just the world separate from the rest of the data directory
|
||||||
if [[ $startScriptCount = 0 ]]; then
|
if [[ $startScriptCount = 0 ]]; then
|
||||||
downloadModpack
|
|
||||||
srv_modpack=${FTB_SERVER_MOD}
|
srv_modpack=${FTB_SERVER_MOD}
|
||||||
|
if isURL "${srv_modpack}"; then
|
||||||
|
log "Downloading modpack from ${srv_modpack}..."
|
||||||
|
if ! srv_modpack=$(get -o /data --output-filename --skip-existing "${srv_modpack}"); then
|
||||||
|
log "ERROR: failed to download modpack"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ "${srv_modpack:0:5}" == "data/" ]]; then
|
||||||
|
# Prepend with "/"
|
||||||
|
srv_modpack="/${srv_modpack}"
|
||||||
|
fi
|
||||||
|
if [[ ! "${srv_modpack:0:1}" == "/" ]]; then
|
||||||
|
# If not an absolute path, assume file is in "/data"
|
||||||
|
srv_modpack=/data/${srv_modpack}
|
||||||
|
fi
|
||||||
|
if [[ ! -f "${srv_modpack}" ]]; then
|
||||||
|
log "FTB server modpack ${srv_modpack} not found."
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
if [[ ! "${srv_modpack: -4}" == ".zip" ]]; then
|
||||||
|
log "FTB server modpack ${srv_modpack} is not a zip archive."
|
||||||
|
log "Please set FTB_SERVER_MOD to a file with a .zip extension."
|
||||||
|
exit 2
|
||||||
|
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 ""}'
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ if [ ! -f "$SERVER" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for later operations
|
# Normalize on Spigot for later operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
export FAMILY=SPIGOT
|
export FAMILY=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ if [ ! -d "$librariesDir" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
mkdir "$librariesDir"
|
||||||
if ! unzip /tmp/libraries.zip -d "$librariesDir"; then
|
if ! unzip /tmp/libraries.zip -d "$librariesDir"; then
|
||||||
log "ERROR: failed to unzip Crucible libraries"
|
log "ERROR: failed to unzip Crucible libraries"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -2,31 +2,27 @@
|
|||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
# shellcheck source=start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
requireVar VANILLA_VERSION
|
requireVar VANILLA_VERSION
|
||||||
export TYPE=FABRIC
|
export TYPE=FABRIC
|
||||||
: "${FABRIC_INSTALLER_VERSION:=${FABRICVERSION:-LATEST}}"
|
export SERVER=fabric-server-${VANILLA_VERSION}.jar
|
||||||
: "${FABRIC_INSTALLER:=}"
|
|
||||||
: "${FABRIC_INSTALLER_URL:=}"
|
|
||||||
: "${FABRIC_LOADER_VERSION:=LATEST}"
|
|
||||||
|
|
||||||
isDebugging && set -x
|
isDebugging && set -x
|
||||||
|
|
||||||
log "Checking Fabric version information."
|
if [[ ! -e ${SERVER} ]]; then
|
||||||
if [[ $FABRIC_INSTALLER ]]; then
|
|
||||||
FABRIC_INSTALLER_VERSION=$(echo -n "$FABRIC_INSTALLER" | mc-image-helper hash)
|
|
||||||
elif [[ $FABRIC_INSTALLER_URL ]]; then
|
|
||||||
FABRIC_INSTALLER_VERSION=$(echo -n "$FABRIC_INSTALLER_URL" | mc-image-helper hash)
|
|
||||||
elif [[ ${FABRIC_INSTALLER_VERSION^^} = LATEST ]]; then
|
|
||||||
FABRIC_INSTALLER_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml)
|
|
||||||
fi
|
|
||||||
|
|
||||||
export SERVER=fabric-server-${VANILLA_VERSION}-${FABRIC_INSTALLER_VERSION}.jar
|
: ${FABRIC_INSTALLER:=}
|
||||||
|
: ${FABRIC_INSTALLER_URL:=}
|
||||||
if [ ! \( -e ${SERVER} -a -e "server-${VANILLA_VERSION}.jar" \) ]; then
|
: ${FABRIC_LOADER_VERSION:=LATEST}
|
||||||
|
: ${FABRIC_INSTALLER_VERSION:=${FABRICVERSION:-LATEST}}
|
||||||
|
|
||||||
if [[ -z $FABRIC_INSTALLER && -z $FABRIC_INSTALLER_URL ]]; then
|
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="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"
|
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
|
elif [[ -z $FABRIC_INSTALLER ]]; then
|
||||||
@@ -70,12 +66,8 @@ if [ ! \( -e ${SERVER} -a -e "server-${VANILLA_VERSION}.jar" \) ]; then
|
|||||||
exit 10
|
exit 10
|
||||||
fi
|
fi
|
||||||
|
|
||||||
mv server.jar "server-${VANILLA_VERSION}.jar"
|
|
||||||
mv fabric-server-launch.jar "${SERVER}"
|
mv fabric-server-launch.jar "${SERVER}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Specify which server jar to run
|
|
||||||
echo "serverJar=server-${VANILLA_VERSION}.jar" > fabric-server-launcher.properties
|
|
||||||
|
|
||||||
export FAMILY=FABRIC
|
export FAMILY=FABRIC
|
||||||
exec "${SCRIPTS:-/}start-setupWorld" "$@"
|
exec ${SCRIPTS:-/}start-setupWorld "$@"
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for downstream operations
|
# Normalize on Spigot for downstream operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
export FAMILY=SPIGOT
|
export FAMILY=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
set -euo pipefail
|
|
||||||
isDebugging && set -x
|
|
||||||
|
|
||||||
IFS=$'\n\t'
|
|
||||||
|
|
||||||
if [ "${VERSION}" != "LATEST" ] && [ "${VERSION}" != "1.18" ] ; then
|
|
||||||
log "ERROR: Pufferfish server type only supports VERSION=LATEST, VERSION=1.18. Note that these are branches, not #.#.# versions."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
: ${PUFFERFISH_BUILD:=lastSuccessfulBuild}
|
|
||||||
|
|
||||||
if [ "${VERSION}" = "LATEST" ] || [ "${VERSION}" = "1.18" ]; then
|
|
||||||
PUFFERFISH_BRANCH="1.18"
|
|
||||||
PUFFERFISH_VERSION="1.18.1-R0.1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "Using Pufferfish-${PUFFERFISH_BRANCH} branch"
|
|
||||||
|
|
||||||
export SERVER=pufferfish-${PUFFERFISH_BRANCH}-${PUFFERFISH_BUILD}.jar
|
|
||||||
|
|
||||||
log "Removing old Pufferfish versions ..."
|
|
||||||
shopt -s nullglob
|
|
||||||
for f in pufferfish-*.jar; do
|
|
||||||
[[ $f != $SERVER ]] && rm $f
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ ! -f "$SERVER" ] || isTrue "${FORCE_REDOWNLOAD:-false}"; then
|
|
||||||
artifact="build/libs/pufferfish-paperclip-${PUFFERFISH_VERSION}-SNAPSHOT-reobf.jar"
|
|
||||||
downloadUrl="https://ci.pufferfish.host/job/Pufferfish-${PUFFERFISH_BRANCH}/${PUFFERFISH_BUILD}/artifact/${artifact}"
|
|
||||||
log "Downloading Pufferfish from $downloadUrl ..."
|
|
||||||
if ! get -o "$SERVER" "$downloadUrl"; then
|
|
||||||
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
|
||||||
exit 3
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Normalize on Spigot for later operations
|
|
||||||
export FAMILY=SPIGOT
|
|
||||||
export SKIP_LOG4J_CONFIG=true
|
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-spiget "$@"
|
|
||||||
@@ -2,8 +2,7 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
isDebugging && set -x
|
isDebugging && set -x
|
||||||
|
|
||||||
: ${VANILLA_VERSION:?}
|
: ${VANILLA_VERSION:?}
|
||||||
@@ -11,10 +10,12 @@ isDebugging && set -x
|
|||||||
: ${FORCE_REDOWNLOAD:=false}
|
: ${FORCE_REDOWNLOAD:=false}
|
||||||
|
|
||||||
if [[ ${PURPUR_BUILD} == LATEST ]]; then
|
if [[ ${PURPUR_BUILD} == LATEST ]]; then
|
||||||
if ! PURPUR_BUILD=$(get --json-path=".builds.latest" "https://api.purpurmc.org/v2/purpur/${VANILLA_VERSION}"); then
|
PURPUR_BUILD=$(curl -fsSL "https://api.purpurmc.org/v2/purpur/${VANILLA_VERSION}" |
|
||||||
|
jq -r '.builds.latest' || echo "")
|
||||||
|
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}."
|
||||||
log " Please check if a download is available at https://purpur.pl3x.net/downloads/"
|
log " Please check if a download is available at https://purpur.pl3x.net/downloads/"
|
||||||
exit 1
|
exit 3
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -23,14 +24,15 @@ export SERVER="purpur-${VANILLA_VERSION}-${PURPUR_BUILD}.jar"
|
|||||||
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
||||||
downloadUrl="https://api.purpurmc.org/v2/purpur/${VANILLA_VERSION}/${PURPUR_BUILD}/download"
|
downloadUrl="https://api.purpurmc.org/v2/purpur/${VANILLA_VERSION}/${PURPUR_BUILD}/download"
|
||||||
log "Downloading Purpur from $downloadUrl ..."
|
log "Downloading Purpur from $downloadUrl ..."
|
||||||
if ! get -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=$?)"
|
||||||
exit 3
|
exit 3
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for later operations
|
# Normalize on Spigot for later operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
export FAMILY=SPIGOT
|
export FAMILY=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-spiget" "$@"
|
exec ${SCRIPTS:-/}start-spiget "$@"
|
||||||
|
|||||||
@@ -128,11 +128,6 @@ elif isFamily VANILLA && versionLessThan 1.12; then
|
|||||||
patchLog4jConfig log4j2_17-111.xml https://launcher.mojang.com/v1/objects/dd2b723346a8dcd48e7f4d245f6bf09e98db9696/log4j2_17-111.xml
|
patchLog4jConfig log4j2_17-111.xml https://launcher.mojang.com/v1/objects/dd2b723346a8dcd48e7f4d245f6bf09e98db9696/log4j2_17-111.xml
|
||||||
elif isFamily VANILLA && versionLessThan 1.17; then
|
elif isFamily VANILLA && versionLessThan 1.17; then
|
||||||
patchLog4jConfig log4j2_112-116.xml https://launcher.mojang.com/v1/objects/02937d122c86ce73319ef9975b58896fc1b491d1/log4j2_112-116.xml
|
patchLog4jConfig log4j2_112-116.xml https://launcher.mojang.com/v1/objects/02937d122c86ce73319ef9975b58896fc1b491d1/log4j2_112-116.xml
|
||||||
# See https://purpurmc.org/docs/Log4j/
|
|
||||||
elif isType PURPUR && versionLessThan 1.17; then
|
|
||||||
patchLog4jConfig purpur_log4j2_1141-1165.xml https://purpurmc.org/docs/xml/purpur_log4j2_1141-1165.xml
|
|
||||||
elif isType PURPUR && versionLessThan 1.18.1; then
|
|
||||||
patchLog4jConfig purpur_log4j2_117.xml https://purpurmc.org/docs/xml/purpur_log4j2_117.xml
|
|
||||||
elif versionLessThan 1.18.1; then
|
elif versionLessThan 1.18.1; then
|
||||||
JVM_OPTS="-Dlog4j2.formatMsgNoLookups=true ${JVM_OPTS}"
|
JVM_OPTS="-Dlog4j2.formatMsgNoLookups=true ${JVM_OPTS}"
|
||||||
fi
|
fi
|
||||||
@@ -241,6 +236,12 @@ if isTrue "${USE_AIKAR_FLAGS}"; then
|
|||||||
"
|
"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if isTrue "${USE_LARGE_PAGES}"; then
|
||||||
|
JVM_XX_OPTS="${JVM_XX_OPTS}
|
||||||
|
-XX:+UseLargePagesInMetaspace
|
||||||
|
"
|
||||||
|
fi
|
||||||
|
|
||||||
if isTrue "${USE_FLARE_FLAGS}"; then
|
if isTrue "${USE_FLARE_FLAGS}"; then
|
||||||
JVM_XX_OPTS="${JVM_XX_OPTS}
|
JVM_XX_OPTS="${JVM_XX_OPTS}
|
||||||
-XX:+UnlockDiagnosticVMOptions
|
-XX:+UnlockDiagnosticVMOptions
|
||||||
@@ -328,10 +329,10 @@ EOF
|
|||||||
else
|
else
|
||||||
exec mc-server-runner "${mcServerRunnerArgs[@]}" "${finalArgs[@]}"
|
exec mc-server-runner "${mcServerRunnerArgs[@]}" "${finalArgs[@]}"
|
||||||
fi
|
fi
|
||||||
elif [[ $SERVER =~ run.sh ]]; then
|
elif [[ -x run.sh ]]; then
|
||||||
log "Using Forge supplied run.sh script..."
|
log "Using Forge supplied run.sh script..."
|
||||||
echo $JVM_XX_OPTS $JVM_OPTS $expandedDOpts > user_jvm_args.txt
|
echo $JVM_XX_OPTS $JVM_OPTS $expandedDOpts > user_jvm_args.txt
|
||||||
exec mc-server-runner "${mcServerRunnerArgs[@]}" --shell bash "${SERVER}"
|
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
|
||||||
|
|||||||
@@ -1,77 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e -o pipefail
|
|
||||||
|
|
||||||
: "${REMOVE_OLD_DATAPACKS:=false}"
|
|
||||||
: "${DATAPACKS_FILE:=}"
|
|
||||||
: "${REMOVE_OLD_DATAPACKS_DEPTH:=1} "
|
|
||||||
: "${REMOVE_OLD_DATAPACKS_INCLUDE:=*.zip}"
|
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
isDebugging && set -x
|
|
||||||
|
|
||||||
out_dir=/data/${LEVEL:-world}/datapacks
|
|
||||||
|
|
||||||
# Remove old datapacks
|
|
||||||
if isTrue "${REMOVE_OLD_DATAPACKS}" && [ -z "${DATAPACKS_FILE}" ]; then
|
|
||||||
if [ -d "$out_dir" ]; then
|
|
||||||
find "$out_dir" -mindepth 1 -maxdepth ${REMOVE_OLD_DATAPACKS_DEPTH:-16} -wholename "${REMOVE_OLD_DATAPACKS_INCLUDE:-*}" -not -wholename "${REMOVE_OLD_DATAPACKS_EXCLUDE:-}" -delete
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$DATAPACKS" ]]; then
|
|
||||||
mkdir -p "$out_dir"
|
|
||||||
|
|
||||||
for i in ${DATAPACKS//,/ }
|
|
||||||
do
|
|
||||||
if isURL "$i"; then
|
|
||||||
log "Downloading datapack $i ..."
|
|
||||||
if ! get -o "${out_dir}" "$i"; then
|
|
||||||
log "ERROR: failed to download from $i into $out_dir"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
elif [[ -f "$i" && "$i" =~ .*\.zip ]]; then
|
|
||||||
log "Copying datapack located at $i ..."
|
|
||||||
out_file=$(basename "$i")
|
|
||||||
if ! cp "$i" "${out_dir}/$out_file"; then
|
|
||||||
log "ERROR: failed to copy from $i into $out_dir"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
elif [[ -d "$i" ]]; then
|
|
||||||
log "Copying datapacks from $i ..."
|
|
||||||
cp "$i"/*.zip "${out_dir}"
|
|
||||||
else
|
|
||||||
log "ERROR Invalid URL or path given in DATAPACKS: $i"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
elif [[ "$DATAPACKS_FILE" ]]; then
|
|
||||||
if [ ! -f "$DATAPACKS_FILE" ]; then
|
|
||||||
log "ERROR: given DATAPACKS_FILE file does not exist"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p "$out_dir"
|
|
||||||
|
|
||||||
args=(
|
|
||||||
-o "${out_dir}"
|
|
||||||
--log-progress-each
|
|
||||||
--skip-existing
|
|
||||||
--uris-file "${DATAPACKS_FILE}"
|
|
||||||
)
|
|
||||||
if isTrue "${REMOVE_OLD_DATAPACKS}"; then
|
|
||||||
args+=(
|
|
||||||
--prune-others "${REMOVE_OLD_DATAPACKS_INCLUDE}"
|
|
||||||
--prune-depth "${REMOVE_OLD_DATAPACKS_DEPTH}"
|
|
||||||
)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! get "${args[@]}" ; then
|
|
||||||
log "ERROR: failed to retrieve one or more datapacks"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupForgeApiMods" "$@"
|
|
||||||
@@ -1,177 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e -o pipefail
|
|
||||||
|
|
||||||
: "${MODS_FORGEAPI_KEY:=}"
|
|
||||||
: "${REMOVE_OLD_FORGEAPI_MODS:=false}"
|
|
||||||
: "${MODS_FORGEAPI_PROJECTIDS:=}"
|
|
||||||
: "${MODS_FORGEAPI_FILE:=}"
|
|
||||||
: "${MODS_FORGEAPI_RELEASES:=RELEASE}"
|
|
||||||
: "${REMOVE_OLD_MODS_DEPTH:=1} "
|
|
||||||
: "${REMOVE_OLD_MODS_INCLUDE:=*.jar}"
|
|
||||||
|
|
||||||
# FORGEAPI_BASE_URL used in manifest downloads below
|
|
||||||
FORGEAPI_BASE_URL=${FORGEAPI_BASE_URL:-https://api.curseforge.com/v1}
|
|
||||||
RELEASE_NUMBER_FILTER=1
|
|
||||||
MINECRAFT_GAME_ID=432
|
|
||||||
out_dir=/data/mods
|
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
isDebugging && set -x
|
|
||||||
|
|
||||||
# Remove old mods/plugins
|
|
||||||
if isTrue "${REMOVE_OLD_FORGEAPI_MODS}" && [ -z "${MODS_FORGEAPI_FILE}" ]; then
|
|
||||||
removeOldMods /data/mods
|
|
||||||
fi
|
|
||||||
|
|
||||||
ensureModKey(){
|
|
||||||
if [ -z "$MODS_FORGEAPI_KEY" ]; then
|
|
||||||
log "ERROR: MODS_FORGEAPI_KEY REQUIRED to Connect to FORGE API, you supplied: ${MODS_FORGEAPI_KEY}"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Set the global release type per the text.
|
|
||||||
# NOTE: downcasing release type for comparing types.
|
|
||||||
updateReleaseNumber(){
|
|
||||||
releaseType=$1
|
|
||||||
if [ "release" = "${releaseType,,}" ]; then
|
|
||||||
RELEASE_NUMBER_FILTER=1
|
|
||||||
elif [ "beta" = "${releaseType,,}" ]; then
|
|
||||||
RELEASE_NUMBER_FILTER=2
|
|
||||||
elif [ "alpha" = "${releaseType,,}" ]; then
|
|
||||||
RELEASE_NUMBER_FILTER=3
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
retrieveVersionTypeNumber(){
|
|
||||||
VERSION_NAME="Minecraft ${VANILLA_VERSION%.*}"
|
|
||||||
minecraft_types=$(curl -X GET -s \
|
|
||||||
"${FORGEAPI_BASE_URL}/games/${MINECRAFT_GAME_ID}/version-types" \
|
|
||||||
-H 'Accept: application/json' -H 'x-api-key: '${MODS_FORGEAPI_KEY}'')
|
|
||||||
|
|
||||||
if [ ! "$minecraft_types" ]; then
|
|
||||||
log "ERROR: unable to retrieve version types for ${VERSION_NAME} from ForgeAPI"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
TYPE_ID=$(jq -n "$minecraft_types" | jq --arg VERSION_NAME "$VERSION_NAME" -jc '
|
|
||||||
.data[] | select(.name==$VERSION_NAME) | .id')
|
|
||||||
|
|
||||||
if [ ! "$TYPE_ID" ]; then
|
|
||||||
log "ERROR: unable to retrieve version types for ${VERSION_NAME} from ForgeAPI"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
modFileByProjectID(){
|
|
||||||
project_id=$(echo $1 | tr -d '"')
|
|
||||||
project_id_release_type=$2
|
|
||||||
unset PROJECT_FILE
|
|
||||||
|
|
||||||
# if Type id isn't defined use minecraft version to go get it.
|
|
||||||
if [ ! "$TYPE_ID" ]; then
|
|
||||||
retrieveVersionTypeNumber
|
|
||||||
fi
|
|
||||||
|
|
||||||
# JQ is struggling with larger page sizes so having to pagination for mods with a lot of releases
|
|
||||||
pageSize=42
|
|
||||||
index=0
|
|
||||||
total_count=1
|
|
||||||
|
|
||||||
while [ $index -lt $total_count ]; do
|
|
||||||
project_files=$(curl -X GET -s \
|
|
||||||
"${FORGEAPI_BASE_URL}/mods/${project_id}/files?gameVersionTypeId=${TYPE_ID}&index=${index}&pageSize=${pageSize}" \
|
|
||||||
-H 'Accept: application/json' -H 'x-api-key: '${MODS_FORGEAPI_KEY}'')
|
|
||||||
|
|
||||||
if [ ! "$project_files" ]; then
|
|
||||||
log "ERROR: unable to retrieve any project id files for ${project_id} from ForgeAPI"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
# Use project files to grab out the total count of mods.
|
|
||||||
total_count=$(jq -n "$project_files" | jq -c '.pagination.totalCount' )
|
|
||||||
|
|
||||||
# Checking for a individual release type input, if not use global
|
|
||||||
if [ $project_id_release_type ]; then
|
|
||||||
updateReleaseNumber $project_id_release_type
|
|
||||||
else
|
|
||||||
updateReleaseNumber $MODS_FORGEAPI_RELEASES
|
|
||||||
fi
|
|
||||||
# grabs the highest ID of the releaseTypes selected.
|
|
||||||
# Default is 1 for Release, Beta is 2, and Alpha is 3. Using less than we can validate highest release.
|
|
||||||
current_project_file=$(jq -n "$project_files" | jq --arg RELEASE_FILTER "$RELEASE_NUMBER_FILTER" -jc '
|
|
||||||
.data | sort_by(.id) | reverse | map(select(.releaseType<=($RELEASE_FILTER|tonumber))) | .[0]')
|
|
||||||
|
|
||||||
# Logic to grab the latest release over the entire pagination
|
|
||||||
if [ ! "$PROJECT_FILE" ]; then
|
|
||||||
PROJECT_FILE=$current_project_file
|
|
||||||
elif [ "$current_project_file" ]; then
|
|
||||||
current_project_file_id=$(jq -n "$current_project_file" | jq -jc '.id' )
|
|
||||||
PROJECT_FILE_ID=$(jq -n "$PROJECT_FILE" | jq -jc '.id' )
|
|
||||||
if (( current_project_file_id > PROJECT_FILE_ID )); then
|
|
||||||
PROJECT_FILE=$current_project_file
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check to see if we have gone to far or lost our index and exit with an error
|
|
||||||
if [ -z "$index" ] || [ -z "$total_count" ] || [ $index -ge $total_count ]; then
|
|
||||||
log "ERROR: Unable to retrieve any files for ${project_id} from ForgeAPI also Validate files have release type associated with no. ${RELEASE_NUMBER_FILTER}"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
# Increment start index to new set.
|
|
||||||
index=$(($index + $pageSize))
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
downloadModPackfromModFile() {
|
|
||||||
if [ ! "$PROJECT_FILE" ]; then
|
|
||||||
log "ERROR: Project File not found from the ForgeAPI"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
# grabs needed values from our json return
|
|
||||||
file_name=$(jq -n "$PROJECT_FILE" | jq -jc '.fileName' )
|
|
||||||
download_url=$(jq -n "$PROJECT_FILE" | jq -jc '.downloadUrl' )
|
|
||||||
|
|
||||||
# trys to make the output directory incase it doesnt exist.
|
|
||||||
mkdir -p "$out_dir"
|
|
||||||
echo "Downloading ${download_url}"
|
|
||||||
if ! get -o "${out_dir}/${file_name}" $download_url ; then
|
|
||||||
log "ERROR: failed to download from ${download_url}"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Use forge api json file to filter and download the correct mods
|
|
||||||
if [ "$MODS_FORGEAPI_FILE" ] && [ -z "$MODS_FORGEAPI_PROJECTIDS" ]; then
|
|
||||||
ensureModKey
|
|
||||||
if [ ! -f "$MODS_FORGEAPI_FILE" ]; then
|
|
||||||
log "ERROR: given MODS_FORGEAPI_FILE file does not exist"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
MODS_FORGEAPI_PROJECTIDS=$(jq --raw-output '[.[] | .projectId] | join(",")' $MODS_FORGEAPI_FILE)
|
|
||||||
if [ ! "$MODS_FORGEAPI_PROJECTIDS" ]; then
|
|
||||||
log "ERROR: unable to retrieve packs from $MODS_FORGEAPI_FILE"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Needs loop here to look up release types befor calling download.
|
|
||||||
for project_id in ${MODS_FORGEAPI_PROJECTIDS//,/ }; do
|
|
||||||
current_release_type=$(jq --arg PROJECT_ID "$project_id" -jc '
|
|
||||||
.[] | select(.projectId==$PROJECT_ID) | .releaseType' "$MODS_FORGEAPI_FILE")
|
|
||||||
modFileByProjectID $project_id $current_release_type
|
|
||||||
downloadModPackfromModFile
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Use only project ids and global release data.
|
|
||||||
if [ "$MODS_FORGEAPI_PROJECTIDS" ] && [ -z "$MODS_FORGEAPI_FILE" ]; then
|
|
||||||
ensureModKey
|
|
||||||
for project_id in ${MODS_FORGEAPI_PROJECTIDS//,/ }; do
|
|
||||||
modFileByProjectID $project_id
|
|
||||||
downloadModPackfromModFile
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupModpack" "$@"
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
|
|
||||||
# If supplied with a URL for a config (simple zip of configurations), download it and unpack
|
# If supplied with a URL for a config (simple zip of configurations), download it and unpack
|
||||||
if [[ "$MODCONFIG" ]]; then
|
if [[ "$MODCONFIG" ]]; then
|
||||||
@@ -10,7 +9,7 @@ case "X$MODCONFIG" in
|
|||||||
log "Downloading mod/plugin configs via HTTP"
|
log "Downloading mod/plugin configs via HTTP"
|
||||||
log " from $MODCONFIG ..."
|
log " from $MODCONFIG ..."
|
||||||
curl -sSL -o /tmp/modconfig.zip "$MODCONFIG"
|
curl -sSL -o /tmp/modconfig.zip "$MODCONFIG"
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
mkdir -p /data/plugins
|
mkdir -p /data/plugins
|
||||||
unzip -o -d /data/plugins /tmp/modconfig.zip
|
unzip -o -d /data/plugins /tmp/modconfig.zip
|
||||||
else
|
else
|
||||||
@@ -25,4 +24,4 @@ case "X$MODCONFIG" in
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupMounts" "$@"
|
exec ${SCRIPTS:-/}start-setupMounts $@
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ set -e -o pipefail
|
|||||||
: "${MODS_FILE:=}"
|
: "${MODS_FILE:=}"
|
||||||
: "${REMOVE_OLD_MODS_DEPTH:=1} "
|
: "${REMOVE_OLD_MODS_DEPTH:=1} "
|
||||||
: "${REMOVE_OLD_MODS_INCLUDE:=*.jar}"
|
: "${REMOVE_OLD_MODS_INCLUDE:=*.jar}"
|
||||||
sum_file=/data/.generic_pack.sum
|
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
# shellcheck source=start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
. "${SCRIPTS:-/}start-utils"
|
||||||
@@ -19,13 +18,12 @@ CURSE_URL_BASE=${CURSE_URL_BASE:-https://minecraft.curseforge.com/projects}
|
|||||||
if isTrue "${REMOVE_OLD_MODS}" && [ -z "${MODS_FILE}" ]; then
|
if isTrue "${REMOVE_OLD_MODS}" && [ -z "${MODS_FILE}" ]; then
|
||||||
removeOldMods /data/mods
|
removeOldMods /data/mods
|
||||||
removeOldMods /data/plugins
|
removeOldMods /data/plugins
|
||||||
rm -f "$sum_file"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# If packwiz url passed, bootstrap packwiz and update mods before other modpack processing
|
# If packwiz url passed, bootstrap packwiz and update mods before other modpack processing
|
||||||
if [[ "${PACKWIZ_URL}" ]]; then
|
if [[ "${PACKWIZ_URL}" ]]; then
|
||||||
# Ensure we have the latest packwiz bootstrap installer
|
# Ensure we have the latest packwiz bootstrap installer
|
||||||
latestPackwiz=$(curl -fsSL https://api.github.com/repos/packwiz/packwiz-installer-bootstrap/releases/latest)
|
latestPackwiz=$(curl -fsSL https://api.github.com/repos/comp500/packwiz-installer-bootstrap/releases/latest)
|
||||||
if [[ -z "${latestPackwiz}" ]]; then
|
if [[ -z "${latestPackwiz}" ]]; then
|
||||||
log "WARNING: Could not retrieve Packwiz bootstrap installer release information"
|
log "WARNING: Could not retrieve Packwiz bootstrap installer release information"
|
||||||
else
|
else
|
||||||
@@ -67,7 +65,7 @@ if [[ "$MODPACK" ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$FAMILY" = "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 ${MODPACK}"
|
log "ERROR: failed to unzip the modpack from ${MODPACK}"
|
||||||
@@ -81,7 +79,7 @@ if [[ "$MODPACK" ]]; then
|
|||||||
rm -f /tmp/modpack.zip
|
rm -f /tmp/modpack.zip
|
||||||
|
|
||||||
elif [[ "$MODS" ]]; then
|
elif [[ "$MODS" ]]; then
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
out_dir=/data/plugins
|
out_dir=/data/plugins
|
||||||
else
|
else
|
||||||
out_dir=/data/mods
|
out_dir=/data/mods
|
||||||
@@ -118,7 +116,7 @@ elif [[ "$MODS_FILE" ]]; then
|
|||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
out_dir=/data/plugins
|
out_dir=/data/plugins
|
||||||
else
|
else
|
||||||
out_dir=/data/mods
|
out_dir=/data/mods
|
||||||
@@ -206,6 +204,7 @@ if [[ "${GENERIC_PACKS}" ]]; then
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
sum_file=/data/.generic_pack.sum
|
||||||
isDebugging && [ -f "$sum_file}" ] && cat "$sum_file"
|
isDebugging && [ -f "$sum_file}" ] && cat "$sum_file"
|
||||||
if ! sha256sum -c "${sum_file}" --status 2> /dev/null; then
|
if ! sha256sum -c "${sum_file}" --status 2> /dev/null; then
|
||||||
base_dir=/tmp/generic_pack_base
|
base_dir=/tmp/generic_pack_base
|
||||||
|
|||||||
@@ -1,15 +1,14 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
|
|
||||||
: "${SYNC_SKIP_NEWER_IN_DESTINATION:=${PLUGINS_SYNC_UPDATE:-true}}"
|
: ${SYNC_SKIP_NEWER_IN_DESTINATION:=${PLUGINS_SYNC_UPDATE:-true}}
|
||||||
: "${REPLACE_ENV_DURING_SYNC:=true}"
|
: ${REPLACE_ENV_DURING_SYNC:=true}
|
||||||
: "${REPLACE_ENV_SUFFIXES:=yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml}"
|
: ${REPLACE_ENV_SUFFIXES:=yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml}
|
||||||
: "${REPLACE_ENV_VARIABLE_PREFIX:=${ENV_VARIABLE_PREFIX:-CFG_}}"
|
: ${REPLACE_ENV_VARIABLE_PREFIX:=${ENV_VARIABLE_PREFIX:-CFG_}}
|
||||||
: "${REPLACE_ENV_VARIABLES_EXCLUDES:=}"
|
: ${REPLACE_ENV_VARIABLES_EXCLUDES:=}
|
||||||
: "${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}"
|
: ${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}
|
||||||
: "${DEBUG:=false}"
|
: ${DEBUG:=false}
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
isDebugging && set -x
|
isDebugging && set -x
|
||||||
@@ -25,8 +24,8 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -d /plugins ]; then
|
if [ -d /plugins ]; then
|
||||||
case ${FAMILY} in
|
case ${TYPE} in
|
||||||
SPIGOT|HYBRID)
|
SPIGOT|BUKKIT|PAPER|MAGMA)
|
||||||
mkdir -p /data/plugins
|
mkdir -p /data/plugins
|
||||||
log "Copying plugins over..."
|
log "Copying plugins over..."
|
||||||
mc-image-helper \
|
mc-image-helper \
|
||||||
@@ -41,7 +40,7 @@ if [ -d /plugins ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# If any modules have been provided, copy them over
|
# If any modules have been provided, copy them over
|
||||||
: "${COPY_MODS_DEST:="/data/mods"}"
|
: ${COPY_MODS_DEST:="/data/mods"}
|
||||||
|
|
||||||
if [ -d /mods ]; then
|
if [ -d /mods ]; then
|
||||||
log "Copying any mods over..."
|
log "Copying any mods over..."
|
||||||
@@ -54,7 +53,7 @@ if [ -d /mods ]; then
|
|||||||
/mods "${COPY_MODS_DEST}"
|
/mods "${COPY_MODS_DEST}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
: "${COPY_CONFIG_DEST:="/data/config"}"
|
: ${COPY_CONFIG_DEST:="/data/config"}
|
||||||
|
|
||||||
if [ -d /config ]; then
|
if [ -d /config ]; then
|
||||||
log "Copying any configs from /config to ${COPY_CONFIG_DEST}"
|
log "Copying any configs from /config to ${COPY_CONFIG_DEST}"
|
||||||
@@ -67,4 +66,4 @@ if [ -d /config ]; then
|
|||||||
/config "${COPY_CONFIG_DEST}"
|
/config "${COPY_CONFIG_DEST}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupServerProperties" "$@"
|
exec ${SCRIPTS:-/}start-setupServerProperties $@
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ function customizeServerProps {
|
|||||||
|
|
||||||
# If not provided, generate a reasonable default message-of-the-day,
|
# If not provided, generate a reasonable default message-of-the-day,
|
||||||
# which shows up in the server listing in the client
|
# which shows up in the server listing in the client
|
||||||
if ! [ -v MOTD ]; then
|
if [ -z "$MOTD" ]; then
|
||||||
# snapshot is the odd case where we have to look at version to identify that label
|
# snapshot is the odd case where we have to look at version to identify that label
|
||||||
if [[ ${ORIGINAL_TYPE} == "VANILLA" && ${VERSION} == "SNAPSHOT" ]]; then
|
if [[ ${ORIGINAL_TYPE} == "VANILLA" && ${VERSION} == "SNAPSHOT" ]]; then
|
||||||
label=SNAPSHOT
|
label=SNAPSHOT
|
||||||
@@ -62,13 +62,6 @@ function customizeServerProps {
|
|||||||
MOTD="A ${label} Minecraft Server powered by Docker"
|
MOTD="A ${label} Minecraft Server powered by Docker"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# normalize MOTD
|
|
||||||
if [[ ${TYPE^^} = LIMBO ]]; then
|
|
||||||
if [[ $MOTD ]] && ! [[ $MOTD =~ ^{ ]]; then
|
|
||||||
MOTD="{\"text\":\"${MOTD}\"}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
setServerProp "server-name" SERVER_NAME
|
setServerProp "server-name" SERVER_NAME
|
||||||
setServerProp "server-ip" SERVER_IP
|
setServerProp "server-ip" SERVER_IP
|
||||||
setServerProp "server-port" SERVER_PORT
|
setServerProp "server-port" SERVER_PORT
|
||||||
|
|||||||
@@ -1,84 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e -o pipefail
|
|
||||||
|
|
||||||
: "${REMOVE_OLD_VANILLATWEAKS:=false}"
|
|
||||||
: "${VANILLATWEAKS_FILE:=}"
|
|
||||||
: "${VANILLATWEAKS_SHARECODE:=}"
|
|
||||||
: "${REMOVE_OLD_VANILLATWEAKS_DEPTH:=1} "
|
|
||||||
: "${REMOVE_OLD_VANILLATWEAKS_INCLUDE:=*.zip}"
|
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
isDebugging && set -x
|
|
||||||
|
|
||||||
out_dir=/data/${LEVEL:-world}/datapacks
|
|
||||||
|
|
||||||
# Remove old VANILLATWEAKS
|
|
||||||
if isTrue "${REMOVE_OLD_VANILLATWEAKS}" && [ -z "${VANILLATWEAKS_FILE}" ]; then
|
|
||||||
if [ -d "$out_dir" ]; then
|
|
||||||
find "$out_dir" -mindepth 1 -maxdepth ${REMOVE_OLD_VANILLATWEAKS_DEPTH:-16} -wholename "${REMOVE_OLD_VANILLATWEAKS_INCLUDE:-*}" -not -wholename "${REMOVE_OLD_VANILLATWEAKS_EXCLUDE:-}" -delete
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Example: VANILLATWEAKS_SHARECODE=MGr52E
|
|
||||||
# Code generated from the UI website, typically a alphanumeric 6 digit code.
|
|
||||||
if [[ "$VANILLATWEAKS_SHARECODE" ]]; then
|
|
||||||
VANILLATWEAKS_FILE=/tmp/vanillatweaksfile.json
|
|
||||||
SHARECODE_LOOKUP_URL="https://vanillatweaks.net/assets/server/sharecode.php?code=${VANILLATWEAKS_SHARECODE}"
|
|
||||||
curl -f $SHARECODE_LOOKUP_URL -o $VANILLATWEAKS_FILE
|
|
||||||
if [ ! -f "$VANILLATWEAKS_FILE" ]; then
|
|
||||||
log "ERROR: Unable to use share code provided to retreive vanillatweaks file"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Use vanillatweaks file to specify VT and datapacks
|
|
||||||
if [[ "$VANILLATWEAKS_FILE" ]]; then
|
|
||||||
if [ ! -f "$VANILLATWEAKS_FILE" ]; then
|
|
||||||
log "ERROR: given VANILLATWEAKS_FILE file does not exist"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
PACKS=$(jq -jc '.packs' $VANILLATWEAKS_FILE)
|
|
||||||
if [ ! "$PACKS" ]; then
|
|
||||||
log "ERROR: unable to retrieve packs from $VANILLATWEAKS_FILE"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
VT_VERSION=$(jq -jc '.version' $VANILLATWEAKS_FILE)
|
|
||||||
if [ ! "$VT_VERSION" ]; then
|
|
||||||
log "ERROR: unable to retrieve version from $VANILLATWEAKS_FILE"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Download and unzip packs
|
|
||||||
if [[ "$PACKS" ]] && [[ "$VT_VERSION" ]]; then
|
|
||||||
VT_ZIPDATA_URL=https://vanillatweaks.net/assets/server/zipdatapacks.php
|
|
||||||
DOWNLOAD_URL=$(curl -X POST -F "packs=${PACKS}" -F "version=${VT_VERSION}" $VT_ZIPDATA_URL | jq -r '.link')
|
|
||||||
if [ ! "$DOWNLOAD_URL" ]; then
|
|
||||||
log "ERROR: unable to retrieve DOWNLOAD_URL from vanillatweaks.net!"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
TEMPZIP=/tmp/vanillatweaks.zip
|
|
||||||
if ! get -o $TEMPZIP "https://vanillatweaks.net${DOWNLOAD_URL}"; then
|
|
||||||
log "ERROR: failed to download from ${DOWNLOAD_URL}"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p "$out_dir"
|
|
||||||
if ! unzip -o -d "$out_dir" $TEMPZIP; then
|
|
||||||
log "ERROR: failed to unzip the ${PACKS} from ${$TEMPZIP}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# clean up files time!
|
|
||||||
rm -f $TEMPZIP
|
|
||||||
# cleans up temp vanilla tweaks file download to get stored packs
|
|
||||||
if [[ "$VANILLATWEAKS_SHARECODE" ]]; then
|
|
||||||
rm -f $VANILLATWEAKS_FILE
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupDatapack" "$@"
|
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
set -e
|
set -e
|
||||||
isDebugging && set -x
|
isDebugging && set -x
|
||||||
|
|
||||||
if [ "$TYPE" = "CURSEFORGE" ]; then
|
if [ $TYPE = "CURSEFORGE" ]; then
|
||||||
worldDest=$FTB_DIR/${LEVEL:-world}
|
worldDest=$FTB_DIR/${LEVEL:-world}
|
||||||
else
|
else
|
||||||
worldDest=/data/${LEVEL:-world}
|
worldDest=/data/${LEVEL:-world}
|
||||||
@@ -19,35 +19,26 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
|||||||
"${worldDest}_the_end"
|
"${worldDest}_the_end"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if isURL "$WORLD"; then
|
if isURL $WORLD; then
|
||||||
log "Downloading world from $WORLD"
|
curl -fsSL "$WORLD" -o /tmp/world.zip
|
||||||
if ! get -o /tmp/world.bin "$WORLD"; then
|
zipSrc=/tmp/world.zip
|
||||||
log "ERROR: failed to download world from $WORLD"
|
elif [[ "$WORLD" =~ .*\.zip ]]; then
|
||||||
exit 1
|
zipSrc="$WORLD"
|
||||||
fi
|
|
||||||
WORLD=/tmp/world.bin
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -f "$WORLD" ]; then
|
if [[ "$zipSrc" ]]; then
|
||||||
log "Extracting world"
|
log "Unzipping world"
|
||||||
|
|
||||||
# Stage contents so that the correct subdirectory can be picked off
|
# Stage contents so that the correct subdirectory can be picked off
|
||||||
mkdir -p /tmp/world-data
|
mkdir -p /tmp/world-data
|
||||||
if ! extract "$WORLD" /tmp/world-data; then
|
(cd /tmp/world-data && unzip -o -q "$zipSrc")
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
baseDirs=$(find /tmp/world-data -name "level.dat" -not -path "*_nether*" -not -path "*_the_end*" -exec dirname "{}" \;)
|
baseDirs=$(find /tmp/world-data -name "level.dat" -not -path "*_nether*" -not -path "*_the_end*" -exec dirname "{}" \;)
|
||||||
else
|
else
|
||||||
baseDirs=$(find /tmp/world-data -name "level.dat" -exec dirname "{}" \;)
|
baseDirs=$(find /tmp/world-data -name "level.dat" -exec dirname "{}" \;)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! [[ $baseDirs ]]; then
|
|
||||||
log "ERROR world content is not valid since level.dat could not be found"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
count=$(echo "$baseDirs" | wc -l)
|
count=$(echo "$baseDirs" | wc -l)
|
||||||
if [[ $count -gt 1 ]]; then
|
if [[ $count -gt 1 ]]; then
|
||||||
baseDir="$(echo "$baseDirs" | sed -n ${WORLD_INDEX:-1}p)"
|
baseDir="$(echo "$baseDirs" | sed -n ${WORLD_INDEX:-1}p)"
|
||||||
@@ -60,20 +51,17 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
rsync --remove-source-files --recursive --delete "$baseDir/" "$worldDest"
|
rsync --remove-source-files --recursive --delete "$baseDir/" "$worldDest"
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
log "Copying end and nether ..."
|
log "Copying end and nether ..."
|
||||||
[ -d "${baseDir}_nether" ] && rsync --remove-source-files --recursive --delete "${baseDir}_nether/" "${worldDest}_nether"
|
[ -d "${baseDir}_nether" ] && rsync --remove-source-files --recursive --delete "${baseDir}_nether/" "${worldDest}_nether"
|
||||||
[ -d "${baseDir}_the_end" ] && rsync --remove-source-files --recursive --delete "${baseDir}_the_end/" "${worldDest}_the_end"
|
[ -d "${baseDir}_the_end" ] && rsync --remove-source-files --recursive --delete "${baseDir}_the_end/" "${worldDest}_the_end"
|
||||||
fi
|
fi
|
||||||
elif [ -d "$WORLD" ]; then
|
else
|
||||||
log "Cloning world directory from $WORLD ..."
|
log "Cloning world directory from $WORLD ..."
|
||||||
rsync --recursive --delete "${WORLD%/}"/ "$worldDest"
|
rsync --recursive --delete "${WORLD%/}"/ "$worldDest"
|
||||||
else
|
|
||||||
log "ERROR: world file/directory $WORLD is missing"
|
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
# Reorganise if a Spigot server
|
# Reorganise if a Spigot server
|
||||||
log "Moving End and Nether maps to Spigot location"
|
log "Moving End and Nether maps to Spigot location"
|
||||||
[ -d "$worldDest/DIM1" ] && mv -f "$worldDest/DIM1" "${worldDest}_the_end"
|
[ -d "$worldDest/DIM1" ] && mv -f "$worldDest/DIM1" "${worldDest}_the_end"
|
||||||
@@ -81,4 +69,4 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupVanillaTweaks" "$@"
|
exec "${SCRIPTS:-/}start-setupModpack" "$@"
|
||||||
|
|||||||
@@ -22,20 +22,6 @@ containsJars() {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
containsPlugin() {
|
|
||||||
file=${1?}
|
|
||||||
|
|
||||||
pat='plugin.yml$'
|
|
||||||
|
|
||||||
while read -r line; do
|
|
||||||
if [[ $line =~ $pat ]]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done <<<$(unzip -l "$file")
|
|
||||||
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
getResourceFromSpiget() {
|
getResourceFromSpiget() {
|
||||||
resource=${1?}
|
resource=${1?}
|
||||||
|
|
||||||
@@ -95,12 +81,9 @@ downloadResourceFromSpiget() {
|
|||||||
log "Extracting contents of resource ${resource} into plugins"
|
log "Extracting contents of resource ${resource} into plugins"
|
||||||
unzip -o -q -d /data/plugins "${tmpfile}"
|
unzip -o -q -d /data/plugins "${tmpfile}"
|
||||||
rm "${tmpfile}"
|
rm "${tmpfile}"
|
||||||
elif containsPlugin "${tmpfile}"; then
|
else
|
||||||
log "Moving resource ${resource} into plugins"
|
log "Moving resource ${resource} into plugins"
|
||||||
mv "${tmpfile}" "/data/plugins/${resource}.jar"
|
mv "${tmpfile}" "/data/plugins/${resource}.jar"
|
||||||
else
|
|
||||||
log "ERROR downloaded resource '${resource}' seems to be not a valid plugin"
|
|
||||||
exit 2
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,14 +93,6 @@ function logAutopauseAction() {
|
|||||||
echo "[$(date -Iseconds)] [Autopause] $*"
|
echo "[$(date -Iseconds)] [Autopause] $*"
|
||||||
}
|
}
|
||||||
|
|
||||||
function logAutostop() {
|
|
||||||
echo "[Autostop loop] $*"
|
|
||||||
}
|
|
||||||
|
|
||||||
function logAutostopAction() {
|
|
||||||
echo "[$(date -Iseconds)] [Autostop] $*"
|
|
||||||
}
|
|
||||||
|
|
||||||
function normalizeMemSize() {
|
function normalizeMemSize() {
|
||||||
local scale=1
|
local scale=1
|
||||||
case ${1,,} in
|
case ${1,,} in
|
||||||
@@ -178,29 +170,5 @@ function isFamily() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
}
|
|
||||||
function isType() {
|
|
||||||
for t in "${@}"; do
|
|
||||||
if [[ $TYPE == "$t" ]]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
function extract() {
|
|
||||||
src=${1?}
|
|
||||||
destDir=${2?}
|
|
||||||
|
|
||||||
type=$(file -b --mime-type "${src}")
|
|
||||||
if [[ $type == application/zip ]]; then
|
|
||||||
unzip -q -d "${destDir}" "${src}"
|
|
||||||
elif [[ $type == application/x-tar ]]; then
|
|
||||||
tar -C "${destDir}" -xf "${src}"
|
|
||||||
else
|
|
||||||
log "ERROR: unsupported archive type: $type"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
1
tests/.gitignore
vendored
1
tests/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
data/
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
version: "3"
|
version: "3.8"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
monitor:
|
monitor:
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# go to script root directory
|
|
||||||
cd "$(dirname "$0")" || exit 1
|
|
||||||
|
|
||||||
# compose down function for reuse
|
|
||||||
down() {
|
|
||||||
docker-compose down -v --remove-orphans
|
|
||||||
}
|
|
||||||
|
|
||||||
checkandExitOnFailure(){
|
|
||||||
failed=$1
|
|
||||||
# docker-compose logs outputs messages from the specified container
|
|
||||||
if $failed; then
|
|
||||||
docker-compose logs mc
|
|
||||||
down
|
|
||||||
cd ..
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# tests to completely spin up Minecraft and use the monitor to validate the service is running.
|
|
||||||
fullMinecraftUpTest(){
|
|
||||||
folder=$1
|
|
||||||
cd "$folder"
|
|
||||||
failed=false
|
|
||||||
# run the monitor to validate the Minecraft image is healthy
|
|
||||||
docker-compose run monitor || failed=true
|
|
||||||
echo "${folder} Result: failed=$failed"
|
|
||||||
checkandExitOnFailure $failed
|
|
||||||
down
|
|
||||||
cd ..
|
|
||||||
}
|
|
||||||
|
|
||||||
# go through each folder in fulltests and run fullbuilds
|
|
||||||
FOLDERS=$(ls)
|
|
||||||
for folder in $FOLDERS; do
|
|
||||||
# If folder is a directory
|
|
||||||
if [ -d "$folder" ]; then
|
|
||||||
echo "Starting Tests on ${folder}"
|
|
||||||
fullMinecraftUpTest $folder
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
@@ -2,11 +2,14 @@ version: "3"
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
mc:
|
mc:
|
||||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
image: itzg/minecraft-server
|
||||||
environment:
|
environment:
|
||||||
EULA: "true"
|
EULA: "true"
|
||||||
SETUP_ONLY: "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
|
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:
|
volumes:
|
||||||
- ./packs:/packs
|
- ./packs:/packs
|
||||||
- ./data:/data
|
- data:/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data: {}
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
mc:
|
|
||||||
restart: "no"
|
|
||||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
SETUP_ONLY: "TRUE"
|
|
||||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
|
||||||
MODS_FORGEAPI_FILE: /config/example.json
|
|
||||||
# Key is defined in .github/workflows/pr.yml and ci.yml
|
|
||||||
# This should be coming from github secrets.
|
|
||||||
MODS_FORGEAPI_KEY: ${MODS_FORGEAPI_KEY}
|
|
||||||
REMOVE_OLD_FORGEAPI_MODS: "TRUE"
|
|
||||||
volumes:
|
|
||||||
- ./example.json:/config/example.json:ro
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
[{
|
|
||||||
"name": "fabric api",
|
|
||||||
"projectId": "306612",
|
|
||||||
"releaseType": "release"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Fabric Voice Mod",
|
|
||||||
"projectId": "416089",
|
|
||||||
"releaseType": "beta"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
mc:
|
|
||||||
restart: "no"
|
|
||||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
SETUP_ONLY: "TRUE"
|
|
||||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
|
||||||
MODS_FORGEAPI_PROJECTIDS: 306612,416089
|
|
||||||
# Allows for Beta releases of 416089 the Fabric Voice Mod
|
|
||||||
MODS_FORGEAPI_RELEASES: BETA
|
|
||||||
MODS_FORGEAPI_KEY: ${MODS_FORGEAPI_KEY}
|
|
||||||
REMOVE_OLD_FORGEAPI_MODS: "TRUE"
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
mc-image-helper assert fileExists one.txt mods/two.txt
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -euo pipefail
|
|
||||||
IFS=$'\n\t'
|
|
||||||
|
|
||||||
# go to script root directory
|
|
||||||
cd "$(dirname "$0")" || exit 1
|
|
||||||
|
|
||||||
# tests that only run the setup files for things like downloads and configuration.
|
|
||||||
setupOnlyMinecraftTest(){
|
|
||||||
folder=$1
|
|
||||||
cd "$folder"
|
|
||||||
result=0
|
|
||||||
|
|
||||||
if ! logs=$(docker compose run --quiet-pull mc 2>&1); then
|
|
||||||
echo "${folder} setup FAILED"
|
|
||||||
echo ":::::::::::: LOGS ::::::::::::::::
|
|
||||||
$logs
|
|
||||||
::::::::::::::::::::::::::::::::::
|
|
||||||
"
|
|
||||||
result=1
|
|
||||||
elif [ -f verify.sh ]; then
|
|
||||||
if ! docker run --rm --entrypoint bash -v "${PWD}/data":/data -v "${PWD}/verify.sh":/verify "${IMAGE_TO_TEST:-itzg/minecraft-server}" /verify; then
|
|
||||||
echo "${folder} verify FAILED"
|
|
||||||
result=1
|
|
||||||
else
|
|
||||||
echo "${folder} verify PASS"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "${folder} PASS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
docker compose down -v --remove-orphans
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
return $result
|
|
||||||
}
|
|
||||||
|
|
||||||
# go through each folder in setuponly and test setups
|
|
||||||
if (( $# > 0 )); then
|
|
||||||
for folder in "$@"; do
|
|
||||||
echo "Starting Tests in ${folder}"
|
|
||||||
setupOnlyMinecraftTest "$folder"
|
|
||||||
done
|
|
||||||
else
|
|
||||||
readarray -t folders < <(find . -maxdepth 2 -mindepth 2 -name docker-compose.yml -printf '%h\n')
|
|
||||||
for folder in "${folders[@]}"; do
|
|
||||||
echo "Starting Tests in ${folder}"
|
|
||||||
setupOnlyMinecraftTest "$folder"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
mc:
|
|
||||||
restart: "no"
|
|
||||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
SETUP_ONLY: "TRUE"
|
|
||||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
|
||||||
VANILLATWEAKS_FILE: /config/vanillatweaks-datapacks.json
|
|
||||||
REMOVE_OLD_VANILLATWEAKS: "TRUE"
|
|
||||||
volumes:
|
|
||||||
- ./vanillatweaks-datapacks.json:/config/vanillatweaks-datapacks.json:ro
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"type": "datapacks",
|
|
||||||
"version": "1.18",
|
|
||||||
"packs": {
|
|
||||||
"survival": [
|
|
||||||
"graves",
|
|
||||||
"multiplayer sleep",
|
|
||||||
"afk display",
|
|
||||||
"armor statues",
|
|
||||||
"unlock all recipes",
|
|
||||||
"fast leaf decay",
|
|
||||||
"coordinates hud"
|
|
||||||
],
|
|
||||||
"items": ["armored elytra"]
|
|
||||||
},
|
|
||||||
"result": "ok"
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
mc:
|
|
||||||
restart: "no"
|
|
||||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
SETUP_ONLY: "TRUE"
|
|
||||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
|
||||||
VANILLATWEAKS_SHARECODE: MGr52E
|
|
||||||
REMOVE_OLD_VANILLATWEAKS: "TRUE"
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
mc:
|
|
||||||
restart: "no"
|
|
||||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
SETUP_ONLY: "TRUE"
|
|
||||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
|
||||||
WORLD: /worlds/world-for-testing.tgz
|
|
||||||
volumes:
|
|
||||||
- ./worlds:/worlds:ro
|
|
||||||
- ./data:/data
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
mc-image-helper assert fileExists world/level.dat
|
|
||||||
Binary file not shown.
@@ -1,14 +0,0 @@
|
|||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
mc:
|
|
||||||
restart: "no"
|
|
||||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
SETUP_ONLY: "TRUE"
|
|
||||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
|
||||||
WORLD: /worlds/world-for-testing.zip
|
|
||||||
volumes:
|
|
||||||
- ./worlds:/worlds:ro
|
|
||||||
- ./data:/data
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
mc-image-helper assert fileExists world/level.dat
|
|
||||||
Binary file not shown.
@@ -1,15 +1,22 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -euo pipefail
|
|
||||||
IFS=$'\n\t'
|
|
||||||
|
|
||||||
# go to script root directory
|
|
||||||
cd "$(dirname "$0")" || exit 1
|
cd "$(dirname "$0")" || exit 1
|
||||||
|
|
||||||
# go through top level folders and trigger the tests in the subfolders
|
failed=false
|
||||||
readarray -t folders < <(find . -maxdepth 2 -mindepth 2 -name test.sh -printf '%h\n')
|
|
||||||
for folder in "${folders[@]}"; do
|
down() {
|
||||||
cd "$folder"
|
docker-compose down -v
|
||||||
echo "Starting ${folder} Tests"
|
}
|
||||||
bash ./test.sh
|
|
||||||
cd ..
|
docker-compose run monitor || failed=true
|
||||||
done
|
echo "
|
||||||
|
Result: failed=$failed"
|
||||||
|
|
||||||
|
if $failed; then
|
||||||
|
docker-compose logs mc
|
||||||
|
down
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
down
|
||||||
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user