mirror of
https://github.com/itzg/docker-minecraft-server.git
synced 2026-02-18 15:36:22 +00:00
Compare commits
8 Commits
2021.23.0-
...
2021.21.0-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4149db7f11 | ||
|
|
666f538ad5 | ||
|
|
145403ea54 | ||
|
|
5392801ecd | ||
|
|
3dfd70d068 | ||
|
|
e5bc9b939f | ||
|
|
1b620d2d6d | ||
|
|
28d77853cb |
10
.github/ISSUE_TEMPLATE/bug.yml
vendored
10
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -24,17 +24,9 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: Container definition
|
label: Container definition
|
||||||
description: Please provide the compose file or run command used to create the container
|
description: Please provide the compose file or run command used to create the container
|
||||||
value: |
|
|
||||||
```
|
|
||||||
Paste run command or compose file here
|
|
||||||
```
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: logs
|
id: logs
|
||||||
attributes:
|
attributes:
|
||||||
label: Container logs
|
label: Container logs
|
||||||
description: |
|
description: |
|
||||||
Please provide container logs from the start of the container, which will be the ones prefixed with `[init]`. It is even better if you can set the variable `DEBUG` to "true" and provide those debug container logs.
|
Please provide container logs from the start of the container, which will be the ones prefixed with `[init]`. It is even better if you can set the variable `DEBUG` to "true" and provide those debug container logs.
|
||||||
value: |
|
|
||||||
```
|
|
||||||
Paste logs here
|
|
||||||
```
|
|
||||||
7
.github/ISSUE_TEMPLATE/config.yml
vendored
7
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,7 +0,0 @@
|
|||||||
contact_links:
|
|
||||||
- name: Ask a question in discussions
|
|
||||||
url: https://github.com/itzg/docker-minecraft-server/discussions
|
|
||||||
about: Please ask questions here
|
|
||||||
- name: Ask a question on Discord
|
|
||||||
url: https://discord.gg/DXfKpjB
|
|
||||||
about: Please ask questions here
|
|
||||||
47
.github/workflows/build-multiarch.yml
vendored
47
.github/workflows/build-multiarch.yml
vendored
@@ -20,16 +20,13 @@ on:
|
|||||||
- "docs/**"
|
- "docs/**"
|
||||||
- "examples/**"
|
- "examples/**"
|
||||||
|
|
||||||
env:
|
|
||||||
IMAGE_TO_TEST: itzg/minecraft-server:test-${{ github.repository_owner }}-${{ github.run_id }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
docker-buildx:
|
||||||
if: github.repository == 'itzg/docker-minecraft-server'
|
if: github.repository == 'itzg/docker-minecraft-server'
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2.4.0
|
uses: actions/checkout@v2.3.5
|
||||||
|
|
||||||
- name: Docker meta
|
- name: Docker meta
|
||||||
id: meta
|
id: meta
|
||||||
@@ -46,6 +43,14 @@ jobs:
|
|||||||
- name: Setup Docker Buildx
|
- name: Setup Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v1
|
||||||
|
|
||||||
|
- name: Cache Docker layers
|
||||||
|
uses: actions/cache@v2.1.6
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache
|
||||||
|
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v1.2.0
|
uses: docker/setup-qemu-action@v1.2.0
|
||||||
|
|
||||||
@@ -55,26 +60,6 @@ jobs:
|
|||||||
username: ${{ secrets.DOCKER_USER }}
|
username: ${{ secrets.DOCKER_USER }}
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
|
||||||
- name: Build for test
|
|
||||||
uses: docker/build-push-action@v2.7.0
|
|
||||||
if: github.ref_name == 'master'
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
platforms: linux/amd64
|
|
||||||
tags: ${{ env.IMAGE_TO_TEST }}
|
|
||||||
# ensure latest base image is used
|
|
||||||
pull: true
|
|
||||||
load: true
|
|
||||||
push: false
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Run tests
|
|
||||||
# It is assumed that image variants are merged from master and tested there
|
|
||||||
if: github.ref_name == 'master'
|
|
||||||
run: |
|
|
||||||
tests/test.sh
|
|
||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
id: docker_build
|
id: docker_build
|
||||||
uses: docker/build-push-action@v2.7.0
|
uses: docker/build-push-action@v2.7.0
|
||||||
@@ -85,9 +70,17 @@ jobs:
|
|||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
# ensure latest base image is used
|
# ensure latest base image is used
|
||||||
pull: true
|
pull: true
|
||||||
cache-from: type=gha
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
cache-to: type=gha,mode=max
|
cache-to: type=local,dest=/tmp/.buildx-cache-new
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
|
||||||
- name: Image digest
|
- name: Image digest
|
||||||
run: echo ${{ steps.docker_build.outputs.digest }}
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
|
|
||||||
|
- # Temp fix
|
||||||
|
# https://github.com/docker/build-push-action/issues/252
|
||||||
|
# https://github.com/moby/buildkit/issues/1896
|
||||||
|
name: Move cache
|
||||||
|
run: |
|
||||||
|
rm -rf /tmp/.buildx-cache
|
||||||
|
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
|
||||||
2
.github/workflows/generate-toc.yml
vendored
2
.github/workflows/generate-toc.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2.4.0
|
- uses: actions/checkout@v2.3.5
|
||||||
- run: |
|
- run: |
|
||||||
curl https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc -o gh-md-toc
|
curl https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc -o gh-md-toc
|
||||||
chmod a+x gh-md-toc
|
chmod a+x gh-md-toc
|
||||||
|
|||||||
59
.github/workflows/main.yml
vendored
59
.github/workflows/main.yml
vendored
@@ -15,15 +15,23 @@ on:
|
|||||||
- "[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"
|
||||||
|
|
||||||
env:
|
|
||||||
IMAGE_TO_TEST: itzg/minecraft-server:test-${{ github.repository_owner }}-${{ github.run_id }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
test:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2.4.0
|
- uses: actions/checkout@v2.3.5
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
tests/test.sh
|
||||||
|
build:
|
||||||
|
needs:
|
||||||
|
- test
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2.3.5
|
||||||
|
|
||||||
- name: Prepare
|
- name: Prepare
|
||||||
id: prep
|
id: prep
|
||||||
@@ -46,33 +54,20 @@ jobs:
|
|||||||
- name: Setup Docker Buildx
|
- name: Setup Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v1
|
||||||
|
|
||||||
|
- name: Cache Docker layers
|
||||||
|
uses: actions/cache@v2.1.6
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache
|
||||||
|
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-
|
||||||
|
|
||||||
- name: Login to DockerHub
|
- name: Login to DockerHub
|
||||||
uses: docker/login-action@v1
|
uses: docker/login-action@v1
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKER_USER }}
|
username: ${{ secrets.DOCKER_USER }}
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
|
||||||
- name: Build for test
|
|
||||||
uses: docker/build-push-action@v2.7.0
|
|
||||||
if: github.ref_name == 'java8'
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
platforms: linux/amd64
|
|
||||||
tags: ${{ env.IMAGE_TO_TEST }}
|
|
||||||
# ensure latest base image is used
|
|
||||||
pull: true
|
|
||||||
load: true
|
|
||||||
push: false
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Run tests
|
|
||||||
if: github.ref_name == 'java8'
|
|
||||||
run: |
|
|
||||||
tests/test.sh
|
|
||||||
env:
|
|
||||||
MINECRAFT_VERSION: 1.12.2
|
|
||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
id: docker_build
|
id: docker_build
|
||||||
uses: docker/build-push-action@v2.7.0
|
uses: docker/build-push-action@v2.7.0
|
||||||
@@ -85,8 +80,8 @@ jobs:
|
|||||||
push: true
|
push: true
|
||||||
# tags determined by prep step
|
# tags determined by prep step
|
||||||
tags: ${{ steps.prep.outputs.tags }}
|
tags: ${{ steps.prep.outputs.tags }}
|
||||||
cache-from: type=gha
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
cache-to: type=gha,mode=max
|
cache-to: type=local,dest=/tmp/.buildx-cache-new
|
||||||
labels: |
|
labels: |
|
||||||
org.opencontainers.image.documentation=https://github.com/itzg/docker-minecraft-server
|
org.opencontainers.image.documentation=https://github.com/itzg/docker-minecraft-server
|
||||||
org.opencontainers.image.version=${{ steps.prep.outputs.version }}
|
org.opencontainers.image.version=${{ steps.prep.outputs.version }}
|
||||||
@@ -95,3 +90,11 @@ jobs:
|
|||||||
|
|
||||||
- name: Image digest
|
- name: Image digest
|
||||||
run: echo ${{ steps.docker_build.outputs.digest }}
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
|
|
||||||
|
- # Temp fix
|
||||||
|
# https://github.com/docker/build-push-action/issues/252
|
||||||
|
# https://github.com/moby/buildkit/issues/1896
|
||||||
|
name: Move cache
|
||||||
|
run: |
|
||||||
|
rm -rf /tmp/.buildx-cache
|
||||||
|
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
|
||||||
|
|||||||
18
.github/workflows/pr.yml
vendored
18
.github/workflows/pr.yml
vendored
@@ -4,28 +4,12 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
|
|
||||||
env:
|
|
||||||
IMAGE_TO_TEST: itzg/minecraft-server:test-${{ github.repository_owner }}-${{ github.run_id }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2.4.0
|
- uses: actions/checkout@v2.3.5
|
||||||
|
|
||||||
- name: Setup Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v1
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
uses: docker/build-push-action@v2.7.0
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
platforms: linux/amd64
|
|
||||||
tags: ${{ env.IMAGE_TO_TEST }}
|
|
||||||
load: true
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
1
.github/workflows/stale-check.yml
vendored
1
.github/workflows/stale-check.yml
vendored
@@ -1,6 +1,7 @@
|
|||||||
name: Stale Check
|
name: Stale Check
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
issue_comment:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: 0 2 * * *
|
- cron: 0 2 * * *
|
||||||
|
|
||||||
|
|||||||
@@ -93,27 +93,5 @@ The multiarch images are built and published by [a Github action](https://github
|
|||||||
The following git command can be used to provide the bulk of release notes content:
|
The following git command can be used to provide the bulk of release notes content:
|
||||||
|
|
||||||
```shell script
|
```shell script
|
||||||
git log --invert-grep --grep "^ci:" --grep "^misc:" --grep "^docs:" --pretty="* %s" 1.1.0..1.2.0
|
git log --invert-grep --grep "^ci:" --grep "^misc:" --grep "^docs:" --pretty="- %s" 1.1.0..1.2.0
|
||||||
```
|
```
|
||||||
## Tracking changes from master without content
|
|
||||||
|
|
||||||
The following script uses the [ours](https://git-scm.com/docs/merge-strategies#Documentation/merge-strategies.txt-ours) merging strategy to track the history from master into the other branches without actually bringing the changes over. It is useful when a change is specific to master only, such as bumping the base Java version for the `latest` image tag.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
branches=(
|
|
||||||
java8
|
|
||||||
java8-multiarch
|
|
||||||
java8-openj9
|
|
||||||
java11
|
|
||||||
java11-openj9
|
|
||||||
java16
|
|
||||||
java16-openj9
|
|
||||||
java17
|
|
||||||
)
|
|
||||||
|
|
||||||
for b in "${branches[@]}"; do
|
|
||||||
git checkout "$b"
|
|
||||||
git merge -s ours -m "Track latest from master" master
|
|
||||||
git push origin
|
|
||||||
done
|
|
||||||
```
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM eclipse-temurin:8-jdk
|
FROM eclipse-temurin:17-jdk
|
||||||
|
|
||||||
LABEL org.opencontainers.image.authors="Geoff Bourne <itzgeoff@gmail.com>"
|
LABEL org.opencontainers.image.authors="Geoff Bourne <itzgeoff@gmail.com>"
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ 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.10.3 --var app=mc-monitor --file {{.app}} \
|
--var version=0.10.1 --var app=mc-monitor --file {{.app}} \
|
||||||
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
||||||
|
|
||||||
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
||||||
@@ -60,7 +60,7 @@ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
|||||||
--var version=0.1.1 --var app=maven-metadata-release --file {{.app}} \
|
--var version=0.1.1 --var app=maven-metadata-release --file {{.app}} \
|
||||||
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
||||||
|
|
||||||
ARG MC_HELPER_VERSION=1.9.10
|
ARG MC_HELPER_VERSION=1.9.6
|
||||||
ARG MC_HELPER_BASE_URL=https://github.com/itzg/mc-image-helper/releases/download/v${MC_HELPER_VERSION}
|
ARG MC_HELPER_BASE_URL=https://github.com/itzg/mc-image-helper/releases/download/v${MC_HELPER_VERSION}
|
||||||
RUN curl -fsSL ${MC_HELPER_BASE_URL}/mc-image-helper-${MC_HELPER_VERSION}.tgz \
|
RUN curl -fsSL ${MC_HELPER_BASE_URL}/mc-image-helper-${MC_HELPER_VERSION}.tgz \
|
||||||
| tar -C /usr/share -zxf - \
|
| tar -C /usr/share -zxf - \
|
||||||
@@ -75,6 +75,7 @@ ENV UID=1000 GID=1000 \
|
|||||||
MEMORY="1G" \
|
MEMORY="1G" \
|
||||||
TYPE=VANILLA VERSION=LATEST \
|
TYPE=VANILLA VERSION=LATEST \
|
||||||
ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
|
ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
|
||||||
|
SERVER_PORT=25565 ONLINE_MODE=TRUE SERVER_NAME="Dedicated Server" \
|
||||||
ENABLE_AUTOPAUSE=false AUTOPAUSE_TIMEOUT_EST=3600 AUTOPAUSE_TIMEOUT_KN=120 AUTOPAUSE_TIMEOUT_INIT=600 \
|
ENABLE_AUTOPAUSE=false AUTOPAUSE_TIMEOUT_EST=3600 AUTOPAUSE_TIMEOUT_KN=120 AUTOPAUSE_TIMEOUT_INIT=600 \
|
||||||
AUTOPAUSE_PERIOD=10 AUTOPAUSE_KNOCK_INTERFACE=eth0
|
AUTOPAUSE_PERIOD=10 AUTOPAUSE_KNOCK_INTERFACE=eth0
|
||||||
|
|
||||||
|
|||||||
125
README.md
125
README.md
@@ -41,7 +41,6 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [Troubleshooting](#troubleshooting)
|
* [Troubleshooting](#troubleshooting)
|
||||||
* [Server types](#server-types)
|
* [Server types](#server-types)
|
||||||
* [Running a Forge Server](#running-a-forge-server)
|
* [Running a Forge Server](#running-a-forge-server)
|
||||||
* [Running a Fabric Server](#running-a-fabric-server)
|
|
||||||
* [Running a Bukkit/Spigot server](#running-a-bukkitspigot-server)
|
* [Running a Bukkit/Spigot server](#running-a-bukkitspigot-server)
|
||||||
* [Running a Paper server](#running-a-paper-server)
|
* [Running a Paper server](#running-a-paper-server)
|
||||||
* [Running an Airplane server](#running-an-airplane-server)
|
* [Running an Airplane server](#running-an-airplane-server)
|
||||||
@@ -49,8 +48,9 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [Running a Magma server](#running-a-magma-server)
|
* [Running a Magma server](#running-a-magma-server)
|
||||||
* [Running a Mohist server](#running-a-mohist-server)
|
* [Running a Mohist server](#running-a-mohist-server)
|
||||||
* [Running a Catserver type server](#running-a-catserver-type-server)
|
* [Running a Catserver type server](#running-a-catserver-type-server)
|
||||||
* [Running a Canyon server](#running-a-canyon-server)
|
* [Running an Canyon server](#running-an-canyon-server)
|
||||||
* [Running a SpongeVanilla server](#running-a-spongevanilla-server)
|
* [Running a SpongeVanilla server](#running-a-spongevanilla-server)
|
||||||
|
* [Running a Fabric Server](#running-a-fabric-server)
|
||||||
* [Running a Limbo server](#running-a-limbo-server)
|
* [Running a Limbo server](#running-a-limbo-server)
|
||||||
* [Running a Crucible server](#running-a-crucible-server)
|
* [Running a Crucible server](#running-a-crucible-server)
|
||||||
* [Running a server with a Feed the Beast modpack](#running-a-server-with-a-feed-the-beast-modpack)
|
* [Running a server with a Feed the Beast modpack](#running-a-server-with-a-feed-the-beast-modpack)
|
||||||
@@ -61,11 +61,10 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [Modpack data directory](#modpack-data-directory)
|
* [Modpack data directory](#modpack-data-directory)
|
||||||
* [Buggy start scripts](#buggy-start-scripts)
|
* [Buggy start scripts](#buggy-start-scripts)
|
||||||
* [Fixing "unable to launch forgemodloader"](#fixing-unable-to-launch-forgemodloader)
|
* [Fixing "unable to launch forgemodloader"](#fixing-unable-to-launch-forgemodloader)
|
||||||
* [Running a server with a packwiz modpack](#running-a-server-with-a-packwiz-modpack)
|
|
||||||
* [Working with mods and plugins](#working-with-mods-and-plugins)
|
* [Working with mods and plugins](#working-with-mods-and-plugins)
|
||||||
* [Optional plugins, mods, and config attach points](#optional-plugins-mods-and-config-attach-points)
|
* [Optional plugins, mods, and config attach points](#optional-plugins-mods-and-config-attach-points)
|
||||||
* [Auto-downloading SpigotMC/Bukkit/PaperMC plugins](#auto-downloading-spigotmcbukkitpapermc-plugins)
|
* [Auto-downloading SpigotMC/Bukkit/PaperMC plugins](#auto-downloading-spigotmcbukkitpapermc-plugins)
|
||||||
* [Downloadable mod/plugin pack for Forge, Fabric, and Bukkit-like Servers](#downloadable-modplugin-pack-for-forge-fabric-and-bukkit-like-servers)
|
* [Downloadable mod/plugin pack for Forge, Bukkit, and Spigot Servers](#downloadable-modplugin-pack-for-forge-bukkit-and-spigot-servers)
|
||||||
* [Generic pack file](#generic-pack-file)
|
* [Generic pack file](#generic-pack-file)
|
||||||
* [Mod/Plugin URL Listing File](#modplugin-url-listing-file)
|
* [Mod/Plugin URL Listing File](#modplugin-url-listing-file)
|
||||||
* [Remove old mods/plugins](#remove-old-modsplugins)
|
* [Remove old mods/plugins](#remove-old-modsplugins)
|
||||||
@@ -134,7 +133,7 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [Running on RaspberryPi](#running-on-raspberrypi)
|
* [Running on RaspberryPi](#running-on-raspberrypi)
|
||||||
* [Contributing](#contributing)
|
* [Contributing](#contributing)
|
||||||
|
|
||||||
<!-- Added by: runner, at: Tue Dec 7 03:43:47 UTC 2021 -->
|
<!-- Added by: runner, at: Fri Nov 5 02:00:06 UTC 2021 -->
|
||||||
|
|
||||||
<!--te-->
|
<!--te-->
|
||||||
|
|
||||||
@@ -271,7 +270,7 @@ the server jar remain in the `/data` directory. It is safe to remove those._
|
|||||||
|
|
||||||
## Running Minecraft server on different Java version
|
## Running Minecraft server on different Java version
|
||||||
|
|
||||||
When using the image `itzg:/minecraft-server` without a tag, the `latest` image tag is implied from the table below. To use a different version of Java, please use an alternate tag to run your Minecraft server container.
|
To use a different version of Java, please use a docker tag to run your Minecraft server.
|
||||||
|
|
||||||
| Tag name | Java version | Linux | JVM Type | Architecture |
|
| Tag name | Java version | Linux | JVM Type | Architecture |
|
||||||
| -------------- | -------------|--------|----------|-------------------|
|
| -------------- | -------------|--------|----------|-------------------|
|
||||||
@@ -281,16 +280,15 @@ When using the image `itzg:/minecraft-server` without a tag, the `latest` image
|
|||||||
| java8-openj9 | 8 | Debian | OpenJ9 | amd64 |
|
| java8-openj9 | 8 | Debian | OpenJ9 | amd64 |
|
||||||
| java11 | 11 | Debian | Hotspot | amd64,arm64,armv7 |
|
| java11 | 11 | Debian | Hotspot | amd64,arm64,armv7 |
|
||||||
| java11-openj9 | 11 | Debian | OpenJ9 | amd64 |
|
| java11-openj9 | 11 | Debian | OpenJ9 | amd64 |
|
||||||
|
| java16 | 16 | Debian | Hotspot | amd64,arm64,armv7 |
|
||||||
| java16-openj9 | 16 | Debian | OpenJ9 | amd64 |
|
| java16-openj9 | 16 | Debian | OpenJ9 | amd64 |
|
||||||
| java17 | 17 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
| java17 | 17 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||||
|
|
||||||
For example, to use Java version 8 on any supported architecture:
|
For example, to use Java version 16 on any supported architecture:
|
||||||
|
|
||||||
docker run --name mc itzg/minecraft-server:java8-multiarch
|
docker run --name mc itzg/minecraft-server:java16
|
||||||
|
|
||||||
> Keep in mind that some versions of Minecraft server, such as Forge before 1.17, can't work on the newest versions of Java. Instead, one of the Java 8 images should be used. Also, FORGE doesn't support openj9 JVM implementation.
|
> Keep in mind that some versions of Minecraft server, such as Forge before 1.17, can't work on the newest versions of Java. Instead, one of the Java 8 images should be used. Also, FORGE doesn't support openj9 JVM implementation.
|
||||||
>
|
|
||||||
> Some versions of vanilla Minecraft, such as 1.10, also do not run correctly with Java 17. If in doubt, use `java8-multiarch` for any version less than 1.17.
|
|
||||||
|
|
||||||
### Deprecated Image Tags
|
### Deprecated Image Tags
|
||||||
|
|
||||||
@@ -300,7 +298,6 @@ The following image tags have been deprecated and are no longer receiving update
|
|||||||
- adopt15
|
- adopt15
|
||||||
- openj9-nightly
|
- openj9-nightly
|
||||||
- multiarch-latest
|
- multiarch-latest
|
||||||
- java16
|
|
||||||
|
|
||||||
## Healthcheck
|
## Healthcheck
|
||||||
|
|
||||||
@@ -403,30 +400,6 @@ the URL with `FORGE_INSTALLER_URL`, such as:
|
|||||||
|
|
||||||
In both of the cases above, there is no need for the `VERSION` or `FORGEVERSION` variables.
|
In both of the cases above, there is no need for the `VERSION` or `FORGEVERSION` variables.
|
||||||
|
|
||||||
### Running a Fabric Server
|
|
||||||
|
|
||||||
Enable [Fabric server](https://fabricmc.net/) mode by adding a `-e TYPE=FABRIC` to your command-line. By default, the container will install the latest [fabric-loader](https://fabricmc.net/wiki/documentation:fabric_loader) using the latest [fabric-installer](https://fabricmc.net/use/), against the minecraft server version you have defined with `VERSION` (defaulting to the latest vanilla release of the game).
|
|
||||||
|
|
||||||
```
|
|
||||||
docker run -d -v /path/on/host:/data \
|
|
||||||
-e TYPE=FABRIC \
|
|
||||||
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
|
|
||||||
```
|
|
||||||
|
|
||||||
See the [Working with mods and plugins](#working-with-mods-and-plugins) section to set up Fabric mods and configuration.
|
|
||||||
|
|
||||||
A specific loader version other than the latest can be requested using `FABRIC_LOADER_VERSION`, such as:
|
|
||||||
|
|
||||||
```
|
|
||||||
docker run -d -v /path/on/host:/data ... \
|
|
||||||
-e FABRIC_LOADER_VERSION=0.12.8
|
|
||||||
```
|
|
||||||
|
|
||||||
If you wish to use an alternative installer you can:
|
|
||||||
* Specify an alternative version using `FABRIC_INSTALLER_VERSION` (such as `-e FABRIC_INSTALLER_VERSION=0.10.2`)
|
|
||||||
* Provide the path to a custom installer jar available to the container with `FABRIC_INSTALLER`, relative to `/data` (such as `-e FABRIC_INSTALLER=fabric-installer-0.5.0.32.jar`)
|
|
||||||
* Provide the URL to a custom installer jar with `FABRIC_INSTALLER_URL` (such as `-e FABRIC_INSTALLER_URL=http://HOST/fabric-installer-0.5.0.32.jar`)
|
|
||||||
|
|
||||||
### Running a Bukkit/Spigot server
|
### Running a Bukkit/Spigot server
|
||||||
|
|
||||||
Enable Bukkit/Spigot server mode by adding a `-e TYPE=BUKKIT` or `-e TYPE=SPIGOT` to your command-line.
|
Enable Bukkit/Spigot server mode by adding a `-e TYPE=BUKKIT` or `-e TYPE=SPIGOT` to your command-line.
|
||||||
@@ -509,6 +482,8 @@ By default, the "stable" channel is used, but you can set `MAGMA_CHANNEL` to "de
|
|||||||
|
|
||||||
### Running a Mohist server
|
### Running a Mohist server
|
||||||
|
|
||||||
|
> **CAUTION** Be sure to [read this article](https://essentialsx.net/do-not-use-mohist.html) to understand the risks associated with using Mohist.
|
||||||
|
|
||||||
A [Mohist](https://github.com/MohistMC/Mohist) server can be used with
|
A [Mohist](https://github.com/MohistMC/Mohist) server can be used with
|
||||||
|
|
||||||
-e TYPE=MOHIST
|
-e TYPE=MOHIST
|
||||||
@@ -527,15 +502,17 @@ A [Catserver](http://catserver.moe/) type server can be used with
|
|||||||
|
|
||||||
> **NOTE** Catserver only provides a single release stream, so `VERSION` is ignored
|
> **NOTE** Catserver only provides a single release stream, so `VERSION` is ignored
|
||||||
|
|
||||||
### Running a Canyon server
|
### Running an Canyon server
|
||||||
|
|
||||||
[Canyon](https://github.com/canyonmodded/canyon) is a fork of CraftBukkit for Minecraft Beta 1.7.3. It includes multiple enhancements whilst also retaining compatibility with old Bukkit plugins and mods as much as possible.
|
[Canyon](https://github.com/canyonmodded/canyon) is a fork of CraftBukkit for Minecraft Beta 1.7.3. It includes multiple enhancements whilst also retaining compatibility with old Bukkit plugins and mods as much as possible.
|
||||||
|
|
||||||
-e VERSION=b1.7.3 -e TYPE=CANYON
|
-e VERSION=b1.7.3 -e TYPE=CANYON
|
||||||
|
|
||||||
> **NOTE** only `VERSION=b1.7.3` is supported. Since that version pre-dates the health check mechanism used by this image, that will need to be disabled by setting `DISABLE_HEALTHCHECK=true`.
|
> **NOTE** only `VERSION=b1.7.3` is supported
|
||||||
|
|
||||||
By default, the latest build will be used; however, a specific build number can be selected by setting `CANYON_BUILD`, such as
|
> **NOTE** only Java 8 is supported
|
||||||
|
|
||||||
|
By default the latest build will be used; however, a specific build number can be selected by setting `CANYON_BUILD`, such as
|
||||||
|
|
||||||
-e CANYON_BUILD=11
|
-e CANYON_BUILD=11
|
||||||
|
|
||||||
@@ -557,6 +534,41 @@ Just change it with `SPONGEBRANCH`, such as:
|
|||||||
$ docker run -d -v /path/on/host:/data ... \
|
$ docker run -d -v /path/on/host:/data ... \
|
||||||
-e TYPE=SPONGEVANILLA -e SPONGEBRANCH=EXPERIMENTAL ...
|
-e TYPE=SPONGEVANILLA -e SPONGEBRANCH=EXPERIMENTAL ...
|
||||||
|
|
||||||
|
### Running a Fabric Server
|
||||||
|
|
||||||
|
Enable [Fabric server](http://fabricmc.net/use/) mode by adding a `-e TYPE=FABRIC` to your command-line. By default, the container will run the latest version, but you can also choose to run a specific version with `VERSION`.
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run -d -v /path/on/host:/data \
|
||||||
|
-e TYPE=FABRIC \
|
||||||
|
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
|
||||||
|
```
|
||||||
|
|
||||||
|
A specific installer version can be requested using `FABRIC_INSTALLER_VERSION`.
|
||||||
|
|
||||||
|
To use a pre-downloaded Fabric installer, place it in a directory attached into the container, such as the `/data` volume and specify the name of the installer file with `FABRIC_INSTALLER`, such as:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run -d -v /path/on/host:/data ... \
|
||||||
|
-e FABRIC_INSTALLER=fabric-installer-0.5.0.32.jar ...
|
||||||
|
```
|
||||||
|
|
||||||
|
To download a Fabric installer from a custom location, such as your own file repository, specify the URL with `FABRIC_INSTALLER_URL`, such as:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run -d -v /path/on/host:/data ... \
|
||||||
|
-e FABRIC_INSTALLER_URL=http://HOST/fabric-installer-0.5.0.32.jar ...
|
||||||
|
```
|
||||||
|
|
||||||
|
A specific loader version can be requested using `FABRIC_LOADER_VERSION`, such as:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run -d -v /path/on/host:/data ... \
|
||||||
|
-e FABRIC_LOADER_VERSION=0.11.7
|
||||||
|
```
|
||||||
|
|
||||||
|
In order to add mods, you have two options:
|
||||||
|
|
||||||
### Running a Limbo server
|
### Running a Limbo server
|
||||||
|
|
||||||
A [Limbo](https://github.com/LOOHP/Limbo) server can be run by setting `TYPE` to `LIMBO`.
|
A [Limbo](https://github.com/LOOHP/Limbo) server can be run by setting `TYPE` to `LIMBO`.
|
||||||
@@ -652,20 +664,6 @@ then you apply a workaround by adding this to the run invocation:
|
|||||||
|
|
||||||
-e FTB_LEGACYJAVAFIXER=true
|
-e FTB_LEGACYJAVAFIXER=true
|
||||||
|
|
||||||
## Running a server with a packwiz modpack
|
|
||||||
|
|
||||||
[packwiz](https://packwiz.infra.link/) is a CLI tool for maintaining and providing modpack definitions, with support for both CurseForge and Modrinth as sources. See the [packwiz tutorial](https://packwiz.infra.link/tutorials/getting-started/) for more information.
|
|
||||||
|
|
||||||
To configure server mods using a packwiz modpack, set the `PACKWIZ_URL` environment variable to the location of your `pack.toml` modpack definition:
|
|
||||||
|
|
||||||
docker run -d -v /path/on/host:/data -e TYPE=FABRIC \
|
|
||||||
-e "PACKWIZ_URL=https://example.com/modpack/pack.toml" \
|
|
||||||
itzg/minecraft-server
|
|
||||||
|
|
||||||
packwiz modpack defitions are processed before other mod definitions (`MODPACK`, `MODS`, etc.) to allow for additional processing/overrides you may want to perform (in case of mods not available via Modrinth/CurseForge, or you do not maintain the pack).
|
|
||||||
|
|
||||||
> packwiz is pre-configured to only download server mods. If client-side mods are downloaded and cause issues, check your pack.toml configuration, and make sure any client-only mods are not set to `"both"`, but rather `"client"` for the side configuration item.
|
|
||||||
|
|
||||||
## Working with mods and plugins
|
## Working with mods and plugins
|
||||||
|
|
||||||
### Optional plugins, mods, and config attach points
|
### Optional plugins, mods, and config attach points
|
||||||
@@ -676,7 +674,7 @@ There are optional volume paths that can be attached to supply content to be cop
|
|||||||
: contents are synchronized into `/data/plugins` for Bukkit related server types. Set `SYNC_SKIP_NEWER_IN_DESTINATION=false` if you want files from `/plugins` to take precedence over newer files in `/data/plugins`.
|
: contents are synchronized into `/data/plugins` for Bukkit related server types. Set `SYNC_SKIP_NEWER_IN_DESTINATION=false` if you want files from `/plugins` to take precedence over newer files in `/data/plugins`.
|
||||||
|
|
||||||
`/mods`
|
`/mods`
|
||||||
: contents are synchronized into `/data/mods` for Fabric and Forge related server types. The destination can be changed by setting `COPY_MODS_DEST`.
|
: contents are synchronized into `/data/mods` for Forge related server types. The destination can be changed by setting `COPY_MODS_DEST`.
|
||||||
|
|
||||||
`/config`
|
`/config`
|
||||||
: contents are synchronized into `/data/config` by default, but can be changed with `COPY_CONFIG_DEST`. For example, `-v ./config:/config -e COPY_CONFIG_DEST=/data` will allow you to copy over files like `bukkit.yml` and so on directly into the server directory. Set `SYNC_SKIP_NEWER_IN_DESTINATION=false` if you want files from `/config` to take precedence over newer files in `/data/config`.
|
: contents are synchronized into `/data/config` by default, but can be changed with `COPY_CONFIG_DEST`. For example, `-v ./config:/config -e COPY_CONFIG_DEST=/data` will allow you to copy over files like `bukkit.yml` and so on directly into the server directory. Set `SYNC_SKIP_NEWER_IN_DESTINATION=false` if you want files from `/config` to take precedence over newer files in `/data/config`.
|
||||||
@@ -689,7 +687,7 @@ For example: `-e REMOVE_OLD_MODS=TRUE -e REMOVE_OLD_MODS_INCLUDE="*.jar" -e REMO
|
|||||||
|
|
||||||
These paths work well if you want to have a common set of modules in a separate location, but still have multiple worlds with different server requirements in either persistent volumes or a downloadable archive.
|
These paths work well if you want to have a common set of modules in a separate location, but still have multiple worlds with different server requirements in either persistent volumes or a downloadable archive.
|
||||||
|
|
||||||
> For more flexibility with mods/plugins preparation, you can declare directories to use in [the `MODS` variable](#downloadable-modplugin-pack-for-forge-fabric-and-bukkit-like-servers)
|
> For more flexibility with mods/plugins preparation, you can declare directories to use in [the `MODS` variable](#downloadable-modplugin-pack-for-forge-bukkit-and-spigot-servers)
|
||||||
|
|
||||||
### Auto-downloading SpigotMC/Bukkit/PaperMC plugins
|
### Auto-downloading SpigotMC/Bukkit/PaperMC plugins
|
||||||
|
|
||||||
@@ -706,10 +704,10 @@ For example, the following will auto-download the [EssentialsX](https://www.spig
|
|||||||
|
|
||||||
-e SPIGET_RESOURCES=9089,34315
|
-e SPIGET_RESOURCES=9089,34315
|
||||||
|
|
||||||
### Downloadable mod/plugin pack for Forge, Fabric, and Bukkit-like Servers
|
### Downloadable mod/plugin pack for Forge, Bukkit, and Spigot Servers
|
||||||
|
|
||||||
Like the `WORLD` option above, you can specify the URL or path of a "mod pack"
|
Like the `WORLD` option above, you can specify the URL or path of a "mod pack"
|
||||||
to download and install into `mods` for Forge/Fabric or `plugins` for Bukkit/Spigot.
|
to download and install into `mods` for Forge or `plugins` for Bukkit/Spigot.
|
||||||
To use this option pass the environment variable `MODPACK`, such as
|
To use this option pass the environment variable `MODPACK`, such as
|
||||||
|
|
||||||
docker run -d -e MODPACK=http://www.example.com/mods/modpack.zip ...
|
docker run -d -e MODPACK=http://www.example.com/mods/modpack.zip ...
|
||||||
@@ -810,8 +808,6 @@ This will reset any manual configuration of the `server.properties` file, so if
|
|||||||
|
|
||||||
In the opposite case, you can skip the startup script's creation of `server.properties`, by setting `SKIP_SERVER_PROPERTIES` to "true".
|
In the opposite case, you can skip the startup script's creation of `server.properties`, by setting `SKIP_SERVER_PROPERTIES` to "true".
|
||||||
|
|
||||||
> NOTE: to clear a server property, set the variable to an empty string, such as `-e RESOURCE_PACK=""`. A variables that maps to a server property that is unset, is ignored and the existing `server.property` is left unchanged.
|
|
||||||
|
|
||||||
### Message of the Day
|
### Message of the Day
|
||||||
|
|
||||||
The message of the day, shown below each server entry in the client UI, can be changed with the `MOTD` environment variable, such as
|
The message of the day, shown below each server entry in the client UI, can be changed with the `MOTD` environment variable, such as
|
||||||
@@ -850,14 +846,8 @@ To whitelist players for your Minecraft server, pass the Minecraft usernames sep
|
|||||||
|
|
||||||
docker run -d -e WHITELIST=user1,user2 ...
|
docker run -d -e WHITELIST=user1,user2 ...
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
docker run -d -e WHITELIST=uuid1,uuid2 ...
|
|
||||||
|
|
||||||
If the `WHITELIST` environment variable is not used, any user can join your Minecraft server if it's publicly accessible.
|
If the `WHITELIST` environment variable is not used, any user can join your Minecraft server if it's publicly accessible.
|
||||||
|
|
||||||
> NOTE: When using uuids in the whitelist, please make sure it is the dashed variant otherwise it will not parse correctly.
|
|
||||||
|
|
||||||
> NOTE: When `WHITELIST` is used the server properties `white-list` and `whitelist` will automatically get set to `true`.
|
> NOTE: When `WHITELIST` is used the server properties `white-list` and `whitelist` will automatically get set to `true`.
|
||||||
|
|
||||||
> By default, the players in `WHITELIST` are **added** to the final `whitelist.json` file by the Minecraft server. If you set `OVERRIDE_WHITELIST` to "true" then the `whitelist.json` file will be recreated on each server startup.
|
> By default, the players in `WHITELIST` are **added** to the final `whitelist.json` file by the Minecraft server. If you set `OVERRIDE_WHITELIST` to "true" then the `whitelist.json` file will be recreated on each server startup.
|
||||||
@@ -885,7 +875,6 @@ The server icon which has been set doesn't get overridden by default. It can be
|
|||||||
### Rcon
|
### Rcon
|
||||||
|
|
||||||
To use rcon use the `ENABLE_RCON` and `RCON_PASSWORD` variables.
|
To use rcon use the `ENABLE_RCON` and `RCON_PASSWORD` variables.
|
||||||
The default RCON password is _"minecraft",_ but it's **highly** recommended to override that.
|
|
||||||
By default rcon port will be `25575` but can easily be changed with the `RCON_PORT` variable.
|
By default rcon port will be `25575` but can easily be changed with the `RCON_PORT` variable.
|
||||||
|
|
||||||
docker run -d -e ENABLE_RCON=true -e RCON_PASSWORD=testing
|
docker run -d -e ENABLE_RCON=true -e RCON_PASSWORD=testing
|
||||||
@@ -1067,9 +1056,9 @@ In Minecraft 1.13+ you need to pass json ([generator site](https://misode.github
|
|||||||
|
|
||||||
You can set a link to a custom resource pack and set it's checksum using the `RESOURCE_PACK` and `RESOURCE_PACK_SHA1` options respectively, the default is blank:
|
You can set a link to a custom resource pack and set it's checksum using the `RESOURCE_PACK` and `RESOURCE_PACK_SHA1` options respectively, the default is blank:
|
||||||
|
|
||||||
docker run -d -e 'RESOURCE_PACK=http://link.com/to/pack.zip?=1' -e 'RESOURCE_PACK_SHA1=d5db29cd03a2ed055086cef9c31c252b4587d6d0'
|
docker run -d -e 'RESOURCE_PACK=http\://link.com/to/pack.zip?\=1' -e 'RESOURCE_PACK_SHA1=d5db29cd03a2ed055086cef9c31c252b4587d6d0'
|
||||||
|
|
||||||
You can enforce the resource pack on clients by setting `RESOURCE_PACK_ENFORCE` to `TRUE` (default: `FALSE`).
|
**NOTE:** `:` and `=` must be escaped using `\`. The checksum plain-text hexadecimal.
|
||||||
|
|
||||||
### Level / World Save Name
|
### Level / World Save Name
|
||||||
|
|
||||||
@@ -1381,7 +1370,7 @@ To enable remote JMX, such as for profiling with VisualVM or JMC, add the enviro
|
|||||||
|
|
||||||
### Enable Aikar's Flags
|
### Enable Aikar's Flags
|
||||||
|
|
||||||
[Aikar has does some research](https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/) into finding the optimal JVM flags for GC tuning, which becomes more important as more users are connected concurrently. The set of flags documented there can be added using
|
[Aikar has does some research](https://mcflags.emc.gs/) into finding the optimal JVM flags for GC tuning, which becomes more important as more users are connected concurrently. The set of flags documented there can be added using
|
||||||
|
|
||||||
-e USE_AIKAR_FLAGS=true
|
-e USE_AIKAR_FLAGS=true
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# shellcheck source=../scripts/start-utils
|
# shellcheck source=../start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
. ${SCRIPTS:-/}start-utils
|
||||||
if [ -f /data/.mc-health.env ]; then
|
|
||||||
. /data/.mc-health.env
|
|
||||||
fi
|
|
||||||
|
|
||||||
if isTrue "${DISABLE_HEALTHCHECK}"; then
|
if isTrue "${DISABLE_HEALTHCHECK}"; then
|
||||||
echo "Healthcheck disabled"
|
echo "Healthcheck disabled"
|
||||||
@@ -13,6 +10,6 @@ elif isTrue "${ENABLE_AUTOPAUSE}" && [[ "$( ps -ax -o stat,comm | grep 'java' |
|
|||||||
echo "Java process suspended by Autopause function"
|
echo "Java process suspended by Autopause function"
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
mc-monitor status "${MC_HEALTH_EXTRA_ARGS[@]}" --host localhost --port "${SERVER_PORT:-25565}"
|
mc-monitor status --host localhost --port $SERVER_PORT
|
||||||
exit $?
|
exit $?
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ branches_list=(
|
|||||||
'java8-openj9'
|
'java8-openj9'
|
||||||
'java11'
|
'java11'
|
||||||
'java11-openj9'
|
'java11-openj9'
|
||||||
|
'java16'
|
||||||
'java16-openj9'
|
'java16-openj9'
|
||||||
'java17'
|
'java17'
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,18 +3,18 @@ apiVersion: apps/v1
|
|||||||
kind: StatefulSet
|
kind: StatefulSet
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: mc-example
|
app: example
|
||||||
name: mc-example
|
name: example
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
serviceName: mc-example
|
serviceName: example
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: mc-example
|
app: example
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: mc-example
|
app: example
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: mc
|
- name: mc
|
||||||
@@ -25,18 +25,6 @@ spec:
|
|||||||
volumeMounts:
|
volumeMounts:
|
||||||
- mountPath: /data
|
- mountPath: /data
|
||||||
name: data
|
name: data
|
||||||
readinessProbe:
|
|
||||||
exec:
|
|
||||||
command:
|
|
||||||
- mc-monitor
|
|
||||||
- status
|
|
||||||
- --host
|
|
||||||
- localhost
|
|
||||||
- --port
|
|
||||||
- "25565"
|
|
||||||
initialDelaySeconds: 30
|
|
||||||
periodSeconds: 5
|
|
||||||
failureThreshold: 18
|
|
||||||
volumeClaimTemplates:
|
volumeClaimTemplates:
|
||||||
- metadata:
|
- metadata:
|
||||||
name: data
|
name: data
|
||||||
@@ -51,12 +39,12 @@ apiVersion: v1
|
|||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
service: mc-example
|
service: example
|
||||||
name: mc-example
|
name: example
|
||||||
spec:
|
spec:
|
||||||
ports:
|
ports:
|
||||||
- port: 25565
|
- port: 25565
|
||||||
targetPort: 25565
|
targetPort: 25565
|
||||||
selector:
|
selector:
|
||||||
app: mc-example
|
app: example
|
||||||
type: NodePort
|
type: LoadBalancer
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
current_uptime() {
|
current_uptime() {
|
||||||
awk '{print $1}' /proc/uptime | cut -d . -f 1
|
echo $(awk '{print $1}' /proc/uptime | cut -d . -f 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
java_running() {
|
java_running() {
|
||||||
@@ -17,15 +17,15 @@ rcon_client_exists() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mc_server_listening() {
|
mc_server_listening() {
|
||||||
mc-monitor status --host localhost --port "$SERVER_PORT" --timeout 10s >& /dev/null
|
mc-monitor status --host localhost --port $SERVER_PORT --timeout 10s >& /dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
java_clients_connected() {
|
java_clients_connected() {
|
||||||
local connections
|
local connections
|
||||||
if java_running ; then
|
if java_running ; then
|
||||||
connections=$(mc-monitor status --host localhost --port "$SERVER_PORT" --show-player-count)
|
connections=$(mc-monitor status --host localhost --port $SERVER_PORT --show-player-count)
|
||||||
else
|
else
|
||||||
connections=0
|
connections=0
|
||||||
fi
|
fi
|
||||||
(( connections > 0 ))
|
(( $connections > 0 ))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<Console name="SysOut" target="SYSTEM_OUT">
|
<Console name="SysOut" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
|
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
|
||||||
</Console>
|
</Console>
|
||||||
<Queue name="TerminalConsole">
|
<Queue name="ServerGuiConsole">
|
||||||
<PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n" />
|
<PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n" />
|
||||||
</Queue>
|
</Queue>
|
||||||
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
|
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
</filters>
|
</filters>
|
||||||
<AppenderRef ref="SysOut"/>
|
<AppenderRef ref="SysOut"/>
|
||||||
<AppenderRef ref="File"/>
|
<AppenderRef ref="File"/>
|
||||||
<AppenderRef ref="TerminalConsole"/>
|
<AppenderRef ref="ServerGuiConsole"/>
|
||||||
</Root>
|
</Root>
|
||||||
</Loggers>
|
</Loggers>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
@@ -1,15 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
|
|
||||||
: "${SERVER_PORT:=25565}"
|
|
||||||
export SERVER_PORT
|
|
||||||
|
|
||||||
log "Autopause functionality enabled"
|
log "Autopause functionality enabled"
|
||||||
|
|
||||||
isDebugging && set -x
|
|
||||||
|
|
||||||
cp /autopause/knockd-config.cfg /tmp/knockd-config.cfg
|
cp /autopause/knockd-config.cfg /tmp/knockd-config.cfg
|
||||||
|
|
||||||
# update server port to listen to
|
# update server port to listen to
|
||||||
|
|||||||
@@ -92,14 +92,6 @@ if isTrue "${ENABLE_AUTOPAUSE}"; then
|
|||||||
${SCRIPTS:-/}start-autopause
|
${SCRIPTS:-/}start-autopause
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if versionLessThan 1.7; then
|
|
||||||
echo "
|
|
||||||
MC_HEALTH_EXTRA_ARGS=(
|
|
||||||
--use-server-list-ping
|
|
||||||
)
|
|
||||||
" > /data/.mc-health.env
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "Resolving type given ${TYPE}"
|
log "Resolving type given ${TYPE}"
|
||||||
case "${TYPE^^}" in
|
case "${TYPE^^}" in
|
||||||
*BUKKIT|SPIGOT)
|
*BUKKIT|SPIGOT)
|
||||||
@@ -111,6 +103,14 @@ case "${TYPE^^}" in
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
FORGE)
|
FORGE)
|
||||||
|
if versionLessThan 1.17; then
|
||||||
|
log "**********************************************************************"
|
||||||
|
log "WARNING: The image tag itzg/minecraft-server:java8 is recommended"
|
||||||
|
log " since some mods require Java 8"
|
||||||
|
log " Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader"
|
||||||
|
log " can be fixed with java8"
|
||||||
|
log "**********************************************************************"
|
||||||
|
fi
|
||||||
exec ${SCRIPTS:-/}start-deployForge "$@"
|
exec ${SCRIPTS:-/}start-deployForge "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -123,6 +123,10 @@ case "${TYPE^^}" in
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
FTB|CURSEFORGE)
|
FTB|CURSEFORGE)
|
||||||
|
log "**********************************************************************"
|
||||||
|
log "NOTE: Some mods and modpacks may require Java 8."
|
||||||
|
log " If so, use itzg/minecraft-server:java8"
|
||||||
|
log "**********************************************************************"
|
||||||
exec ${SCRIPTS:-/}start-deployCF "$@"
|
exec ${SCRIPTS:-/}start-deployCF "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -167,6 +171,12 @@ case "${TYPE^^}" in
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
CRUCIBLE)
|
CRUCIBLE)
|
||||||
|
log "**********************************************************************"
|
||||||
|
log "WARNING: The image tag itzg/minecraft-server:java8 is recommended"
|
||||||
|
log " since some mods require Java 8"
|
||||||
|
log " Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader"
|
||||||
|
log " can be fixed with java8"
|
||||||
|
log "**********************************************************************"
|
||||||
exec "${SCRIPTS:-/}start-deployCrucible" "$@"
|
exec "${SCRIPTS:-/}start-deployCrucible" "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ function downloadSpigot {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -z $downloadUrl ]]; then
|
if [[ -z $downloadUrl ]]; then
|
||||||
if versionLessThan 1.16.5 || ([[ ${getbukkitFlavor} = "craftbukkit" ]] && [[ ${VANILLA_VERSION} = "1.16.5" ]]); then
|
if versionLessThan 1.16.5; then
|
||||||
downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar"
|
downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar"
|
||||||
else
|
else
|
||||||
downloadUrl="https://download.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar"
|
downloadUrl="https://download.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VANILLA_VERSION}.jar"
|
||||||
|
|||||||
@@ -2,11 +2,16 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
isDebugging && set -x
|
isDebugging && set -x
|
||||||
|
|
||||||
: "${CANYON_BUILD:=lastSuccessfulBuild}"
|
: ${CANYON_BUILD:=lastSuccessfulBuild}
|
||||||
|
JAVA_VER=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1)
|
||||||
|
|
||||||
|
if [ "${JAVA_VER}" != "8" ]; then
|
||||||
|
log "ERROR: Canyon server type only supports Java version 8"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "${VERSION}" != "b1.7.3" ]; then
|
if [ "${VERSION}" != "b1.7.3" ]; then
|
||||||
log "ERROR: Canyon server type only supports VERSION=b1.7.3"
|
log "ERROR: Canyon server type only supports VERSION=b1.7.3"
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ variants=(
|
|||||||
forge-${mcVersion}-${forgeVersion}-${mcVersion}-universal.jar
|
forge-${mcVersion}-${forgeVersion}-${mcVersion}-universal.jar
|
||||||
fabric-${mcVersion}-${fabricVersion}-server-launch.jar
|
fabric-${mcVersion}-${fabricVersion}-server-launch.jar
|
||||||
)
|
)
|
||||||
for f in "${variants[@]}"; do
|
for f in ${variants[@]}; do
|
||||||
if [ -f $f ]; then
|
if [ -f $f ]; then
|
||||||
export SERVER=$f
|
export SERVER=$f
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ get_installer() {
|
|||||||
log "Downloading $normForgeVersion"
|
log "Downloading $normForgeVersion"
|
||||||
|
|
||||||
forgeFileNames="
|
forgeFileNames="
|
||||||
$shortForgeVersion/forge-$shortForgeVersion-installer.jar
|
|
||||||
$normForgeVersion/forge-$normForgeVersion-installer.jar
|
$normForgeVersion/forge-$normForgeVersion-installer.jar
|
||||||
|
$shortForgeVersion/forge-$shortForgeVersion-installer.jar
|
||||||
"
|
"
|
||||||
|
|
||||||
for fn in $forgeFileNames; do
|
for fn in $forgeFileNames; do
|
||||||
@@ -102,7 +102,7 @@ resolve_versions() {
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
RECOMMENDED)
|
RECOMMENDED)
|
||||||
if ! FORGE_VERSION=$(get -s --json-path ".promos['$VANILLA_VERSION-recommended']" "$promosUrl"); then
|
if ! FORGE_VERSION=$(get --json-path ".promos['$VANILLA_VERSION-recommended']" "$promosUrl"); then
|
||||||
if ! FORGE_VERSION=$(get --json-path ".promos['$VANILLA_VERSION-latest']" "$promosUrl"); then
|
if ! FORGE_VERSION=$(get --json-path ".promos['$VANILLA_VERSION-latest']" "$promosUrl"); then
|
||||||
log "ERROR: Version $VANILLA_VERSION is not supported by Forge"
|
log "ERROR: Version $VANILLA_VERSION is not supported by Forge"
|
||||||
log " Refer to http://files.minecraftforge.net/ for supported versions"
|
log " Refer to http://files.minecraftforge.net/ for supported versions"
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ isDebugging && set -x
|
|||||||
: ${FORCE_REDOWNLOAD:=false}
|
: ${FORCE_REDOWNLOAD:=false}
|
||||||
|
|
||||||
if [[ ${PURPUR_BUILD} == LATEST ]]; then
|
if [[ ${PURPUR_BUILD} == LATEST ]]; then
|
||||||
PURPUR_BUILD=$(curl -fsSL "https://api.purpurmc.org/v2/purpur/${VANILLA_VERSION}" |
|
PURPUR_BUILD=$(curl -fsSL "https://api.pl3x.net/v2/purpur/${VANILLA_VERSION}" |
|
||||||
jq -r '.builds.latest' || echo "")
|
jq -r '.builds.latest' || echo "")
|
||||||
if [[ -z ${PURPUR_BUILD} ]]; then
|
if [[ -z ${PURPUR_BUILD} ]]; then
|
||||||
log "ERROR: Failed to locate a Purpur build for ${VANILLA_VERSION}."
|
log "ERROR: Failed to locate a Purpur build for ${VANILLA_VERSION}."
|
||||||
@@ -22,7 +22,7 @@ fi
|
|||||||
export SERVER="purpur-${VANILLA_VERSION}-${PURPUR_BUILD}.jar"
|
export SERVER="purpur-${VANILLA_VERSION}-${PURPUR_BUILD}.jar"
|
||||||
|
|
||||||
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
||||||
downloadUrl="https://api.purpurmc.org/v2/purpur/${VANILLA_VERSION}/${PURPUR_BUILD}/download"
|
downloadUrl="https://api.pl3x.net/v2/purpur/${VANILLA_VERSION}/${PURPUR_BUILD}/download"
|
||||||
log "Downloading Purpur from $downloadUrl ..."
|
log "Downloading Purpur from $downloadUrl ..."
|
||||||
if ! curl -fsSL -o "$SERVER" "$downloadUrl"; then
|
if ! curl -fsSL -o "$SERVER" "$downloadUrl"; then
|
||||||
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
||||||
|
|||||||
@@ -41,16 +41,6 @@ if [ ! -e "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if versionLessThan 1.6; then
|
|
||||||
if ! [[ -L /data/minecraft_server.jar && /data/minecraft_server.jar -ef "/data/$SERVER" ]]; then
|
|
||||||
rm -f /data/minecraft_server.jar
|
|
||||||
ln -s "/data/$SERVER" /data/minecraft_server.jar
|
|
||||||
fi
|
|
||||||
SERVER=minecraft_server.jar
|
|
||||||
elif [[ -L /data/minecraft_server.jar ]]; then
|
|
||||||
rm -f /data/minecraft_server.jar
|
|
||||||
fi
|
|
||||||
|
|
||||||
isDebugging && ls -l
|
isDebugging && ls -l
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupWorld" "$@"
|
exec "${SCRIPTS:-/}start-setupWorld" "$@"
|
||||||
|
|||||||
@@ -16,11 +16,7 @@ fi
|
|||||||
if [ -n "$WHITELIST" ]; then
|
if [ -n "$WHITELIST" ]; then
|
||||||
log "Updating whitelist"
|
log "Updating whitelist"
|
||||||
rm -f /data/white-list.txt.converted
|
rm -f /data/white-list.txt.converted
|
||||||
if [[ $WHITELIST == *"-"* ]]; then
|
echo $WHITELIST | awk -v RS=, '{print}' > /data/white-list.txt
|
||||||
echo $WHITELIST | awk -v RS=, '{print}' | xargs -l -i curl -s https://playerdb.co/api/player/minecraft/{} | jq -r '.["data"]["player"] | {"uuid": .id, "name": .username}' | jq -s . > "whitelist.json"
|
|
||||||
else
|
|
||||||
echo $WHITELIST | awk -v RS=, '{print}' > /data/white-list.txt
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
if isTrue "${OVERRIDE_WHITELIST}"; then
|
if isTrue "${OVERRIDE_WHITELIST}"; then
|
||||||
log "Recreating whitelist.json file at server startup"
|
log "Recreating whitelist.json file at server startup"
|
||||||
@@ -85,9 +81,6 @@ if [ -n "$JVM_DD_OPTS" ]; then
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Patch Log4j remote code execution vulnerability
|
|
||||||
JVM_OPTS="-Dlog4j2.formatMsgNoLookups=true ${JVM_OPTS}"
|
|
||||||
|
|
||||||
if isTrue ${ENABLE_JMX}; then
|
if isTrue ${ENABLE_JMX}; then
|
||||||
: ${JMX_PORT:=7091}
|
: ${JMX_PORT:=7091}
|
||||||
JVM_OPTS="${JVM_OPTS}
|
JVM_OPTS="${JVM_OPTS}
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
: "${REPLACE_ENV_IN_PLACE:=${REPLACE_ENV_VARIABLES:-false}}"
|
: ${REPLACE_ENV_IN_PLACE:=${REPLACE_ENV_VARIABLES:-false}}
|
||||||
: "${REPLACE_ENV_PATHS:=/data}"
|
: ${REPLACE_ENV_PATHS:=/data}
|
||||||
: "${REPLACE_ENV_SUFFIXES:=yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml}"
|
: ${REPLACE_ENV_SUFFIXES:=yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml}
|
||||||
: "${REPLACE_ENV_VARIABLE_PREFIX:=${ENV_VARIABLE_PREFIX:-CFG_}}"
|
: ${REPLACE_ENV_VARIABLE_PREFIX:=${ENV_VARIABLE_PREFIX:-CFG_}}
|
||||||
: "${REPLACE_ENV_VARIABLES_EXCLUDES:=}"
|
: ${REPLACE_ENV_VARIABLES_EXCLUDES:=}
|
||||||
: "${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}"
|
: ${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}
|
||||||
: "${PATCH_DEFINITIONS:=}"
|
: ${PATCH_DEFINITIONS:=}
|
||||||
: "${DEBUG:=false}"
|
: ${DEBUG:=false}
|
||||||
|
|
||||||
if isTrue "${REPLACE_ENV_IN_PLACE}"; then
|
if isTrue "${REPLACE_ENV_IN_PLACE}"; then
|
||||||
log "Replacing env variables in ${REPLACE_ENV_PATHS} that match the prefix $REPLACE_ENV_VARIABLE_PREFIX ..."
|
log "Replacing env variables in ${REPLACE_ENV_PATHS} that match the prefix $REPLACE_ENV_VARIABLE_PREFIX ..."
|
||||||
@@ -21,15 +20,15 @@ if isTrue "${REPLACE_ENV_IN_PLACE}"; then
|
|||||||
--replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \
|
--replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \
|
||||||
--replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \
|
--replace-env-excludes="${REPLACE_ENV_VARIABLES_EXCLUDES}" \
|
||||||
--replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \
|
--replace-env-exclude-paths="${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS}" \
|
||||||
--replace-env-prefix="${REPLACE_ENV_VARIABLE_PREFIX}" \
|
--replace-env-prefix=${REPLACE_ENV_VARIABLE_PREFIX} \
|
||||||
"${REPLACE_ENV_PATHS[@]}"
|
"${REPLACE_ENV_PATHS[@]}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ${PATCH_DEFINITIONS} ]]; then
|
if [[ ${PATCH_DEFINITIONS} ]]; then
|
||||||
log "Applying patch definitions from ${PATCH_DEFINITIONS}"
|
log "Applying patch definitions from ${PATCH_DEFINITIONS}"
|
||||||
mc-image-helper --debug=${DEBUG} patch \
|
mc-image-helper --debug=${DEBUG} patch \
|
||||||
--patch-env-prefix="${REPLACE_ENV_VARIABLE_PREFIX}" \
|
--patch-env-prefix=${REPLACE_ENV_VARIABLE_PREFIX} \
|
||||||
"${PATCH_DEFINITIONS}"
|
"${PATCH_DEFINITIONS}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-finalExec" "$@"
|
exec ${SCRIPTS:-/}start-finalExec $@
|
||||||
|
|||||||
@@ -20,33 +20,6 @@ if isTrue "${REMOVE_OLD_MODS}" && [ -z "${MODS_FILE}" ]; then
|
|||||||
removeOldMods /data/plugins
|
removeOldMods /data/plugins
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# If packwiz url passed, bootstrap packwiz and update mods before other modpack processing
|
|
||||||
if [[ "${PACKWIZ_URL}" ]]; then
|
|
||||||
# Ensure we have the latest packwiz bootstrap installer
|
|
||||||
latestPackwiz=$(curl -fsSL https://api.github.com/repos/comp500/packwiz-installer-bootstrap/releases/latest)
|
|
||||||
if [[ -z "${latestPackwiz}" ]]; then
|
|
||||||
log "WARNING: Could not retrieve Packwiz bootstrap installer release information"
|
|
||||||
else
|
|
||||||
isDebugging && log "Latest packwiz ${latestPackWiz}"
|
|
||||||
latestPackwizVer=$(echo ${latestPackwiz} | jq --raw-output '.tag_name')
|
|
||||||
latestPackwizUrl=$(echo ${latestPackwiz} | jq --raw-output '.assets[] | select(.name | match("packwiz-installer-bootstrap.jar")) | .url')
|
|
||||||
: "${PACKWIZ_JAR:=packwiz-installer-bootstrap_${latestPackwizVer}.jar}"
|
|
||||||
if [[ ! -e $PACKWIZ_JAR ]]; then
|
|
||||||
log "Downloading Packwiz ${latestPackwizVer}"
|
|
||||||
curl -H "Accept:application/octet-stream" -o "$PACKWIZ_JAR" -fsSL ${latestPackwizUrl}
|
|
||||||
ln -sf "${PACKWIZ_JAR}" packwiz-installer-bootstrap.jar
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if [[ ! -e packwiz-installer-bootstrap.jar ]]; then
|
|
||||||
log "ERROR: Packwiz not available or could not be downloaded from Github!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if isURL "${PACKWIZ_URL}"; then
|
|
||||||
log "Running packwiz against URL: ${PACKWIZ_URL}"
|
|
||||||
java -jar packwiz-installer-bootstrap.jar -g -s server "${PACKWIZ_URL}"
|
|
||||||
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
|
||||||
if isURL "${MODPACK}"; then
|
if isURL "${MODPACK}"; then
|
||||||
|
|||||||
@@ -1,46 +1,40 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
|
|
||||||
: "${SERVER_PROPERTIES:=/data/server.properties}"
|
: ${SERVER_PROPERTIES:=/data/server.properties}
|
||||||
|
|
||||||
# FUNCTIONS
|
# FUNCTIONS
|
||||||
function setServerPropValue {
|
|
||||||
local prop=$1
|
|
||||||
local value=$2
|
|
||||||
# normalize booleans
|
|
||||||
case ${value^^} in
|
|
||||||
TRUE|FALSE)
|
|
||||||
value=${value,,} ;;
|
|
||||||
esac
|
|
||||||
if grep "${prop}" "$SERVER_PROPERTIES" > /dev/null; then
|
|
||||||
log "Setting ${prop} to '${value}' in ${SERVER_PROPERTIES}"
|
|
||||||
sed -i "/^${prop}\s*=/ c ${prop}=${value//\\/\\\\}" "$SERVER_PROPERTIES"
|
|
||||||
else
|
|
||||||
log "Adding ${prop} with '${value}' in ${SERVER_PROPERTIES}"
|
|
||||||
echo "${prop}=${value}" >> "$SERVER_PROPERTIES"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function setServerProp {
|
function setServerProp {
|
||||||
local prop=$1
|
local prop=$1
|
||||||
local varName=$2
|
local var=$2
|
||||||
|
if [ -n "$var" ]; then
|
||||||
if [ -v $varName ]; then
|
# normalize booleans
|
||||||
setServerPropValue "$prop" "${!varName}"
|
case ${var^^} in
|
||||||
|
TRUE|FALSE)
|
||||||
|
var=${var,,} ;;
|
||||||
|
esac
|
||||||
|
if grep "${prop}" "$SERVER_PROPERTIES" > /dev/null; then
|
||||||
|
log "Setting ${prop} to '${var}' in ${SERVER_PROPERTIES}"
|
||||||
|
sed -i "/^${prop}\s*=/ c ${prop}=${var//\\/\\\\}" "$SERVER_PROPERTIES"
|
||||||
|
else
|
||||||
|
log "Adding ${prop} with '${var}' in ${SERVER_PROPERTIES}"
|
||||||
|
echo "${prop}=${var}" >> "$SERVER_PROPERTIES"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
isDebugging && log "Skip setting ${prop}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function customizeServerProps {
|
function customizeServerProps {
|
||||||
if [ -n "$WHITELIST" ] || isTrue "${ENABLE_WHITELIST:-false}"; then
|
if [ -n "$WHITELIST" ] || isTrue ${ENABLE_WHITELIST:-false}; then
|
||||||
log "Creating whitelist"
|
log "Creating whitelist"
|
||||||
setServerPropValue "whitelist" "true"
|
setServerProp "whitelist" "true"
|
||||||
setServerPropValue "white-list" "true"
|
setServerProp "white-list" "true"
|
||||||
else
|
else
|
||||||
log "Disabling whitelist"
|
log "Disabling whitelist"
|
||||||
setServerPropValue "whitelist" "false"
|
setServerProp "whitelist" "false"
|
||||||
setServerPropValue "white-list" "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,
|
||||||
@@ -59,58 +53,57 @@ function customizeServerProps {
|
|||||||
MOTD="A ${label} Minecraft Server powered by Docker"
|
MOTD="A ${label} Minecraft Server powered by Docker"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
setServerProp "server-name" SERVER_NAME
|
setServerProp "server-name" "$SERVER_NAME"
|
||||||
setServerProp "server-ip" SERVER_IP
|
setServerProp "server-ip" "$SERVER_IP"
|
||||||
setServerProp "server-port" SERVER_PORT
|
setServerProp "server-port" "$SERVER_PORT"
|
||||||
setServerProp "allow-nether" ALLOW_NETHER
|
setServerProp "motd" "$(echo $MOTD | mc-image-helper asciify)"
|
||||||
setServerProp "announce-player-achievements" ANNOUNCE_PLAYER_ACHIEVEMENTS
|
setServerProp "allow-nether" "$ALLOW_NETHER"
|
||||||
setServerProp "enable-command-block" ENABLE_COMMAND_BLOCK
|
setServerProp "announce-player-achievements" "$ANNOUNCE_PLAYER_ACHIEVEMENTS"
|
||||||
setServerProp "spawn-animals" SPAWN_ANIMALS
|
setServerProp "enable-command-block" "$ENABLE_COMMAND_BLOCK"
|
||||||
setServerProp "spawn-monsters" SPAWN_MONSTERS
|
setServerProp "spawn-animals" "$SPAWN_ANIMALS"
|
||||||
setServerProp "spawn-npcs" SPAWN_NPCS
|
setServerProp "spawn-monsters" "$SPAWN_MONSTERS"
|
||||||
setServerProp "spawn-protection" SPAWN_PROTECTION
|
setServerProp "spawn-npcs" "$SPAWN_NPCS"
|
||||||
setServerProp "generate-structures" GENERATE_STRUCTURES
|
setServerProp "spawn-protection" "$SPAWN_PROTECTION"
|
||||||
setServerProp "view-distance" VIEW_DISTANCE
|
setServerProp "generate-structures" "$GENERATE_STRUCTURES"
|
||||||
setServerProp "hardcore" HARDCORE
|
setServerProp "view-distance" "$VIEW_DISTANCE"
|
||||||
setServerProp "snooper-enabled" SNOOPER_ENABLED
|
setServerProp "hardcore" "$HARDCORE"
|
||||||
setServerProp "max-build-height" MAX_BUILD_HEIGHT
|
setServerProp "snooper-enabled" "$SNOOPER_ENABLED"
|
||||||
setServerProp "force-gamemode" FORCE_GAMEMODE
|
setServerProp "max-build-height" "$MAX_BUILD_HEIGHT"
|
||||||
setServerProp "max-tick-time" MAX_TICK_TIME
|
setServerProp "force-gamemode" "$FORCE_GAMEMODE"
|
||||||
setServerProp "enable-query" ENABLE_QUERY
|
setServerProp "max-tick-time" "$MAX_TICK_TIME"
|
||||||
setServerProp "query.port" QUERY_PORT
|
setServerProp "enable-query" "$ENABLE_QUERY"
|
||||||
setServerProp "enable-rcon" ENABLE_RCON
|
setServerProp "query.port" "$QUERY_PORT"
|
||||||
setServerProp "rcon.password" RCON_PASSWORD
|
setServerProp "enable-rcon" "$ENABLE_RCON"
|
||||||
setServerProp "rcon.port" RCON_PORT
|
setServerProp "rcon.password" "$RCON_PASSWORD"
|
||||||
setServerProp "max-players" MAX_PLAYERS
|
setServerProp "rcon.port" "$RCON_PORT"
|
||||||
setServerProp "max-world-size" MAX_WORLD_SIZE
|
setServerProp "max-players" "$MAX_PLAYERS"
|
||||||
setServerProp "level-name" LEVEL
|
setServerProp "max-world-size" "$MAX_WORLD_SIZE"
|
||||||
setServerProp "level-seed" SEED
|
setServerProp "level-name" "$LEVEL"
|
||||||
setServerProp "pvp" PVP
|
setServerProp "level-seed" "$SEED"
|
||||||
setServerProp "generator-settings" GENERATOR_SETTINGS
|
setServerProp "pvp" "${PVP}"
|
||||||
setServerProp "online-mode" ONLINE_MODE
|
setServerProp "generator-settings" "$GENERATOR_SETTINGS"
|
||||||
setServerProp "allow-flight" ALLOW_FLIGHT
|
setServerProp "online-mode" "$ONLINE_MODE"
|
||||||
setServerProp "resource-pack" RESOURCE_PACK
|
setServerProp "allow-flight" "$ALLOW_FLIGHT"
|
||||||
setServerProp "resource-pack-sha1" RESOURCE_PACK_SHA1
|
setServerProp "level-type" "${LEVEL_TYPE^^}"
|
||||||
setServerProp "require-resource-pack" RESOURCE_PACK_ENFORCE
|
setServerProp "resource-pack" "$RESOURCE_PACK"
|
||||||
setServerProp "player-idle-timeout" PLAYER_IDLE_TIMEOUT
|
setServerProp "resource-pack-sha1" "$RESOURCE_PACK_SHA1"
|
||||||
setServerProp "broadcast-console-to-ops" BROADCAST_CONSOLE_TO_OPS
|
setServerProp "player-idle-timeout" "$PLAYER_IDLE_TIMEOUT"
|
||||||
setServerProp "broadcast-rcon-to-ops" BROADCAST_RCON_TO_OPS
|
setServerProp "broadcast-console-to-ops" "$BROADCAST_CONSOLE_TO_OPS"
|
||||||
setServerProp "enable-jmx-monitoring" ENABLE_JMX
|
setServerProp "broadcast-rcon-to-ops" "$BROADCAST_RCON_TO_OPS"
|
||||||
setServerProp "sync-chunk-writes" SYNC_CHUNK_WRITES
|
setServerProp "enable-jmx-monitoring" "$ENABLE_JMX"
|
||||||
setServerProp "enable-status" ENABLE_STATUS
|
setServerProp "sync-chunk-writes" "$SYNC_CHUNK_WRITES"
|
||||||
setServerProp "entity-broadcast-range-percentage" ENTITY_BROADCAST_RANGE_PERCENTAGE
|
setServerProp "enable-status" "$ENABLE_STATUS"
|
||||||
setServerProp "function-permission-level" FUNCTION_PERMISSION_LEVEL
|
setServerProp "entity-broadcast-range-percentage" "$ENTITY_BROADCAST_RANGE_PERCENTAGE"
|
||||||
setServerProp "network-compression-threshold" NETWORK_COMPRESSION_THRESHOLD
|
setServerProp "function-permission-level" "$FUNCTION_PERMISSION_LEVEL"
|
||||||
setServerProp "op-permission-level" OP_PERMISSION_LEVEL
|
setServerProp "network-compression-threshold" "$NETWORK_COMPRESSION_THRESHOLD"
|
||||||
setServerProp "prevent-proxy-connections" PREVENT_PROXY_CONNECTIONS
|
setServerProp "op-permission-level" "$OP_PERMISSION_LEVEL"
|
||||||
setServerProp "use-native-transport" USE_NATIVE_TRANSPORT
|
setServerProp "prevent-proxy-connections" "$PREVENT_PROXY_CONNECTIONS"
|
||||||
setServerProp "enforce-whitelist" ENFORCE_WHITELIST
|
setServerProp "use-native-transport" "$USE_NATIVE_TRANSPORT"
|
||||||
setServerProp "simulation-distance" SIMULATION_DISTANCE
|
setServerProp "enforce-whitelist" "$ENFORCE_WHITELIST"
|
||||||
setServerPropValue "motd" "$(echo "$MOTD" | mc-image-helper asciify)"
|
setServerProp "simulation-distance" "$SIMULATION_DISTANCE"
|
||||||
[[ $LEVEL_TYPE ]] && setServerPropValue "level-type" "${LEVEL_TYPE^^}"
|
|
||||||
|
|
||||||
if [ -n "$DIFFICULTY" ]; then
|
if [ -n "$DIFFICULTY" ]; then
|
||||||
case ${DIFFICULTY,,} in
|
case $DIFFICULTY in
|
||||||
peaceful|0)
|
peaceful|0)
|
||||||
if versionLessThan 1.13; then
|
if versionLessThan 1.13; then
|
||||||
DIFFICULTY=0
|
DIFFICULTY=0
|
||||||
@@ -144,12 +137,13 @@ function customizeServerProps {
|
|||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
setServerPropValue "difficulty" "$DIFFICULTY"
|
setServerProp "difficulty" "$DIFFICULTY"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$MODE" ]; then
|
if [ -n "$MODE" ]; then
|
||||||
log "Setting mode"
|
log "Setting mode"
|
||||||
case ${MODE,,} in
|
MODE_LC=$( echo $MODE | tr '[:upper:]' '[:lower:]' )
|
||||||
|
case $MODE_LC in
|
||||||
su*|0)
|
su*|0)
|
||||||
if versionLessThan 1.13; then
|
if versionLessThan 1.13; then
|
||||||
MODE=0
|
MODE=0
|
||||||
@@ -183,7 +177,7 @@ function customizeServerProps {
|
|||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
setServerPropValue "gamemode" "$MODE"
|
setServerProp "gamemode" "$MODE"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,16 +210,16 @@ fi
|
|||||||
|
|
||||||
if isTrue "${ENABLE_AUTOPAUSE}"; then
|
if isTrue "${ENABLE_AUTOPAUSE}"; then
|
||||||
current_max_tick=$( grep 'max-tick-time' "$SERVER_PROPERTIES" | sed -r 's/( )+//g' | awk -F= '{print $2}' )
|
current_max_tick=$( grep 'max-tick-time' "$SERVER_PROPERTIES" | sed -r 's/( )+//g' | awk -F= '{print $2}' )
|
||||||
if (( current_max_tick > 0 && current_max_tick < 86400000 )); then
|
if (( $current_max_tick > 0 && $current_max_tick < 86400000 )); then
|
||||||
log "Warning: The server.properties for the server doesn't have the Server Watchdog (effectively) disabled."
|
log "Warning: The server.properties for the server doesn't have the Server Watchdog (effectively) disabled."
|
||||||
log "Warning (cont): Autopause functionality resuming the process might trigger the Watchdog and restart the server completely."
|
log "Warning (cont): Autopause functionality resuming the process might trigger the Watchdog and restart the server completely."
|
||||||
log "Warning (cont): Set the max-tick-time property to a high value (or disable the Watchdog with value -1 for versions 1.8.1+)."
|
log "Warning (cont): Set the max-tick-time property to a high value (or disable the Watchdog with value -1 for versions 1.8.1+)."
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if isDebugging && [ -f "${SERVER_PROPERTIES}" ]; then
|
if isDebugging; then
|
||||||
log "DEBUG Dumping server.properties"
|
log "DEBUG Dumping server.properties"
|
||||||
cat "${SERVER_PROPERTIES}"
|
cat "${SERVER_PROPERTIES}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupEnvVariables" "$@"
|
exec ${SCRIPTS:-/}start-setupEnvVariables $@
|
||||||
|
|||||||
@@ -1,14 +1,16 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
set -e
|
set -e
|
||||||
isDebugging && set -x
|
isDebugging && set -x
|
||||||
|
|
||||||
|
: ${LEVEL:=world}
|
||||||
|
export LEVEL
|
||||||
|
|
||||||
if [ $TYPE = "CURSEFORGE" ]; then
|
if [ $TYPE = "CURSEFORGE" ]; then
|
||||||
worldDest=$FTB_DIR/${LEVEL:-world}
|
worldDest=$FTB_DIR/$LEVEL
|
||||||
else
|
else
|
||||||
worldDest=/data/${LEVEL:-world}
|
worldDest=/data/$LEVEL
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] ); then
|
if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] ); then
|
||||||
@@ -69,4 +71,4 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupModpack" "$@"
|
exec ${SCRIPTS:-/}start-setupModpack $@
|
||||||
|
|||||||
@@ -113,9 +113,7 @@ function normalizeMemSize() {
|
|||||||
|
|
||||||
function versionLessThan() {
|
function versionLessThan() {
|
||||||
local activeParts
|
local activeParts
|
||||||
version=${VANILLA_VERSION%%-*} # for snapshot/rc versions
|
IFS=. read -ra activeParts <<<"${VANILLA_VERSION}"
|
||||||
version=${version##b} # for versions like b1.7.3
|
|
||||||
IFS=. read -ra activeParts <<<"${version}"
|
|
||||||
|
|
||||||
local givenParts
|
local givenParts
|
||||||
IFS=. read -ra givenParts <<<"$1"
|
IFS=. read -ra givenParts <<<"$1"
|
||||||
|
|||||||
20
tests/docker-compose.test.yml
Normal file
20
tests/docker-compose.test.yml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
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: ..
|
||||||
|
args:
|
||||||
|
TARGETOS: linux
|
||||||
|
TARGETARCH: amd64
|
||||||
|
cache_from:
|
||||||
|
- itzg/minecraft-server:latest
|
||||||
|
environment:
|
||||||
|
EULA: "TRUE"
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
version: "3.8"
|
|
||||||
|
|
||||||
services:
|
|
||||||
monitor:
|
|
||||||
depends_on:
|
|
||||||
- mc
|
|
||||||
image: itzg/mc-monitor:${MC_MONITOR_VERSION:-0.10.4}
|
|
||||||
command: status --host mc --retry-interval 1s --timeout 1s --retry-limit 240
|
|
||||||
mc:
|
|
||||||
restart: "no"
|
|
||||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
|
||||||
|
|
||||||
@@ -1,22 +1,17 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
cd "$(dirname "$0")" || exit 1
|
cd $(dirname $0)
|
||||||
|
|
||||||
failed=false
|
failed=false
|
||||||
|
args="-f docker-compose.test.yml"
|
||||||
down() {
|
docker-compose $args run sut || failed=true
|
||||||
docker-compose down -v
|
|
||||||
}
|
|
||||||
|
|
||||||
docker-compose run monitor || failed=true
|
|
||||||
echo "
|
echo "
|
||||||
Result: failed=$failed"
|
Result: failed=$failed"
|
||||||
|
|
||||||
|
$failed && docker-compose $args logs mc
|
||||||
|
docker-compose $args down -v
|
||||||
|
|
||||||
if $failed; then
|
if $failed; then
|
||||||
docker-compose logs mc
|
|
||||||
down
|
|
||||||
exit 1
|
exit 1
|
||||||
else
|
|
||||||
down
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user