mirror of
https://github.com/itzg/docker-minecraft-server.git
synced 2026-02-19 15:56:24 +00:00
Compare commits
203 Commits
1.3.0
...
2021.10.0-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b389561091 | ||
|
|
75f5a430e4 | ||
|
|
e0c721585e | ||
|
|
da21c2e0a7 | ||
|
|
2b989e4c39 | ||
|
|
6ee055761d | ||
|
|
7d6c80b941 | ||
|
|
49f9ff645e | ||
|
|
70ea32e89d | ||
|
|
004cbdb9f7 | ||
|
|
52cbf1fb64 | ||
|
|
190e401452 | ||
|
|
b881a27c8d | ||
|
|
45856a1a81 | ||
|
|
7aa47e2a60 | ||
|
|
327538a98f | ||
|
|
f6c71e27d8 | ||
|
|
4628da7ea2 | ||
|
|
02ba96c421 | ||
|
|
87f6fe6b20 | ||
|
|
8049bd5b80 | ||
|
|
5225ba06c8 | ||
|
|
d695fc3fbc | ||
|
|
a2132292ac | ||
|
|
1e615e76e8 | ||
|
|
c31b191b96 | ||
|
|
c4b573f608 | ||
|
|
28810fcba3 | ||
|
|
1c85a685de | ||
|
|
8d1989a595 | ||
|
|
7cd207f40b | ||
|
|
d022956e24 | ||
|
|
2bdaa4dc4e | ||
|
|
46bfbaada1 | ||
|
|
140a8aa90c | ||
|
|
e659343821 | ||
|
|
76dcff9d18 | ||
|
|
44138564b0 | ||
|
|
3c77abbbab | ||
|
|
209c6e6dab | ||
|
|
6fa827e9a1 | ||
|
|
cd3ea7fd2e | ||
|
|
d3bd697cb2 | ||
|
|
6c6bf030c5 | ||
|
|
6e2b3ae0c7 | ||
|
|
9915929340 | ||
|
|
a9a86d249b | ||
|
|
595760d301 | ||
|
|
5c1f176848 | ||
|
|
6d3f194ce3 | ||
|
|
861aec6bd6 | ||
|
|
53f5fbb77f | ||
|
|
9299f00d20 | ||
|
|
e5e97a3560 | ||
|
|
32bc0382d6 | ||
|
|
fa53abdfb7 | ||
|
|
0cbfb81b4c | ||
|
|
d47c801b18 | ||
|
|
c056b9d2dd | ||
|
|
92a15ea85d | ||
|
|
6fe022ccc8 | ||
|
|
21c1620f0c | ||
|
|
b71eb666a7 | ||
|
|
e78e5af96d | ||
|
|
a2ab0d75ed | ||
|
|
0fb9700fc7 | ||
|
|
c48f6c31ce | ||
|
|
b2d23edf6d | ||
|
|
18925ef32c | ||
|
|
31f25cfd1b | ||
|
|
7d4e4c167e | ||
|
|
f06b990f8a | ||
|
|
eb12030975 | ||
|
|
e46af9d54c | ||
|
|
861faaa285 | ||
|
|
8312233a93 | ||
|
|
75844ae81a | ||
|
|
959bf73485 | ||
|
|
6bb2323c46 | ||
|
|
beeaf1a996 | ||
|
|
96aa1054dc | ||
|
|
e7937206af | ||
|
|
081b2c11e4 | ||
|
|
f342f4aa98 | ||
|
|
4e73e69342 | ||
|
|
c6ff80b71c | ||
|
|
37cad3f255 | ||
|
|
7814ca21b5 | ||
|
|
5700f36a6f | ||
|
|
b8806629ec | ||
|
|
4a7f838a0f | ||
|
|
34f800d815 | ||
|
|
2d07dee4df | ||
|
|
ffec50141a | ||
|
|
54027049d3 | ||
|
|
4c2829e3d2 | ||
|
|
69e308d420 | ||
|
|
ad46f10b55 | ||
|
|
cd0fdfc95b | ||
|
|
d95abfce82 | ||
|
|
942a125e04 | ||
|
|
a3677d5aa8 | ||
|
|
f927933c46 | ||
|
|
5ab83bcb21 | ||
|
|
fdf5fb46bc | ||
|
|
8c6ca5e999 | ||
|
|
bb2b9eeea9 | ||
|
|
d1cbce3f89 | ||
|
|
55b5f6821f | ||
|
|
2fb01b4adf | ||
|
|
02bce8c3a8 | ||
|
|
468671a3fa | ||
|
|
8ee650f38d | ||
|
|
3de2bf88df | ||
|
|
1fcbd8410f | ||
|
|
d40bbdc3a5 | ||
|
|
61c291ae4e | ||
|
|
f613228619 | ||
|
|
ca9f883352 | ||
|
|
9d68fa3b88 | ||
|
|
d3a5885d95 | ||
|
|
c1db13c1f6 | ||
|
|
31b0f711b8 | ||
|
|
59ca1ce3a6 | ||
|
|
0f7bd5f4fd | ||
|
|
a368f4cf57 | ||
|
|
08a4bde6c1 | ||
|
|
f68e979229 | ||
|
|
544b1f243d | ||
|
|
391e807c78 | ||
|
|
4099cde737 | ||
|
|
e56a74dc81 | ||
|
|
31b8535854 | ||
|
|
ed1bb73c22 | ||
|
|
b7ac28e902 | ||
|
|
3cb72797b6 | ||
|
|
6f1f8d7806 | ||
|
|
b06f1115d4 | ||
|
|
777ad31de0 | ||
|
|
8b977f8786 | ||
|
|
7c3139226c | ||
|
|
0ddabf3089 | ||
|
|
6cfc7e45ef | ||
|
|
9ea675bc89 | ||
|
|
42f90c8806 | ||
|
|
c8b6eac8fe | ||
|
|
d78272c1fa | ||
|
|
48ccdf128f | ||
|
|
2322dffd49 | ||
|
|
8a5e5bf01e | ||
|
|
99ed83022e | ||
|
|
07185534fb | ||
|
|
4fe55b5a28 | ||
|
|
bd503f224d | ||
|
|
b5c91647ca | ||
|
|
c359a0f2ac | ||
|
|
49d9f4a89d | ||
|
|
aebe35c9d4 | ||
|
|
a26361c79f | ||
|
|
a486458a08 | ||
|
|
82b8401414 | ||
|
|
8b6ee91ec1 | ||
|
|
06cffd9e15 | ||
|
|
beaccbcf3b | ||
|
|
21ee5e2401 | ||
|
|
747c188824 | ||
|
|
692087dd25 | ||
|
|
6fe13e8654 | ||
|
|
3b2b98b9fe | ||
|
|
796f2fe14a | ||
|
|
4fef391b64 | ||
|
|
83f6cebd0b | ||
|
|
90183ae823 | ||
|
|
3c9df03584 | ||
|
|
367c6cfd92 | ||
|
|
5e75410e7c | ||
|
|
38028f7d0c | ||
|
|
a07ae685e2 | ||
|
|
092b530537 | ||
|
|
cf691499a1 | ||
|
|
0bb9cccdc6 | ||
|
|
4cb12f6cae | ||
|
|
ecbdeb2096 | ||
|
|
9a7a532f7b | ||
|
|
825833c859 | ||
|
|
c4c3613874 | ||
|
|
3a03156cb3 | ||
|
|
b3780186f8 | ||
|
|
c4654e44d8 | ||
|
|
9c6047e3fc | ||
|
|
260cc7d180 | ||
|
|
bbe930e552 | ||
|
|
a655fe860e | ||
|
|
ddf36aa879 | ||
|
|
34c31c561d | ||
|
|
3cc7d00d71 | ||
|
|
ed214b1382 | ||
|
|
f8405e298c | ||
|
|
539159ba50 | ||
|
|
f2c9d2f905 | ||
|
|
1b11331881 | ||
|
|
b71afff29f | ||
|
|
b4c6950f95 |
@@ -1,5 +1,6 @@
|
|||||||
data
|
data
|
||||||
|
testdata
|
||||||
examples
|
examples
|
||||||
k8s-examples
|
k8s-examples
|
||||||
.idea
|
.idea
|
||||||
.git
|
.git
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
[start-*]
|
[start-*]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
end_of_line = lf
|
||||||
|
|||||||
83
.github/workflows/build-multiarch.yml
vendored
Normal file
83
.github/workflows/build-multiarch.yml
vendored
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
name: Build and publish multiarch
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- multiarch
|
||||||
|
- java8-multiarch
|
||||||
|
- multiarch-latest
|
||||||
|
- java15
|
||||||
|
- java15-openj9
|
||||||
|
- test/multiarch/*
|
||||||
|
tags:
|
||||||
|
- "[0-9]+.[0-9]+.[0-9]+-multiarch"
|
||||||
|
- "[0-9]+.[0-9]+.[0-9]+-multiarch-latest"
|
||||||
|
- "[0-9]+.[0-9]+.[0-9]+-java15"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docker-buildx:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2.2.0
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
id: prep
|
||||||
|
run: |
|
||||||
|
DOCKER_IMAGE=itzg/minecraft-server
|
||||||
|
VERSION=edge
|
||||||
|
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||||
|
VERSION=${GITHUB_REF#refs/tags/}
|
||||||
|
fi
|
||||||
|
if [[ $GITHUB_REF == refs/heads/* ]]; then
|
||||||
|
VERSION=${GITHUB_REF#refs/heads/}
|
||||||
|
if [[ $VERSION == master ]]; then
|
||||||
|
VERSION=latest
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
TAGS="${DOCKER_IMAGE}:${VERSION//\//-}"
|
||||||
|
echo ::set-output name=tags::${TAGS}
|
||||||
|
echo ::set-output name=cache_from::${TAGS}
|
||||||
|
echo ::set-output name=version::${VERSION//\//-}
|
||||||
|
echo ::set-output name=cache_version::${VERSION//\//-}
|
||||||
|
|
||||||
|
- name: Setup Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
|
||||||
|
- name: Cache Docker layers
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache
|
||||||
|
key: ${{ runner.os }}-buildx-${{ steps.prep.outputs.cache_version }}-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-${{ steps.prep.outputs.cache_version }}-
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
|
||||||
|
- name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_USER }}
|
||||||
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
id: docker_build
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ./Dockerfile
|
||||||
|
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: ${{ steps.prep.outputs.tags }}
|
||||||
|
# ensure latest base image is used
|
||||||
|
pull: true
|
||||||
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
|
cache-to: type=local,dest=/tmp/.buildx-cache
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.documentation=https://github.com/itzg/docker-minecraft-server
|
||||||
|
org.opencontainers.image.source=https://github.com/itzg/docker-minecraft-server
|
||||||
|
org.opencontainers.image.version=${{ steps.prep.outputs.version }}
|
||||||
|
org.opencontainers.image.revision=${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Image digest
|
||||||
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
90
.github/workflows/main.yml
vendored
90
.github/workflows/main.yml
vendored
@@ -1,39 +1,97 @@
|
|||||||
# This is a basic workflow to help you get started with Actions
|
name: Build and Publish
|
||||||
|
|
||||||
name: Build and publish non-multiarch branches/tags
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
|
- java8
|
||||||
- openj9
|
- openj9
|
||||||
- openj9-nightly
|
- openj9-11
|
||||||
- adopt11
|
- adopt11
|
||||||
- adopt13
|
- test/*
|
||||||
tags:
|
tags:
|
||||||
- "[0-9]+.[0-9]+.[0-9]+"
|
- "[0-9]+.[0-9]+.[0-9]+"
|
||||||
|
- "[0-9]+.[0-9]+.[0-9]+-java8"
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-openj9"
|
- "[0-9]+.[0-9]+.[0-9]+-openj9"
|
||||||
|
- "[0-9]+.[0-9]+.[0-9]+-openj9-11"
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-openj9-nightly"
|
- "[0-9]+.[0-9]+.[0-9]+-openj9-nightly"
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-adopt11"
|
- "[0-9]+.[0-9]+.[0-9]+-adopt11"
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-adopt13"
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
tests/test.sh
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
needs:
|
||||||
|
- test
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Build and push Docker images
|
- name: Prepare
|
||||||
uses: docker/build-push-action@v1.1.0
|
id: prep
|
||||||
|
run: |
|
||||||
|
DOCKER_IMAGE=itzg/minecraft-server
|
||||||
|
VERSION=edge
|
||||||
|
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||||
|
VERSION=${GITHUB_REF#refs/tags/}
|
||||||
|
fi
|
||||||
|
if [[ $GITHUB_REF == refs/heads/* ]]; then
|
||||||
|
VERSION=${GITHUB_REF#refs/heads/}
|
||||||
|
if [[ $VERSION == master ]]; then
|
||||||
|
VERSION=latest
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
TAGS="${DOCKER_IMAGE}:${VERSION//\//-}"
|
||||||
|
echo ::set-output name=tags::${TAGS}
|
||||||
|
echo ::set-output name=cache_from::${TAGS}
|
||||||
|
echo ::set-output name=version::${VERSION//\//-}
|
||||||
|
echo ::set-output name=cache_version::${VERSION//\//-}
|
||||||
|
|
||||||
|
- name: Setup Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
|
||||||
|
- name: Cache Docker layers
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache
|
||||||
|
key: ${{ runner.os }}-buildx-${{ steps.prep.outputs.cache_version }}-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-${{ steps.prep.outputs.cache_version }}-
|
||||||
|
${{ runner.os }}-buildx-
|
||||||
|
|
||||||
|
- name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v1
|
||||||
with:
|
with:
|
||||||
repository: itzg/minecraft-server
|
|
||||||
username: ${{ secrets.DOCKER_USER }}
|
username: ${{ secrets.DOCKER_USER }}
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
tag_with_ref: true
|
|
||||||
tag_with_sha: true
|
- name: Build and push
|
||||||
cache_froms: itzg/minecraft-server:latest
|
id: docker_build
|
||||||
add_git_labels: true
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ./Dockerfile
|
||||||
|
# ensure latest base image is used
|
||||||
|
pull: true
|
||||||
|
# publish
|
||||||
push: true
|
push: true
|
||||||
|
# tags determined by prep step
|
||||||
|
tags: ${{ steps.prep.outputs.tags }}
|
||||||
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
|
cache-to: type=local,dest=/tmp/.buildx-cache
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.documentation=https://github.com/itzg/docker-minecraft-server
|
||||||
|
org.opencontainers.image.version=${{ steps.prep.outputs.version }}
|
||||||
|
org.opencontainers.image.source=https://github.com/itzg/docker-minecraft-server
|
||||||
|
org.opencontainers.image.revision=${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Image digest
|
||||||
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
|
|||||||
16
.github/workflows/pr.yml
vendored
Normal file
16
.github/workflows/pr.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
name: Validate PR
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
tests/test.sh
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
Adding a new server `TYPE` can vary due to the complexity of obtaining and configuring each type; however, the addition of any server type includes at least the following steps:
|
Adding a new server `TYPE` can vary due to the complexity of obtaining and configuring each type; however, the addition of any server type includes at least the following steps:
|
||||||
|
|
||||||
1. Copy an existing "start-deploy*" script, such as [start-deployMohist](start-deployMohist) and rename it accordingly making sure to retain the "start-deploy" prefix
|
1. Copy an existing "start-deploy*" script, such as [start-deployMohist](start-deployMohist) and rename it accordingly making sure to retain the "start-deploy" prefix
|
||||||
2. Modify the type-specific behavior between the "start-utils" preamble and the hand-off to `start-finalSetup01World` at the end of the script
|
2. Modify the type-specific behavior between the "start-utils" preamble and the hand-off to `start-finalSetupWorld` at the end of the script
|
||||||
3. Develop and test the changes using the [iterative process described below](#iterative-script-development)
|
3. Develop and test the changes using the [iterative process described below](#iterative-script-development)
|
||||||
4. Add a case-entry to the `case "${TYPE^^}"` in [start-configuration](start-configuration)
|
4. Add a case-entry to the `case "${TYPE^^}"` in [start-configuration](start-configuration)
|
||||||
5. Add a section to the [README](README.md). It is recommended to copy-modify an existing section to retain a similar wording and level of detail
|
5. Add a section to the [README](README.md). It is recommended to copy-modify an existing section to retain a similar wording and level of detail
|
||||||
@@ -70,5 +70,5 @@ The multiarch images are built and published by [a Github action](https://github
|
|||||||
The following git command can be used to provide the bulk of release notes content:
|
The following git command can be used to provide the bulk of release notes content:
|
||||||
|
|
||||||
```shell script
|
```shell script
|
||||||
git log --invert-grep --grep "^ci:" --grep "^misc:" --pretty="- %s" 1.1.0..1.2.0
|
git log --invert-grep --grep "^ci:" --grep "^misc:" --grep "^docs:" --pretty="- %s" 1.1.0..1.2.0
|
||||||
```
|
```
|
||||||
|
|||||||
18
Dockerfile
18
Dockerfile
@@ -1,6 +1,6 @@
|
|||||||
FROM openjdk:8u212-jre-alpine
|
FROM openjdk:8u212-jre-alpine
|
||||||
|
|
||||||
LABEL maintainer "itzg"
|
LABEL org.opencontainers.image.authors="Geoff Bourne <itzgeoff@gmail.com>"
|
||||||
|
|
||||||
RUN apk add --no-cache -U \
|
RUN apk add --no-cache -U \
|
||||||
openssl \
|
openssl \
|
||||||
@@ -48,11 +48,11 @@ 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=0.1.7 --var app=mc-monitor --file {{.app}} \
|
--var version=0.7.1 --var app=mc-monitor --file {{.app}} \
|
||||||
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
||||||
|
|
||||||
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
||||||
--var version=1.4.3 --var app=mc-server-runner --file {{.app}} \
|
--var version=1.5.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} \
|
||||||
@@ -66,13 +66,15 @@ COPY server.properties /tmp/server.properties
|
|||||||
COPY log4j2.xml /tmp/log4j2.xml
|
COPY log4j2.xml /tmp/log4j2.xml
|
||||||
WORKDIR /data
|
WORKDIR /data
|
||||||
|
|
||||||
|
STOPSIGNAL SIGTERM
|
||||||
|
|
||||||
ENV UID=1000 GID=1000 \
|
ENV UID=1000 GID=1000 \
|
||||||
JVM_XX_OPTS="-XX:+UseG1GC" MEMORY="1G" \
|
JVM_XX_OPTS="-XX:+UseG1GC" MEMORY="1G" \
|
||||||
TYPE=VANILLA VERSION=LATEST FORGEVERSION=RECOMMENDED SPONGEBRANCH=STABLE SPONGEVERSION= FABRICVERSION=LATEST LEVEL=world \
|
TYPE=VANILLA VERSION=LATEST \
|
||||||
PVP=true DIFFICULTY=easy ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
|
ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
|
||||||
LEVEL_TYPE=DEFAULT SERVER_PORT=25565 ONLINE_MODE=TRUE SERVER_NAME="Dedicated Server" \
|
SERVER_PORT=25565 ONLINE_MODE=TRUE SERVER_NAME="Dedicated Server" \
|
||||||
REPLACE_ENV_VARIABLES="FALSE" ENV_VARIABLE_PREFIX="CFG_" \
|
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_PERIOD=10 AUTOPAUSE_KNOCK_INTERFACE=eth0
|
||||||
|
|
||||||
COPY start* /
|
COPY start* /
|
||||||
COPY health.sh /
|
COPY health.sh /
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# manually purge any pre-existing manifest list
|
|
||||||
# since docker manifest command lacks a "remove" operation
|
|
||||||
rm -rf ~/.docker/manifests/docker.io_itzg_minecraft-server-multiarch
|
|
||||||
|
|
||||||
export DOCKER_BUILDKIT=1
|
|
||||||
|
|
||||||
docker build --platform linux/arm64 -t itzg/minecraft-server:arm64 .
|
|
||||||
docker push itzg/minecraft-server:arm64
|
|
||||||
|
|
||||||
armv7tag=armv7-buildkit
|
|
||||||
armv7workDir=/tmp/armv7-$$
|
|
||||||
git worktree add $armv7workDir armv7
|
|
||||||
# sub-shell for build of armv7
|
|
||||||
(
|
|
||||||
cd $armv7workDir
|
|
||||||
docker build --platform linux/arm/v7 -t itzg/minecraft-server:$armv7tag .
|
|
||||||
docker push itzg/minecraft-server:$armv7tag
|
|
||||||
)
|
|
||||||
git worktree remove $armv7workDir
|
|
||||||
|
|
||||||
docker pull itzg/minecraft-server
|
|
||||||
# use the rpi build one for now since armv7-buildkit is giving ABI mismatch on curl
|
|
||||||
docker pull itzg/minecraft-server:armv7
|
|
||||||
|
|
||||||
docker manifest create itzg/minecraft-server:multiarch \
|
|
||||||
itzg/minecraft-server \
|
|
||||||
itzg/minecraft-server:armv7 \
|
|
||||||
itzg/minecraft-server:arm64
|
|
||||||
|
|
||||||
docker manifest inspect itzg/minecraft-server:multiarch
|
|
||||||
|
|
||||||
docker manifest push -p itzg/minecraft-server:multiarch
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
manifest="itzg/minecraft-server:multiarch"
|
|
||||||
|
|
||||||
for t in latest rpi3 aarch64; do
|
|
||||||
docker pull itzg/minecraft-server:$t
|
|
||||||
done
|
|
||||||
|
|
||||||
docker manifest create --amend ${manifest} \
|
|
||||||
itzg/minecraft-server:aarch64 \
|
|
||||||
itzg/minecraft-server:latest \
|
|
||||||
itzg/minecraft-server:rpi3
|
|
||||||
|
|
||||||
docker manifest annotate --os linux --arch amd64 ${manifest} itzg/minecraft-server:latest
|
|
||||||
docker manifest annotate --os linux --arch arm64 ${manifest} itzg/minecraft-server:aarch64
|
|
||||||
docker manifest annotate --os linux --arch arm --variant v7 ${manifest} itzg/minecraft-server:rpi3
|
|
||||||
|
|
||||||
docker manifest push ${manifest}
|
|
||||||
@@ -10,19 +10,7 @@ services:
|
|||||||
- "mc:/data"
|
- "mc:/data"
|
||||||
environment:
|
environment:
|
||||||
EULA: "TRUE"
|
EULA: "TRUE"
|
||||||
CONSOLE: "false"
|
|
||||||
ENABLE_RCON: "true"
|
|
||||||
RCON_PASSWORD: "testing"
|
|
||||||
RCON_PORT: 28016
|
|
||||||
restart: always
|
restart: always
|
||||||
rcon:
|
|
||||||
image: itzg/rcon
|
|
||||||
ports:
|
|
||||||
- "4326:4326"
|
|
||||||
- "4327:4327"
|
|
||||||
volumes:
|
|
||||||
- "rcon:/opt/rcon-web-admin/db"
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
mc:
|
mc: {}
|
||||||
rcon:
|
|
||||||
@@ -1,7 +1,17 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#set -x
|
#set -x
|
||||||
# Use this variable to indicate a list of branches that docker hub is watching
|
# Use this variable to indicate a list of branches that docker hub is watching
|
||||||
branches_list=('openj9' 'openj9-nightly' 'adopt11' 'adopt13' 'multiarch')
|
branches_list=(
|
||||||
|
'java8'
|
||||||
|
'java8-multiarch'
|
||||||
|
'openj9'
|
||||||
|
'openj9-11'
|
||||||
|
'adopt11'
|
||||||
|
'java15'
|
||||||
|
'java15-openj9'
|
||||||
|
'multiarch'
|
||||||
|
'multiarch-latest'
|
||||||
|
)
|
||||||
|
|
||||||
function TrapExit {
|
function TrapExit {
|
||||||
echo "Checking out back in master"
|
echo "Checking out back in master"
|
||||||
|
|||||||
BIN
docs/level-vs-world.drawio.png
Normal file
BIN
docs/level-vs-world.drawio.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
BIN
docs/start-script-flow.drawio.png
Normal file
BIN
docs/start-script-flow.drawio.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 34 KiB |
18
examples/docker-compose-autopause.yml
Normal file
18
examples/docker-compose-autopause.yml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
minecraft:
|
||||||
|
image: itzg/minecraft-server
|
||||||
|
ports:
|
||||||
|
- "25565:25565"
|
||||||
|
volumes:
|
||||||
|
- "mc:/data"
|
||||||
|
environment:
|
||||||
|
EULA: "TRUE"
|
||||||
|
ENABLE_AUTOPAUSE: "TRUE"
|
||||||
|
OVERRIDE_SERVER_PROPERTIES: "TRUE"
|
||||||
|
MAX_TICK_TIME: "-1"
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
mc: {}
|
||||||
@@ -2,7 +2,7 @@ version: '3.2'
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
mc:
|
mc:
|
||||||
image: itzg/minecraft-server
|
image: itzg/minecraft-server:java8
|
||||||
volumes:
|
volumes:
|
||||||
- ./modpacks:/modpacks:ro
|
- ./modpacks:/modpacks:ro
|
||||||
environment:
|
environment:
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
version: "3.7"
|
|
||||||
|
|
||||||
services:
|
|
||||||
mc:
|
|
||||||
image: itzg/minecraft-server
|
|
||||||
ports:
|
|
||||||
- 25565:25565
|
|
||||||
volumes:
|
|
||||||
# Attach .../Curse/Minecraft/Instances for use at /instances
|
|
||||||
- ./Instances:/instances:ro
|
|
||||||
# Attach /data as usual
|
|
||||||
- ./ServerData:/data
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
# Modpacks generally need more memory, so let's give at 2 GB
|
|
||||||
MEMORY: 2G
|
|
||||||
# Use new CURSE_INSTANCE type
|
|
||||||
TYPE: CURSE_INSTANCE
|
|
||||||
# Reference directory of or full path to minecraftinstance.json
|
|
||||||
CURSE_INSTANCE_JSON: /instances/FTB Presents SkyFactory 3
|
|
||||||
@@ -2,7 +2,7 @@ version: "3.7"
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
mc:
|
mc:
|
||||||
image: itzg/minecraft-server
|
image: itzg/minecraft-server:java8
|
||||||
ports:
|
ports:
|
||||||
# expose the Minecraft server port outside of container
|
# expose the Minecraft server port outside of container
|
||||||
- 25565:25565
|
- 25565:25565
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ version: "3.7"
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
mc:
|
mc:
|
||||||
# FTBA support is only available in multiarch image tag
|
# FTBA support is only available in non-Alpine images
|
||||||
image: itzg/minecraft-server:multiarch
|
image: itzg/minecraft-server:java8-multiarch
|
||||||
ports:
|
ports:
|
||||||
# expose the Minecraft server port outside of container
|
# expose the Minecraft server port outside of container
|
||||||
- 25565:25565
|
- 25565:25565
|
||||||
|
|||||||
@@ -7,11 +7,12 @@ services:
|
|||||||
EULA: "true"
|
EULA: "true"
|
||||||
TYPE: PAPER
|
TYPE: PAPER
|
||||||
VERSION: 1.9.4
|
VERSION: 1.9.4
|
||||||
command: --noconsole
|
# needed for Paper versions before 1.14
|
||||||
|
CONSOLE: "false"
|
||||||
ports:
|
ports:
|
||||||
- 25565:25565
|
- 25565:25565
|
||||||
volumes:
|
volumes:
|
||||||
- mc-paper:/data
|
- mc-paper:/data
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
mc-paper:
|
mc-paper:
|
||||||
|
|||||||
12
examples/docker-compose-simple.yml
Normal file
12
examples/docker-compose-simple.yml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
mc:
|
||||||
|
image: itzg/minecraft-server
|
||||||
|
ports:
|
||||||
|
- 25565:25565
|
||||||
|
environment:
|
||||||
|
EULA: "TRUE"
|
||||||
|
volumes:
|
||||||
|
# attach the relative directory 'data' to the container's /data path
|
||||||
|
- ./data:/data
|
||||||
@@ -5,7 +5,7 @@ version: '3'
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
minecraft:
|
minecraft:
|
||||||
image: itzg/minecraft-server
|
image: itzg/minecraft-server:java8
|
||||||
ports:
|
ports:
|
||||||
- "25565:25565"
|
- "25565:25565"
|
||||||
volumes:
|
volumes:
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
Please server [modpacks downloaded from CurseForge](https://www.curseforge.com/minecraft/modpacks) in this directory.
|
Place server [modpacks downloaded from CurseForge](https://www.curseforge.com/minecraft/modpacks) in this directory.
|
||||||
|
|
||||||
The example [`docker-compose-curseforge.yml`](../docker-compose-curseforge.yml) references a modpack downloaded from <https://www.curseforge.com/minecraft/modpacks/skyfactory-4/files/2787018>.
|
The example [`docker-compose-curseforge.yml`](../docker-compose-curseforge.yml) references a modpack downloaded from <https://www.curseforge.com/minecraft/modpacks/skyfactory-4/files/2787018>.
|
||||||
|
|||||||
@@ -2,23 +2,48 @@
|
|||||||
|
|
||||||
. /autopause/autopause-fcns.sh
|
. /autopause/autopause-fcns.sh
|
||||||
|
|
||||||
. /start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
sudo /usr/sbin/knockd -c /autopause/knockd-config.cfg -d
|
|
||||||
if [ $? -ne 0 ] ; then
|
autopause_error_loop() {
|
||||||
|
logAutopause "Available interfaces within the docker container:"
|
||||||
|
INTERFACES=$(echo /sys/class/net/*)
|
||||||
|
INTERFACES=${INTERFACES//\/sys\/class\/net\//}
|
||||||
|
logAutopause " $INTERFACES"
|
||||||
|
logAutopause "Please set the environment variable AUTOPAUSE_KNOCK_INTERFACE to the interface that handles incoming connections."
|
||||||
|
logAutopause "If unsure which interface to choose, run the ifconfig command in the container."
|
||||||
|
logAutopause "Autopause failed to initialize. This log entry will be printed every 30 minutes."
|
||||||
while :
|
while :
|
||||||
do
|
do
|
||||||
if [[ -n $(ps -o comm | grep java) ]] ; then
|
sleep 1800
|
||||||
break
|
logAutopause "Autopause failed to initialize."
|
||||||
fi
|
|
||||||
sleep 0.1
|
|
||||||
done
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# wait for java process to be started
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
if java_process_exists ; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
|
|
||||||
|
# check for interface existence
|
||||||
|
if [[ -z "$AUTOPAUSE_KNOCK_INTERFACE" ]] ; then
|
||||||
|
logAutopause "AUTOPAUSE_KNOCK_INTERFACE variable must not be empty!"
|
||||||
|
autopause_error_loop
|
||||||
|
fi
|
||||||
|
if ! [[ -d "/sys/class/net/$AUTOPAUSE_KNOCK_INTERFACE" ]] ; then
|
||||||
|
logAutopause "Selected interface \"$AUTOPAUSE_KNOCK_INTERFACE\" does not exist!"
|
||||||
|
autopause_error_loop
|
||||||
|
fi
|
||||||
|
|
||||||
|
sudo /usr/sbin/knockd -c /tmp/knockd-config.cfg -d -i "$AUTOPAUSE_KNOCK_INTERFACE"
|
||||||
|
if [ $? -ne 0 ] ; then
|
||||||
logAutopause "Failed to start knockd daemon."
|
logAutopause "Failed to start knockd daemon."
|
||||||
logAutopause "Possible cause: docker's host network mode."
|
logAutopause "Probable cause: Unable to attach to interface \"$AUTOPAUSE_KNOCK_INTERFACE\"."
|
||||||
logAutopause "Recreate without host mode or disable autopause functionality."
|
autopause_error_loop
|
||||||
logAutopause "Stopping server."
|
|
||||||
killall -SIGTERM java
|
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
STATE=INIT
|
STATE=INIT
|
||||||
|
|||||||
@@ -8,12 +8,16 @@ java_running() {
|
|||||||
[[ $( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]]
|
[[ $( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
java_process_exists() {
|
||||||
|
[[ -n "$(ps -a -o comm | grep 'java')" ]]
|
||||||
|
}
|
||||||
|
|
||||||
rcon_client_exists() {
|
rcon_client_exists() {
|
||||||
[[ -n "$(ps -a -o comm | grep 'rcon-cli')" ]]
|
[[ -n "$(ps -a -o comm | grep 'rcon-cli')" ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
mc_server_listening() {
|
mc_server_listening() {
|
||||||
[[ -n $(netstat -tln | grep "0.0.0.0:$SERVER_PORT" | grep LISTEN) ]]
|
[[ -n $(netstat -tln | grep -e "0.0.0.0:$SERVER_PORT" -e ":::$SERVER_PORT" | grep LISTEN) ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
java_clients_connected() {
|
java_clients_connected() {
|
||||||
@@ -29,7 +33,7 @@ java_clients_connected() {
|
|||||||
# remember, that the host network mode does not work with autopause because of the knockd utility
|
# remember, that the host network mode does not work with autopause because of the knockd utility
|
||||||
for (( i=0; i<${#connections[@]}; i++ ))
|
for (( i=0; i<${#connections[@]}; i++ ))
|
||||||
do
|
do
|
||||||
if [[ ! $(echo "${connections[$i]}" | awk '{print $5}') =~ ^\s*127\.0\.0\.1:.*$ ]] ; then
|
if [[ ! $(echo "${connections[$i]}" | awk '{print $5}') =~ ^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$ ]] ; then
|
||||||
# not localhost
|
# not localhost
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -17,5 +17,5 @@ if [[ $( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]] ; th
|
|||||||
|
|
||||||
# finally pause the process
|
# finally pause the process
|
||||||
logAutopauseAction "Pausing Java process"
|
logAutopauseAction "Pausing Java process"
|
||||||
killall -q -STOP java
|
pkill -STOP java
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
|
|
||||||
if [[ $( ps -a -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"
|
||||||
killall -q -CONT java
|
pkill -CONT java
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
%minecraft ALL=(ALL) NOPASSWD:/usr/bin/killall
|
%minecraft ALL=(ALL) NOPASSWD:/usr/bin/pkill
|
||||||
%minecraft ALL=(ALL) NOPASSWD:/usr/sbin/knockd
|
%minecraft ALL=(ALL) NOPASSWD:/usr/sbin/knockd
|
||||||
|
|||||||
@@ -2,7 +2,10 @@
|
|||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
if isTrue "${ENABLE_AUTOPAUSE}" && [[ "$( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }')" =~ ^T.*$ ]]; then
|
if isTrue "${DISABLE_HEALTHCHECK}"; then
|
||||||
|
echo "Healthcheck disabled"
|
||||||
|
exit 0
|
||||||
|
elif isTrue "${ENABLE_AUTOPAUSE}" && [[ "$( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }')" =~ ^T.*$ ]]; then
|
||||||
echo "Java process suspended by Autopause function"
|
echo "Java process suspended by Autopause function"
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -37,3 +37,15 @@ motd=A Minecraft Server powered by Docker
|
|||||||
generator-settings=
|
generator-settings=
|
||||||
rcon.password=
|
rcon.password=
|
||||||
max-world-size=29999984
|
max-world-size=29999984
|
||||||
|
broadcast-console-to-ops=true
|
||||||
|
broadcast-rcon-to-ops=true
|
||||||
|
enable-jmx-monitoring=false
|
||||||
|
sync-chunk-writes=true
|
||||||
|
enable-status=true
|
||||||
|
entity-broadcast-range-percentage=100
|
||||||
|
function-permission-level=2
|
||||||
|
network-compression-threshold=256
|
||||||
|
op-permission-level=4
|
||||||
|
prevent-proxy-connections=false
|
||||||
|
use-native-transport=true
|
||||||
|
enforce-whitelist=false
|
||||||
|
|||||||
7
start
7
start
@@ -5,7 +5,7 @@
|
|||||||
umask 0002
|
umask 0002
|
||||||
chmod g+w /data
|
chmod g+w /data
|
||||||
|
|
||||||
if [ $(id -u) = 0 ]; then
|
if ! isTrue "${SKIP_SUDO:-false}" && [ $(id -u) = 0 ]; then
|
||||||
runAsUser=minecraft
|
runAsUser=minecraft
|
||||||
runAsGroup=minecraft
|
runAsGroup=minecraft
|
||||||
|
|
||||||
@@ -36,11 +36,6 @@ if [ $(id -u) = 0 ]; then
|
|||||||
chown -R ${runAsUser}:${runAsGroup} /data
|
chown -R ${runAsUser}:${runAsGroup} /data
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $(stat -c "%u" /autopause) != $UID ]]; then
|
|
||||||
log "Changing ownership of /autopause to $UID ..."
|
|
||||||
chown -R ${runAsUser}:${runAsGroup} /autopause
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${SKIP_NSSWITCH_CONF^^} != TRUE ]]; then
|
if [[ ${SKIP_NSSWITCH_CONF^^} != TRUE ]]; then
|
||||||
echo 'hosts: files dns' > /etc/nsswitch.conf
|
echo 'hosts: files dns' > /etc/nsswitch.conf
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -4,18 +4,20 @@
|
|||||||
|
|
||||||
log "Autopause functionality enabled"
|
log "Autopause functionality enabled"
|
||||||
|
|
||||||
|
cp /autopause/knockd-config.cfg /tmp/knockd-config.cfg
|
||||||
|
|
||||||
# update server port to listen to
|
# update server port to listen to
|
||||||
regseq="^\s*sequence\s*=\s*$SERVER_PORT\s*$"
|
regseq="^\s*sequence\s*=\s*$SERVER_PORT\s*$"
|
||||||
linenum=$(grep -nm1 sequence /autopause/knockd-config.cfg | cut -d : -f 1 | tail -n1)
|
linenum=$(grep -nm1 sequence /tmp/knockd-config.cfg | cut -d : -f 1 | tail -n1)
|
||||||
if ! [[ $(awk "NR==$linenum" /autopause/knockd-config.cfg) =~ $regseq ]]; then
|
if ! [[ $(awk "NR==$linenum" /tmp/knockd-config.cfg) =~ $regseq ]]; then
|
||||||
sed -i "${linenum}s/sequence.*/sequence = $SERVER_PORT/" /autopause/knockd-config.cfg
|
sed -i "${linenum}s/sequence.*/sequence = $SERVER_PORT/" /tmp/knockd-config.cfg
|
||||||
log "Updated server port in knockd config"
|
log "Updated server port in knockd config"
|
||||||
fi
|
fi
|
||||||
# update rcon port to listen to
|
# update rcon port to listen to
|
||||||
regseq="^\s*sequence\s*=\s*$RCON_PORT\s*$"
|
regseq="^\s*sequence\s*=\s*$RCON_PORT\s*$"
|
||||||
linenum=$(grep -nm2 sequence /autopause/knockd-config.cfg | cut -d : -f 1 | tail -n1)
|
linenum=$(grep -nm2 sequence /tmp/knockd-config.cfg | cut -d : -f 1 | tail -n1)
|
||||||
if ! [[ $(awk "NR==$linenum" /autopause/knockd-config.cfg) =~ $regseq ]]; then
|
if ! [[ $(awk "NR==$linenum" /tmp/knockd-config.cfg) =~ $regseq ]]; then
|
||||||
sed -i "${linenum}s/sequence.*/sequence = $RCON_PORT/" /autopause/knockd-config.cfg
|
sed -i "${linenum}s/sequence.*/sequence = $RCON_PORT/" /tmp/knockd-config.cfg
|
||||||
log "Updated rcon port in knockd config"
|
log "Updated rcon port in knockd config"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -44,10 +46,15 @@ if ! [[ $AUTOPAUSE_TIMEOUT_INIT =~ ^[0-9]+$ ]] ; then
|
|||||||
export AUTOPAUSE_TIMEOUT_INIT
|
export AUTOPAUSE_TIMEOUT_INIT
|
||||||
log "Warning: AUTOPAUSE_TIMEOUT_INIT is not numeric, set to 600 (seconds)"
|
log "Warning: AUTOPAUSE_TIMEOUT_INIT is not numeric, set to 600 (seconds)"
|
||||||
fi
|
fi
|
||||||
|
if [[ "$AUTOPAUSE_KNOCK_INTERFACE" == "lo" ]] ; then
|
||||||
|
log "Warning: AUTOPAUSE_KNOCK_INTERFACE is set to the local loopback interface."
|
||||||
|
log " This is not advisable, as incoming connections are likely not picked up there."
|
||||||
|
log " Continuing with this setting."
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ -n $MAX_TICK_TIME ]] ; then
|
if [[ -n "$MAX_TICK_TIME" && "$MAX_TICK_TIME" != "-1" ]] ; then
|
||||||
log "Warning: MAX_TICK_TIME is non-default, for autopause to work properly, this check should be disabled (-1 for versions >= 1.8.1)"
|
log "Warning: MAX_TICK_TIME is non-default, for autopause to work properly, this check should be disabled (-1 for versions >= 1.8.1)"
|
||||||
else
|
elif [[ -z "$MAX_TICK_TIME" ]] ; then
|
||||||
if versionLessThan 1.8.1; then
|
if versionLessThan 1.8.1; then
|
||||||
# 10 years
|
# 10 years
|
||||||
MAX_TICK_TIME=315360000000
|
MAX_TICK_TIME=315360000000
|
||||||
|
|||||||
@@ -1,15 +1,20 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
|
: ${EULA:=}
|
||||||
|
: ${PROXY:=}
|
||||||
|
: ${RCON_PASSWORD_FILE:=}
|
||||||
|
|
||||||
shopt -s nullglob
|
shopt -s nullglob
|
||||||
|
|
||||||
#umask 002
|
#umask 002
|
||||||
export HOME=/data
|
export HOME=/data
|
||||||
|
|
||||||
if [ ! -e /data/eula.txt ]; then
|
if [ ! -e /data/eula.txt ]; then
|
||||||
EULA="${EULA,,}"
|
if ! isTrue "$EULA"; then
|
||||||
if [ "$EULA" != "true" ]; then
|
|
||||||
log ""
|
log ""
|
||||||
log "Please accept the Minecraft EULA at"
|
log "Please accept the Minecraft EULA at"
|
||||||
log " https://account.mojang.com/documents/minecraft_eula"
|
log " https://account.mojang.com/documents/minecraft_eula"
|
||||||
@@ -19,12 +24,7 @@ if [ ! -e /data/eula.txt ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "# Generated via Docker on $(date)" > /data/eula.txt
|
writeEula
|
||||||
|
|
||||||
if ! echo "eula=$EULA" >> /data/eula.txt; then
|
|
||||||
log "ERROR: unable to write eula to /data. Please make sure attached directory is writable by uid=${UID}"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
@@ -45,7 +45,27 @@ if [[ $PROXY ]]; then
|
|||||||
sleep 5
|
sleep 5
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export SERVER_PROPERTIES=/data/server.properties
|
if [[ $RCON_PASSWORD_FILE ]]; then
|
||||||
|
log ""
|
||||||
|
if [ ! -e ${RCON_PASSWORD_FILE} ]; then
|
||||||
|
log "Initial RCON password file ${RCON_PASSWORD_FILE} does not seems to exist."
|
||||||
|
log "Please ensure your configuration."
|
||||||
|
log "If you are using Docker Secrets feature, please check this for further information: "
|
||||||
|
log " https://docs.docker.com/engine/swarm/secrets"
|
||||||
|
log ""
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
RCON_PASSWORD=$(cat ${RCON_PASSWORD_FILE})
|
||||||
|
export RCON_PASSWORD
|
||||||
|
fi
|
||||||
|
log ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! which java > /dev/null; then
|
||||||
|
log "Fixing PATH to include java"
|
||||||
|
PATH="${PATH}:/usr/bin"
|
||||||
|
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
|
||||||
|
|
||||||
case "X$VERSION" in
|
case "X$VERSION" in
|
||||||
@@ -55,11 +75,8 @@ case "X$VERSION" in
|
|||||||
XSNAPSHOT|Xsnapshot)
|
XSNAPSHOT|Xsnapshot)
|
||||||
VANILLA_VERSION=$(curl -fsSL $VERSIONS_JSON | jq -r '.latest.snapshot')
|
VANILLA_VERSION=$(curl -fsSL $VERSIONS_JSON | jq -r '.latest.snapshot')
|
||||||
;;
|
;;
|
||||||
X[1-9]*)
|
|
||||||
VANILLA_VERSION=$VERSION
|
|
||||||
;;
|
|
||||||
*)
|
*)
|
||||||
VANILLA_VERSION=$(curl -fsSL $VERSIONS_JSON | jq -r '.latest.release')
|
VANILLA_VERSION=$VERSION
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
export VANILLA_VERSION
|
export VANILLA_VERSION
|
||||||
@@ -96,7 +113,7 @@ case "${TYPE^^}" in
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
FTB|CURSEFORGE)
|
FTB|CURSEFORGE)
|
||||||
exec ${SCRIPTS:-/}start-deployFTB "$@"
|
exec ${SCRIPTS:-/}start-deployCF "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
VANILLA)
|
VANILLA)
|
||||||
@@ -127,9 +144,23 @@ case "${TYPE^^}" in
|
|||||||
exec ${SCRIPTS:-/}start-deployCatserver "$@"
|
exec ${SCRIPTS:-/}start-deployCatserver "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
PURPUR)
|
||||||
|
exec ${SCRIPTS:-/}start-deployPurpur "$@"
|
||||||
|
;;
|
||||||
|
|
||||||
|
YATOPIA)
|
||||||
|
exec ${SCRIPTS:-/}start-deployYatopia "$@"
|
||||||
|
;;
|
||||||
|
|
||||||
|
AIRPLANE)
|
||||||
|
exec ${SCRIPTS:-/}start-deployAirplane "$@"
|
||||||
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
log "Invalid type: '$TYPE'"
|
log "Invalid type: '$TYPE'"
|
||||||
log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTB, CURSEFORGE, SPONGEVANILLA"
|
log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTBA (multiarch-only),"
|
||||||
|
log " CURSE_INSTANCE, CURSEFORGE, SPONGEVANILLA, TUINITY, PURPUR"
|
||||||
|
log " CUSTOM, MAGMA, MOHIST, CATSERVER, YATOPIA, AIRPLANE"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|||||||
36
start-deployAirplane
Normal file
36
start-deployAirplane
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
JAVA_VER=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1)
|
||||||
|
|
||||||
|
if [ "${JAVA_VER}" != "8" ] && [ "${JAVA_VER}" != "11" ]; then
|
||||||
|
log "ERROR: Airplane server type only supports Java versions 8 and 11"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${VERSION}" != "LATEST" ]; then
|
||||||
|
log "ERROR: Airplane server type only supports VERSION=LATEST"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
export SERVER=airplane-${VANILLA_VERSION}-jdk${JAVA_VER}.jar
|
||||||
|
|
||||||
|
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
||||||
|
downloadUrl="https://dl.airplane.gg/latest/Airplane-JDK${JAVA_VER}/launcher-airplane.jar"
|
||||||
|
log "Downloading Airplane from $downloadUrl ..."
|
||||||
|
curl -fsSL -o "$SERVER" "$downloadUrl"
|
||||||
|
if [ ! -f "$SERVER" ]; then
|
||||||
|
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Normalize on Spigot for later operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-spiget "$@"
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
@@ -58,20 +59,41 @@ function downloadSpigot {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
if [[ ${VERSION^^} = LATEST ]]; then
|
||||||
|
VANILLA_VERSION=$(restify https://getbukkit.org/download/spigot --attribute='property=og:title' | jq -r '.[0] | .attributes | select(.property == "og:title") | .content | split(" ") | .[-1]')
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ -z $downloadUrl ]]; then
|
if [[ -z $downloadUrl ]]; then
|
||||||
downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar"
|
downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
setServerVar
|
||||||
|
if [ -f $SERVER ]; then
|
||||||
|
# tell curl to only download when newer
|
||||||
|
curlArgs="-z $SERVER"
|
||||||
|
fi
|
||||||
|
if isDebugging; then
|
||||||
|
curlArgs="$curlArgs -v"
|
||||||
|
fi
|
||||||
log "Downloading $match from $downloadUrl ..."
|
log "Downloading $match from $downloadUrl ..."
|
||||||
curl -fsSL -o $SERVER "$downloadUrl"
|
curl -fsSL -o $SERVER $curlArgs "$downloadUrl"
|
||||||
if [[ $? != 0 || $(grep -c "DOCTYPE html" $SERVER) != 0 ]]; then
|
if [[ $? != 0 || $(grep -c "DOCTYPE html" $SERVER) != 0 ]]; then
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|
||||||
ERROR: failed to download from $downloadUrl
|
ERROR: failed to download from $downloadUrl
|
||||||
Visit https://getbukkit.org/download/${getbukkitFlavor} to lookup the
|
Visit https://getbukkit.org/download/${getbukkitFlavor} to lookup the
|
||||||
exact version, such as 1.4.6-R0.4-SNAPSHOT or 1.8-R0.1-SNAPSHOT-LATEST
|
exact version, such as 1.4.6-R0.4-SNAPSHOT or 1.8-R0.1-SNAPSHOT-latest.
|
||||||
|
Click into the version entry to find the **exact** version, because something
|
||||||
|
like "1.8" is not sufficient according to their download naming.
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
if isDebugging && [[ $(grep -c "DOCTYPE html" $SERVER) != 0 ]]; then
|
||||||
|
cat $SERVER
|
||||||
|
fi
|
||||||
|
|
||||||
|
# remove invalid download
|
||||||
|
rm $SERVER
|
||||||
exit 3
|
exit 3
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -79,27 +101,28 @@ EOF
|
|||||||
export JVM_OPTS
|
export JVM_OPTS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setServerVar {
|
||||||
|
case "$TYPE" in
|
||||||
|
*BUKKIT|*bukkit)
|
||||||
|
export SERVER=craftbukkit_server-${VANILLA_VERSION}.jar
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
export SERVER=spigot_server-${VANILLA_VERSION}.jar
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
case "$TYPE" in
|
if isTrue "$BUILD_SPIGOT_FROM_SOURCE" || isTrue "$BUILD_FROM_SOURCE"; then
|
||||||
*BUKKIT|*bukkit)
|
setServerVar
|
||||||
export SERVER=craftbukkit_server-${VANILLA_VERSION}.jar
|
if [ ! -f $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
||||||
;;
|
buildSpigotFromSource
|
||||||
*)
|
fi
|
||||||
export SERVER=spigot_server-${VANILLA_VERSION}.jar
|
else
|
||||||
;;
|
downloadSpigot
|
||||||
esac
|
|
||||||
|
|
||||||
if [ ! -f $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
|
||||||
if isTrue "$BUILD_SPIGOT_FROM_SOURCE" || isTrue "$BUILD_FROM_SOURCE"; then
|
|
||||||
buildSpigotFromSource
|
|
||||||
else
|
|
||||||
downloadSpigot
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for operations below
|
# Normalize on Spigot for operations below
|
||||||
export TYPE=SPIGOT
|
export TYPE=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
# Continue to Final Setup
|
exec ${SCRIPTS:-/}start-spiget "$@"
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World $@
|
|
||||||
|
|||||||
@@ -1,26 +1,116 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
export FTB_BASE_DIR=/data/FeedTheBeast
|
loadForgeVars() {
|
||||||
legacyJavaFixerUrl=http://ftb.cursecdn.com/FTB2/maven/net/minecraftforge/lex/legacyjavafixer/1.0/legacyjavafixer-1.0.jar
|
cfgFile=${1?}
|
||||||
|
pat='^([^#;][^=]+)=[:space:]*([^;]*)'
|
||||||
|
while read -r line || [[ -n "$line" ]] ; do
|
||||||
|
if [[ $line =~ $pat ]]; then
|
||||||
|
#echo "MATCHED $line"
|
||||||
|
k=${BASH_REMATCH[1]}
|
||||||
|
v=${BASH_REMATCH[2]}
|
||||||
|
case $k in
|
||||||
|
FORGEURL)
|
||||||
|
forgeInstallerUrl="$v"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
done < "$cfgFile"
|
||||||
|
}
|
||||||
|
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
: ${FTB_BASE_DIR:=${CF_BASE_DIR:-/data/FeedTheBeast}}
|
||||||
|
export FTB_BASE_DIR
|
||||||
|
|
||||||
|
legacyJavaFixerUrl=https://ftb.forgecdn.net/FTB2/maven/net/minecraftforge/lex/legacyjavafixer/1.0/legacyjavafixer-1.0.jar
|
||||||
export TYPE=FEED-THE-BEAST
|
export TYPE=FEED-THE-BEAST
|
||||||
|
|
||||||
FTB_SERVER_MOD=${FTB_SERVER_MOD:-$CF_SERVER_MOD}
|
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."
|
||||||
if [[ -z $FTB_SERVER_MOD ]]; then
|
requireVar FTB_SERVER_MOD
|
||||||
log "Environment variable FTB_SERVER_MOD not set."
|
|
||||||
log "Set FTB_SERVER_MOD to the file name of the FTB server modpack."
|
if ! isTrue ${USE_MODPACK_START_SCRIPT:-true}; then
|
||||||
log "(And place the modpack in the /data directory.)"
|
if ! [ -f "${FTB_SERVER_MOD}" ]; then
|
||||||
|
log "ERROR unable to find requested modpack file ${FTB_SERVER_MOD}"
|
||||||
exit 2
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
needsInstall=true
|
||||||
|
installMarker=/data/.curseforge-installed
|
||||||
|
if [ -f $installMarker ]; then
|
||||||
|
if [ "$(cat $installMarker)" != "${FTB_SERVER_MOD}" ]; then
|
||||||
|
log "Upgrading modpack"
|
||||||
|
|
||||||
|
serverJar=$(find ${FTB_BASE_DIR} -not -name "forge*installer.jar" -name "forge*.jar")
|
||||||
|
if [[ "${serverJar}" ]]; then
|
||||||
|
rm -rf $(dirname "${serverJar}")/{mods,*.jar,libraries,resources,scripts,config}
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
needsInstall=false
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $needsInstall; then
|
||||||
|
log "Unpacking FTB server modpack ${FTB_SERVER_MOD} ..."
|
||||||
|
mkdir -p ${FTB_BASE_DIR}
|
||||||
|
unzip -o "${FTB_SERVER_MOD}" -d ${FTB_BASE_DIR} | awk '{printf "."} END {print ""}'
|
||||||
|
|
||||||
|
serverJar=$(find ${FTB_BASE_DIR} -path "*/libraries/*" -prune -type f -o -not -name "forge*installer.jar" -name "forge*.jar")
|
||||||
|
if [[ -z "$serverJar" ]]; then
|
||||||
|
|
||||||
|
if [ -f "${FTB_BASE_DIR}/settings.cfg" ]; then
|
||||||
|
loadForgeVars "${FTB_BASE_DIR}/settings.cfg"
|
||||||
|
|
||||||
|
if [[ $forgeInstallerUrl ]]; then
|
||||||
|
forgeInstallerJar="${FTB_BASE_DIR}/forge-installer.jar"
|
||||||
|
if ! curl -fsSL -o "$forgeInstallerJar" "$forgeInstallerUrl" ; then
|
||||||
|
log "ERROR failed to download Forge installer from $forgeInstallerUrl"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
forgeInstallerJar=$(find "${FTB_BASE_DIR}" -name "forge*installer.jar")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "${forgeInstallerJar}" ]]; then
|
||||||
|
log "ERROR Unable to find forge installer in modpack"
|
||||||
|
log " or download using modpack config."
|
||||||
|
log " Make sure you downloaded the server files."
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Installing forge server"
|
||||||
|
(cd $(dirname "${forgeInstallerJar}"); java -jar $(basename "${forgeInstallerJar}") --installServer)
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "${FTB_SERVER_MOD}" > $installMarker
|
||||||
|
fi
|
||||||
|
|
||||||
|
export SERVER=$(find ${FTB_BASE_DIR} -path "*/libraries/*" -prune -type f -o -not -name "forge*installer.jar" -name "forge*.jar")
|
||||||
|
if [[ -z "${SERVER}" || ! -f "${SERVER}" ]]; then
|
||||||
|
log "ERROR unable to locate installed forge server jar"
|
||||||
|
isDebugging && find ${FTB_BASE_DIR} -name "forge*.jar"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
export FTB_DIR=$(dirname "${SERVER}")
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
||||||
fi
|
fi
|
||||||
|
|
||||||
entryScriptExpr="
|
entryScriptExpr="
|
||||||
-name ServerStart.sh
|
-name ServerStart.sh
|
||||||
|
-o -name serverstart.sh
|
||||||
-o -name ServerStartLinux.sh
|
-o -name ServerStartLinux.sh
|
||||||
-o -name LaunchServer.sh
|
-o -name LaunchServer.sh
|
||||||
-o -name server-start.sh
|
-o -name server-start.sh
|
||||||
|
-o -name startserver.sh
|
||||||
|
-o -name StartServer.sh
|
||||||
"
|
"
|
||||||
|
|
||||||
if [[ -d ${FTB_BASE_DIR} ]]; then
|
if [[ -d ${FTB_BASE_DIR} ]]; then
|
||||||
@@ -38,7 +128,7 @@ fi
|
|||||||
# 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
|
||||||
srv_modpack=${FTB_SERVER_MOD}
|
srv_modpack=${FTB_SERVER_MOD}
|
||||||
if isURL ${srv_modpack}; then
|
if isURL "${srv_modpack}"; then
|
||||||
case $srv_modpack in
|
case $srv_modpack in
|
||||||
https://www.feed-the-beast.com/*/download|https://www.curseforge.com/minecraft/modpacks/*/download/*/file)
|
https://www.feed-the-beast.com/*/download|https://www.curseforge.com/minecraft/modpacks/*/download/*/file)
|
||||||
;;
|
;;
|
||||||
@@ -56,19 +146,19 @@ if [[ $startScriptCount = 0 ]]; then
|
|||||||
fi
|
fi
|
||||||
srv_modpack=$downloaded
|
srv_modpack=$downloaded
|
||||||
fi
|
fi
|
||||||
if [[ ${srv_modpack:0:5} == "data/" ]]; then
|
if [[ "${srv_modpack:0:5}" == "data/" ]]; then
|
||||||
# Prepend with "/"
|
# Prepend with "/"
|
||||||
srv_modpack=/${srv_modpack}
|
srv_modpack="/${srv_modpack}"
|
||||||
fi
|
fi
|
||||||
if [[ ! ${srv_modpack:0:1} == "/" ]]; then
|
if [[ ! "${srv_modpack:0:1}" == "/" ]]; then
|
||||||
# If not an absolute path, assume file is in "/data"
|
# If not an absolute path, assume file is in "/data"
|
||||||
srv_modpack=/data/${srv_modpack}
|
srv_modpack=/data/${srv_modpack}
|
||||||
fi
|
fi
|
||||||
if [[ ! -f ${srv_modpack} ]]; then
|
if [[ ! -f "${srv_modpack}" ]]; then
|
||||||
log "FTB server modpack ${srv_modpack} not found."
|
log "FTB server modpack ${srv_modpack} not found."
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
if [[ ! ${srv_modpack: -4} == ".zip" ]]; then
|
if [[ ! "${srv_modpack: -4}" == ".zip" ]]; then
|
||||||
log "FTB server modpack ${srv_modpack} is not a zip archive."
|
log "FTB server modpack ${srv_modpack} is not a zip archive."
|
||||||
log "Please set FTB_SERVER_MOD to a file with a .zip extension."
|
log "Please set FTB_SERVER_MOD to a file with a .zip extension."
|
||||||
exit 2
|
exit 2
|
||||||
@@ -76,7 +166,17 @@ if [[ $startScriptCount = 0 ]]; then
|
|||||||
|
|
||||||
log "Unpacking FTB server modpack ${srv_modpack} ..."
|
log "Unpacking FTB server modpack ${srv_modpack} ..."
|
||||||
mkdir -p ${FTB_BASE_DIR}
|
mkdir -p ${FTB_BASE_DIR}
|
||||||
unzip -o ${srv_modpack} -d ${FTB_BASE_DIR} | awk '{printf "."} END {print ""}'
|
unzip -o "${srv_modpack}" -d ${FTB_BASE_DIR} | awk '{printf "."} END {print ""}'
|
||||||
|
|
||||||
|
installScript=$(find "${FTB_BASE_DIR}" -maxdepth 2 -type f -name install.sh)
|
||||||
|
if [[ "$installScript" ]]; then
|
||||||
|
(
|
||||||
|
cd "$(dirname "${installScript}")"
|
||||||
|
chmod +x ./install.sh
|
||||||
|
log "Running included install.sh"
|
||||||
|
./install.sh
|
||||||
|
)
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $(find ${FTB_BASE_DIR} $entryScriptExpr | wc -l) = 0 ]]; then
|
if [[ $(find ${FTB_BASE_DIR} $entryScriptExpr | wc -l) = 0 ]]; then
|
||||||
@@ -114,7 +214,7 @@ export FTB_SERVER_START=$(find "${FTB_BASE_DIR}" $entryScriptExpr)
|
|||||||
|
|
||||||
export FTB_DIR=$(dirname "${FTB_SERVER_START}")
|
export FTB_DIR=$(dirname "${FTB_SERVER_START}")
|
||||||
chmod a+x "${FTB_SERVER_START}"
|
chmod a+x "${FTB_SERVER_START}"
|
||||||
grep fml.queryResult=confirm ${FTB_SERVER_START} > /dev/null || \
|
grep fml.queryResult=confirm "${FTB_SERVER_START}" > /dev/null || \
|
||||||
sed -i 's/-jar/-Dfml.queryResult=confirm -jar/' "${FTB_SERVER_START}"
|
sed -i 's/-jar/-Dfml.queryResult=confirm -jar/' "${FTB_SERVER_START}"
|
||||||
sed -i 's/.*read.*Restart now/#\0/' "${FTB_SERVER_START}"
|
sed -i 's/.*read.*Restart now/#\0/' "${FTB_SERVER_START}"
|
||||||
legacyJavaFixerPath="${FTB_DIR}/mods/legacyjavafixer.jar"
|
legacyJavaFixerPath="${FTB_DIR}/mods/legacyjavafixer.jar"
|
||||||
@@ -135,4 +235,4 @@ elif [ -e "${FTB_DIR}/Install.sh" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Continue to Final Setup
|
# Continue to Final Setup
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World $@
|
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
||||||
@@ -29,4 +29,4 @@ fi
|
|||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
# Continue to Final Setup
|
# Continue to Final Setup
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World "$@"
|
exec ${SCRIPTS:-/}start-finalSetupWorld "$@"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
if isURL ${CUSTOM_SERVER}; then
|
if isURL ${CUSTOM_SERVER}; then
|
||||||
filename=$(basename ${CUSTOM_SERVER})
|
filename=$(basename ${CUSTOM_SERVER})
|
||||||
@@ -17,15 +18,19 @@ if isURL ${CUSTOM_SERVER}; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
elif [[ -f ${CUSTOM_SERVER} ]]; then
|
elif [[ -f ${CUSTOM_SERVER} ]]; then
|
||||||
log "Using custom server jar at ${CUSTOM_SERVER} ..."
|
export SERVER=${CUSTOM_SERVER}
|
||||||
|
|
||||||
|
elif [[ ${GENERIC_PACK} ]]; then
|
||||||
|
log "Using custom server jar from generic pack at ${CUSTOM_SERVER} ..."
|
||||||
export SERVER=${CUSTOM_SERVER}
|
export SERVER=${CUSTOM_SERVER}
|
||||||
|
|
||||||
else
|
else
|
||||||
log "CUSTOM_SERVER is not properly set to a URL or existing jar file"
|
log "CUSTOM_SERVER is not properly set to a URL or existing jar file"
|
||||||
exit 2
|
exit 2
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
# Continue to Final Setup
|
# Continue to Final Setup
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World $@
|
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
||||||
|
|||||||
@@ -7,36 +7,34 @@ export TYPE=FABRIC
|
|||||||
|
|
||||||
FABRIC_INSTALLER=${FABRIC_INSTALLER:-}
|
FABRIC_INSTALLER=${FABRIC_INSTALLER:-}
|
||||||
FABRIC_INSTALLER_URL=${FABRIC_INSTALLER_URL:-}
|
FABRIC_INSTALLER_URL=${FABRIC_INSTALLER_URL:-}
|
||||||
FABRICVERSION=${FABRICVERSION:-LATEST}
|
FABRIC_INSTALLER_VERSION=${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."
|
log "Checking Fabric version information."
|
||||||
case $FABRICVERSION in
|
case $FABRIC_INSTALLER_VERSION in
|
||||||
LATEST)
|
LATEST)
|
||||||
FABRIC_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml)
|
FABRIC_INSTALLER_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml)
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
FABRIC_VERSION=$FABRICVERSION
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
FABRIC_INSTALLER="/tmp/fabric-installer-$FABRIC_VERSION.jar"
|
FABRIC_INSTALLER="/tmp/fabric-installer-${FABRIC_INSTALLER_VERSION}.jar"
|
||||||
|
markerVersion=$FABRIC_INSTALLER_VERSION
|
||||||
|
|
||||||
elif [[ -z $FABRIC_INSTALLER ]]; then
|
elif [[ -z $FABRIC_INSTALLER ]]; then
|
||||||
FABRIC_INSTALLER="/tmp/fabric-installer.jar"
|
FABRIC_INSTALLER="/tmp/fabric-installer.jar"
|
||||||
|
markerVersion=custom
|
||||||
elif [[ ! -e $FABRIC_INSTALLER ]]; then
|
elif [[ ! -e $FABRIC_INSTALLER ]]; then
|
||||||
log "ERROR: the given Fabric installer doesn't exist : $FABRIC_INSTALLER"
|
log "ERROR: the given Fabric installer doesn't exist : $FABRIC_INSTALLER"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
installMarker="/data/.fabric-installed-${VANILLA_VERSION}-${FABRIC_VERSION:-manual}"
|
installMarker="/data/.fabric-installed-${VANILLA_VERSION}-${markerVersion}"
|
||||||
|
|
||||||
debug Checking for installMarker ${installMarker}
|
debug Checking for installMarker ${installMarker}
|
||||||
if [[ ! -e $installMarker ]]; then
|
if [[ ! -e $installMarker ]]; then
|
||||||
if [[ ! -e $FABRIC_INSTALLER ]]; then
|
if [[ ! -e $FABRIC_INSTALLER ]]; then
|
||||||
if [[ -z $FABRIC_INSTALLER_URL ]]; then
|
if [[ -z $FABRIC_INSTALLER_URL ]]; then
|
||||||
log "Downloading $FABRIC_VERSION"
|
log "Downloading installer version $FABRIC_INSTALLER_VERSION"
|
||||||
downloadUrl="https://maven.fabricmc.net/net/fabricmc/fabric-installer/$FABRIC_VERSION/fabric-installer-$FABRIC_VERSION.jar"
|
downloadUrl="https://maven.fabricmc.net/net/fabricmc/fabric-installer/${FABRIC_INSTALLER_VERSION}/fabric-installer-${FABRIC_INSTALLER_VERSION}.jar"
|
||||||
log "...trying $downloadUrl"
|
log "...trying $downloadUrl"
|
||||||
curl -o $FABRIC_INSTALLER -fsSL $downloadUrl
|
curl -o $FABRIC_INSTALLER -fsSL $downloadUrl
|
||||||
else
|
else
|
||||||
@@ -49,14 +47,17 @@ if [[ ! -e $installMarker ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if isDebugging; then
|
if isDebugging; then
|
||||||
debug "Installing Fabric $FABRIC_VERSION using $FABRIC_INSTALLER with mcversion ${VANILLA_VERSION}"
|
debug "Installing Fabric ${VANILLA_VERSION} using $FABRIC_INSTALLER"
|
||||||
else
|
else
|
||||||
log "Installing Fabric $FABRIC_VERSION using $FABRIC_INSTALLER"
|
log "Installing Fabric using $FABRIC_INSTALLER"
|
||||||
fi
|
fi
|
||||||
tries=3
|
tries=3
|
||||||
set +e
|
set +e
|
||||||
while ((--tries >= 0)); do
|
while ((--tries >= 0)); do
|
||||||
java -jar $FABRIC_INSTALLER server -mcversion $VANILLA_VERSION -downloadMinecraft
|
java -jar $FABRIC_INSTALLER server \
|
||||||
|
-mcversion $VANILLA_VERSION \
|
||||||
|
-downloadMinecraft \
|
||||||
|
-dir /data
|
||||||
if [[ $? == 0 ]]; then
|
if [[ $? == 0 ]]; then
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
@@ -75,4 +76,4 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Contineut to Final Setup
|
# Contineut to Final Setup
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World $@
|
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
export TYPE=FORGE
|
export TYPE=FORGE
|
||||||
|
: ${FORGEVERSION:=RECOMMENDED}
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
if [[ -z $FORGE_INSTALLER && -z $FORGE_INSTALLER_URL ]]; then
|
if [[ -z $FORGE_INSTALLER && -z $FORGE_INSTALLER_URL ]]; then
|
||||||
norm=$VANILLA_VERSION
|
norm=$VANILLA_VERSION
|
||||||
@@ -45,6 +46,8 @@ elif [[ -z $FORGE_INSTALLER ]]; then
|
|||||||
elif [[ ! -e $FORGE_INSTALLER ]]; then
|
elif [[ ! -e $FORGE_INSTALLER ]]; then
|
||||||
log "ERROR: the given Forge installer doesn't exist : $FORGE_INSTALLER"
|
log "ERROR: the given Forge installer doesn't exist : $FORGE_INSTALLER"
|
||||||
exit 2
|
exit 2
|
||||||
|
else
|
||||||
|
shortForgeVersion=$VANILLA_VERSION-custom
|
||||||
fi
|
fi
|
||||||
|
|
||||||
installMarker="/data/.forge-installed-$shortForgeVersion"
|
installMarker="/data/.forge-installed-$shortForgeVersion"
|
||||||
@@ -97,7 +100,11 @@ if [ ! -e $installMarker ]; then
|
|||||||
log "Finding installed server jar..."
|
log "Finding installed server jar..."
|
||||||
unset -v latest
|
unset -v latest
|
||||||
for file in *forge*.jar; do
|
for file in *forge*.jar; do
|
||||||
[[ $file =~ installer ]] || [[ $file -nt $latest ]] && latest=$file
|
if ! [[ $file =~ installer ]]; then
|
||||||
|
if [[ -z $latest ]] || [[ $file -nt $latest ]]; then
|
||||||
|
latest=$file
|
||||||
|
fi
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
if [[ -z $latest ]]; then
|
if [[ -z $latest ]]; then
|
||||||
log "Unable to derive server jar for Forge"
|
log "Unable to derive server jar for Forge"
|
||||||
@@ -113,4 +120,4 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Continue to Final Setup
|
# Continue to Final Setup
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World $@
|
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
||||||
|
|||||||
@@ -15,4 +15,4 @@ fi
|
|||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
# Continue to Final Setup
|
# Continue to Final Setup
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World $@
|
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ set -e
|
|||||||
isDebugging && set -x
|
isDebugging && set -x
|
||||||
|
|
||||||
requireVar VANILLA_VERSION
|
requireVar VANILLA_VERSION
|
||||||
|
: ${MOHIST_BUILD:=lastSuccessfulBuild}
|
||||||
|
|
||||||
mohistJobs=https://ci.codemc.io/job/Mohist-Community/job/
|
mohistJobs=https://ci.codemc.io/job/Mohist-Community/job/
|
||||||
mohistJob=${mohistJobs}Mohist-${VANILLA_VERSION}/
|
mohistJob=${mohistJobs}Mohist-${VANILLA_VERSION}/
|
||||||
@@ -17,12 +18,12 @@ if ! curl -X HEAD -o /dev/null -fsSL "${mohistJob}"; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
latestBuildRelPath=$(
|
buildRelPath=$(
|
||||||
curl -fsSL "${mohistJob}lastSuccessfulBuild/api/json" |
|
curl -fsSL "${mohistJob}${MOHIST_BUILD}/api/json" |
|
||||||
jq -r '.artifacts[0].relativePath'
|
jq -r '.artifacts[0].relativePath'
|
||||||
)
|
)
|
||||||
|
|
||||||
baseName=$(basename "${latestBuildRelPath}")
|
baseName=$(basename "${buildRelPath}")
|
||||||
if [[ ${baseName} != *-server.jar* ]]; then
|
if [[ ${baseName} != *-server.jar* ]]; then
|
||||||
log "ERROR: mohist build for ${VANILLA_VERSION} is not a valid server jar, found ${baseName}"
|
log "ERROR: mohist build for ${VANILLA_VERSION} is not a valid server jar, found ${baseName}"
|
||||||
log " check https://ci.codemc.io/job/Mohist-Community/ for available versions"
|
log " check https://ci.codemc.io/job/Mohist-Community/ for available versions"
|
||||||
@@ -34,10 +35,10 @@ export SERVER="/data/${baseName}"
|
|||||||
|
|
||||||
if [ ! -f ${SERVER} ]; then
|
if [ ! -f ${SERVER} ]; then
|
||||||
log "Downloading ${baseName}"
|
log "Downloading ${baseName}"
|
||||||
curl -o "${SERVER}" -fsSL "${mohistJob}lastSuccessfulBuild/artifact/${latestBuildRelPath}"
|
curl -o "${SERVER}" -fsSL "${mohistJob}${MOHIST_BUILD}/artifact/${buildRelPath}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
# Continue to Final Setup
|
# Continue to Final Setup
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World "$@"
|
exec ${SCRIPTS:-/}start-finalSetupWorld "$@"
|
||||||
|
|||||||
@@ -1,23 +1,79 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
set -o pipefail
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
: ${PAPERBUILD:=latest}
|
if [[ $PAPER_DOWNLOAD_URL ]]; then
|
||||||
export SERVER=paper_server-${VANILLA_VERSION}-${PAPERBUILD}.jar
|
export SERVER=$(getFilenameFromUrl "${PAPER_DOWNLOAD_URL}")
|
||||||
|
|
||||||
if [ ! -f "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
if [ -f "$SERVER" ]; then
|
||||||
downloadUrl=${PAPER_DOWNLOAD_URL:-https://papermc.io/api/v1/paper/${VANILLA_VERSION}/${PAPERBUILD}/download}
|
zarg=(-z "$SERVER")
|
||||||
log "Downloading Paper $VANILLA_VERSION (build $PAPERBUILD) from $downloadUrl ..."
|
fi
|
||||||
curl -fsSL -o "$SERVER" "$downloadUrl"
|
|
||||||
if [ ! -f "$SERVER" ]; then
|
echo "Preparing custom PaperMC jar from $PAPER_DOWNLOAD_URL"
|
||||||
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
|
||||||
exit 3
|
curl -fsSL -o "$SERVER" "${zarg[@]}" "${PAPER_DOWNLOAD_URL}"
|
||||||
fi
|
else
|
||||||
|
# PaperMC API v2 docs : https://papermc.io/api/docs/swagger-ui/index.html?configUrl=/api/openapi/swagger-config
|
||||||
|
|
||||||
|
build=${PAPERBUILD:=$(curl -fsSL "https://papermc.io/api/v2/projects/paper/versions/${VANILLA_VERSION}" -H "accept: application/json" \
|
||||||
|
| jq '.builds[-1]')}
|
||||||
|
case $? in
|
||||||
|
0)
|
||||||
|
;;
|
||||||
|
22)
|
||||||
|
versions=$(curl -fsSL "https://papermc.io/api/v2/projects/paper" -H "accept: application/json")
|
||||||
|
if [[ $VERSION = LATEST ]]; then
|
||||||
|
VANILLA_VERSION=$(echo "$versions" | jq -r '.versions[-1]')
|
||||||
|
log "WARN: using ${VANILLA_VERSION} since that's the latest provided by PaperMC"
|
||||||
|
# re-execute the current script with the newly computed version
|
||||||
|
exec "$0" "$@"
|
||||||
|
fi
|
||||||
|
log "ERROR: ${VANILLA_VERSION} is not published by PaperMC"
|
||||||
|
log " Set VERSION to one of the following: "
|
||||||
|
log " $(echo "$versions" | jq -r '.versions | join(", ")')"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "ERROR: unknown error while looking up PaperMC version=${VANILLA_VERSION}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
echo "ERROR: failed to lookup PaperMC build from version ${VANILLA_VERSION}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
export SERVER=$(curl -fsSL "https://papermc.io/api/v2/projects/paper/versions/${VANILLA_VERSION}/builds/${build}" -H "accept: application/json" \
|
||||||
|
| jq -r '.downloads.application.name')
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
echo "ERROR: failed to lookup PaperMC download file from version=${VANILLA_VERSION} build=${build}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$SERVER" ]; then
|
||||||
|
zarg=(-z "$SERVER")
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Removing old PaperMC versions ..."
|
||||||
|
shopt -s nullglob
|
||||||
|
for f in paper-*.jar; do
|
||||||
|
[[ $f != $SERVER ]] && rm $f
|
||||||
|
done
|
||||||
|
|
||||||
|
log "Downloading PaperMC $VANILLA_VERSION (build $build) ..."
|
||||||
|
curl -fsSL -o "$SERVER" "${zarg[@]}" \
|
||||||
|
"https://papermc.io/api/v2/projects/paper/versions/${VANILLA_VERSION}/builds/${build}/downloads/${SERVER}" \
|
||||||
|
-H "accept: application/java-archive"
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
echo "ERROR: failed to download PaperMC from version=${VANILLA_VERSION} build=${build} download=${SERVER}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for operations below
|
# Normalize on Spigot for downstream operations
|
||||||
export TYPE=SPIGOT
|
export TYPE=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
# Continue to Final Setup
|
exec ${SCRIPTS:-/}start-spiget "$@"
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World $@
|
|
||||||
|
|||||||
37
start-deployPurpur
Executable file
37
start-deployPurpur
Executable file
@@ -0,0 +1,37 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
: ${VANILLA_VERSION:?}
|
||||||
|
: ${PURPUR_BUILD:=LATEST}
|
||||||
|
: ${FORCE_REDOWNLOAD:=false}
|
||||||
|
|
||||||
|
if [[ ${PURPUR_BUILD} == LATEST ]]; then
|
||||||
|
PURPUR_BUILD=$(curl -fsSL "https://purpur.pl3x.net/api/v1/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 " Please check if a download is available at https://purpur.pl3x.net/downloads/"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
export SERVER="purpur-${VANILLA_VERSION}-${PURPUR_BUILD}.jar"
|
||||||
|
|
||||||
|
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
||||||
|
downloadUrl="https://purpur.pl3x.net/api/v1/purpur/${VANILLA_VERSION}/${PURPUR_BUILD}/download"
|
||||||
|
log "Downloading Purpur from $downloadUrl ..."
|
||||||
|
if ! curl -fsSL -o "$SERVER" "$downloadUrl"; then
|
||||||
|
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Normalize on Spigot for later operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-spiget "$@"
|
||||||
@@ -3,6 +3,8 @@
|
|||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
export TYPE=spongevanilla
|
export TYPE=spongevanilla
|
||||||
|
: ${SPONGEBRANCH:=STABLE}
|
||||||
|
: ${SPONGEVERSION:=}
|
||||||
|
|
||||||
# Parse branch
|
# Parse branch
|
||||||
log "Choosing branch for Sponge"
|
log "Choosing branch for Sponge"
|
||||||
@@ -36,4 +38,4 @@ if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Continue to Final Setup
|
# Continue to Final Setup
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World $@
|
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
||||||
|
|||||||
@@ -20,8 +20,7 @@ if [ ! -f "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for operations below
|
# Normalize on Spigot for later operations
|
||||||
export TYPE=SPIGOT
|
export TYPE=SPIGOT
|
||||||
|
|
||||||
# Continue to Final Setup
|
exec ${SCRIPTS:-/}start-spiget "$@"
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World $@
|
|
||||||
|
|||||||
@@ -26,6 +26,9 @@ if [ ! -e $SERVER ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
|||||||
if [ $result != 0 ]; then
|
if [ $result != 0 ]; then
|
||||||
log "ERROR failed to obtain version manifest from $versionManifestUrl ($result)"
|
log "ERROR failed to obtain version manifest from $versionManifestUrl ($result)"
|
||||||
exit 1
|
exit 1
|
||||||
|
elif [ $serverDownloadUrl = null ]; then
|
||||||
|
log "ERROR version $VANILLA_VERSION does not provide a server download"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
debug "Downloading server from $serverDownloadUrl"
|
debug "Downloading server from $serverDownloadUrl"
|
||||||
@@ -43,4 +46,4 @@ fi
|
|||||||
isDebugging && ls -l
|
isDebugging && ls -l
|
||||||
|
|
||||||
# Continue to Final Setup
|
# Continue to Final Setup
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World $@
|
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
||||||
|
|||||||
30
start-deployYatopia
Normal file
30
start-deployYatopia
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
: ${VANILLA_VERSION:?}
|
||||||
|
: ${RELEASE:=stable}
|
||||||
|
: ${FORCE_REDOWNLOAD:=false}
|
||||||
|
|
||||||
|
requireEnum RELEASE stable latest
|
||||||
|
|
||||||
|
export SERVER="yatopia-${RELEASE}-${VANILLA_VERSION}.jar"
|
||||||
|
|
||||||
|
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
||||||
|
downloadUrl="https://api.yatopiamc.org/v2/${RELEASE}Build/download?branch=ver/${VANILLA_VERSION}"
|
||||||
|
log "Downloading Yatopia from $downloadUrl ..."
|
||||||
|
if ! curl -fsSL -o "$SERVER" "$downloadUrl"; then
|
||||||
|
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Normalize on Spigot for later operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
# Continue to Final Setup
|
||||||
|
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
set -e
|
|
||||||
isDebugging && set -x
|
|
||||||
|
|
||||||
if [ $TYPE = "FEED-THE-BEAST" ]; then
|
|
||||||
worldDest=$FTB_BASE_DIR/$LEVEL
|
|
||||||
else
|
|
||||||
worldDest=/data/$LEVEL
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$WORLD" ]] && [ ! -d "$worldDest" ]; then
|
|
||||||
if isURL $WORLD; then
|
|
||||||
curl -fsSL "$WORLD" -o /tmp/world.zip
|
|
||||||
zipSrc=/tmp/world.zip
|
|
||||||
elif [[ "$WORLD" =~ .*\.zip ]]; then
|
|
||||||
zipSrc="$WORLD"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$zipSrc" ]]; then
|
|
||||||
log "Unzipping world"
|
|
||||||
|
|
||||||
# Stage contents so that the correct subdirectory can be picked off
|
|
||||||
mkdir -p /tmp/world-data
|
|
||||||
(cd /tmp/world-data && unzip -o -q "$zipSrc")
|
|
||||||
|
|
||||||
baseDirs=$(find /tmp/world-data -name "level.dat" -exec dirname "{}" \;)
|
|
||||||
count=$(echo "$baseDirs" | wc -l)
|
|
||||||
if [[ $count -gt 1 ]]; then
|
|
||||||
baseDir="$(echo "$baseDirs" | sed -n ${WORLD_INDEX:-1}p)"
|
|
||||||
baseName=$(basename "$baseDir")
|
|
||||||
log "WARN multiple levels found, picking: $baseName"
|
|
||||||
elif [[ $count -gt 0 ]]; then
|
|
||||||
baseDir="$baseDirs"
|
|
||||||
else
|
|
||||||
log "ERROR invalid world content"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
mv "$baseDir" "$worldDest"
|
|
||||||
else
|
|
||||||
log "Cloning world directory from $WORLD ..."
|
|
||||||
cp -r "$WORLD" "$worldDest"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$TYPE" = "SPIGOT" ]; then
|
|
||||||
# Reorganise if a Spigot server
|
|
||||||
log "Moving End and Nether maps to Spigot location"
|
|
||||||
[ -d "$worldDest/DIM1" ] && mv -f "$worldDest/DIM1" "/data/${LEVEL}_the_end"
|
|
||||||
[ -d "$worldDest/DIM-1" ] && mv -f "$worldDest/DIM-1" "/data/${LEVEL}_nether"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetup02Modpack $@
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
|
||||||
|
|
||||||
if [ "${REPLACE_ENV_VARIABLES^^}" = "TRUE" ]; then
|
|
||||||
log "Replacing env variables in configs that match the prefix $ENV_VARIABLE_PREFIX..."
|
|
||||||
while IFS='=' read -r name value ; do
|
|
||||||
# check if name of env variable matches the prefix
|
|
||||||
# sanity check environment variables to avoid code injections
|
|
||||||
if [[ "$name" = $ENV_VARIABLE_PREFIX* ]] \
|
|
||||||
&& [[ $value =~ ^[0-9a-zA-Z_:/=?.+\-]*$ ]] \
|
|
||||||
&& [[ $name =~ ^[0-9a-zA-Z_\-]*$ ]]; then
|
|
||||||
# Read content from file environment
|
|
||||||
if [[ $name = *"_FILE" ]] && [[ -f $value ]]; then
|
|
||||||
name="${name/_FILE/}"
|
|
||||||
value=$(<$value)
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "Replacing $name with $value ..."
|
|
||||||
find /data/ -type f \
|
|
||||||
\( -name "*.yml" -or -name "*.yaml" -or -name "*.txt" -or -name "*.cfg" \
|
|
||||||
-or -name "*.conf" -or -name "*.properties" \) \
|
|
||||||
-exec sed -i 's#${'"$name"'}#'"$value"'#g' {} \;
|
|
||||||
fi
|
|
||||||
done < <(env)
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-minecraftFinalSetup $@
|
|
||||||
51
start-finalSetupEnvVariables
Normal file
51
start-finalSetupEnvVariables
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
|
: ${ENV_VARIABLE_PREFIX:=CFG_}
|
||||||
|
|
||||||
|
if isTrue "${REPLACE_ENV_VARIABLES}"; then
|
||||||
|
log "Replacing env variables in configs that match the prefix $ENV_VARIABLE_PREFIX ..."
|
||||||
|
|
||||||
|
# File excludes
|
||||||
|
fileExcludes=
|
||||||
|
for f in ${REPLACE_ENV_VARIABLES_EXCLUDES}; do
|
||||||
|
fileExcludes="${fileExcludes} -not -name $f"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Directory excludes (recursive)
|
||||||
|
dirExcludes=$(join_by " -o -path " ${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS})
|
||||||
|
if [[ $dirExcludes ]]; then
|
||||||
|
dirExcludes=" -type d ( -path ${dirExcludes} ) -prune -o"
|
||||||
|
fi
|
||||||
|
|
||||||
|
isDebugging && echo "Using find file exclusions: $fileExcludes"
|
||||||
|
isDebugging && echo "Using find directory exclusions: $dirExcludes"
|
||||||
|
|
||||||
|
for name in $(compgen -v $ENV_VARIABLE_PREFIX); do
|
||||||
|
# check if name of env variable matches the prefix
|
||||||
|
# sanity check environment variables to avoid code injections
|
||||||
|
# Read content from file environment
|
||||||
|
if [[ $name = *"_FILE" ]]; then
|
||||||
|
value=$(<${!name})
|
||||||
|
name="${name%_FILE}"
|
||||||
|
else
|
||||||
|
value=${!name}
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Replacing $name with $value ..."
|
||||||
|
|
||||||
|
value=${value//\\/\\\\}
|
||||||
|
value=${value//#/\\#}
|
||||||
|
|
||||||
|
find /data/ \
|
||||||
|
$dirExcludes \
|
||||||
|
-type f \
|
||||||
|
\( -name "*.yml" -or -name "*.yaml" -or -name "*.txt" -or -name "*.cfg" \
|
||||||
|
-or -name "*.conf" -or -name "*.properties" -or -name "*.hjson" -or -name "*.json" \) \
|
||||||
|
$fileExcludes \
|
||||||
|
-exec sed -i 's#${'"$name"'}#'"$value"'#g' {} \;
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-minecraftFinalSetup $@
|
||||||
@@ -24,4 +24,4 @@ case "X$MODCONFIG" in
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetup04ServerProperties $@
|
exec ${SCRIPTS:-/}start-finalSetupMounts $@
|
||||||
@@ -1,80 +1,109 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
set -e
|
set -e -o pipefail
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
if isDebugging; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
# CURSE_URL_BASE used in manifest downloads below
|
# CURSE_URL_BASE used in manifest downloads below
|
||||||
CURSE_URL_BASE=${CURSE_URL_BASE:-https://minecraft.curseforge.com/projects}
|
CURSE_URL_BASE=${CURSE_URL_BASE:-https://minecraft.curseforge.com/projects}
|
||||||
|
|
||||||
# Remove old mods/plugins
|
# Remove old mods/plugins
|
||||||
if [ "$REMOVE_OLD_MODS" = "TRUE" ]; then
|
if isTrue ${REMOVE_OLD_MODS}; then
|
||||||
if [ "$TYPE" = "SPIGOT" ]; then
|
remove_mods_dest="/data/mods"
|
||||||
rm -rf /data/plugins/*
|
case ${TYPE} in
|
||||||
|
SPIGOT|BUKKIT|PAPER)
|
||||||
|
remove_mods_dest="/data/plugins"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# only try to remove existing mods dir
|
||||||
|
if [ -d "$remove_mods_dest" ]; then
|
||||||
|
log "Removing old mods in $remove_mods_dest..."
|
||||||
|
find $remove_mods_dest -mindepth 1 -maxdepth ${REMOVE_OLD_MODS_DEPTH:-16} -wholename "${REMOVE_OLD_MODS_INCLUDE:-*}" -not -wholename "${REMOVE_OLD_MODS_EXCLUDE}" -delete
|
||||||
else
|
else
|
||||||
rm -rf /data/mods/*
|
log "Directory $remove_mods_dest does not exist; removing nothing."
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# If supplied with a URL for a modpack (simple zip of jars), download it and unpack
|
# If supplied with a URL for a modpack (simple zip of jars), download it and unpack
|
||||||
if [[ "$MODPACK" ]]; then
|
if [[ "$MODPACK" ]]; then
|
||||||
EFFECTIVE_MODPACK_URL=$(curl -Ls -o /dev/null -w %{url_effective} $MODPACK)
|
if isURL "${MODPACK}"; then
|
||||||
case "X$EFFECTIVE_MODPACK_URL" in
|
if [[ "${MODPACK}" == *.zip ]]; then
|
||||||
X[Hh][Tt][Tt][Pp]*.zip)
|
downloadUrl="${MODPACK}"
|
||||||
|
else
|
||||||
|
downloadUrl=$(curl -Ls -o /dev/null -w %{effective_url} $MODPACK)
|
||||||
|
if ! [[ $downloadUrl == *.zip ]]; then
|
||||||
|
log "ERROR Invalid URL given for MODPACK: $downloadUrl resolved from $MODPACK"
|
||||||
|
log " Must be HTTP or HTTPS and a ZIP file"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
log "Downloading mod/plugin pack via HTTP"
|
log "Downloading mod/plugin pack via HTTP"
|
||||||
log " from $EFFECTIVE_MODPACK_URL ..."
|
log " from $downloadUrl ..."
|
||||||
if ! curl -sSL -o /tmp/modpack.zip "$EFFECTIVE_MODPACK_URL"; then
|
if ! curl -sSL -o /tmp/modpack.zip "$downloadUrl"; then
|
||||||
log "ERROR: failed to download from $EFFECTIVE_MODPACK_URL"
|
log "ERROR: failed to download from $downloadUrl"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$TYPE" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
mkdir -p /data/plugins
|
mkdir -p /data/plugins
|
||||||
if ! unzip -o -d /data/plugins /tmp/modpack.zip; then
|
if ! unzip -o -d /data/plugins /tmp/modpack.zip; then
|
||||||
log "ERROR: failed to unzip the modpack from $EFFECTIVE_MODPACK_URL"
|
log "ERROR: failed to unzip the modpack from $downloadUrl"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
mkdir -p /data/mods
|
mkdir -p /data/mods
|
||||||
if ! unzip -o -d /data/mods /tmp/modpack.zip; then
|
if ! unzip -o -d /data/mods /tmp/modpack.zip; then
|
||||||
log "ERROR: failed to unzip the modpack from $EFFECTIVE_MODPACK_URL"
|
log "ERROR: failed to unzip the modpack from $downloadUrl"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
rm -f /tmp/modpack.zip
|
rm -f /tmp/modpack.zip
|
||||||
;;
|
|
||||||
*)
|
else
|
||||||
log "Invalid URL given for modpack: Must be HTTP or HTTPS and a ZIP file"
|
log "ERROR Invalid URL given for MODPACK: $MODPACK"
|
||||||
;;
|
exit 1
|
||||||
esac
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# If supplied with a URL for a plugin download it.
|
# If supplied with a URL for a plugin download it.
|
||||||
if [[ "$MODS" ]]; then
|
if [[ "$MODS" ]]; then
|
||||||
for i in ${MODS//,/ }
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
do
|
out_dir=/data/plugins
|
||||||
EFFECTIVE_MOD_URL=$(curl -Ls -o /dev/null -w %{url_effective} $i)
|
else
|
||||||
case "X$EFFECTIVE_MOD_URL" in
|
out_dir=/data/mods
|
||||||
X[Hh][Tt][Tt][Pp]*.jar)
|
fi
|
||||||
log "Downloading mod/plugin via HTTP"
|
mkdir -p "$out_dir"
|
||||||
log " from $EFFECTIVE_MOD_URL ..."
|
|
||||||
if ! curl -sSL -o /tmp/${EFFECTIVE_MOD_URL##*/} $EFFECTIVE_MOD_URL; then
|
|
||||||
log "ERROR: failed to download from $EFFECTIVE_MOD_URL to /tmp/${EFFECTIVE_MOD_URL##*/}"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$TYPE" = "SPIGOT" ]; then
|
for i in ${MODS//,/ }
|
||||||
mkdir -p /data/plugins
|
do
|
||||||
mv /tmp/${EFFECTIVE_MOD_URL##*/} /data/plugins/${EFFECTIVE_MOD_URL##*/}
|
if isURL $i; then
|
||||||
|
log "Downloading mod/plugin $i ..."
|
||||||
|
if isValidFileURL jar "$i"; then
|
||||||
|
if ! curl -fsSL -o "${out_dir}/$(getFilenameFromUrl "${i}")" "${i}"; then
|
||||||
|
log "ERROR: failed to download from $i into $out_dir"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
mkdir -p /data/mods
|
effective_url=$(resolveEffectiveUrl "$i")
|
||||||
mv /tmp/${EFFECTIVE_MOD_URL##*/} /data/mods/${EFFECTIVE_MOD_URL##*/}
|
if isValidFileURL jar "${effective_url}"; then
|
||||||
|
out_file=$(getFilenameFromUrl "${effective_url}")
|
||||||
|
if ! curl -fsSL -o "${out_dir}/$out_file" "${effective_url}"; then
|
||||||
|
log "ERROR: failed to download from $i into $out_dir"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "ERROR: $effective_url resolved from $i is not a valid jar URL"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
rm -f /tmp/${EFFECTIVE_MOD_URL##*/}
|
else
|
||||||
;;
|
log "ERROR Invalid URL given in MODS: $i"
|
||||||
*)
|
exit 2
|
||||||
log "Invalid URL given for modpack: Must be HTTP or HTTPS and a JAR file"
|
fi
|
||||||
;;
|
done
|
||||||
esac
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$MANIFEST" ]]; then
|
if [[ "$MANIFEST" ]]; then
|
||||||
@@ -82,7 +111,7 @@ if [[ "$MANIFEST" ]]; then
|
|||||||
EFFECTIVE_MANIFEST_FILE=$MANIFEST
|
EFFECTIVE_MANIFEST_FILE=$MANIFEST
|
||||||
elif isURL "$MANIFEST"; then
|
elif isURL "$MANIFEST"; then
|
||||||
EFFECTIVE_MANIFEST_FILE=/tmp/manifest.json
|
EFFECTIVE_MANIFEST_FILE=/tmp/manifest.json
|
||||||
EFFECTIVE_MANIFEST_URL=$(curl -Ls -o /dev/null -w %{url_effective} $MANIFEST)
|
EFFECTIVE_MANIFEST_URL=$(curl -Ls -o /dev/null -w %{effective_url} $MANIFEST)
|
||||||
curl -Ls -o $EFFECTIVE_MANIFEST_FILE "$EFFECTIVE_MANIFEST_URL"
|
curl -Ls -o $EFFECTIVE_MANIFEST_FILE "$EFFECTIVE_MANIFEST_URL"
|
||||||
else
|
else
|
||||||
log "MANIFEST='$MANIFEST' is not a valid manifest url or location"
|
log "MANIFEST='$MANIFEST' is not a valid manifest url or location"
|
||||||
@@ -103,7 +132,7 @@ case "X$EFFECTIVE_MANIFEST_FILE" in
|
|||||||
do
|
do
|
||||||
if [ ! -f $MOD_DIR/${p}_${f}.jar ]
|
if [ ! -f $MOD_DIR/${p}_${f}.jar ]
|
||||||
then
|
then
|
||||||
redirect_url="$(curl -Ls -o /dev/null -w %{url_effective} ${CURSE_URL_BASE}/${p})"
|
redirect_url="$(curl -Ls -o /dev/null -w %{effective_url} ${CURSE_URL_BASE}/${p})"
|
||||||
url="$redirect_url/download/${f}/file"
|
url="$redirect_url/download/${f}/file"
|
||||||
log Downloading curseforge mod $url
|
log Downloading curseforge mod $url
|
||||||
# Manifest usually doesn't have mod names. Using id should be fine, tho
|
# Manifest usually doesn't have mod names. Using id should be fine, tho
|
||||||
@@ -122,17 +151,17 @@ fi
|
|||||||
|
|
||||||
if [[ "${GENERIC_PACK}" ]]; then
|
if [[ "${GENERIC_PACK}" ]]; then
|
||||||
if isURL "${GENERIC_PACK}"; then
|
if isURL "${GENERIC_PACK}"; then
|
||||||
generic_pack_url=${GENERIC_PACK}
|
log "Downloading generic pack ..."
|
||||||
GENERIC_PACK=/tmp/$(basename ${generic_pack_url})
|
curl -fsSL -o /tmp/generic_pack.zip "${GENERIC_PACK}"
|
||||||
log "Downloading generic pack from ${generic_pack_url} ..."
|
GENERIC_PACK=/tmp/generic_pack.zip
|
||||||
curl -fsSL -o ${GENERIC_PACK} ${generic_pack_url}
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sum_file=/data/.generic_pack.sum
|
sum_file=/data/.generic_pack.sum
|
||||||
if ! sha256sum -c ${sum_file} -s 2> /dev/null; then
|
if ! sha256sum -c ${sum_file} -s 2> /dev/null; then
|
||||||
base_dir=/tmp/generic_pack_base
|
base_dir=/tmp/generic_pack_base
|
||||||
mkdir -p ${base_dir}
|
mkdir -p ${base_dir}
|
||||||
unzip -q -d ${base_dir} ${GENERIC_PACK}
|
isDebugging && ls -l "${GENERIC_PACK}"
|
||||||
|
unzip -q -d ${base_dir} "${GENERIC_PACK}"
|
||||||
if [ -f /data/manifest.txt ]; then
|
if [ -f /data/manifest.txt ]; then
|
||||||
log "Manifest exists from older generic pack, cleaning up ..."
|
log "Manifest exists from older generic pack, cleaning up ..."
|
||||||
while read f; do
|
while read f; do
|
||||||
@@ -150,8 +179,8 @@ if [[ "${GENERIC_PACK}" ]]; then
|
|||||||
for d in $(find ${base_dir} -type d); do mkdir -p "$(sed "s#${base_dir}#/data#" <<< $d)"; done
|
for d in $(find ${base_dir} -type d); do mkdir -p "$(sed "s#${base_dir}#/data#" <<< $d)"; done
|
||||||
for f in $(find ${base_dir} -type f); do cp -f "$f" "$(sed "s#${base_dir}#/data#" <<< $f)"; done
|
for f in $(find ${base_dir} -type f); do cp -f "$f" "$(sed "s#${base_dir}#/data#" <<< $f)"; done
|
||||||
rm -rf ${base_dir}
|
rm -rf ${base_dir}
|
||||||
sha256sum ${GENERIC_PACK} > ${sum_file}
|
sha256sum "${GENERIC_PACK}" > ${sum_file}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetup03Modconfig $@
|
exec ${SCRIPTS:-/}start-finalSetupModconfig $@
|
||||||
40
start-finalSetupMounts
Executable file
40
start-finalSetupMounts
Executable file
@@ -0,0 +1,40 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
|
: ${PLUGINS_SYNC_UPDATE:=true}
|
||||||
|
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
if [ -d /plugins ]; then
|
||||||
|
case ${TYPE} in
|
||||||
|
SPIGOT|BUKKIT|PAPER|MAGMA)
|
||||||
|
mkdir -p /data/plugins
|
||||||
|
log "Copying plugins over..."
|
||||||
|
if isTrue ${PLUGINS_SYNC_UPDATE}; then
|
||||||
|
updateArg="--update"
|
||||||
|
fi
|
||||||
|
# Copy plugins over using rsync to allow deeply nested updates of plugins
|
||||||
|
rsync -a --out-format="update:%f:Last Modified %M" --prune-empty-dirs $updateArg /plugins /data
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If any modules have been provided, copy them over
|
||||||
|
: ${COPY_MODS_DEST:="/data/mods"}
|
||||||
|
|
||||||
|
if [ -d /mods ]; then
|
||||||
|
log "Copying any mods over..."
|
||||||
|
mkdir -p $COPY_MODS_DEST
|
||||||
|
rsync -a --out-format="update:%f:Last Modified %M" "${rsyncArgs[@]}" --prune-empty-dirs --update /mods/ $COPY_MODS_DEST
|
||||||
|
fi
|
||||||
|
|
||||||
|
: ${COPY_CONFIG_DEST:="/data/config"}
|
||||||
|
|
||||||
|
if [ -d /config ]; then
|
||||||
|
log "Copying any configs from /config to $COPY_CONFIG_DEST"
|
||||||
|
mkdir -p $COPY_CONFIG_DEST
|
||||||
|
rsync -a --out-format="update:%f:Last Modified %M" "${rsyncArgs[@]}" --prune-empty-dirs --update /config/ $COPY_CONFIG_DEST
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-finalSetupServerProperties $@
|
||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
|
||||||
|
: ${SERVER_PROPERTIES:=/data/server.properties}
|
||||||
|
|
||||||
# FUNCTIONS
|
# FUNCTIONS
|
||||||
function setServerProp {
|
function setServerProp {
|
||||||
local prop=$1
|
local prop=$1
|
||||||
@@ -12,10 +14,15 @@ function setServerProp {
|
|||||||
TRUE|FALSE)
|
TRUE|FALSE)
|
||||||
var=${var,,} ;;
|
var=${var,,} ;;
|
||||||
esac
|
esac
|
||||||
log "Setting ${prop} to '${var}' in ${SERVER_PROPERTIES}"
|
if grep "${prop}" "$SERVER_PROPERTIES" > /dev/null; then
|
||||||
sed -i "/^${prop}\s*=/ c ${prop}=${var}" "$SERVER_PROPERTIES"
|
log "Setting ${prop} to '${var}' in ${SERVER_PROPERTIES}"
|
||||||
|
sed -i "/^${prop}\s*=/ c ${prop}=${var//\\/\\\\}" "$SERVER_PROPERTIES"
|
||||||
|
else
|
||||||
|
log "Adding ${prop} with '${var}' in ${SERVER_PROPERTIES}"
|
||||||
|
echo "${prop}=${var//\\/\\\\}" >> "$SERVER_PROPERTIES"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
log "Skip setting ${prop}"
|
isDebugging && log "Skip setting ${prop}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,6 +31,10 @@ function customizeServerProps {
|
|||||||
log "Creating whitelist"
|
log "Creating whitelist"
|
||||||
setServerProp "whitelist" "true"
|
setServerProp "whitelist" "true"
|
||||||
setServerProp "white-list" "true"
|
setServerProp "white-list" "true"
|
||||||
|
else
|
||||||
|
log "Disabling whitelist"
|
||||||
|
setServerProp "whitelist" "false"
|
||||||
|
setServerProp "white-list" "false"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# If not provided, generate a reasonable default message-of-the-day,
|
# If not provided, generate a reasonable default message-of-the-day,
|
||||||
@@ -69,7 +80,7 @@ function customizeServerProps {
|
|||||||
setServerProp "max-world-size" "$MAX_WORLD_SIZE"
|
setServerProp "max-world-size" "$MAX_WORLD_SIZE"
|
||||||
setServerProp "level-name" "$LEVEL"
|
setServerProp "level-name" "$LEVEL"
|
||||||
setServerProp "level-seed" "$SEED"
|
setServerProp "level-seed" "$SEED"
|
||||||
setServerProp "pvp" "$PVP"
|
setServerProp "pvp" "${PVP}"
|
||||||
setServerProp "generator-settings" "$GENERATOR_SETTINGS"
|
setServerProp "generator-settings" "$GENERATOR_SETTINGS"
|
||||||
setServerProp "online-mode" "$ONLINE_MODE"
|
setServerProp "online-mode" "$ONLINE_MODE"
|
||||||
setServerProp "allow-flight" "$ALLOW_FLIGHT"
|
setServerProp "allow-flight" "$ALLOW_FLIGHT"
|
||||||
@@ -77,6 +88,18 @@ function customizeServerProps {
|
|||||||
setServerProp "resource-pack" "$RESOURCE_PACK"
|
setServerProp "resource-pack" "$RESOURCE_PACK"
|
||||||
setServerProp "resource-pack-sha1" "$RESOURCE_PACK_SHA1"
|
setServerProp "resource-pack-sha1" "$RESOURCE_PACK_SHA1"
|
||||||
setServerProp "player-idle-timeout" "$PLAYER_IDLE_TIMEOUT"
|
setServerProp "player-idle-timeout" "$PLAYER_IDLE_TIMEOUT"
|
||||||
|
setServerProp "broadcast-console-to-ops" "$BROADCAST_CONSOLE_TO_OPS"
|
||||||
|
setServerProp "broadcast-rcon-to-ops" "$BROADCAST_RCON_TO_OPS"
|
||||||
|
setServerProp "enable-jmx-monitoring" "$ENABLE_JMX"
|
||||||
|
setServerProp "sync-chunk-writes" "$SYNC_CHUNK_WRITES"
|
||||||
|
setServerProp "enable-status" "$ENABLE_STATUS"
|
||||||
|
setServerProp "entity-broadcast-range-percentage" "$ENTITY_BROADCAST_RANGE_PERCENTAGE"
|
||||||
|
setServerProp "function-permission-level" "$FUNCTION_PERMISSION_LEVEL"
|
||||||
|
setServerProp "network-compression-threshold" "$NETWORK_COMPRESSION_THRESHOLD"
|
||||||
|
setServerProp "op-permission-level" "$OP_PERMISSION_LEVEL"
|
||||||
|
setServerProp "prevent-proxy-connections" "$PREVENT_PROXY_CONNECTIONS"
|
||||||
|
setServerProp "use-native-transport" "$USE_NATIVE_TRANSPORT"
|
||||||
|
setServerProp "enforce-whitelist" "$ENFORCE_WHITELIST"
|
||||||
|
|
||||||
if [ -n "$DIFFICULTY" ]; then
|
if [ -n "$DIFFICULTY" ]; then
|
||||||
case $DIFFICULTY in
|
case $DIFFICULTY in
|
||||||
@@ -194,4 +217,4 @@ if isDebugging; then
|
|||||||
cat /data/server.properties
|
cat /data/server.properties
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec ${SCRIPTS:-/}start-finalSetup05EnvVariables $@
|
exec ${SCRIPTS:-/}start-finalSetupEnvVariables $@
|
||||||
74
start-finalSetupWorld
Normal file
74
start-finalSetupWorld
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
set -e
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
|
: ${LEVEL:=world}
|
||||||
|
export LEVEL
|
||||||
|
|
||||||
|
if [ $TYPE = "FEED-THE-BEAST" ]; then
|
||||||
|
worldDest=$FTB_DIR/$LEVEL
|
||||||
|
else
|
||||||
|
worldDest=/data/$LEVEL
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] ); then
|
||||||
|
if isTrue "${FORCE_WORLD_COPY}"; then
|
||||||
|
log "Removing existing world data in $worldDest ${worldDest}_nether ${worldDest}_the_end"
|
||||||
|
rm -rf "$worldDest" \
|
||||||
|
"${worldDest}_nether" \
|
||||||
|
"${worldDest}_the_end"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if isURL $WORLD; then
|
||||||
|
curl -fsSL "$WORLD" -o /tmp/world.zip
|
||||||
|
zipSrc=/tmp/world.zip
|
||||||
|
elif [[ "$WORLD" =~ .*\.zip ]]; then
|
||||||
|
zipSrc="$WORLD"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$zipSrc" ]]; then
|
||||||
|
log "Unzipping world"
|
||||||
|
|
||||||
|
# Stage contents so that the correct subdirectory can be picked off
|
||||||
|
mkdir -p /tmp/world-data
|
||||||
|
(cd /tmp/world-data && unzip -o -q "$zipSrc")
|
||||||
|
|
||||||
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
|
baseDirs=$(find /tmp/world-data -name "level.dat" -not -path "*_nether*" -not -path "*_the_end*" -exec dirname "{}" \;)
|
||||||
|
else
|
||||||
|
baseDirs=$(find /tmp/world-data -name "level.dat" -exec dirname "{}" \;)
|
||||||
|
fi
|
||||||
|
|
||||||
|
count=$(echo "$baseDirs" | wc -l)
|
||||||
|
if [[ $count -gt 1 ]]; then
|
||||||
|
baseDir="$(echo "$baseDirs" | sed -n ${WORLD_INDEX:-1}p)"
|
||||||
|
baseName=$(basename "$baseDir")
|
||||||
|
log "WARN multiple levels found, picking: $baseName"
|
||||||
|
elif [[ $count -gt 0 ]]; then
|
||||||
|
baseDir="$baseDirs"
|
||||||
|
else
|
||||||
|
log "ERROR invalid world content"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
rsync --remove-source-files --recursive --delete "$baseDir/" "$worldDest"
|
||||||
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
|
log "Copying end and 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"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "Cloning world directory from $WORLD ..."
|
||||||
|
rsync --recursive --delete "${WORLD%/}"/ "$worldDest"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
|
# Reorganise if a Spigot server
|
||||||
|
log "Moving End and Nether maps to Spigot location"
|
||||||
|
[ -d "$worldDest/DIM1" ] && mv -f "$worldDest/DIM1" "${worldDest}_the_end"
|
||||||
|
[ -d "$worldDest/DIM-1" ] && mv -f "$worldDest/DIM-1" "${worldDest}_nether"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec ${SCRIPTS:-/}start-finalSetupModpack $@
|
||||||
@@ -1,42 +1,53 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
. ${SCRIPTS:-/}start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
isDebugging && set -x
|
||||||
|
|
||||||
if [ -n "$OPS" ]; then
|
if [ -n "$OPS" ]; then
|
||||||
log "Setting/adding ops"
|
log "Updating ops"
|
||||||
rm -rf /data/ops.txt.converted
|
rm -f /data/ops.txt.converted
|
||||||
echo $OPS | awk -v RS=, '{print}' > /data/ops.txt
|
echo $OPS | awk -v RS=, '{print}' > /data/ops.txt
|
||||||
fi
|
fi
|
||||||
|
if isTrue "${OVERRIDE_OPS}"; then
|
||||||
|
log "Recreating ops.json file at server startup"
|
||||||
|
rm -f /data/ops.json
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -n "$WHITELIST" ]; then
|
if [ -n "$WHITELIST" ]; then
|
||||||
log "Setting whitelist"
|
log "Updating whitelist"
|
||||||
rm -rf /data/white-list.txt.converted
|
rm -f /data/white-list.txt.converted
|
||||||
echo $WHITELIST | awk -v RS=, '{print}' > /data/white-list.txt
|
echo $WHITELIST | awk -v RS=, '{print}' > /data/white-list.txt
|
||||||
fi
|
fi
|
||||||
|
if isTrue "${OVERRIDE_WHITELIST}"; then
|
||||||
|
log "Recreating whitelist.json file at server startup"
|
||||||
|
rm -f /data/whitelist.json
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -n "$ICON" -a ! -e server-icon.png ]; then
|
if [ -n "$ICON" ]; then
|
||||||
log "Using server icon from $ICON..."
|
if [ ! -e server-icon.png ] || [ "${OVERRIDE_ICON}" == "TRUE" ]; then
|
||||||
# Not sure what it is yet...call it "img"
|
log "Using server icon from $ICON..."
|
||||||
curl -sSL -o /tmp/icon.img $ICON
|
# Not sure what it is yet...call it "img"
|
||||||
specs=$(identify /tmp/icon.img | awk '{print $2,$3}')
|
curl -sSL -o /tmp/icon.img $ICON
|
||||||
if [ "$specs" = "PNG 64x64" ]; then
|
specs=$(identify /tmp/icon.img | awk '{print $2,$3}')
|
||||||
mv /tmp/icon.img /data/server-icon.png
|
if [ "$specs" = "PNG 64x64" ]; then
|
||||||
|
mv /tmp/icon.img /data/server-icon.png
|
||||||
|
else
|
||||||
|
log "Converting image to 64x64 PNG..."
|
||||||
|
convert /tmp/icon.img -resize 64x64! /data/server-icon.png
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if isTrue ${ENABLE_ROLLING_LOGS:-false}; then
|
||||||
|
# Set up log configuration
|
||||||
|
LOGFILE="/data/log4j2.xml"
|
||||||
|
if [ ! -e "$LOGFILE" ]; then
|
||||||
|
log "Creating log4j2.xml in ${LOGFILE}"
|
||||||
|
cp /tmp/log4j2.xml "$LOGFILE"
|
||||||
else
|
else
|
||||||
log "Converting image to 64x64 PNG..."
|
log "log4j2.xml already created, skipping"
|
||||||
convert /tmp/icon.img -resize 64x64! /data/server-icon.png
|
|
||||||
fi
|
fi
|
||||||
fi
|
JVM_OPTS="-Dlog4j.configurationFile=/data/log4j2.xml ${JVM_OPTS}"
|
||||||
|
|
||||||
if ! isTrue ${SKIP_LOG4J_CONFIG}; then
|
|
||||||
# Set up log configuration
|
|
||||||
LOGFILE="/data/log4j2.xml"
|
|
||||||
if [ ! -e "$LOGFILE" ]; then
|
|
||||||
log "Creating log4j2.xml in ${LOGFILE}"
|
|
||||||
cp /tmp/log4j2.xml "$LOGFILE"
|
|
||||||
else
|
|
||||||
log "log4j2.xml already created, skipping"
|
|
||||||
fi
|
|
||||||
JVM_OPTS="-Dlog4j.configurationFile=/data/log4j2.xml ${JVM_OPTS}"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Make sure files exist and are valid JSON (for pre-1.12 to 1.12 upgrades)
|
# Make sure files exist and are valid JSON (for pre-1.12 to 1.12 upgrades)
|
||||||
@@ -49,44 +60,14 @@ for j in $JSON_FILES; do
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
# If any modules have been provided, copy them over
|
|
||||||
if [ -d /mods ]; then
|
|
||||||
log "Copying any mods over..."
|
|
||||||
mkdir -p /data/mods
|
|
||||||
rsync -a --out-format="update:%f:Last Modified %M" --prune-empty-dirs --update /mods /data
|
|
||||||
fi
|
|
||||||
|
|
||||||
[ -d /data/config ] || mkdir /data/config
|
|
||||||
for c in /config/*
|
|
||||||
do
|
|
||||||
if [ -f "$c" ]; then
|
|
||||||
log Copying configuration $(basename "$c")
|
|
||||||
cp -rf "$c" /data/config
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
case ${TYPE} in
|
|
||||||
SPIGOT|BUKKIT|PAPER)
|
|
||||||
mkdir -p /data/plugins
|
|
||||||
if [ -d /plugins ]; then
|
|
||||||
log "Copying plugins over..."
|
|
||||||
# Copy plugins over using rsync to allow deeply nested updates of plugins
|
|
||||||
# only updates files if the source file is newer and print updated files
|
|
||||||
rsync -a --out-format="update:%f:Last Modified %M" --prune-empty-dirs --update /plugins /data
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
EXTRA_ARGS=""
|
|
||||||
# Optional disable console
|
# Optional disable console
|
||||||
if versionLessThan 1.14 && [[ ${CONSOLE,,} = false ]]; then
|
if versionLessThan 1.14 && [[ ${CONSOLE,,} = false ]]; then
|
||||||
EXTRA_ARGS+="--noconsole"
|
EXTRA_ARGS+=" --noconsole"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Optional disable GUI for headless servers
|
# Optional disable GUI for headless servers
|
||||||
if [[ ${GUI} = false || ${GUI} = FALSE ]]; then
|
if [[ ${GUI} = false || ${GUI} = FALSE ]]; then
|
||||||
EXTRA_ARGS="${EXTRA_ARGS} nogui"
|
EXTRA_ARGS+=" nogui"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# put these prior JVM_OPTS at the end to give any memory settings there higher precedence
|
# put these prior JVM_OPTS at the end to give any memory settings there higher precedence
|
||||||
@@ -101,7 +82,6 @@ if [ -n "$JVM_DD_OPTS" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if isTrue ${ENABLE_JMX}; then
|
if isTrue ${ENABLE_JMX}; then
|
||||||
: ${JMX_HOST:=0.0.0.0}
|
|
||||||
: ${JMX_PORT:=7091}
|
: ${JMX_PORT:=7091}
|
||||||
JVM_OPTS="${JVM_OPTS}
|
JVM_OPTS="${JVM_OPTS}
|
||||||
-Dcom.sun.management.jmxremote.local.only=false
|
-Dcom.sun.management.jmxremote.local.only=false
|
||||||
@@ -109,8 +89,8 @@ if isTrue ${ENABLE_JMX}; then
|
|||||||
-Dcom.sun.management.jmxremote.rmi.port=${JMX_PORT}
|
-Dcom.sun.management.jmxremote.rmi.port=${JMX_PORT}
|
||||||
-Dcom.sun.management.jmxremote.authenticate=false
|
-Dcom.sun.management.jmxremote.authenticate=false
|
||||||
-Dcom.sun.management.jmxremote.ssl=false
|
-Dcom.sun.management.jmxremote.ssl=false
|
||||||
-Dcom.sun.management.jmxremote.host=${JMX_HOST}
|
-Dcom.sun.management.jmxremote.host=${JMX_BINDING:-0.0.0.0}
|
||||||
-Djava.rmi.server.hostname=${JMX_HOST}"
|
-Djava.rmi.server.hostname=${JMX_HOST:-localhost}"
|
||||||
|
|
||||||
log "JMX is enabled. Make sure you have port forwarding for ${JMX_PORT}"
|
log "JMX is enabled. Make sure you have port forwarding for ${JMX_PORT}"
|
||||||
fi
|
fi
|
||||||
@@ -164,51 +144,82 @@ if isTrue "${USE_LARGE_PAGES}"; then
|
|||||||
"
|
"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if isTrue "${USE_FLARE_FLAGS}"; then
|
||||||
|
JVM_XX_OPTS="${JVM_XX_OPTS}
|
||||||
|
-XX:+UnlockDiagnosticVMOptions
|
||||||
|
-XX:+DebugNonSafepoints
|
||||||
|
"
|
||||||
|
fi
|
||||||
|
|
||||||
if isTrue "${DEBUG_MEMORY}"; then
|
if isTrue "${DEBUG_MEMORY}"; then
|
||||||
log "Memory usage and availability (in MB)"
|
log "Memory usage and availability (in MB)"
|
||||||
uname -a
|
uname -a
|
||||||
free -m
|
free -m
|
||||||
fi
|
fi
|
||||||
|
|
||||||
mcServerRunnerArgs="--stop-duration 60s"
|
JVM_OPTS="-Xms${INIT_MEMORY} -Xmx${MAX_MEMORY} ${JVM_OPTS}"
|
||||||
|
|
||||||
|
function copyFilesForCurseForge() {
|
||||||
|
# copy player modification files unconditionally since their
|
||||||
|
# processing into json is additive anyway
|
||||||
|
[ -f /data/ops.txt ] && cp -f /data/ops.txt "${FTB_DIR}/"
|
||||||
|
[ -f /data/white-list.txt ] && cp -f /data/white-list.txt "${FTB_DIR}/"
|
||||||
|
|
||||||
|
if [ ! -e "${FTB_DIR}/server-icon.png" -a -e /data/server-icon.png ]; then
|
||||||
|
cp -f /data/server-icon.png "${FTB_DIR}/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp -f /data/eula.txt "${FTB_DIR}/"
|
||||||
|
}
|
||||||
|
|
||||||
|
mcServerRunnerArgs="--stop-duration ${STOP_DURATION:-60}s"
|
||||||
if [[ ${TYPE} == "CURSE_INSTANCE" ]]; then
|
if [[ ${TYPE} == "CURSE_INSTANCE" ]]; then
|
||||||
JVM_OPTS="-Xms${INIT_MEMORY} -Xmx${MAX_MEMORY} ${JVM_OPTS}"
|
|
||||||
if isTrue ${DEBUG_EXEC}; then
|
if isTrue ${DEBUG_EXEC}; then
|
||||||
set -x
|
set -x
|
||||||
fi
|
fi
|
||||||
exec mc-server-runner ${mcServerRunnerArgs} \
|
exec mc-server-runner ${mcServerRunnerArgs} \
|
||||||
--cf-instance-file "${CURSE_INSTANCE_JSON}" \
|
--cf-instance-file "${CURSE_INSTANCE_JSON}" \
|
||||||
java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar _SERVERJAR_ "$@" $EXTRA_ARGS
|
java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar _SERVERJAR_ "$@" $EXTRA_ARGS
|
||||||
|
elif [[ ${TYPE} == "FEED-THE-BEAST" && "${SERVER}" ]]; then
|
||||||
|
copyFilesForCurseForge
|
||||||
|
|
||||||
|
cd "${FTB_DIR}"
|
||||||
|
log "Starting CurseForge server in ${FTB_DIR}..."
|
||||||
|
if isTrue ${DEBUG_EXEC}; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
exec mc-server-runner ${bootstrapArgs} ${mcServerRunnerArgs} java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar $(basename "${SERVER}") "$@" $EXTRA_ARGS
|
||||||
elif [[ ${TYPE} == "FEED-THE-BEAST" ]]; then
|
elif [[ ${TYPE} == "FEED-THE-BEAST" ]]; then
|
||||||
mcServerRunnerArgs="${mcServerRunnerArgs} --shell bash"
|
mcServerRunnerArgs="${mcServerRunnerArgs} --shell bash"
|
||||||
|
|
||||||
if [ ! -e "${FTB_DIR}/ops.json" -a -e /data/ops.txt ]; then
|
copyFilesForCurseForge
|
||||||
cp -f /data/ops.txt ${FTB_DIR}/
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -e "${FTB_DIR}/whitelist.json" -a -e /data/white-list.txt ]; then
|
cat > "${FTB_DIR}/settings-local.sh" <<EOF
|
||||||
cp -f /data/white-list.txt ${FTB_DIR}/
|
|
||||||
fi
|
|
||||||
|
|
||||||
cp -f /data/eula.txt "${FTB_DIR}/"
|
|
||||||
|
|
||||||
cat > "${FTB_DIR}/settings-local.sh" <<EOF
|
|
||||||
export MIN_RAM="${INIT_MEMORY}"
|
export MIN_RAM="${INIT_MEMORY}"
|
||||||
export MAX_RAM="${MAX_MEMORY}"
|
export MAX_RAM="${MAX_MEMORY}"
|
||||||
export JAVA_PARAMETERS="${JVM_XX_OPTS} -Xms${INIT_MEMORY} ${JVM_OPTS} $expandedDOpts"
|
export JAVA_PARAMETERS="${JVM_XX_OPTS} -Xms${INIT_MEMORY} ${JVM_OPTS} $expandedDOpts"
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# patch CurseForge cfg file, if present
|
# patch CurseForge cfg file, if present
|
||||||
if [ -f "${FTB_DIR}/settings.cfg" ]; then
|
if [ -f "${FTB_DIR}/settings.cfg" ]; then
|
||||||
sed -i "s/MAX_RAM=[^;]*/MAX_RAM=${MAX_MEMORY}/" "${FTB_DIR}/settings.cfg"
|
sed -i "s/MAX_RAM=[^;]*/MAX_RAM=${MAX_MEMORY}/" "${FTB_DIR}/settings.cfg"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd "${FTB_DIR}"
|
cd "${FTB_DIR}"
|
||||||
log "Running FTB ${FTB_SERVER_START} in ${FTB_DIR} ..."
|
log "Running FTB ${FTB_SERVER_START} in ${FTB_DIR} ..."
|
||||||
if isTrue ${DEBUG_EXEC}; then
|
|
||||||
set -x
|
finalArgs=(
|
||||||
fi
|
"${FTB_SERVER_START}"
|
||||||
exec mc-server-runner ${mcServerRunnerArgs} "${FTB_SERVER_START}"
|
)
|
||||||
|
|
||||||
|
if isTrue ${DEBUG_EXEC}; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
if isTrue ${EXEC_DIRECTLY:-false}; then
|
||||||
|
"${finalArgs[@]}"
|
||||||
|
else
|
||||||
|
exec mc-server-runner ${mcServerRunnerArgs} "${finalArgs[@]}"
|
||||||
|
fi
|
||||||
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
|
||||||
@@ -216,9 +227,22 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
log "Starting the Minecraft server..."
|
log "Starting the Minecraft server..."
|
||||||
JVM_OPTS="-Xms${INIT_MEMORY} -Xmx${MAX_MEMORY} ${JVM_OPTS}"
|
|
||||||
|
finalArgs=(
|
||||||
|
$JVM_XX_OPTS
|
||||||
|
$JVM_OPTS
|
||||||
|
$expandedDOpts
|
||||||
|
-jar $SERVER
|
||||||
|
"$@" $EXTRA_ARGS
|
||||||
|
)
|
||||||
|
|
||||||
if isTrue ${DEBUG_EXEC}; then
|
if isTrue ${DEBUG_EXEC}; then
|
||||||
set -x
|
set -x
|
||||||
fi
|
fi
|
||||||
exec mc-server-runner ${bootstrapArgs} ${mcServerRunnerArgs} java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar $SERVER "$@" $EXTRA_ARGS
|
|
||||||
|
if isTrue ${EXEC_DIRECTLY:-false}; then
|
||||||
|
exec java "${finalArgs[@]}"
|
||||||
|
else
|
||||||
|
exec mc-server-runner ${bootstrapArgs} ${mcServerRunnerArgs} java "${finalArgs[@]}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
58
start-spiget
Normal file
58
start-spiget
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
. ${SCRIPTS:-/}start-utils
|
||||||
|
handleDebugMode
|
||||||
|
|
||||||
|
: ${SPIGET_RESOURCES:=}
|
||||||
|
|
||||||
|
containsJars() {
|
||||||
|
file=${1?}
|
||||||
|
|
||||||
|
pat='\.jar$'
|
||||||
|
|
||||||
|
while read -r line; do
|
||||||
|
if [[ $line =~ $pat ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done <<< $(unzip -l "$file")
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
getResourceFromSpiget() {
|
||||||
|
resource=${1?}
|
||||||
|
|
||||||
|
log "Downloading resource ${resource} ..."
|
||||||
|
|
||||||
|
tmpfile="/tmp/${resource}.zip"
|
||||||
|
url="https://api.spiget.org/v2/resources/${resource}/download"
|
||||||
|
if ! curl -o "${tmpfile}" -fsSL -H "User-Agent: itzg/minecraft-server" "${extraCurlArgs[@]}" "${url}"; then
|
||||||
|
log "ERROR failed to download resource '${resource}' from ${url}"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p /data/plugins
|
||||||
|
if containsJars "${tmpfile}"; then
|
||||||
|
log "Extracting contents of resource ${resource} into plugins"
|
||||||
|
unzip -o -q -d /data/plugins "${tmpfile}"
|
||||||
|
rm "${tmpfile}"
|
||||||
|
else
|
||||||
|
log "Moving resource ${resource} into plugins"
|
||||||
|
mv "${tmpfile}" "/data/plugins/${resource}.jar"
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ ${SPIGET_RESOURCES} ]]; then
|
||||||
|
log "Getting plugins via Spiget"
|
||||||
|
IFS=',' read -r -a resources <<< "${SPIGET_RESOURCES}"
|
||||||
|
for resource in "${resources[@]}"
|
||||||
|
do
|
||||||
|
getResourceFromSpiget "${resource}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Continue to Final Setup
|
||||||
|
exec ${SCRIPTS:-/}start-finalSetupWorld $@
|
||||||
135
start-utils
135
start-utils
@@ -1,6 +1,14 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
function isURL {
|
function join_by() {
|
||||||
|
local d=$1
|
||||||
|
shift
|
||||||
|
echo -n "$1"
|
||||||
|
shift
|
||||||
|
printf "%s" "${@/#/$d}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function isURL() {
|
||||||
local value=$1
|
local value=$1
|
||||||
|
|
||||||
if [[ ${value:0:8} == "https://" || ${value:0:7} == "http://" ]]; then
|
if [[ ${value:0:8} == "https://" || ${value:0:7} == "http://" ]]; then
|
||||||
@@ -10,90 +18,121 @@ function isURL {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function isTrue {
|
function isValidFileURL() {
|
||||||
|
suffix=${1:?Missing required suffix arg}
|
||||||
|
url=${2:?Missing required url arg}
|
||||||
|
|
||||||
|
[[ "$url" == http*://*.${suffix} || "$url" == http*://*.${suffix}\?* ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveEffectiveUrl() {
|
||||||
|
url="${1:?Missing required url argument}"
|
||||||
|
if ! curl -Ls -o /dev/null -w %{url_effective} "$url"; then
|
||||||
|
log "ERROR failed to resolve effective URL from $url"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function getFilenameFromUrl() {
|
||||||
|
url="${1:?Missing required url argument}"
|
||||||
|
strippedOfQuery="${url%\?*}"
|
||||||
|
basename "$strippedOfQuery"
|
||||||
|
}
|
||||||
|
|
||||||
|
function isTrue() {
|
||||||
local value=${1,,}
|
local value=${1,,}
|
||||||
|
|
||||||
result=
|
result=
|
||||||
|
|
||||||
case ${value} in
|
case ${value} in
|
||||||
true|on)
|
true | on)
|
||||||
result=0
|
result=0
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
result=1
|
result=1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
return ${result}
|
return ${result}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isDebugging {
|
function isDebugging() {
|
||||||
if [[ -v DEBUG ]] && [[ ${DEBUG^^} = TRUE ]]; then
|
if isTrue "${DEBUG:-false}"; then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function debug {
|
function handleDebugMode() {
|
||||||
|
if isDebugging; then
|
||||||
|
set -x
|
||||||
|
extraCurlArgs=(-v)
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function debug() {
|
||||||
if isDebugging; then
|
if isDebugging; then
|
||||||
log "DEBUG: $*"
|
log "DEBUG: $*"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function logn {
|
function logn() {
|
||||||
echo -n "[init] $*"
|
echo -n "[init] $*"
|
||||||
}
|
}
|
||||||
|
|
||||||
function log {
|
function log() {
|
||||||
echo "[init] $*"
|
echo "[init] $*"
|
||||||
}
|
}
|
||||||
|
|
||||||
function logAutopause {
|
function logAutopause() {
|
||||||
echo "[Autopause loop] $*"
|
echo "[Autopause loop] $*"
|
||||||
}
|
}
|
||||||
|
|
||||||
function logAutopauseAction {
|
function logAutopauseAction() {
|
||||||
echo "[$(date -Iseconds)] [Autopause] $*"
|
echo "[$(date -Iseconds)] [Autopause] $*"
|
||||||
}
|
}
|
||||||
|
|
||||||
function normalizeMemSize {
|
function normalizeMemSize() {
|
||||||
local scale=1
|
local scale=1
|
||||||
case ${1,,} in
|
case ${1,,} in
|
||||||
*k)
|
*k)
|
||||||
scale=1024;;
|
scale=1024
|
||||||
*m)
|
;;
|
||||||
scale=1048576;;
|
*m)
|
||||||
*g)
|
scale=1048576
|
||||||
scale=1073741824;;
|
;;
|
||||||
|
*g)
|
||||||
|
scale=1073741824
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
val=${1:0: -1}
|
val=${1:0:-1}
|
||||||
echo $(( val * scale ))
|
echo $((val * scale))
|
||||||
}
|
}
|
||||||
|
|
||||||
function versionLessThan {
|
function versionLessThan() {
|
||||||
local activeParts
|
local activeParts
|
||||||
IFS=. read -ra activeParts <<< "${VANILLA_VERSION}"
|
IFS=. read -ra activeParts <<<"${VANILLA_VERSION}"
|
||||||
|
|
||||||
local givenParts
|
local givenParts
|
||||||
IFS=. read -ra givenParts <<< "$1"
|
IFS=. read -ra givenParts <<<"$1"
|
||||||
|
|
||||||
if (( ${#activeParts[@]} < 2 )); then
|
if ((${#activeParts[@]} < 2)); then
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if (( ${#activeParts[@]} == 2 )); then
|
if ((${#activeParts[@]} == 2)); then
|
||||||
if (( activeParts[0] < givenParts[0] )) || \
|
if ((activeParts[0] < givenParts[0])) ||
|
||||||
(( activeParts[0] == givenParts[0] && activeParts[1] < givenParts[1] )); then
|
((activeParts[0] == givenParts[0] && activeParts[1] < givenParts[1])); then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
if (( activeParts[0] < givenParts[0] )) || \
|
if ((activeParts[0] < givenParts[0])) ||
|
||||||
(( activeParts[0] == givenParts[0] && activeParts[1] < givenParts[1] )) || \
|
((activeParts[0] == givenParts[0] && activeParts[1] < givenParts[1])) ||
|
||||||
(( activeParts[0] == givenParts[0] && activeParts[1] == givenParts[1] && activeParts[2] < givenParts[2] )); then
|
((activeParts[0] == givenParts[0] && activeParts[1] == givenParts[1] && activeParts[2] < givenParts[2])); then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
@@ -106,4 +145,32 @@ requireVar() {
|
|||||||
log "ERROR: $1 is required to be set"
|
log "ERROR: $1 is required to be set"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
if [ -z "${!1}" ]; then
|
||||||
|
log "ERROR: $1 is required to be set"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
requireEnum() {
|
||||||
|
var=${1?}
|
||||||
|
shift
|
||||||
|
|
||||||
|
for allowed in $*; do
|
||||||
|
if [[ ${!var} = $allowed ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
log "ERROR: $var must be set to one of $@"
|
||||||
|
# exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeEula() {
|
||||||
|
if ! echo "# Generated via Docker
|
||||||
|
# $(date)
|
||||||
|
eula=${EULA,,}
|
||||||
|
" >/data/eula.txt; then
|
||||||
|
log "ERROR: unable to write eula to /data. Please make sure attached directory is writable by uid=${UID}"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,4 +15,4 @@ fi
|
|||||||
log "Resolved CURSE_INSTANCE_JSON as ${CURSE_INSTANCE_JSON}"
|
log "Resolved CURSE_INSTANCE_JSON as ${CURSE_INSTANCE_JSON}"
|
||||||
|
|
||||||
# Continue to Final Setup
|
# Continue to Final Setup
|
||||||
exec ${SCRIPTS:-/}start-finalSetup01World "$@"
|
exec ${SCRIPTS:-/}start-finalSetupWorld "$@"
|
||||||
|
|||||||
17
tests/docker-compose.test.yml
Normal file
17
tests/docker-compose.test.yml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
sut:
|
||||||
|
depends_on:
|
||||||
|
- mc
|
||||||
|
image: itzg/mc-monitor:0.6.0
|
||||||
|
command: status --host mc --retry-interval 1s --retry-limit 120
|
||||||
|
mc:
|
||||||
|
restart: "no"
|
||||||
|
build:
|
||||||
|
context: ..
|
||||||
|
cache_from:
|
||||||
|
- itzg/minecraft-server:latest
|
||||||
|
environment:
|
||||||
|
EULA: "TRUE"
|
||||||
|
|
||||||
17
tests/test.sh
Executable file
17
tests/test.sh
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cd $(dirname $0)
|
||||||
|
|
||||||
|
failed=false
|
||||||
|
args="-f docker-compose.test.yml"
|
||||||
|
docker-compose $args run sut || failed=true
|
||||||
|
echo "
|
||||||
|
Result: failed=$failed"
|
||||||
|
|
||||||
|
$failed && docker-compose $args logs mc
|
||||||
|
docker-compose $args down -v
|
||||||
|
|
||||||
|
if $failed; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
Reference in New Issue
Block a user