mirror of
https://github.com/itzg/docker-minecraft-server.git
synced 2026-02-18 15:36:22 +00:00
Compare commits
109 Commits
java16-ope
...
2022.1.0-j
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
df1dac4b3a | ||
|
|
4f149f8f40 | ||
|
|
88e5b7e135 | ||
|
|
86190eafc7 | ||
|
|
7983a4a3a2 | ||
|
|
52ac180c77 | ||
|
|
32195e71c5 | ||
|
|
a0a578f452 | ||
|
|
ca0ddc80aa | ||
|
|
1a625f09bb | ||
|
|
9ab345a727 | ||
|
|
4e3031cff8 | ||
|
|
466e1728f6 | ||
|
|
8dddbc4120 | ||
|
|
53e9d36a05 | ||
|
|
275c2d0c54 | ||
|
|
cf9c40f331 | ||
|
|
491ffe49bf | ||
|
|
d4a9b367c7 | ||
|
|
032d94a30f | ||
|
|
3784d2df54 | ||
|
|
8a36823843 | ||
|
|
78c520572a | ||
|
|
5303105265 | ||
|
|
1f120c5fa4 | ||
|
|
70ec3b838d | ||
|
|
b248ed342f | ||
|
|
4c70184804 | ||
|
|
b9ba062add | ||
|
|
cbb1d0ea52 | ||
|
|
bbad3a3e7a | ||
|
|
8965397a5a | ||
|
|
c661fe7318 | ||
|
|
bae1feb750 | ||
|
|
edbcf80a70 | ||
|
|
fb23e12680 | ||
|
|
e30a2e6448 | ||
|
|
03d7babd68 | ||
|
|
332b929a6d | ||
|
|
c138cabc65 | ||
|
|
41631e35e8 | ||
|
|
6f95fa6175 | ||
|
|
6f16da8309 | ||
|
|
8cee8d5618 | ||
|
|
8b76b5776a | ||
|
|
e3af06d2e4 | ||
|
|
0ac583514c | ||
|
|
bf3f15f5fb | ||
|
|
4aec2322b5 | ||
|
|
51b2eb6851 | ||
|
|
846050f41a | ||
|
|
485ec6a141 | ||
|
|
0096e41882 | ||
|
|
d45610723a | ||
|
|
072704b54d | ||
|
|
0f08e88c5b | ||
|
|
89604c8d13 | ||
|
|
58842d444b | ||
|
|
457d09e14d | ||
|
|
7210e81f47 | ||
|
|
ba86534e6e | ||
|
|
44bafbff09 | ||
|
|
75c51bf0c7 | ||
|
|
cf651f2279 | ||
|
|
6d0d7fe19c | ||
|
|
bb58d7a4c9 | ||
|
|
6efaac2861 | ||
|
|
806342d74b | ||
|
|
926e302595 | ||
|
|
10e85140ad | ||
|
|
fc2ed9e612 | ||
|
|
edfe58079a | ||
|
|
d423cc3b8d | ||
|
|
1537e48e29 | ||
|
|
62473771dc | ||
|
|
c4528e8f79 | ||
|
|
0f797487ab | ||
|
|
9511e3cc80 | ||
|
|
3aa4dd6c85 | ||
|
|
27571999b2 | ||
|
|
bbd7d9e39a | ||
|
|
ef6f308229 | ||
|
|
49d89d3e73 | ||
|
|
74203b23f4 | ||
|
|
4fb791b490 | ||
|
|
ced25ad50a | ||
|
|
48efc224ba | ||
|
|
467c1d9954 | ||
|
|
9ced230f55 | ||
|
|
f3a8276362 | ||
|
|
b91d63716e | ||
|
|
46cccfd531 | ||
|
|
9fe1cb4a0d | ||
|
|
076038b470 | ||
|
|
aa416729ea | ||
|
|
812c6365ec | ||
|
|
42a5131b19 | ||
|
|
624f6a210f | ||
|
|
1c63cd18b7 | ||
|
|
6266a7e3cc | ||
|
|
871ecd4d9d | ||
|
|
c572c95161 | ||
|
|
f7b58fbbb1 | ||
|
|
eccfa444a9 | ||
|
|
e831d25706 | ||
|
|
12e931332b | ||
|
|
ceee9eddc9 | ||
|
|
60ba668743 | ||
|
|
fd1b15e01f |
7
.github/workflows/build-multiarch.yml
vendored
7
.github/workflows/build-multiarch.yml
vendored
@@ -8,7 +8,6 @@ on:
|
|||||||
- java11*
|
- java11*
|
||||||
- java16*
|
- java16*
|
||||||
- java17*
|
- java17*
|
||||||
- test/**
|
|
||||||
tags:
|
tags:
|
||||||
- "[0-9]+.[0-9]+.[0-9]+"
|
- "[0-9]+.[0-9]+.[0-9]+"
|
||||||
- "[0-9]+.[0-9]+.[0-9]+-java8-multiarch"
|
- "[0-9]+.[0-9]+.[0-9]+-java8-multiarch"
|
||||||
@@ -57,7 +56,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build for test
|
- name: Build for test
|
||||||
uses: docker/build-push-action@v2.7.0
|
uses: docker/build-push-action@v2.7.0
|
||||||
if: github.ref_name == 'master' || startsWith(github.ref_name, 'test/')
|
if: github.ref_name == 'master'
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
platforms: linux/amd64
|
platforms: linux/amd64
|
||||||
@@ -71,7 +70,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
# It is assumed that image variants are merged from master and tested there
|
# It is assumed that image variants are merged from master and tested there
|
||||||
if: github.ref_name == 'master' || startsWith(github.ref_name, 'test/')
|
if: github.ref_name == 'master'
|
||||||
run: |
|
run: |
|
||||||
tests/test.sh
|
tests/test.sh
|
||||||
|
|
||||||
@@ -81,7 +80,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
platforms: linux/amd64
|
platforms: linux/amd64
|
||||||
push: true
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
# ensure latest base image is used
|
# ensure latest base image is used
|
||||||
pull: true
|
pull: true
|
||||||
|
|||||||
43
.github/workflows/ci.yml
vendored
43
.github/workflows/ci.yml
vendored
@@ -1,43 +0,0 @@
|
|||||||
name: ContinuousIntegration
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- 'dev*'
|
|
||||||
- '!master'
|
|
||||||
- '!java*'
|
|
||||||
- '!multi*'
|
|
||||||
paths-ignore:
|
|
||||||
- "*.md"
|
|
||||||
- "docs/**"
|
|
||||||
- "examples/**"
|
|
||||||
|
|
||||||
env:
|
|
||||||
IMAGE_TO_TEST: ${{ secrets.IMAGE_ORG }}/minecraft-server:test-${{ github.repository_owner }}-${{ github.run_id }}
|
|
||||||
MODS_FORGEAPI_KEY: ${{ secrets.MODS_FORGEAPI_KEY }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2.4.0
|
|
||||||
|
|
||||||
- name: Setup Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v1
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
uses: docker/build-push-action@v2.7.0
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
platforms: linux/amd64
|
|
||||||
tags: ${{ env.IMAGE_TO_TEST }}
|
|
||||||
load: true
|
|
||||||
cache-from: type=gha
|
|
||||||
|
|
||||||
- name: Run Setup Only Tests
|
|
||||||
run: sh tests/setuponlytests/test.sh
|
|
||||||
|
|
||||||
# - name: Run Full Minecraft Service Tests
|
|
||||||
# run: |
|
|
||||||
# tests/fulltests/test.sh
|
|
||||||
27
.github/workflows/discord.yml
vendored
27
.github/workflows/discord.yml
vendored
@@ -1,27 +0,0 @@
|
|||||||
name: discord
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_run:
|
|
||||||
workflows: ["ContinuousIntegration", "PullRequest", "Build and Publish", "Build and publish multiarch" ]
|
|
||||||
types:
|
|
||||||
- completed
|
|
||||||
|
|
||||||
env:
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
GITHUB_WORKFLOW_URL: https://github.com/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
discord:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 5
|
|
||||||
steps:
|
|
||||||
- name: on-success
|
|
||||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
|
||||||
uses: Ilshidur/action-discord@master
|
|
||||||
with:
|
|
||||||
args: "Github repo: ${{ github.repository }}\n- Branch: ${{ github.ref }}\n- [Link: to Actions](<${{ env.GITHUB_WORKFLOW_URL }}>)\n- Status: 🎉 ${{ github.event.workflow_run.conclusion }} 🍏"
|
|
||||||
- name: on-failure
|
|
||||||
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
|
|
||||||
uses: Ilshidur/action-discord@master
|
|
||||||
with:
|
|
||||||
args: "Github repo: ${{ github.repository }}\n- Branch: ${{ github.ref }}\n- [Link: to Actions](<${{ env.GITHUB_WORKFLOW_URL }}>)\n- Status: 🤔 ${{ github.event.workflow_run.conclusion }} 💣💥"
|
|
||||||
2
.github/workflows/generate-toc.yml
vendored
2
.github/workflows/generate-toc.yml
vendored
@@ -16,6 +16,6 @@ jobs:
|
|||||||
curl https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc -o gh-md-toc
|
curl https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc -o gh-md-toc
|
||||||
chmod a+x gh-md-toc
|
chmod a+x gh-md-toc
|
||||||
./gh-md-toc --insert --no-backup README.md
|
./gh-md-toc --insert --no-backup README.md
|
||||||
- uses: stefanzweifel/git-auto-commit-action@v4.13.1
|
- uses: stefanzweifel/git-auto-commit-action@v4.12.0
|
||||||
with:
|
with:
|
||||||
commit_message: "docs: Auto update markdown TOC"
|
commit_message: "docs: Auto update markdown TOC"
|
||||||
17
.github/workflows/issue-label.yml
vendored
17
.github/workflows/issue-label.yml
vendored
@@ -1,17 +0,0 @@
|
|||||||
on:
|
|
||||||
issues:
|
|
||||||
types: [labeled]
|
|
||||||
|
|
||||||
env:
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
labelNotify:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 5
|
|
||||||
steps:
|
|
||||||
- name: notify
|
|
||||||
if: github.event.label.name == 'enhancement' || github.event.label.name == 'bug'
|
|
||||||
uses: Ilshidur/action-discord@master
|
|
||||||
with:
|
|
||||||
args: "[${{ github.event.issue.title }}](<${{ github.event.issue.html_url }}>) added `${{ github.event.label.name }}` label"
|
|
||||||
3
.github/workflows/pr.yml
vendored
3
.github/workflows/pr.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: PullRequest
|
name: Validate PR
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
@@ -11,7 +11,6 @@ on:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
IMAGE_TO_TEST: itzg/minecraft-server:test-${{ github.repository_owner }}-${{ github.run_id }}
|
IMAGE_TO_TEST: itzg/minecraft-server:test-${{ github.repository_owner }}-${{ github.run_id }}
|
||||||
MODS_FORGEAPI_KEY: ${{ secrets.MODS_FORGEAPI_KEY }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
|
|||||||
2
.github/workflows/stale-check.yml
vendored
2
.github/workflows/stale-check.yml
vendored
@@ -21,5 +21,5 @@ jobs:
|
|||||||
Please add a comment describing the reason to keep this issue open.
|
Please add a comment describing the reason to keep this issue open.
|
||||||
days-before-stale: 30
|
days-before-stale: 30
|
||||||
days-before-close: 5
|
days-before-close: 5
|
||||||
exempt-issue-labels: 'enhancement,keep,status/needs triage,priority/high'
|
exempt-issue-labels: 'enhancement,keep,status/needs triage'
|
||||||
|
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,4 +2,5 @@
|
|||||||
/data/
|
/data/
|
||||||
/.idea/
|
/.idea/
|
||||||
*.iml
|
*.iml
|
||||||
|
*.zip
|
||||||
/gh-md-toc
|
/gh-md-toc
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM adoptopenjdk:16-jdk-openj9
|
FROM adoptopenjdk:8-jdk-openj9
|
||||||
|
|
||||||
LABEL org.opencontainers.image.authors="Geoff Bourne <itzgeoff@gmail.com>"
|
LABEL org.opencontainers.image.authors="Geoff Bourne <itzgeoff@gmail.com>"
|
||||||
|
|
||||||
|
|||||||
60
README.md
60
README.md
@@ -68,7 +68,6 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [Optional plugins, mods, and config attach points](#optional-plugins-mods-and-config-attach-points)
|
* [Optional plugins, mods, and config attach points](#optional-plugins-mods-and-config-attach-points)
|
||||||
* [Auto-downloading SpigotMC/Bukkit/PaperMC plugins](#auto-downloading-spigotmcbukkitpapermc-plugins)
|
* [Auto-downloading SpigotMC/Bukkit/PaperMC plugins](#auto-downloading-spigotmcbukkitpapermc-plugins)
|
||||||
* [Downloadable mod/plugin pack for Forge, Fabric, and Bukkit-like Servers](#downloadable-modplugin-pack-for-forge-fabric-and-bukkit-like-servers)
|
* [Downloadable mod/plugin pack for Forge, Fabric, and Bukkit-like Servers](#downloadable-modplugin-pack-for-forge-fabric-and-bukkit-like-servers)
|
||||||
* [<strong>ForgeAPI</strong> usage to use non-version specific projects](#forgeapi-usage-to-use-non-version-specific-projects)
|
|
||||||
* [Generic pack file](#generic-pack-file)
|
* [Generic pack file](#generic-pack-file)
|
||||||
* [Mod/Plugin URL Listing File](#modplugin-url-listing-file)
|
* [Mod/Plugin URL Listing File](#modplugin-url-listing-file)
|
||||||
* [Remove old mods/plugins](#remove-old-modsplugins)
|
* [Remove old mods/plugins](#remove-old-modsplugins)
|
||||||
@@ -133,7 +132,6 @@ By default, the container will download the latest version of the "vanilla" [Min
|
|||||||
* [Explicitly disable GUI](#explicitly-disable-gui)
|
* [Explicitly disable GUI](#explicitly-disable-gui)
|
||||||
* [Stop Duration](#stop-duration)
|
* [Stop Duration](#stop-duration)
|
||||||
* [Setup only](#setup-only)
|
* [Setup only](#setup-only)
|
||||||
* [Enable Flare Flags](#enable-flare-flags)
|
|
||||||
* [Autopause](#autopause)
|
* [Autopause](#autopause)
|
||||||
* [Description](#description)
|
* [Description](#description)
|
||||||
* [Enabling Autopause](#enabling-autopause)
|
* [Enabling Autopause](#enabling-autopause)
|
||||||
@@ -141,7 +139,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: Thu Jan 20 23:09:53 UTC 2022 -->
|
<!-- Added by: runner, at: Thu Jan 6 12:50:03 UTC 2022 -->
|
||||||
|
|
||||||
<!--te-->
|
<!--te-->
|
||||||
|
|
||||||
@@ -487,7 +485,7 @@ An [Airplane](https://airplane.gg) server, which is "a stable, optimized, well s
|
|||||||
Extra variables:
|
Extra variables:
|
||||||
- `AIRPLANE_BUILD=lastSuccessfulBuild` : set a specific Airplane build to use
|
- `AIRPLANE_BUILD=lastSuccessfulBuild` : set a specific Airplane build to use
|
||||||
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
||||||
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the built-in [Flare](https://blog.airplane.gg/flare) profiler
|
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the [Flare](https://blog.airplane.gg/flare) profiler
|
||||||
|
|
||||||
### Running a Pufferfish server
|
### Running a Pufferfish server
|
||||||
|
|
||||||
@@ -500,7 +498,6 @@ A [Pufferfish](https://github.com/pufferfish-gg/Pufferfish) server, which is "a
|
|||||||
Extra variables:
|
Extra variables:
|
||||||
- `PUFFERFISH_BUILD=lastSuccessfulBuild` : set a specific Pufferfish build to use
|
- `PUFFERFISH_BUILD=lastSuccessfulBuild` : set a specific Pufferfish build to use
|
||||||
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
||||||
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the built-in [Flare](https://blog.airplane.gg/flare) profiler
|
|
||||||
|
|
||||||
### Running a Purpur server
|
### Running a Purpur server
|
||||||
|
|
||||||
@@ -513,7 +510,7 @@ A [Purpur](https://purpur.pl3x.net/) server, which is "drop-in replacement for P
|
|||||||
Extra variables:
|
Extra variables:
|
||||||
- `PURPUR_BUILD=LATEST` : set a specific Purpur build to use
|
- `PURPUR_BUILD=LATEST` : set a specific Purpur build to use
|
||||||
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
||||||
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the built-in [Flare](https://blog.airplane.gg/flare) profiler
|
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the [Flare](https://blog.airplane.gg/flare) profiler
|
||||||
|
|
||||||
### Running a Magma server
|
### Running a Magma server
|
||||||
|
|
||||||
@@ -590,8 +587,6 @@ Configuration options with defaults:
|
|||||||
- `LIMBO_SCHEMA_FILENAME`=default.schem
|
- `LIMBO_SCHEMA_FILENAME`=default.schem
|
||||||
- `LEVEL`="Default;${LIMBO_SCHEMA_FILENAME}"
|
- `LEVEL`="Default;${LIMBO_SCHEMA_FILENAME}"
|
||||||
|
|
||||||
> NOTE: instead of using format codes in the MOTD, Limbo requires [JSON chat content](https://minecraft.fandom.com/wiki/Raw_JSON_text_format#Java_Edition). If a plain string is provided, which is the default, then it gets converted into the required JSON structure.
|
|
||||||
|
|
||||||
### Running a Crucible server
|
### Running a Crucible server
|
||||||
|
|
||||||
A [Crucible](https://github.com/CrucibleMC/Crucible) server can be run by setting `TYPE` to `CRUCIBLE`.
|
A [Crucible](https://github.com/CrucibleMC/Crucible) server can be run by setting `TYPE` to `CRUCIBLE`.
|
||||||
@@ -746,47 +741,6 @@ You may also download or copy over individual mods using the `MODS` environment
|
|||||||
|
|
||||||
docker run -d -e MODS=https://www.example.com/mods/mod1.jar,/plugins/common,/plugins/special/mod2.jar ...
|
docker run -d -e MODS=https://www.example.com/mods/mod1.jar,/plugins/common,/plugins/special/mod2.jar ...
|
||||||
|
|
||||||
### **ForgeAPI** usage to use non-version specific projects
|
|
||||||
|
|
||||||
**NOTE:** This potentially could lead to unexpected behavior if the Mod recieves an update with unexpected behavior.
|
|
||||||
|
|
||||||
This is more complicated because you will be pulling/using the latest mod for the release of your game. To get started make sure you have a [CursedForge API Key](https://docs.curseforge.com/#getting-started). Then use the environmental parameters in your docker build.
|
|
||||||
|
|
||||||
Parameters to use the ForgeAPI:
|
|
||||||
|
|
||||||
* `MODS_FORGEAPI_KEY` - Required
|
|
||||||
* `MODS_FORGEAPI_FILE` - Required or use MODS_FORGEAPI_PROJECTIDS (Overrides MODS_FORGEAPI_PROJECTIDS)
|
|
||||||
* `MODS_FORGEAPI_PROJECTIDS` - Required or use MODS_FORGEAPI_FILE
|
|
||||||
* `MODS_FORGEAPI_RELEASES` - Default is release, Options: [Release|Beta|Alpha]
|
|
||||||
* `REMOVE_OLD_FORGEAPI_MODS` - Default is False
|
|
||||||
* `REMOVE_OLD_DATAPACKS_DEPTH` - Default is 1
|
|
||||||
* `REMOVE_OLD_DATAPACKS_INCLUDE` - Default is *.jar
|
|
||||||
|
|
||||||
Example of expected forge api project ids, releases, and key:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
MODS_FORGEAPI_PROJECTIDS: 306612,256717
|
|
||||||
MODS_FORGEAPI_RELEASES: Release
|
|
||||||
MODS_FORGEAPI_KEY: $WRX...
|
|
||||||
```
|
|
||||||
|
|
||||||
Example of expected ForgeAPI file format: **Note**: name is currently unused, but can be used to document each entry.
|
|
||||||
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"name": "fabric api",
|
|
||||||
"projectId": "306612",
|
|
||||||
"releaseType": "release"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "fabric voice mod",
|
|
||||||
"projectId": "416089",
|
|
||||||
"releaseType": "beta"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Generic pack file
|
### Generic pack file
|
||||||
|
|
||||||
To install all of the server content (jars, mods, plugins, configs, etc) from a zip file, such as a CurseForge modpack that is missing a server start script, then set `GENERIC_PACK` to the container path of the zip file. That, combined with `TYPE`, allows for custom content along with container managed server download and install.
|
To install all of the server content (jars, mods, plugins, configs, etc) from a zip file, such as a CurseForge modpack that is missing a server start script, then set `GENERIC_PACK` to the container path of the zip file. That, combined with `TYPE`, allows for custom content along with container managed server download and install.
|
||||||
@@ -1531,14 +1485,6 @@ When the container is signalled to stop, the Minecraft process wrapper will atte
|
|||||||
### Setup only
|
### Setup only
|
||||||
|
|
||||||
If you are using a host-attached data directory, then you can have the image setup the Minecraft server files and stop prior to launching the server process by setting `SETUP_ONLY` to `true`.
|
If you are using a host-attached data directory, then you can have the image setup the Minecraft server files and stop prior to launching the server process by setting `SETUP_ONLY` to `true`.
|
||||||
|
|
||||||
### Enable Flare Flags
|
|
||||||
|
|
||||||
To enable the JVM flags required to fully support the [Flare profiling suite](https://blog.airplane.gg/flare), set the following variable:
|
|
||||||
|
|
||||||
-e USE_FLARE_FLAGS=true
|
|
||||||
|
|
||||||
Flare is built-in to Airplane/Pufferfish/Purpur, and is available in [plugin form](https://github.com/TECHNOVE/FlarePlugin) for other server types.
|
|
||||||
|
|
||||||
## Autopause
|
## Autopause
|
||||||
|
|
||||||
|
|||||||
@@ -124,14 +124,6 @@ case "${TYPE^^}" in
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
FORGE)
|
FORGE)
|
||||||
if versionLessThan 1.17; then
|
|
||||||
log "**********************************************************************"
|
|
||||||
log "WARNING: The image tag itzg/minecraft-server:java8 is recommended"
|
|
||||||
log " since some mods require Java 8"
|
|
||||||
log " Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader"
|
|
||||||
log " can be fixed with java8"
|
|
||||||
log "**********************************************************************"
|
|
||||||
fi
|
|
||||||
exec ${SCRIPTS:-/}start-deployForge "$@"
|
exec ${SCRIPTS:-/}start-deployForge "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -144,10 +136,6 @@ 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 "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -196,12 +184,6 @@ case "${TYPE^^}" in
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
CRUCIBLE)
|
CRUCIBLE)
|
||||||
log "**********************************************************************"
|
|
||||||
log "WARNING: The image tag itzg/minecraft-server:java8 is recommended"
|
|
||||||
log " since some mods require Java 8"
|
|
||||||
log " Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader"
|
|
||||||
log " can be fixed with java8"
|
|
||||||
log "**********************************************************************"
|
|
||||||
exec "${SCRIPTS:-/}start-deployCrucible" "$@"
|
exec "${SCRIPTS:-/}start-deployCrucible" "$@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,8 @@ if [ ! -f "$SERVER" ] || isTrue "${FORCE_REDOWNLOAD:-false}"; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for later operations
|
# Normalize on Spigot for later operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
export FAMILY=SPIGOT
|
export FAMILY=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-spiget" "$@"
|
exec ${SCRIPTS:-/}start-spiget "$@"
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for operations below
|
# Normalize on Spigot for operations below
|
||||||
|
export TYPE=SPIGOT
|
||||||
export FAMILY=SPIGOT
|
export FAMILY=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ if [ ! -f "$SERVER" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for later operations
|
# Normalize on Spigot for later operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
export FAMILY=SPIGOT
|
export FAMILY=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for downstream operations
|
# Normalize on Spigot for downstream operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
export FAMILY=SPIGOT
|
export FAMILY=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ if [ ! -f "$SERVER" ] || isTrue "${FORCE_REDOWNLOAD:-false}"; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for later operations
|
# Normalize on Spigot for later operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
export FAMILY=SPIGOT
|
export FAMILY=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Normalize on Spigot for later operations
|
# Normalize on Spigot for later operations
|
||||||
|
export TYPE=SPIGOT
|
||||||
export FAMILY=SPIGOT
|
export FAMILY=SPIGOT
|
||||||
export SKIP_LOG4J_CONFIG=true
|
export SKIP_LOG4J_CONFIG=true
|
||||||
|
|
||||||
|
|||||||
@@ -128,11 +128,6 @@ elif isFamily VANILLA && versionLessThan 1.12; then
|
|||||||
patchLog4jConfig log4j2_17-111.xml https://launcher.mojang.com/v1/objects/dd2b723346a8dcd48e7f4d245f6bf09e98db9696/log4j2_17-111.xml
|
patchLog4jConfig log4j2_17-111.xml https://launcher.mojang.com/v1/objects/dd2b723346a8dcd48e7f4d245f6bf09e98db9696/log4j2_17-111.xml
|
||||||
elif isFamily VANILLA && versionLessThan 1.17; then
|
elif isFamily VANILLA && versionLessThan 1.17; then
|
||||||
patchLog4jConfig log4j2_112-116.xml https://launcher.mojang.com/v1/objects/02937d122c86ce73319ef9975b58896fc1b491d1/log4j2_112-116.xml
|
patchLog4jConfig log4j2_112-116.xml https://launcher.mojang.com/v1/objects/02937d122c86ce73319ef9975b58896fc1b491d1/log4j2_112-116.xml
|
||||||
# See https://purpurmc.org/docs/Log4j/
|
|
||||||
elif isType PURPUR && versionLessThan 1.17; then
|
|
||||||
patchLog4jConfig purpur_log4j2_1141-1165.xml https://purpurmc.org/docs/xml/purpur_log4j2_1141-1165.xml
|
|
||||||
elif isType PURPUR && versionLessThan 1.18.1; then
|
|
||||||
patchLog4jConfig purpur_log4j2_117.xml https://purpurmc.org/docs/xml/purpur_log4j2_117.xml
|
|
||||||
elif versionLessThan 1.18.1; then
|
elif versionLessThan 1.18.1; then
|
||||||
JVM_OPTS="-Dlog4j2.formatMsgNoLookups=true ${JVM_OPTS}"
|
JVM_OPTS="-Dlog4j2.formatMsgNoLookups=true ${JVM_OPTS}"
|
||||||
fi
|
fi
|
||||||
@@ -328,10 +323,10 @@ EOF
|
|||||||
else
|
else
|
||||||
exec mc-server-runner "${mcServerRunnerArgs[@]}" "${finalArgs[@]}"
|
exec mc-server-runner "${mcServerRunnerArgs[@]}" "${finalArgs[@]}"
|
||||||
fi
|
fi
|
||||||
elif [[ $SERVER =~ run.sh ]]; then
|
elif [[ -x run.sh ]]; then
|
||||||
log "Using Forge supplied run.sh script..."
|
log "Using Forge supplied run.sh script..."
|
||||||
echo $JVM_XX_OPTS $JVM_OPTS $expandedDOpts > user_jvm_args.txt
|
echo $JVM_XX_OPTS $JVM_OPTS $expandedDOpts > user_jvm_args.txt
|
||||||
exec mc-server-runner "${mcServerRunnerArgs[@]}" --shell bash "${SERVER}"
|
exec mc-server-runner "${mcServerRunnerArgs[@]}" --shell bash run.sh
|
||||||
else
|
else
|
||||||
# If we have a bootstrap.txt file... feed that in to the server stdin
|
# If we have a bootstrap.txt file... feed that in to the server stdin
|
||||||
if [ -f /data/bootstrap.txt ]; then
|
if [ -f /data/bootstrap.txt ]; then
|
||||||
|
|||||||
@@ -74,4 +74,4 @@ elif [[ "$DATAPACKS_FILE" ]]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupForgeApiMods" "$@"
|
exec "${SCRIPTS:-/}start-setupModpack" "$@"
|
||||||
|
|||||||
@@ -1,177 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e -o pipefail
|
|
||||||
|
|
||||||
: "${MODS_FORGEAPI_KEY:=}"
|
|
||||||
: "${REMOVE_OLD_FORGEAPI_MODS:=false}"
|
|
||||||
: "${MODS_FORGEAPI_PROJECTIDS:=}"
|
|
||||||
: "${MODS_FORGEAPI_FILE:=}"
|
|
||||||
: "${MODS_FORGEAPI_RELEASES:=RELEASE}"
|
|
||||||
: "${REMOVE_OLD_MODS_DEPTH:=1} "
|
|
||||||
: "${REMOVE_OLD_MODS_INCLUDE:=*.jar}"
|
|
||||||
|
|
||||||
# FORGEAPI_BASE_URL used in manifest downloads below
|
|
||||||
FORGEAPI_BASE_URL=${FORGEAPI_BASE_URL:-https://api.curseforge.com/v1}
|
|
||||||
RELEASE_NUMBER_FILTER=1
|
|
||||||
MINECRAFT_GAME_ID=432
|
|
||||||
out_dir=/data/mods
|
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
isDebugging && set -x
|
|
||||||
|
|
||||||
# Remove old mods/plugins
|
|
||||||
if isTrue "${REMOVE_OLD_FORGEAPI_MODS}" && [ -z "${MODS_FORGEAPI_FILE}" ]; then
|
|
||||||
removeOldMods /data/mods
|
|
||||||
fi
|
|
||||||
|
|
||||||
ensureModKey(){
|
|
||||||
if [ -z "$MODS_FORGEAPI_KEY" ]; then
|
|
||||||
log "ERROR: MODS_FORGEAPI_KEY REQUIRED to Connect to FORGE API, you supplied: ${MODS_FORGEAPI_KEY}"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Set the global release type per the text.
|
|
||||||
# NOTE: downcasing release type for comparing types.
|
|
||||||
updateReleaseNumber(){
|
|
||||||
releaseType=$1
|
|
||||||
if [ "release" = "${releaseType,,}" ]; then
|
|
||||||
RELEASE_NUMBER_FILTER=1
|
|
||||||
elif [ "beta" = "${releaseType,,}" ]; then
|
|
||||||
RELEASE_NUMBER_FILTER=2
|
|
||||||
elif [ "alpha" = "${releaseType,,}" ]; then
|
|
||||||
RELEASE_NUMBER_FILTER=3
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
retrieveVersionTypeNumber(){
|
|
||||||
VERSION_NAME="Minecraft ${VANILLA_VERSION%.*}"
|
|
||||||
minecraft_types=$(curl -X GET -s \
|
|
||||||
"${FORGEAPI_BASE_URL}/games/${MINECRAFT_GAME_ID}/version-types" \
|
|
||||||
-H 'Accept: application/json' -H 'x-api-key: '${MODS_FORGEAPI_KEY}'')
|
|
||||||
|
|
||||||
if [ ! "$minecraft_types" ]; then
|
|
||||||
log "ERROR: unable to retrieve version types for ${VERSION_NAME} from ForgeAPI"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
TYPE_ID=$(jq -n "$minecraft_types" | jq --arg VERSION_NAME "$VERSION_NAME" -jc '
|
|
||||||
.data[] | select(.name==$VERSION_NAME) | .id')
|
|
||||||
|
|
||||||
if [ ! "$TYPE_ID" ]; then
|
|
||||||
log "ERROR: unable to retrieve version types for ${VERSION_NAME} from ForgeAPI"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
modFileByProjectID(){
|
|
||||||
project_id=$(echo $1 | tr -d '"')
|
|
||||||
project_id_release_type=$2
|
|
||||||
unset PROJECT_FILE
|
|
||||||
|
|
||||||
# if Type id isn't defined use minecraft version to go get it.
|
|
||||||
if [ ! "$TYPE_ID" ]; then
|
|
||||||
retrieveVersionTypeNumber
|
|
||||||
fi
|
|
||||||
|
|
||||||
# JQ is struggling with larger page sizes so having to pagination for mods with a lot of releases
|
|
||||||
pageSize=42
|
|
||||||
index=0
|
|
||||||
total_count=1
|
|
||||||
|
|
||||||
while [ $index -lt $total_count ]; do
|
|
||||||
project_files=$(curl -X GET -s \
|
|
||||||
"${FORGEAPI_BASE_URL}/mods/${project_id}/files?gameVersionTypeId=${TYPE_ID}&index=${index}&pageSize=${pageSize}" \
|
|
||||||
-H 'Accept: application/json' -H 'x-api-key: '${MODS_FORGEAPI_KEY}'')
|
|
||||||
|
|
||||||
if [ ! "$project_files" ]; then
|
|
||||||
log "ERROR: unable to retrieve any project id files for ${project_id} from ForgeAPI"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
# Use project files to grab out the total count of mods.
|
|
||||||
total_count=$(jq -n "$project_files" | jq -c '.pagination.totalCount' )
|
|
||||||
|
|
||||||
# Checking for a individual release type input, if not use global
|
|
||||||
if [ $project_id_release_type ]; then
|
|
||||||
updateReleaseNumber $project_id_release_type
|
|
||||||
else
|
|
||||||
updateReleaseNumber $MODS_FORGEAPI_RELEASES
|
|
||||||
fi
|
|
||||||
# grabs the highest ID of the releaseTypes selected.
|
|
||||||
# Default is 1 for Release, Beta is 2, and Alpha is 3. Using less than we can validate highest release.
|
|
||||||
current_project_file=$(jq -n "$project_files" | jq --arg RELEASE_FILTER "$RELEASE_NUMBER_FILTER" -jc '
|
|
||||||
.data | sort_by(.id) | reverse | map(select(.releaseType<=($RELEASE_FILTER|tonumber))) | .[0]')
|
|
||||||
|
|
||||||
# Logic to grab the latest release over the entire pagination
|
|
||||||
if [ ! "$PROJECT_FILE" ]; then
|
|
||||||
PROJECT_FILE=$current_project_file
|
|
||||||
elif [ "$current_project_file" ]; then
|
|
||||||
current_project_file_id=$(jq -n "$current_project_file" | jq -jc '.id' )
|
|
||||||
PROJECT_FILE_ID=$(jq -n "$PROJECT_FILE" | jq -jc '.id' )
|
|
||||||
if (( current_project_file_id > PROJECT_FILE_ID )); then
|
|
||||||
PROJECT_FILE=$current_project_file
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check to see if we have gone to far or lost our index and exit with an error
|
|
||||||
if [ -z "$index" ] || [ -z "$total_count" ] || [ $index -ge $total_count ]; then
|
|
||||||
log "ERROR: Unable to retrieve any files for ${project_id} from ForgeAPI also Validate files have release type associated with no. ${RELEASE_NUMBER_FILTER}"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
# Increment start index to new set.
|
|
||||||
index=$(($index + $pageSize))
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
downloadModPackfromModFile() {
|
|
||||||
if [ ! "$PROJECT_FILE" ]; then
|
|
||||||
log "ERROR: Project File not found from the ForgeAPI"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
# grabs needed values from our json return
|
|
||||||
file_name=$(jq -n "$PROJECT_FILE" | jq -jc '.fileName' )
|
|
||||||
download_url=$(jq -n "$PROJECT_FILE" | jq -jc '.downloadUrl' )
|
|
||||||
|
|
||||||
# trys to make the output directory incase it doesnt exist.
|
|
||||||
mkdir -p "$out_dir"
|
|
||||||
echo "Downloading ${download_url}"
|
|
||||||
if ! get -o "${out_dir}/${file_name}" $download_url ; then
|
|
||||||
log "ERROR: failed to download from ${download_url}"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Use forge api json file to filter and download the correct mods
|
|
||||||
if [ "$MODS_FORGEAPI_FILE" ] && [ -z "$MODS_FORGEAPI_PROJECTIDS" ]; then
|
|
||||||
ensureModKey
|
|
||||||
if [ ! -f "$MODS_FORGEAPI_FILE" ]; then
|
|
||||||
log "ERROR: given MODS_FORGEAPI_FILE file does not exist"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
MODS_FORGEAPI_PROJECTIDS=$(jq --raw-output '[.[] | .projectId] | join(",")' $MODS_FORGEAPI_FILE)
|
|
||||||
if [ ! "$MODS_FORGEAPI_PROJECTIDS" ]; then
|
|
||||||
log "ERROR: unable to retrieve packs from $MODS_FORGEAPI_FILE"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Needs loop here to look up release types befor calling download.
|
|
||||||
for project_id in ${MODS_FORGEAPI_PROJECTIDS//,/ }; do
|
|
||||||
current_release_type=$(jq --arg PROJECT_ID "$project_id" -jc '
|
|
||||||
.[] | select(.projectId==$PROJECT_ID) | .releaseType' "$MODS_FORGEAPI_FILE")
|
|
||||||
modFileByProjectID $project_id $current_release_type
|
|
||||||
downloadModPackfromModFile
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Use only project ids and global release data.
|
|
||||||
if [ "$MODS_FORGEAPI_PROJECTIDS" ] && [ -z "$MODS_FORGEAPI_FILE" ]; then
|
|
||||||
ensureModKey
|
|
||||||
for project_id in ${MODS_FORGEAPI_PROJECTIDS//,/ }; do
|
|
||||||
modFileByProjectID $project_id
|
|
||||||
downloadModPackfromModFile
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupModpack" "$@"
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
|
|
||||||
# If supplied with a URL for a config (simple zip of configurations), download it and unpack
|
# If supplied with a URL for a config (simple zip of configurations), download it and unpack
|
||||||
if [[ "$MODCONFIG" ]]; then
|
if [[ "$MODCONFIG" ]]; then
|
||||||
@@ -10,7 +9,7 @@ case "X$MODCONFIG" in
|
|||||||
log "Downloading mod/plugin configs via HTTP"
|
log "Downloading mod/plugin configs via HTTP"
|
||||||
log " from $MODCONFIG ..."
|
log " from $MODCONFIG ..."
|
||||||
curl -sSL -o /tmp/modconfig.zip "$MODCONFIG"
|
curl -sSL -o /tmp/modconfig.zip "$MODCONFIG"
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
mkdir -p /data/plugins
|
mkdir -p /data/plugins
|
||||||
unzip -o -d /data/plugins /tmp/modconfig.zip
|
unzip -o -d /data/plugins /tmp/modconfig.zip
|
||||||
else
|
else
|
||||||
@@ -25,4 +24,4 @@ case "X$MODCONFIG" in
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupMounts" "$@"
|
exec ${SCRIPTS:-/}start-setupMounts $@
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ if [[ "$MODPACK" ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
mkdir -p /data/plugins
|
mkdir -p /data/plugins
|
||||||
if ! unzip -o -d /data/plugins /tmp/modpack.zip; then
|
if ! unzip -o -d /data/plugins /tmp/modpack.zip; then
|
||||||
log "ERROR: failed to unzip the modpack from ${MODPACK}"
|
log "ERROR: failed to unzip the modpack from ${MODPACK}"
|
||||||
@@ -81,7 +81,7 @@ if [[ "$MODPACK" ]]; then
|
|||||||
rm -f /tmp/modpack.zip
|
rm -f /tmp/modpack.zip
|
||||||
|
|
||||||
elif [[ "$MODS" ]]; then
|
elif [[ "$MODS" ]]; then
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
out_dir=/data/plugins
|
out_dir=/data/plugins
|
||||||
else
|
else
|
||||||
out_dir=/data/mods
|
out_dir=/data/mods
|
||||||
@@ -118,7 +118,7 @@ elif [[ "$MODS_FILE" ]]; then
|
|||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
out_dir=/data/plugins
|
out_dir=/data/plugins
|
||||||
else
|
else
|
||||||
out_dir=/data/mods
|
out_dir=/data/mods
|
||||||
|
|||||||
@@ -1,15 +1,14 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# shellcheck source=start-utils
|
. ${SCRIPTS:-/}start-utils
|
||||||
. "${SCRIPTS:-/}start-utils"
|
|
||||||
|
|
||||||
: "${SYNC_SKIP_NEWER_IN_DESTINATION:=${PLUGINS_SYNC_UPDATE:-true}}"
|
: ${SYNC_SKIP_NEWER_IN_DESTINATION:=${PLUGINS_SYNC_UPDATE:-true}}
|
||||||
: "${REPLACE_ENV_DURING_SYNC:=true}"
|
: ${REPLACE_ENV_DURING_SYNC:=true}
|
||||||
: "${REPLACE_ENV_SUFFIXES:=yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml}"
|
: ${REPLACE_ENV_SUFFIXES:=yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml}
|
||||||
: "${REPLACE_ENV_VARIABLE_PREFIX:=${ENV_VARIABLE_PREFIX:-CFG_}}"
|
: ${REPLACE_ENV_VARIABLE_PREFIX:=${ENV_VARIABLE_PREFIX:-CFG_}}
|
||||||
: "${REPLACE_ENV_VARIABLES_EXCLUDES:=}"
|
: ${REPLACE_ENV_VARIABLES_EXCLUDES:=}
|
||||||
: "${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}"
|
: ${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}
|
||||||
: "${DEBUG:=false}"
|
: ${DEBUG:=false}
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
isDebugging && set -x
|
isDebugging && set -x
|
||||||
@@ -25,8 +24,8 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -d /plugins ]; then
|
if [ -d /plugins ]; then
|
||||||
case ${FAMILY} in
|
case ${TYPE} in
|
||||||
SPIGOT|HYBRID)
|
SPIGOT|BUKKIT|PAPER|MAGMA)
|
||||||
mkdir -p /data/plugins
|
mkdir -p /data/plugins
|
||||||
log "Copying plugins over..."
|
log "Copying plugins over..."
|
||||||
mc-image-helper \
|
mc-image-helper \
|
||||||
@@ -41,7 +40,7 @@ if [ -d /plugins ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# If any modules have been provided, copy them over
|
# If any modules have been provided, copy them over
|
||||||
: "${COPY_MODS_DEST:="/data/mods"}"
|
: ${COPY_MODS_DEST:="/data/mods"}
|
||||||
|
|
||||||
if [ -d /mods ]; then
|
if [ -d /mods ]; then
|
||||||
log "Copying any mods over..."
|
log "Copying any mods over..."
|
||||||
@@ -54,7 +53,7 @@ if [ -d /mods ]; then
|
|||||||
/mods "${COPY_MODS_DEST}"
|
/mods "${COPY_MODS_DEST}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
: "${COPY_CONFIG_DEST:="/data/config"}"
|
: ${COPY_CONFIG_DEST:="/data/config"}
|
||||||
|
|
||||||
if [ -d /config ]; then
|
if [ -d /config ]; then
|
||||||
log "Copying any configs from /config to ${COPY_CONFIG_DEST}"
|
log "Copying any configs from /config to ${COPY_CONFIG_DEST}"
|
||||||
@@ -67,4 +66,4 @@ if [ -d /config ]; then
|
|||||||
/config "${COPY_CONFIG_DEST}"
|
/config "${COPY_CONFIG_DEST}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec "${SCRIPTS:-/}start-setupServerProperties" "$@"
|
exec ${SCRIPTS:-/}start-setupServerProperties $@
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ function customizeServerProps {
|
|||||||
|
|
||||||
# If not provided, generate a reasonable default message-of-the-day,
|
# If not provided, generate a reasonable default message-of-the-day,
|
||||||
# which shows up in the server listing in the client
|
# which shows up in the server listing in the client
|
||||||
if ! [ -v MOTD ]; then
|
if [ -z "$MOTD" ]; then
|
||||||
# snapshot is the odd case where we have to look at version to identify that label
|
# snapshot is the odd case where we have to look at version to identify that label
|
||||||
if [[ ${ORIGINAL_TYPE} == "VANILLA" && ${VERSION} == "SNAPSHOT" ]]; then
|
if [[ ${ORIGINAL_TYPE} == "VANILLA" && ${VERSION} == "SNAPSHOT" ]]; then
|
||||||
label=SNAPSHOT
|
label=SNAPSHOT
|
||||||
@@ -62,13 +62,6 @@ function customizeServerProps {
|
|||||||
MOTD="A ${label} Minecraft Server powered by Docker"
|
MOTD="A ${label} Minecraft Server powered by Docker"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# normalize MOTD
|
|
||||||
if [[ ${TYPE^^} = LIMBO ]]; then
|
|
||||||
if [[ $MOTD ]] && ! [[ $MOTD =~ ^{ ]]; then
|
|
||||||
MOTD="{\"text\":\"${MOTD}\"}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
setServerProp "server-name" SERVER_NAME
|
setServerProp "server-name" SERVER_NAME
|
||||||
setServerProp "server-ip" SERVER_IP
|
setServerProp "server-ip" SERVER_IP
|
||||||
setServerProp "server-port" SERVER_PORT
|
setServerProp "server-port" SERVER_PORT
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
|||||||
mkdir -p /tmp/world-data
|
mkdir -p /tmp/world-data
|
||||||
(cd /tmp/world-data && unzip -o -q "$zipSrc")
|
(cd /tmp/world-data && unzip -o -q "$zipSrc")
|
||||||
|
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
baseDirs=$(find /tmp/world-data -name "level.dat" -not -path "*_nether*" -not -path "*_the_end*" -exec dirname "{}" \;)
|
baseDirs=$(find /tmp/world-data -name "level.dat" -not -path "*_nether*" -not -path "*_the_end*" -exec dirname "{}" \;)
|
||||||
else
|
else
|
||||||
baseDirs=$(find /tmp/world-data -name "level.dat" -exec dirname "{}" \;)
|
baseDirs=$(find /tmp/world-data -name "level.dat" -exec dirname "{}" \;)
|
||||||
@@ -51,7 +51,7 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
rsync --remove-source-files --recursive --delete "$baseDir/" "$worldDest"
|
rsync --remove-source-files --recursive --delete "$baseDir/" "$worldDest"
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
log "Copying end and nether ..."
|
log "Copying end and nether ..."
|
||||||
[ -d "${baseDir}_nether" ] && rsync --remove-source-files --recursive --delete "${baseDir}_nether/" "${worldDest}_nether"
|
[ -d "${baseDir}_nether" ] && rsync --remove-source-files --recursive --delete "${baseDir}_nether/" "${worldDest}_nether"
|
||||||
[ -d "${baseDir}_the_end" ] && rsync --remove-source-files --recursive --delete "${baseDir}_the_end/" "${worldDest}_the_end"
|
[ -d "${baseDir}_the_end" ] && rsync --remove-source-files --recursive --delete "${baseDir}_the_end/" "${worldDest}_the_end"
|
||||||
@@ -61,7 +61,7 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
|||||||
rsync --recursive --delete "${WORLD%/}"/ "$worldDest"
|
rsync --recursive --delete "${WORLD%/}"/ "$worldDest"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$TYPE" = "SPIGOT" ]; then
|
||||||
# Reorganise if a Spigot server
|
# Reorganise if a Spigot server
|
||||||
log "Moving End and Nether maps to Spigot location"
|
log "Moving End and Nether maps to Spigot location"
|
||||||
[ -d "$worldDest/DIM1" ] && mv -f "$worldDest/DIM1" "${worldDest}_the_end"
|
[ -d "$worldDest/DIM1" ] && mv -f "$worldDest/DIM1" "${worldDest}_the_end"
|
||||||
|
|||||||
@@ -178,14 +178,5 @@ function isFamily() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
function isType() {
|
|
||||||
for t in "${@}"; do
|
|
||||||
if [[ $TYPE == "$t" ]]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# go to script root directory
|
|
||||||
cd "$(dirname "$0")" || exit 1
|
|
||||||
|
|
||||||
# compose down function for reuse
|
|
||||||
down() {
|
|
||||||
docker-compose down -v --remove-orphans
|
|
||||||
}
|
|
||||||
|
|
||||||
checkandExitOnFailure(){
|
|
||||||
failed=$1
|
|
||||||
# docker-compose logs outputs messages from the specified container
|
|
||||||
if $failed; then
|
|
||||||
docker-compose logs mc
|
|
||||||
down
|
|
||||||
cd ..
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# tests to completely spin up Minecraft and use the monitor to validate the service is running.
|
|
||||||
fullMinecraftUpTest(){
|
|
||||||
folder=$1
|
|
||||||
cd "$folder"
|
|
||||||
failed=false
|
|
||||||
# run the monitor to validate the Minecraft image is healthy
|
|
||||||
docker-compose run monitor || failed=true
|
|
||||||
echo "${folder} Result: failed=$failed"
|
|
||||||
checkandExitOnFailure $failed
|
|
||||||
down
|
|
||||||
cd ..
|
|
||||||
}
|
|
||||||
|
|
||||||
# go through each folder in fulltests and run fullbuilds
|
|
||||||
FOLDERS=$(ls)
|
|
||||||
for folder in $FOLDERS; do
|
|
||||||
# If folder is a directory
|
|
||||||
if [ -d "$folder" ]; then
|
|
||||||
echo "Starting Tests on ${folder}"
|
|
||||||
fullMinecraftUpTest $folder
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
mc:
|
|
||||||
restart: "no"
|
|
||||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
SETUP_ONLY: "TRUE"
|
|
||||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
|
||||||
MODS_FORGEAPI_FILE: /config/example.json
|
|
||||||
# Key is defined in .github/workflows/pr.yml and ci.yml
|
|
||||||
# This should be coming from github secrets.
|
|
||||||
MODS_FORGEAPI_KEY: ${MODS_FORGEAPI_KEY}
|
|
||||||
REMOVE_OLD_FORGEAPI_MODS: "TRUE"
|
|
||||||
volumes:
|
|
||||||
- ./example.json:/config/example.json:ro
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
[{
|
|
||||||
"name": "fabric api",
|
|
||||||
"projectId": "306612",
|
|
||||||
"releaseType": "release"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Fabric Voice Mod",
|
|
||||||
"projectId": "416089",
|
|
||||||
"releaseType": "beta"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
mc:
|
|
||||||
restart: "no"
|
|
||||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
|
||||||
environment:
|
|
||||||
EULA: "TRUE"
|
|
||||||
SETUP_ONLY: "TRUE"
|
|
||||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
|
||||||
MODS_FORGEAPI_PROJECTIDS: 306612,416089
|
|
||||||
# Allows for Beta releases of 416089 the Fabric Voice Mod
|
|
||||||
MODS_FORGEAPI_RELEASES: BETA
|
|
||||||
MODS_FORGEAPI_KEY: ${MODS_FORGEAPI_KEY}
|
|
||||||
REMOVE_OLD_FORGEAPI_MODS: "TRUE"
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# go to script root directory
|
|
||||||
cd "$(dirname "$0")" || exit 1
|
|
||||||
|
|
||||||
# compose down function for reuse
|
|
||||||
down() {
|
|
||||||
docker-compose down -v --remove-orphans
|
|
||||||
}
|
|
||||||
|
|
||||||
checkandExitOnFailure(){
|
|
||||||
failed=$1
|
|
||||||
# docker-compose logs outputs messages from the specified container
|
|
||||||
if $failed; then
|
|
||||||
docker-compose logs mc
|
|
||||||
down
|
|
||||||
cd ..
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# tests that only run the setup files for things like downloads and configuration.
|
|
||||||
setupOnlyMinecraftTest(){
|
|
||||||
folder=$1
|
|
||||||
cd "$folder"
|
|
||||||
failed=false
|
|
||||||
# run the monitor to validate the Minecraft image is healthy
|
|
||||||
docker-compose --log-level ERROR up --quiet-pull --exit-code-from mc 2>/dev/null || failed=true
|
|
||||||
echo "${folder} Result: failed=$failed"
|
|
||||||
checkandExitOnFailure $failed
|
|
||||||
down
|
|
||||||
cd ..
|
|
||||||
}
|
|
||||||
|
|
||||||
# go through each folder in setuponly and test setups
|
|
||||||
FOLDERS=$(ls)
|
|
||||||
for folder in $FOLDERS; do
|
|
||||||
# If folder is a directory
|
|
||||||
if [ -d "$folder" ]; then
|
|
||||||
echo "Starting Tests on ${folder}"
|
|
||||||
setupOnlyMinecraftTest $folder
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
@@ -3,16 +3,54 @@
|
|||||||
# go to script root directory
|
# go to script root directory
|
||||||
cd "$(dirname "$0")" || exit 1
|
cd "$(dirname "$0")" || exit 1
|
||||||
|
|
||||||
# go through top level folders and trigger the tests in the subfolders
|
# compose down function for reuse
|
||||||
|
down() {
|
||||||
|
docker-compose down -v --remove-orphans
|
||||||
|
}
|
||||||
|
|
||||||
|
fullMinecraftUpTest(){
|
||||||
|
name=$1
|
||||||
|
failed=false
|
||||||
|
# run the monitor to validate the Minecraft image is healthy
|
||||||
|
docker-compose run monitor || failed=true
|
||||||
|
echo "${name} Result: failed=$failed"
|
||||||
|
|
||||||
|
# docker-compose logs outputs messages from the specified container
|
||||||
|
if $failed; then
|
||||||
|
docker-compose logs mc
|
||||||
|
down
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
down
|
||||||
|
}
|
||||||
|
|
||||||
|
setupOnlyMinecraftTest(){
|
||||||
|
folder=$1
|
||||||
|
failed=false
|
||||||
|
# run the monitor to validate the Minecraft image is healthy
|
||||||
|
docker-compose --log-level ERROR up --quiet-pull --exit-code-from mc 2>/dev/null || failed=true
|
||||||
|
echo "${folder} Result: failed=$failed"
|
||||||
|
|
||||||
|
# docker-compose logs outputs messages from the specified container
|
||||||
|
if $failed; then
|
||||||
|
docker-compose logs mc
|
||||||
|
down
|
||||||
|
cd ..
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
down
|
||||||
|
cd ..
|
||||||
|
}
|
||||||
|
|
||||||
|
# run tests on base docker compose and validate mc service with monitor
|
||||||
|
fullMinecraftUpTest 'Full Vanilla Test'
|
||||||
|
|
||||||
|
# go through each folder to test builds
|
||||||
FOLDERS=$(ls)
|
FOLDERS=$(ls)
|
||||||
for folder in $FOLDERS; do
|
for folder in $FOLDERS; do
|
||||||
# If folder is a directory
|
# If folder is a directory
|
||||||
if [ -d "$folder" ]; then
|
if [ -d "$folder" ]; then
|
||||||
cd "$folder"
|
cd "$folder"
|
||||||
if [ -f "./test.sh" ]; then
|
setupOnlyMinecraftTest $folder
|
||||||
echo "Starting ${folder} Tests"
|
|
||||||
sh ./test.sh
|
|
||||||
fi
|
|
||||||
cd ..
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|||||||
Reference in New Issue
Block a user