mirror of
https://github.com/itzg/docker-minecraft-server.git
synced 2026-02-17 15:13:55 +00:00
Compare commits
68 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3ccdcac9e | ||
|
|
6fce520004 | ||
|
|
ec539a5dd2 | ||
|
|
7427bc9043 | ||
|
|
8ab104f6b7 | ||
|
|
f15cbb4ca1 | ||
|
|
fa235e97c5 | ||
|
|
d5e315bba8 | ||
|
|
91ad2974ec | ||
|
|
59902566f3 | ||
|
|
411391baa1 | ||
|
|
cadc48b41a | ||
|
|
1396a1ef6c | ||
|
|
0cf5195fc5 | ||
|
|
17e2f90b91 | ||
|
|
a079dd0ff0 | ||
|
|
c4d8972a83 | ||
|
|
b494124a2d | ||
|
|
d8ad2e5721 | ||
|
|
ec7bd14451 | ||
|
|
2097702daa | ||
|
|
dc149eaa01 | ||
|
|
f14b77db05 | ||
|
|
df53fe3971 | ||
|
|
bb57d7e99f | ||
|
|
03034d2f15 | ||
|
|
8fd1495795 | ||
|
|
dba2556e4e | ||
|
|
cdec1c0c19 | ||
|
|
3aa0dd2db6 | ||
|
|
c3829aa435 | ||
|
|
356c1af046 | ||
|
|
6bd4de3af5 | ||
|
|
4040e971f5 | ||
|
|
316b79bf72 | ||
|
|
9eb1fbaf1f | ||
|
|
1cc0c8a0fc | ||
|
|
c59414c5c1 | ||
|
|
008693184e | ||
|
|
55df8b3d87 | ||
|
|
5470245b45 | ||
|
|
95d15555f4 | ||
|
|
3ffcbb32dd | ||
|
|
2fbe2bbe68 | ||
|
|
396d202d9f | ||
|
|
cb6b793f37 | ||
|
|
086552fbe5 | ||
|
|
b028e655d2 | ||
|
|
374fa9ad5b | ||
|
|
7d8f70635c | ||
|
|
4d4d21e2fa | ||
|
|
7f7636e85e | ||
|
|
953e3bf8fc | ||
|
|
8fabf17c21 | ||
|
|
fc14b79a29 | ||
|
|
3fb36477dd | ||
|
|
3311cf479f | ||
|
|
fd8d6bb32a | ||
|
|
7f4cf0fc48 | ||
|
|
d3dd14c87d | ||
|
|
b79014e47f | ||
|
|
98e939d937 | ||
|
|
2611551076 | ||
|
|
4a942dbc02 | ||
|
|
ce65bcc840 | ||
|
|
d276c58d29 | ||
|
|
495c4440fd | ||
|
|
bb472eb8b7 |
18
.github/dependabot.yml
vendored
18
.github/dependabot.yml
vendored
@@ -1,7 +1,23 @@
|
||||
version: 2
|
||||
updates:
|
||||
# Maintain dependencies for GitHub Actions
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
groups:
|
||||
updates:
|
||||
patterns:
|
||||
- "*"
|
||||
update-types:
|
||||
- patch
|
||||
- minor
|
||||
- package-ecosystem: pip
|
||||
directory: "/docs"
|
||||
schedule:
|
||||
interval: weekly
|
||||
groups:
|
||||
patches:
|
||||
patterns:
|
||||
- "*"
|
||||
update-types:
|
||||
- patch
|
||||
|
||||
33
.github/workflows/build-multiarch.yml
vendored
33
.github/workflows/build-multiarch.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: Test and Build multi-architecture
|
||||
name: Build and Publish
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
@@ -18,10 +18,11 @@ jobs:
|
||||
matrix:
|
||||
# NOTE: the "latest" variant is identified in the Docker meta step's 'latest' config
|
||||
variant:
|
||||
- java21-graalvm
|
||||
- java20
|
||||
- java20-alpine
|
||||
- java17
|
||||
- java17-graalvm-ce
|
||||
- java17-graalvm
|
||||
- java17-jdk
|
||||
- java17-openj9
|
||||
- java17-alpine
|
||||
@@ -34,6 +35,11 @@ jobs:
|
||||
- java11-openj9
|
||||
- java11-jdk
|
||||
include:
|
||||
# JAVA 21:
|
||||
- variant: java21-graalvm
|
||||
baseImage: container-registry.oracle.com/graalvm/jdk:21-ol8
|
||||
platforms: linux/amd64,linux/arm64
|
||||
mcVersion: 1.20.2
|
||||
# JAVA 20:
|
||||
- variant: java20
|
||||
baseImage: eclipse-temurin:20-jre
|
||||
@@ -49,8 +55,8 @@ jobs:
|
||||
baseImage: eclipse-temurin:17-jre-focal
|
||||
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
||||
mcVersion: 1.18.2
|
||||
- variant: java17-graalvm-ce
|
||||
baseImage: ghcr.io/graalvm/graalvm-ce:ol8-java17
|
||||
- variant: java17-graalvm
|
||||
baseImage: container-registry.oracle.com/graalvm/jdk:17-ol8
|
||||
platforms: linux/amd64,linux/arm64
|
||||
mcVersion: 1.18.2
|
||||
- variant: java17-jdk
|
||||
@@ -106,14 +112,14 @@ jobs:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4.1.0
|
||||
with:
|
||||
# for build-files step
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
uses: docker/metadata-action@v5.0.0
|
||||
with:
|
||||
# NOTE for forks: if your Docker Hub organization doesn't match your Github repo's,
|
||||
# then the use of ${{ github.repository_owner }} will need to be replaced.
|
||||
@@ -139,13 +145,13 @@ jobs:
|
||||
org.opencontainers.image.authors=Geoff Bourne <itzgeoff@gmail.com>
|
||||
|
||||
- name: Setup Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
uses: docker/setup-buildx-action@v3.0.0
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2.2.0
|
||||
uses: docker/setup-qemu-action@v3.0.0
|
||||
|
||||
- name: Build for test
|
||||
uses: docker/build-push-action@v4.1.1
|
||||
uses: docker/build-push-action@v5.0.0
|
||||
with:
|
||||
platforms: linux/amd64
|
||||
tags: ${{ env.IMAGE_TO_TEST }}
|
||||
@@ -163,20 +169,19 @@ jobs:
|
||||
env:
|
||||
MINECRAFT_VERSION: ${{ matrix.mcVersion }}
|
||||
VARIANT: ${{ matrix.variant }}
|
||||
MODS_FORGEAPI_KEY: ${{ secrets.MODS_FORGEAPI_KEY }}
|
||||
CF_API_KEY: ${{ secrets.MODS_FORGEAPI_KEY }}
|
||||
CF_API_KEY: ${{ secrets.CF_API_KEY }}
|
||||
run: |
|
||||
tests/test.sh
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@v2
|
||||
uses: docker/login-action@v3.0.0
|
||||
if: env.HAS_IMAGE_REPO_ACCESS
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USER }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Login to GHCR
|
||||
uses: docker/login-action@v2
|
||||
uses: docker/login-action@v3.0.0
|
||||
if: env.HAS_IMAGE_REPO_ACCESS
|
||||
with:
|
||||
registry: ghcr.io
|
||||
@@ -184,7 +189,7 @@ jobs:
|
||||
password: ${{ github.token }}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v4.1.1
|
||||
uses: docker/build-push-action@v5.0.0
|
||||
if: github.actor == github.repository_owner
|
||||
with:
|
||||
platforms: ${{ matrix.platforms }}
|
||||
|
||||
11
.github/workflows/verify-pr.yml
vendored
11
.github/workflows/verify-pr.yml
vendored
@@ -45,16 +45,16 @@ jobs:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4.1.0
|
||||
with:
|
||||
# for build-files step
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
uses: docker/setup-buildx-action@v3.0.0
|
||||
|
||||
- name: Confirm multi-arch build
|
||||
uses: docker/build-push-action@v4.1.1
|
||||
uses: docker/build-push-action@v5.0.0
|
||||
with:
|
||||
platforms: ${{ matrix.platforms }}
|
||||
# ensure latest base image is used
|
||||
@@ -64,7 +64,7 @@ jobs:
|
||||
cache-from: type=gha,scope=${{ matrix.variant }}
|
||||
|
||||
- name: Build for test
|
||||
uses: docker/build-push-action@v4.1.1
|
||||
uses: docker/build-push-action@v5.0.0
|
||||
with:
|
||||
# Only build single platform since loading multi-arch image into daemon fails with
|
||||
# "docker exporter does not currently support exporting manifest lists"
|
||||
@@ -83,8 +83,7 @@ jobs:
|
||||
env:
|
||||
MINECRAFT_VERSION: ${{ matrix.mcVersion }}
|
||||
VARIANT: ${{ matrix.variant }}
|
||||
MODS_FORGEAPI_KEY: ${{ secrets.MODS_FORGEAPI_KEY }}
|
||||
CF_API_KEY: ${{ secrets.MODS_FORGEAPI_KEY }}
|
||||
CF_API_KEY: ${{ secrets.CF_API_KEY }}
|
||||
DEBUG: ${{ runner.debug }}
|
||||
run: |
|
||||
tests/test.sh
|
||||
|
||||
27
Dockerfile
27
Dockerfile
@@ -9,44 +9,37 @@ ARG TARGETOS
|
||||
ARG TARGETARCH
|
||||
ARG TARGETVARIANT
|
||||
|
||||
# CI system should set this to a hash or git revision of the build directory and it's contents to
|
||||
# ensure consistent cache updates.
|
||||
ARG BUILD_FILES_REV=1
|
||||
RUN --mount=target=/build,source=build \
|
||||
REV=${BUILD_FILES_REV} TARGET=${TARGETARCH}${TARGETVARIANT} /build/run.sh install-packages
|
||||
/build/run.sh setup-user
|
||||
|
||||
RUN --mount=target=/build,source=build \
|
||||
REV=${BUILD_FILES_REV} /build/run.sh setup-user
|
||||
TARGET=${TARGETARCH}${TARGETVARIANT} /build/run.sh install-packages
|
||||
|
||||
COPY --chmod=644 files/sudoers* /etc/sudoers.d
|
||||
|
||||
EXPOSE 25565
|
||||
|
||||
ARG EASY_ADD_VER=0.7.1
|
||||
ARG EASY_ADD_VER=0.8.0
|
||||
ADD https://github.com/itzg/easy-add/releases/download/${EASY_ADD_VER}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add
|
||||
RUN chmod +x /usr/bin/easy-add
|
||||
|
||||
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
||||
--var version=1.2.0 --var app=restify --file {{.app}} \
|
||||
--var version=1.7.0 --var app=restify --file {{.app}} \
|
||||
--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} \
|
||||
--var version=1.6.1 --var app=rcon-cli --file {{.app}} \
|
||||
--var version=1.6.2 --var app=rcon-cli --file {{.app}} \
|
||||
--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} \
|
||||
--var version=0.11.0 --var app=mc-monitor --file {{.app}} \
|
||||
--var version=0.12.3 --var app=mc-monitor --file {{.app}} \
|
||||
--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} \
|
||||
--var version=1.8.3 --var app=mc-server-runner --file {{.app}} \
|
||||
--var version=1.9.0 --var app=mc-server-runner --file {{.app}} \
|
||||
--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} \
|
||||
--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
|
||||
|
||||
ARG MC_HELPER_VERSION=1.32.4
|
||||
ARG MC_HELPER_VERSION=1.36.1
|
||||
ARG MC_HELPER_BASE_URL=https://github.com/itzg/mc-image-helper/releases/download/${MC_HELPER_VERSION}
|
||||
# used for cache busting local copy of mc-image-helper
|
||||
ARG MC_HELPER_REV=1
|
||||
@@ -65,9 +58,7 @@ ENV TYPE=VANILLA VERSION=LATEST EULA="" UID=1000 GID=1000
|
||||
COPY --chmod=755 scripts/start* /
|
||||
COPY --chmod=755 bin/ /usr/local/bin/
|
||||
COPY --chmod=755 bin/mc-health /health.sh
|
||||
COPY --chmod=644 files/log4j2.xml /image/log4j2.xml
|
||||
# By default this file gets retrieved from repo, but bundle in image as potential fallback
|
||||
COPY --chmod=644 files/cf-exclude-include.json /image/cf-exclude-include.json
|
||||
COPY --chmod=644 files/* /image/
|
||||
COPY --chmod=755 files/auto /auto
|
||||
|
||||
RUN curl -fsSL -o /image/Log4jPatcher.jar https://github.com/CreeperHost/Log4jPatcher/releases/download/v1.0.1/Log4jPatcher-1.0.1.jar
|
||||
|
||||
82
README.md
82
README.md
@@ -2,7 +2,7 @@
|
||||
[](https://hub.docker.com/r/itzg/minecraft-server/)
|
||||
[](https://github.com/itzg/docker-minecraft-server/issues)
|
||||
[](https://discord.gg/DXfKpjB)
|
||||
[](https://github.com/itzg/docker-minecraft-server/actions)
|
||||
[](https://github.com/itzg/docker-minecraft-server/actions/workflows/build-multiarch.yml)
|
||||
[](https://www.buymeacoffee.com/itzg)
|
||||
[](https://docker-minecraft-server.readthedocs.io/en/latest/?badge=latest)
|
||||
|
||||
@@ -585,7 +585,7 @@ Configuration options with defaults:
|
||||
|
||||
NAME}"
|
||||
|
||||
> 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.
|
||||
> NOTE: instead of using format codes in the MOTD, Limbo requires [JSON chat content](https://minecraft.wiki/w/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
|
||||
|
||||
@@ -601,7 +601,7 @@ Crucible is only available for 1.7.10, so be sure to set `VERSION=1.7.10`.
|
||||
|
||||
[Modrinth Modpacks](https://modrinth.com/modpacks) can automatically be installed along with the required mod loader (Forge or Fabric) by setting `TYPE` to "MODRINTH". Upgrading (and downgrading) takes care of cleaning up old files and upgrading (and downgrading) the mod loader.
|
||||
|
||||
The desired modpack project is specified with the `MODRINTH_PROJECT` environment variable and must be one of:
|
||||
The desired modpack project is specified with the `MODRINTH_MODPACK` environment variable and must be one of:
|
||||
|
||||
- The project "slug", which is located in the URL shown here:
|
||||
|
||||
@@ -619,7 +619,7 @@ Furthermore, the resolved modpack version can be narrowed by setting `VERSION` t
|
||||
|
||||
The selected version can also be narrowed to a particular mod loader by setting `MODRINTH_LOADER` to either "forge", "fabric", or "quilt".
|
||||
|
||||
Instead of auto resolving, a specific version of modpack file can be specified by passing the version's page URL to `MODRINTH_PROJECT`, such as <https://modrinth.com/modpack/cobblemon-fabric/version/1.3.2> or by setting `MODRINTH_VERSION` to the version ID or number located in the Metadata section, as shown here
|
||||
Instead of auto resolving, a specific version of modpack file can be specified by passing the version's page URL to `MODRINTH_MODPACK`, such as <https://modrinth.com/modpack/cobblemon-fabric/version/1.3.2> or by setting `MODRINTH_VERSION` to the version ID or number located in the Metadata section, as shown here
|
||||
|
||||

|
||||
|
||||
@@ -895,66 +895,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 ...
|
||||
|
||||
### ForgeAPI usage to use non-version specific projects
|
||||
|
||||
**NOTE:** This potentially could lead to unexpected behavior if the Mod receives 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.
|
||||
|
||||
Please be aware of the following when using these options for your mods:
|
||||
* Mod Release types: Release, Beta, and Alpha.
|
||||
* Mod dependencies: Required and Optional
|
||||
* Mod family: Fabric, Forge, and Bukkit.
|
||||
|
||||
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]
|
||||
* `MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES` - Default is False, attempts to download required mods (releaseType Release) defined in Forge.
|
||||
* `MODS_FORGEAPI_IGNORE_GAMETYPE` - Default is False, Allows for filtering mods on family type: FORGE, FABRIC, and BUKKIT. (Does not filter for Vanilla or custom)
|
||||
* `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.
|
||||
|
||||
**Field Description**:
|
||||
* `name` is currently unused, but can be used to document each entry.
|
||||
* `projectId` id is the id found on the CurseForge website for a particular mod
|
||||
* `releaseType` Type corresponds to forge's R, B, A icon for each file. Default Release, options are (release|beta|alpha).
|
||||
* `fileName` is used for version pinning if latest file will not work for you.
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"name": "fabric api",
|
||||
"projectId": "306612",
|
||||
"releaseType": "release"
|
||||
},
|
||||
{
|
||||
"name": "fabric voice mod",
|
||||
"projectId": "416089",
|
||||
"releaseType": "beta"
|
||||
},
|
||||
{
|
||||
"name": "Biomes o plenty",
|
||||
"projectId": "220318",
|
||||
"fileName": "BiomesOPlenty-1.18.1-15.0.0.100-universal.jar",
|
||||
"releaseType": "release"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### Generic pack files
|
||||
|
||||
To install all the server content (jars, mods, plugins, configs, etc.) from a zip or tgz file, then set `GENERIC_PACK` to the container path or URL of the archive file. This can also be used to apply a CurseForge modpack that is missing a server start script and/or Forge installer.
|
||||
@@ -993,7 +933,7 @@ https://edge.forgecdn.net/files/2871/647/ToastControl-1.15.2-3.0.1.jar
|
||||
```
|
||||
> Blank lines and lines that start with a `#` will be ignored
|
||||
|
||||
> [This compose file](examples/docker-compose-mods-file.yml) shows another example of using this feature.
|
||||
> [This compose file](examples/mods-file/docker-compose.yml) shows another example of using this feature.
|
||||
|
||||
> It is recommended to combine this option with `REMOVE_OLD_MODS=TRUE` to ensure the mods/plugins remain consistent with the file's listing.
|
||||
|
||||
@@ -1150,7 +1090,7 @@ If you leave it off, a default is computed from the server type and version, suc
|
||||
|
||||
That way you can easily differentiate between several servers you may have started.
|
||||
|
||||
The section symbol (§) and other unicode characters are automatically converted to allow [formatting codes](https://minecraft.fandom.com/wiki/Formatting_codes) to be used consistently with all server versions. For example,
|
||||
The section symbol (§) and other unicode characters are automatically converted to allow [formatting codes](https://minecraft.wiki/w/Formatting_codes) to be used consistently with all server versions. For example,
|
||||
|
||||
-e MOTD="A §l§cMinecraft§r §nserver"
|
||||
|
||||
@@ -1182,7 +1122,7 @@ To whitelist players for your Minecraft server, you can:
|
||||
- Provide the url or path to a whitelist file via `WHITELIST_FILE` environment variable
|
||||
`docker run -d -e WHITELIST_FILE=/extra/whitelist.json ...`
|
||||
|
||||
When either is set, [whitelisting of connecting users](https://minecraft.fandom.com/wiki/Server.properties#white-list) is enabled . If managing the list manually, `ENABLE_WHITELIST` can be set to "true" to set the `white-list` property.
|
||||
When either is set, [whitelisting of connecting users](https://minecraft.wiki/w/Server.properties#white-list) is enabled . If managing the list manually, `ENABLE_WHITELIST` can be set to "true" to set the `white-list` property.
|
||||
|
||||
If whitelist configuration already exists, `WHITELIST_FILE` will not be retrieved and any usernames in `WHITELIST` are **added** to the whitelist configuration. You can enforce regeneration of the whitelist on each server startup by setting `OVERRIDE_WHITELIST` to "true". This will delete the whitelist file before processing whitelist configuration.
|
||||
|
||||
@@ -1192,7 +1132,7 @@ If whitelist configuration already exists, `WHITELIST_FILE` will not be retrieve
|
||||
|
||||
> If running Minecraft 1.7.5 or earlier, these variables will apply to `white-list.txt`, with 1.7.6 implementing support for `whitelist.json`. Make sure your `WHITELIST_FILE` is in the appropriate format.
|
||||
|
||||
To [enforce the whitelist changes immediately](https://minecraft.fandom.com/wiki/Server.properties#enforce-whitelist) when whitelist commands are used , set `ENFORCE_WHITELIST` to "true".
|
||||
To [enforce the whitelist changes immediately](https://minecraft.wiki/w/Server.properties#enforce-whitelist) when whitelist commands are used , set `ENFORCE_WHITELIST` to "true".
|
||||
|
||||
### Op/Administrator Players
|
||||
|
||||
@@ -1363,7 +1303,7 @@ If using a negative value for the seed, make sure to quote the value such as:
|
||||
|
||||
By default, Minecraft servers are configured to run in Survival mode. You can
|
||||
change the mode using `MODE` where you can either provide the [standard
|
||||
numerical values](http://minecraft.gamepedia.com/Game_mode#Game_modes) or the
|
||||
numerical values](http://minecraft.wiki/Game_mode#Game_modes) or the
|
||||
shortcut values:
|
||||
|
||||
- creative
|
||||
@@ -1385,9 +1325,9 @@ environment variable set to `false`, such as
|
||||
### Level Type and Generator Settings
|
||||
|
||||
By default, a standard world is generated with hills, valleys, water, etc. A different level type can
|
||||
be configured by setting `LEVEL_TYPE` to [an expected type listed here](https://minecraft.fandom.com/wiki/Server.properties#level-type).
|
||||
be configured by setting `LEVEL_TYPE` to [an expected type listed here](https://minecraft.wiki/w/Server.properties#level-type).
|
||||
|
||||
For some of the level types, `GENERATOR_SETTINGS` can be used to further customize the world generation [as described here](https://minecraft.fandom.com/wiki/Server.properties#generator-settings).
|
||||
For some of the level types, `GENERATOR_SETTINGS` can be used to further customize the world generation [as described here](https://minecraft.wiki/w/Server.properties#generator-settings).
|
||||
|
||||
### Custom Server Resource Pack
|
||||
|
||||
|
||||
@@ -26,9 +26,12 @@ apk add --no-cache -U \
|
||||
zstd \
|
||||
nfs-utils \
|
||||
libpcap \
|
||||
libwebp
|
||||
libwebp \
|
||||
libcap
|
||||
|
||||
# Patched knockd
|
||||
curl -fsSL -o /tmp/knock.tar.gz https://github.com/Metalcape/knock/releases/download/0.8.1/knock-0.8.1-alpine-amd64.tar.gz
|
||||
tar -xf /tmp/knock.tar.gz -C /usr/local/ && rm /tmp/knock.tar.gz
|
||||
ln -s /usr/local/sbin/knockd /usr/sbin/knockd
|
||||
setcap cap_net_raw=ep /usr/local/sbin/knockd
|
||||
chown minecraft /usr/local/sbin/knockd
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [[ $(uname -m) == "aarch64" ]]; then
|
||||
curl -sL -o /bin/gosu https://github.com/tianon/gosu/releases/download/1.14/gosu-arm64
|
||||
curl -sL -o /bin/gosu https://github.com/tianon/gosu/releases/download/1.16/gosu-arm64
|
||||
chmod +x /bin/gosu
|
||||
elif [[ $(uname -m) == "x86_64" ]]; then
|
||||
curl -sL -o /bin/gosu https://github.com/tianon/gosu/releases/download/1.14/gosu-amd64
|
||||
curl -sL -o /bin/gosu https://github.com/tianon/gosu/releases/download/1.16/gosu-amd64
|
||||
chmod +x /bin/gosu
|
||||
else
|
||||
echo "Not supported!"
|
||||
|
||||
@@ -36,7 +36,9 @@ dnf install -y ImageMagick \
|
||||
zstd \
|
||||
lbzip2 \
|
||||
libpcap \
|
||||
libwebp
|
||||
libwebp \
|
||||
findutils \
|
||||
which
|
||||
|
||||
bash /build/ol/install-gosu.sh
|
||||
|
||||
@@ -44,3 +46,5 @@ bash /build/ol/install-gosu.sh
|
||||
curl -fsSL -o /tmp/knock.tar.gz https://github.com/Metalcape/knock/releases/download/0.8.1/knock-0.8.1-$TARGET.tar.gz
|
||||
tar -xf /tmp/knock.tar.gz -C /usr/local/ && rm /tmp/knock.tar.gz
|
||||
ln -s /usr/local/sbin/knockd /usr/sbin/knockd
|
||||
setcap cap_net_raw=ep /usr/local/sbin/knockd
|
||||
chown minecraft /usr/local/sbin/knockd
|
||||
|
||||
@@ -35,4 +35,6 @@ apt-get clean
|
||||
curl -fsSL -o /tmp/knock.tar.gz https://github.com/Metalcape/knock/releases/download/0.8.1/knock-0.8.1-$TARGET.tar.gz
|
||||
tar -xf /tmp/knock.tar.gz -C /usr/local/ && rm /tmp/knock.tar.gz
|
||||
ln -s /usr/local/sbin/knockd /usr/sbin/knockd
|
||||
setcap cap_net_raw=ep /usr/local/sbin/knockd
|
||||
chown minecraft /usr/local/sbin/knockd
|
||||
find /usr/lib -name 'libpcap.so.0.8' -execdir cp '{}' libpcap.so.1 \;
|
||||
|
||||
@@ -17,7 +17,7 @@ When the environment variable `REPLACE_ENV_IN_PLACE` is set to `true` (the defau
|
||||
|
||||
Variables that you want to replace need to be declared inside curly brackets and prefixed with a dollar sign, such as `${CFG_YOUR_VARIABLE}`, which is same as many scripting languages.
|
||||
|
||||
You can also change `REPLACE_ENV_VARIABLE_PREFIX`, which defaults to "CFG_", to limit which environment variables are allowed to be used. For example, with "CFG_" as the prefix, the variable `${CFG_DB_HOST}` would be subsituted, but not `${DB_HOST}`.
|
||||
You can also change `REPLACE_ENV_VARIABLE_PREFIX`, which defaults to "CFG_", to limit which environment variables are allowed to be used. For example, with "CFG_" as the prefix, the variable `${CFG_DB_HOST}` would be substituted, but not `${DB_HOST}`. The prefix can be set to an empty string to allow for matching any variable name.
|
||||
|
||||
If you want to use a file's content for value, such as when using secrets mounted as files, declare the placeholder named like normal in the file and declare an environment variable named the same but with the suffix `_FILE`.
|
||||
|
||||
|
||||
@@ -70,7 +70,9 @@ To enable remote JMX, such as for profiling with VisualVM or JMC, add the enviro
|
||||
|
||||
## Enable Aikar's Flags
|
||||
|
||||
[Aikar has done 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 done 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. [PaperMC also has an explanation](https://docs.papermc.io/paper/aikars-flags) of what the JVM flags are doing.
|
||||
|
||||
The set of flags documented there can be added using
|
||||
|
||||
-e USE_AIKAR_FLAGS=true
|
||||
|
||||
|
||||
@@ -61,7 +61,11 @@ If you would like to `docker attach` to the Minecraft server console with color
|
||||
|
||||
To allow time for players to finish what they're doing during a graceful server shutdown, set `STOP_SERVER_ANNOUNCE_DELAY` to a number of seconds to delay after an announcement is posted by the server.
|
||||
|
||||
> **NOTE** be sure to adjust Docker's shutdown timeout accordingly, such as using [the -t option on docker-compose down](https://docs.docker.com/compose/reference/down/).
|
||||
!!! warning "Increase stop grace period"
|
||||
|
||||
The Docker stop grace period must be increased to a value longer than the announce delay. The value to use that is longer than announce delay will vary based upon the amount of time it takes for final world data saving. If the container exits with exit code 137, then that indicates a longer grace period is needed.
|
||||
|
||||
The grace period can be increased using [the -t option on docker-compose down](https://docs.docker.com/compose/reference/down/) or set the [stop_grace_period](https://docs.docker.com/compose/compose-file/05-services/#stop_grace_period) in the compose file.
|
||||
|
||||
## OpenJ9 Specific Options
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ If you leave it off, a default is computed from the server type and version, suc
|
||||
|
||||
That way you can easily differentiate between several servers you may have started.
|
||||
|
||||
The section symbol (§) and other unicode characters are automatically converted to allow [formatting codes](https://minecraft.fandom.com/wiki/Formatting_codes) to be used consistently with all server versions. For example,
|
||||
The section symbol (§) and other unicode characters are automatically converted to allow [formatting codes](https://minecraft.wiki/w/Formatting_codes) to be used consistently with all server versions. For example,
|
||||
|
||||
-e MOTD="A §l§cMinecraft§r §nserver"
|
||||
|
||||
@@ -42,47 +42,83 @@ values.
|
||||
|
||||
### Whitelist Players
|
||||
|
||||
!!! note
|
||||
!!! warning "For public servers"
|
||||
|
||||
It is very important to set this with servers exposed to the internet where you want only limited players to join.
|
||||
It is very important to consider setting a whitelist of expected players.
|
||||
|
||||
To whitelist players for your Minecraft server, you can:
|
||||
|
||||
- Provide a list of usernames and/or UUIDs separated by commas via the `WHITELIST` environment variable
|
||||
`docker run -d -e WHITELIST=user1,uuid2 ...`
|
||||
- Provide the url or path to a whitelist file via `WHITELIST_FILE` environment variable
|
||||
`docker run -d -e WHITELIST_FILE=/extra/whitelist.json ...`
|
||||
- Provide a list of usernames and/or UUIDs separated by commas or newlines via the `WHITELIST` environment variable
|
||||
- Provide the URL or container path to a whitelist file via `WHITELIST_FILE` that will be retrieved/copied into the standard location
|
||||
|
||||
When either is set, [whitelisting of connecting users](https://minecraft.fandom.com/wiki/Server.properties#white-list) is enabled . If managing the list manually, `ENABLE_WHITELIST` can be set to "true" to set the `white-list` property.
|
||||
!!! example
|
||||
|
||||
If whitelist configuration already exists, `WHITELIST_FILE` will not be retrieved and any usernames in `WHITELIST` are **added** to the whitelist configuration. You can enforce regeneration of the whitelist on each server startup by setting `OVERRIDE_WHITELIST` to "true". This will delete the whitelist file before processing whitelist configuration.
|
||||
In a compose file, a text block can be used to improve maintainability, such as
|
||||
|
||||
!!! note
|
||||
```yaml
|
||||
WHITELIST: |
|
||||
user1
|
||||
user2
|
||||
user3
|
||||
```
|
||||
|
||||
You can provide both `WHITELIST_FILE` and `WHITELIST`, which are processed in that order.
|
||||
When either is set, [whitelisting of connecting users](https://minecraft.wiki/w/Server.properties#white-list) is enabled.
|
||||
|
||||
To change the behavior when the whitelist file already exists, set the variable `EXISTING_WHITELIST_FILE` to one of the following options:
|
||||
|
||||
`SKIP` (default)
|
||||
: Skip processing of the whitelist file when one is already present. This is the same as setting the legacy variable `OVERRIDE_WHITELIST` to "false".
|
||||
|
||||
`SYNCHRONIZE`
|
||||
: Synchronize the list of users in the file with the `WHITELIST` or `WHITELIST_FILE` provided. When using both, `WHITELIST` will take precedence. This is the same as setting the legacy variable `OVERRIDE_WHITELIST` to "true".
|
||||
|
||||
`MERGE`
|
||||
: Merge the list of users from `WHITELIST` into the existing file. `WHITELIST_FILE` cannot be used with this option.
|
||||
|
||||
`SYNC_FILE_MERGE_LIST`
|
||||
: When `WHITELIST_FILE` is provided it will overwrite an existing whitelist file. Also, if `WHITELIST` is provided, then those users will be merged into the newly copied file.
|
||||
|
||||
!!! note
|
||||
|
||||
UUIDs passed via `WHITELIST` need to be the dashed variant, otherwise it not be recognised and instead added as a username.
|
||||
|
||||
If running Minecraft 1.7.5 or earlier, these variables will apply to `white-list.txt`, with 1.7.6 implementing support for `whitelist.json`. Make sure your `WHITELIST_FILE` is in the appropriate format.
|
||||
|
||||
To [enforce the whitelist changes immediately](https://minecraft.fandom.com/wiki/Server.properties#enforce-whitelist) when whitelist commands are used , set `ENFORCE_WHITELIST` to "true".
|
||||
For versions prior to 1.7.3, `white-list.txt` will be maintained instead. Only usernames are supported for those versions.
|
||||
|
||||
To [enforce the whitelist changes immediately](https://minecraft.wiki/w/Server.properties#enforce-whitelist) when whitelist commands are used , set `ENFORCE_WHITELIST` to "true". If managing the whitelist file manually, `ENABLE_WHITELIST` can be set to "true" to set the `white-list` property.
|
||||
|
||||
### Op/Administrator Players
|
||||
|
||||
Similar to the whitelist, to add users as operators (aka adminstrators) to your Minecraft server, you can:
|
||||
Similar to the whitelist, users can be provisioned as operators (aka administrators) to your Minecraft server by
|
||||
|
||||
- Provide te url or path to an ops file via `OPS_FILE` environment variable
|
||||
`docker run -d -e OPS_FILE=https://config.example.com/extra/ops.json ...`
|
||||
- Provide a list of usernames and/or UUIDs separated by commas via the `OPS` environment variable
|
||||
`docker run -d -e OPS=user1,uuid2 ...`
|
||||
- Providing a list of usernames and/or UUIDs separated by commas or newlines via the `OPS` environment variable
|
||||
- Providing the URL or container path to an ops file via `OPS_FILE` that will be retrieved/copied into the standard location
|
||||
|
||||
If ops configuration already exists, `OPS_FILE` will not be retrieved and any usernames in `OPS` are **added** to the ops configuration. You can enforce regeneration of the ops configuration on each server startup by setting `OVERRIDE_OPS` to "true". This will delete the ops file before processing ops configuration.
|
||||
!!! example
|
||||
|
||||
!!! note
|
||||
In a compose file, a text block can be used to improve maintainability, such as
|
||||
|
||||
Similar to whitelists, you can provide both `OPS_FILE` and `OPS`, and Minecraft 1.7.5 or earlier will use `ops.txt` rather than `ops.json`.
|
||||
```yaml
|
||||
OPS: |
|
||||
user1
|
||||
user2
|
||||
user3
|
||||
```
|
||||
|
||||
To change the behavior when the ops file already exists, set the variable `EXISTING_OPS_FILE` to one of the following options:
|
||||
|
||||
`SKIP` (default)
|
||||
: Skip processing of the ops file when one is already present. This is the same as setting the legacy variable `OVERRIDE_OPS` to "false".
|
||||
|
||||
`SYNCHRONIZE`
|
||||
: Synchronize the list of users in the file with the `OPS` or `OPS_FILE` provided. When using both, `OPS` will take precedence. The `level` and `bypassesPlayerLimit` will be retained from previous entries. This is the same as setting the legacy variable `OVERRIDE_OPS` to "true".
|
||||
|
||||
`MERGE`
|
||||
: Merge the list of users from `OPS` into the existing file. `OPS_FILE` cannot be used with this option.
|
||||
|
||||
`SYNC_FILE_MERGE_LIST`
|
||||
: When `OPS_FILE` is provided it will overwrite an existing ops file. Also, if `OPS` is provided, then those users will be merged into the newly copied file.
|
||||
|
||||
!!! note
|
||||
|
||||
For versions prior to 1.7.3, `ops.txt` will be maintained instead. Only usernames are supported for those versions.
|
||||
|
||||
### Enable/disable initial selection of datapacks
|
||||
|
||||
@@ -243,7 +279,7 @@ If using a negative value for the seed, make sure to quote the value such as:
|
||||
|
||||
By default, Minecraft servers are configured to run in Survival mode. You can
|
||||
change the mode using `MODE` where you can either provide the [standard
|
||||
numerical values](http://minecraft.gamepedia.com/Game_mode#Game_modes) or the
|
||||
numerical values](http://minecraft.wiki/Game_mode#Game_modes) or the
|
||||
shortcut values:
|
||||
|
||||
- creative
|
||||
@@ -265,9 +301,9 @@ environment variable set to `false`, such as
|
||||
### Level Type and Generator Settings
|
||||
|
||||
By default, a standard world is generated with hills, valleys, water, etc. A different level type can
|
||||
be configured by setting `LEVEL_TYPE` to [an expected type listed here](https://minecraft.fandom.com/wiki/Server.properties#level-type).
|
||||
be configured by setting `LEVEL_TYPE` to [an expected type listed here](https://minecraft.wiki/w/Server.properties#level-type).
|
||||
|
||||
For some of the level types, `GENERATOR_SETTINGS` can be used to further customize the world generation [as described here](https://minecraft.fandom.com/wiki/Server.properties#generator-settings).
|
||||
For some of the level types, `GENERATOR_SETTINGS` can be used to further customize the world generation [as described here](https://minecraft.wiki/w/Server.properties#generator-settings).
|
||||
|
||||
### Custom Server Resource Pack
|
||||
|
||||
@@ -317,10 +353,28 @@ If you must, the server port can be set like:
|
||||
|
||||
**however**, be sure to change your port mapping accordingly and be prepared for some features to break.
|
||||
|
||||
### Custom server properties
|
||||
|
||||
Some mods/plugins utilize custom `server.properties` entries which can be declared via the `CUSTOM_SERVER_PROPERTIES` environment variable. The contents must be newline delimited `name=value` pairs.
|
||||
|
||||
Within a compose file, newline delimited entries can be declared as shown here:
|
||||
|
||||
```yaml
|
||||
CUSTOM_SERVER_PROPERTIES: |
|
||||
custom1=value1
|
||||
defaultworldgenerator-port=f8c04631-f744-11ec-b260-f02f74b094e0
|
||||
```
|
||||
|
||||
When using `docker run` from a bash shell, the entries must be quoted with the `$'` syntax, such as
|
||||
|
||||
```
|
||||
-e CUSTOM_SERVER_PROPERTIES=$'k1=v1\nk2=v2'
|
||||
```
|
||||
|
||||
### Other server property mappings
|
||||
|
||||
| Environment Variable | Server Property |
|
||||
| --------------------------------- | --------------------------------- |
|
||||
|-----------------------------------|-----------------------------------|
|
||||
| BROADCAST_CONSOLE_TO_OPS | broadcast-console-to-ops |
|
||||
| BROADCAST_RCON_TO_OPS | broadcast-rcon-to-ops |
|
||||
| ENABLE_STATUS | enable-status |
|
||||
|
||||
@@ -14,6 +14,8 @@ The utility used to wake the server (`knock(d)`) works at network interface leve
|
||||
|
||||
A file called `.paused` is created in `/data` directory when the server is paused and removed when the server is resumed. Other services may check for this file's existence before waking the server.
|
||||
|
||||
A `.skip-pause` file can be created in the `/data` directory to make the server skip autopausing, for as long as the file is present. The autopause timer will also be reset.
|
||||
|
||||
A starting, example compose file has been provided in [examples/docker-compose-autopause.yml](https://github.com/itzg/docker-minecraft-server/blob/master/examples/docker-compose-autopause.yml).
|
||||
|
||||
Auto-pause is not compatible with `EXEC_DIRECTLY=true` and the two cannot be set together.
|
||||
@@ -36,6 +38,8 @@ The following environment variables define the behaviour of auto-pausing:
|
||||
describes period of the daemonized state machine, that handles the pausing of the process (resuming is done independently)
|
||||
- `AUTOPAUSE_KNOCK_INTERFACE`, default `eth0`
|
||||
<br>Describes the interface passed to the `knockd` daemon. If the default interface does not work, run the `ifconfig` command inside the container and derive the interface receiving the incoming connection from its output. The passed interface must exist inside the container. Using the loopback interface (`lo`) does likely not yield the desired results.
|
||||
- `AUTOPAUSE_SUDO`, default "true"
|
||||
specifies if the knockd service should be run via sudo in order to elevate its privileges
|
||||
|
||||
!!! tip
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@ An option to stop the server after a specified time has been added for niche app
|
||||
|
||||
the docker container variables have to be set accordingly (restart policy set to "no") and that the container has to be manually restarted.
|
||||
|
||||
A `.skip-stop` file can be created in the `/data` directory to make the server skip autostopping, for as long as the file is present. The autostop timer will also be reset.
|
||||
|
||||
A starting, example compose file has been provided in [examples/docker-compose-autostop.yml](https://github.com/itzg/docker-minecraft-server/blob/master/examples/docker-compose-autostop.yml).
|
||||
|
||||
Enable the Autostop functionality by setting:
|
||||
|
||||
@@ -17,7 +17,6 @@ First, build a baseline of the image to include the packages needed by existing
|
||||
|
||||
PowerShell: (Example of building and testing ForgeAPI)
|
||||
```powershell
|
||||
$env:MODS_FORGEAPI_KEY='$2a$...'
|
||||
$env:FOLDER_TO_TEST="forgeapimods_projectids"
|
||||
$env:IMAGE_TO_TEST="mc-dev"
|
||||
docker build -t $env:IMAGE_TO_TEST .
|
||||
@@ -36,7 +35,6 @@ docker build --build-arg BASE_IMAGE=$env:BASE_IMAGE -t $env:IMAGE_TO_TEST .
|
||||
|
||||
Bash: (Example of building and testing ForgeAPI)
|
||||
```bash
|
||||
export MODS_FORGEAPI_KEY='$2a$...'
|
||||
export FOLDER_TO_TEST="forgeapimods_file"
|
||||
export IMAGE_TO_TEST="mc-dev"
|
||||
docker build -t $IMAGE_TO_TEST .
|
||||
@@ -85,6 +83,8 @@ cd build/distributions
|
||||
jwebserver -b 0.0.0.0 -p 8008
|
||||
```
|
||||
|
||||
If `jwebserver` is not available, try `java -m jdk.httpserver`
|
||||
|
||||
```shell
|
||||
--build-arg MC_HELPER_VERSION=1.8.1-SNAPSHOT \
|
||||
--build-arg MC_HELPER_BASE_URL=http://host.docker.internal:8008
|
||||
|
||||
28
docs/misc/examples.md
Normal file
28
docs/misc/examples.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# Examples
|
||||
|
||||
Various examples are [maintained in the repository](https://github.com/itzg/docker-minecraft-server/tree/master/examples). The sections below highlight a few particular ones.
|
||||
|
||||
## Bedrock compatible server
|
||||
|
||||
Using the [GeyserMC plugin](https://geysermc.org/) with a Paper server (or similar) "enables clients from Minecraft Bedrock Edition to join your Minecraft Java server". The example also includes [Floodgate](https://wiki.geysermc.org/floodgate/) which "allows Xbox Live authenticated Bedrock users to join without a Java Edition account".
|
||||
|
||||
```yaml
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
mc:
|
||||
image: itzg/minecraft-server
|
||||
environment:
|
||||
EULA: "true"
|
||||
TYPE: "PAPER"
|
||||
PLUGINS: |
|
||||
https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/spigot
|
||||
https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot
|
||||
ports:
|
||||
- "25565:25565"
|
||||
- "19132:19132/udp"
|
||||
volumes:
|
||||
- ./data:/data
|
||||
```
|
||||
|
||||
[Source](https://github.com/itzg/docker-minecraft-server/blob/master/examples/geyser/docker-compose.yml)
|
||||
@@ -25,3 +25,8 @@ healthcheck:
|
||||
```
|
||||
|
||||
Some orchestration systems, such as Portainer, don't allow for disabling the default `HEALTHCHECK` declared by this image. In those cases you can approximate the disabling of healthchecks by setting the environment variable `DISABLE_HEALTHCHECK` to `true`.
|
||||
|
||||
### Healthchecks for older versions
|
||||
|
||||
This container disables Healthchecks for Versions before b1.8 as those versions do not support any kind of server pinging.
|
||||
For more information see [Server List Ping](https://wiki.vg/Server_List_Ping#Beta_1.8_to_1.3)
|
||||
|
||||
45
docs/mods-and-plugins/curseforge-files.md
Normal file
45
docs/mods-and-plugins/curseforge-files.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# Auto-download from CurseForge
|
||||
|
||||
Mods and plugins can be auto-downloaded and upgraded from CurseForge by setting `CURSEFORGE_FILES` to a comma or space delimited list of [project-file references](#project-file-references). References removed from the declaration are automatically cleaned up and setting `CURSEFORGE_FILES` to an empty string removes all previously managed project-files.
|
||||
|
||||
A specific file can be omitted from each reference to allow for auto-selecting the newest version of the selected mod/plugin. The resolved `VERSION` and `TYPE` will be taken into consideration for selecting the appropriate file.
|
||||
|
||||
!!! warning "CurseForge API key usage"
|
||||
|
||||
A CurseForge API key must be allocated and set with `CF_API_KEY` [as described here](../types-and-platforms/mod-platforms/auto-curseforge.md#api-key).
|
||||
|
||||
## Project-file references
|
||||
|
||||
The following formats are supported in the list of project-file references:
|
||||
|
||||
- A project page URL, such as `https://www.curseforge.com/minecraft/mc-mods/jei`. _The newest applicable file will be automatically selected._
|
||||
- A file page URL, such as `https://www.curseforge.com/minecraft/mc-mods/jei/files/4593548`
|
||||
- Project slug, such as `jei`. _The newest applicable file will be automatically selected._
|
||||
- Project ID, such as `238222`. _The newest applicable file will be automatically selected._
|
||||
- Project slug or ID, `:`, and a file ID, such as `jei:4593548` or `238222:4593548`
|
||||
- Project slug or ID, `@`, and a partial filename, such as `jei@10.2.1.1005`
|
||||
|
||||
An `@` followed by the container path to a listing file can also be provided as a project-file reference. Each line is processed as a reference where blank lines and comments that start with `#` are ignored.
|
||||
|
||||
For example, `CURSEFORGE_FILES` can be set to "@/extras/cf-mods.txt" where the container file `/extras/cf-mods.txt` contains
|
||||
|
||||
```text
|
||||
# This comment is ignored
|
||||
jei:10.2.1.1005
|
||||
|
||||
# This and previous blank line are ignore
|
||||
geckolib
|
||||
aquaculture
|
||||
naturalist
|
||||
```
|
||||
|
||||
!!! tip "Docker Compose"
|
||||
|
||||
Making use of the space delimited option, compose file declarations can be organized nicely with a [multi-line string](https://yaml-multiline.info/), such as
|
||||
|
||||
```yaml
|
||||
CURSEFORGE_FILES: |
|
||||
geckolib
|
||||
aquaculture
|
||||
naturalist
|
||||
```
|
||||
@@ -1,65 +0,0 @@
|
||||
# Forge API
|
||||
|
||||
## ForgeAPI usage to use non-version specific projects
|
||||
|
||||
!!! warning "Deprecated"
|
||||
This approach will soon be deprecated in favor of a variation of `AUTO_CURSEFORGE`.
|
||||
|
||||
!!! warning
|
||||
This potentially could lead to unexpected behavior if the Mod receives 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.
|
||||
|
||||
Please be aware of the following when using these options for your mods:
|
||||
* Mod Release types: Release, Beta, and Alpha.
|
||||
* Mod dependencies: Required and Optional
|
||||
* Mod family: Fabric, Forge, and Bukkit.
|
||||
|
||||
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]
|
||||
* `MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES` - Default is False, attempts to download required mods (releaseType Release) defined in Forge.
|
||||
* `MODS_FORGEAPI_IGNORE_GAMETYPE` - Default is False, Allows for filtering mods on family type: FORGE, FABRIC, and BUKKIT. (Does not filter for Vanilla or custom)
|
||||
* `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.
|
||||
|
||||
**Field Description**:
|
||||
* `name` is currently unused, but can be used to document each entry.
|
||||
* `projectId` id is the id found on the CurseForge website for a particular mod
|
||||
* `releaseType` Type corresponds to forge's R, B, A icon for each file. Default Release, options are (release|beta|alpha).
|
||||
* `fileName` is used for version pinning if latest file will not work for you.
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"name": "fabric api",
|
||||
"projectId": "306612",
|
||||
"releaseType": "release"
|
||||
},
|
||||
{
|
||||
"name": "fabric voice mod",
|
||||
"projectId": "416089",
|
||||
"releaseType": "beta"
|
||||
},
|
||||
{
|
||||
"name": "Biomes o plenty",
|
||||
"projectId": "220318",
|
||||
"fileName": "BiomesOPlenty-1.18.1-15.0.0.100-universal.jar",
|
||||
"releaseType": "release"
|
||||
}
|
||||
]
|
||||
```
|
||||
@@ -47,16 +47,14 @@ These paths work well if you want to have a common set of modules in a separate
|
||||
|
||||
## Zip file modpack
|
||||
|
||||
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 use this option pass the environment variable `MODPACK`, such as
|
||||
Like the `WORLD` option above, you can specify the URL or container path of a "mod pack" to download and install into `mods` for Forge/Fabric or `plugins` for Bukkit/Spigot. To use this option pass the environment variable `MODPACK`, such as
|
||||
|
||||
```shell
|
||||
docker run -d -e MODPACK=http://www.example.com/mods/modpack.zip ...
|
||||
```
|
||||
|
||||
!!! note
|
||||
The referenced URL must be a zip file with one or more jar files at the
|
||||
The referenced URL/file must be a zip file with one or more jar files at the
|
||||
top level of the zip archive. Make sure the jars are compatible with the
|
||||
particular `TYPE` of server you are running.
|
||||
|
||||
|
||||
@@ -2,17 +2,29 @@
|
||||
|
||||
[Modrinth](https://modrinth.com/) is an open source modding platform with a clean, easy to use website for finding [Fabric and Forge mods](https://modrinth.com/mods). At startup, the container will automatically locate and download the newest versions of mod/plugin files that correspond to the `TYPE` and `VERSION` in use. Older file versions downloaded previously will automatically be cleaned up.
|
||||
|
||||
- **MODRINTH_PROJECTS** : comma separated list of project slugs (short name) or IDs. The project ID can be located in the "Technical information" section. The slug is the part of the page URL that follows `/mod/`:
|
||||
- **MODRINTH_PROJECTS** : comma or newline separated list of project slugs (short name) or IDs. The project ID is located in the "Technical information" section. The slug is the part of the page URL that follows `/mod/`:
|
||||
```
|
||||
https://modrinth.com/mod/fabric-api
|
||||
----------
|
||||
|
|
||||
+-- project slug
|
||||
```
|
||||
Also, specific version/type can be declared using colon symbol and version id/type after the project slug. The version id can be found at 'Metadata' section. Valid version types are `release`, `beta`, `alpha`. For instance:
|
||||
```
|
||||
-e MODRINTH_PROJECTS=fabric-api,fabric-api:PbVeub96,fabric-api:beta
|
||||
```
|
||||
- **MODRINTH_DOWNLOAD_OPTIONAL_DEPENDENCIES**=true : required dependencies of the project will _always_ be downloaded and optional dependencies can also be downloaded by setting this to `true`
|
||||
- **MODRINTH_ALLOWED_VERSION_TYPE**=release : the version type is used to determine the newest version to use from each project. The allowed values are `release`, `beta`, `alpha`.
|
||||
Also, a specific version/type can be declared using colon symbol and version id/type after the project slug. The version id can be found in the 'Metadata' section. Valid version types are `release`, `beta`, `alpha`.
|
||||
|
||||
!!! example
|
||||
|
||||
| Description | Example |
|
||||
|---------------------------------|-----------------------|
|
||||
| Select latest version | `fabric-api` |
|
||||
| Select specific version | `fabric-api:PbVeub96` |
|
||||
| Select latest beta version | `fabric-api:beta` |
|
||||
| Latest version using project ID | `P7dR8mSH` |
|
||||
|
||||
## Extra options
|
||||
|
||||
`MODRINTH_DOWNLOAD_DEPENDENCIES`
|
||||
: Can be set to `none` (the default), `required`, or `optional` to download required and/or optional dependencies.
|
||||
|
||||
`MODRINTH_ALLOWED_VERSION_TYPE`
|
||||
: The version type is used to determine the newest version to use from each project. The allowed values are `release` (default), `beta`, `alpha`.
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
mkdocs
|
||||
mkdocs-material-extensions
|
||||
mkdocs-material
|
||||
mkdocs-autorefs
|
||||
mkdocstrings
|
||||
mkdocs-literate-nav
|
||||
mdx-gh-links
|
||||
mkdocs-click
|
||||
mkdocs-static-i18n
|
||||
mkdocs == 1.5.3
|
||||
mkdocs-material-extensions == 1.2
|
||||
mkdocs-material == 9.4.3
|
||||
mkdocs-autorefs == 0.5.0
|
||||
mkdocstrings == 0.23.0
|
||||
mkdocs-literate-nav == 0.6.1
|
||||
mdx-gh-links == 0.3.1
|
||||
mkdocs-click == 0.8.1
|
||||
mkdocs-static-i18n == 1.0.6
|
||||
@@ -58,7 +58,10 @@ For example:
|
||||
|
||||
For mod, modpacks, and world files that are not allowed for automated download, the container path `/downloads` can be attached and matching files will be retrieved from there. The subdirectories `mods`, `modpacks`, and `worlds` will also be checked accordingly. To change the source location of downloaded files, set `CF_DOWNLOADS_REPO` to an existing container path. To disable this feature, set `CF_DOWNLOADS_REPO` to an empty string.
|
||||
|
||||
If the authors of the modpack have disallowed project distribution, then the desired **client** modpack zip will need to be manually downloaded and made available to the container. The path to that file must be passed to `CF_MODPACK_ZIP`. Similarly, the container path to a modpack manifest JSON can be passed to `CF_MODPACK_MANIFEST`. In either case, the modpack slug or page URL must still be provided.
|
||||
!!! note "Mods need download report"
|
||||
A file called `MODS_NEED_DOWNLOAD.txt` will be created in the `/data` directory that lists the mods that need to be manually downloaded and where to get them.
|
||||
|
||||
If you wish to use a unpublished modpack zip, set the container path to the file in `CF_MODPACK_ZIP`. Similarly, the container path to a modpack manifest JSON can be passed to `CF_MODPACK_MANIFEST`. In either case, **the modpack slug or page URL must still be provided**.
|
||||
|
||||
The latest file will be located and used by default, but if a specific version is desired you can use one of the following options. With any of these options **do not select a server file** -- they lack the required manifest and defeat the ability to consistently automate startup.
|
||||
|
||||
@@ -84,7 +87,7 @@ The following examples all refer to version 1.0.7 of ATM8:
|
||||
-e CF_SLUG=all-the-mods-8 -e CF_FILENAME_MATCHER=1.0.7
|
||||
```
|
||||
|
||||
## Exlude client mods
|
||||
## Exclude client mods
|
||||
|
||||
Quite often there are mods that need to be excluded, such as ones that did not properly declare as a client mod via the file's game versions. Similarly, there are some mods that are incorrectly tagged as client only. The following describes two options to exclude/include mods:
|
||||
|
||||
@@ -98,7 +101,7 @@ For more complex scenarios, global and per modpack exclusions can be declared in
|
||||
If needing to iterate on the options above, set `CF_FORCE_SYNCHRONIZE` to "true" to ensure the exclude/includes are re-evaluated.
|
||||
|
||||
!!! important
|
||||
These options are provided to empower you to get your server up and running quickly. Please help out by reporting an issue with the respective mod project. Ideally mod developers should [use correct registrations for one-sided client mods](https://docs.minecraftforge.net/en/latest/concepts/sides/#writing-one-sided-mods). Understandably, those code changes may be non-trivial, so mod authors can also add "Client" to the game versions when publishing.
|
||||
These options are provided to empower you to get your server up and running quickly. Please help out by reporting an issue with the respective mod project. Ideally mod developers should [use correct registrations for one-sided client mods](https://docs.minecraftforge.net/en/latest/concepts/sides/#writing-one-sided-mods). Understandably, those code changes may be non-trivial, so mod authors can also add "Client" to the game versions when publishing.
|
||||
|
||||
## Extra options
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@ This mod platform type will automatically take care of downloading and installin
|
||||
```
|
||||
- `FTB_MODPACK_VERSION_ID`: optional, the numerical ID of the version to install. If not specified, the latest version will be installed. The "Version ID" can be obtained by hovering over a server file entry and grabbing [this ID in the URL](../../img/ftba-version-id-popup.png).
|
||||
|
||||
- `FTB_FORCE_REINSTALL`: if the files become inconsistent, such as when accidentally removing them, the FTB can be forced to re-run by setting this to "true"
|
||||
|
||||
### Upgrading
|
||||
|
||||
If a specific `FTB_MODPACK_VERSION_ID` was not specified, simply restart the container to pick up the newest modpack version. If using a specific version ID, recreate the container with the new version ID.
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
|
||||
[Modrinth Modpacks](https://modrinth.com/modpacks) can automatically be installed along with the required mod loader (Forge or Fabric) by setting `MOD_PLATFORM` or `TYPE` to "MODRINTH". Upgrading (and downgrading) takes care of cleaning up old files and upgrading (and downgrading) the mod loader.
|
||||
|
||||
The desired modpack project is specified with the `MODRINTH_PROJECT` environment variable and must be one of:
|
||||
## Modpack project
|
||||
|
||||
The desired modpack project is specified with the `MODRINTH_MODPACK` environment variable and must be one of:
|
||||
|
||||
- The project "slug", which is located in the URL shown here:
|
||||
|
||||
@@ -12,14 +14,30 @@ The desired modpack project is specified with the `MODRINTH_PROJECT` environment
|
||||

|
||||
- The project page URL, such as <https://modrinth.com/modpack/cobblemon-fabric>. As described below, this can further be the page URL of a modpack's version page.
|
||||
|
||||
## Modpack version
|
||||
|
||||
The automatic modpack version resolving can be narrowed in a few ways:
|
||||
|
||||
The latest release or beta version, respectively, of the Modrinth modpack is selected when `VERSION` is "LATEST" or "SNAPSHOT". That can be overridden by setting `MODRINTH_DEFAULT_VERSION_TYPE` to "release", "beta", or "alpha".
|
||||
|
||||
Furthermore, the resolved modpack version can be narrowed by setting `VERSION` to a specific Minecraft version, such as "1.19.2".
|
||||
The resolved modpack version can be narrowed by setting `VERSION` to a specific Minecraft version, such as "1.19.2".
|
||||
|
||||
The selected version can also be narrowed to a particular mod loader by setting `MODRINTH_LOADER` to either "forge", "fabric", or "quilt".
|
||||
|
||||
Instead of auto resolving, a specific version of modpack file can be specified by passing the version's page URL to `MODRINTH_PROJECT`, such as <https://modrinth.com/modpack/cobblemon-fabric/version/1.3.2> or by setting `MODRINTH_VERSION` to the version ID or number located in the Metadata section, as shown here
|
||||
Instead of auto resolving, a specific version of modpack file can be specified by passing the version's page URL to `MODRINTH_MODPACK`, such as <https://modrinth.com/modpack/cobblemon-fabric/version/1.3.2> or by setting `MODRINTH_VERSION` to the version ID or number located in the Metadata section, as shown here
|
||||
|
||||

|
||||
|
||||
## Ignore missing files
|
||||
|
||||
Some mods, such as [MCInstance Loader](https://modrinth.com/mod/mcinstance-loader), use temporary files from the modpack and delete them when finished. In order to avoid the installer from detecting the absent file(s) and re-installing, those files can be ignored by passing a comma or newline delimited list to `MODRINTH_IGNORE_MISSING_FILES`.
|
||||
|
||||
!!! example
|
||||
|
||||
In a Compose file
|
||||
```yaml
|
||||
environment:
|
||||
MODRINTH_IGNORE_MISSING_FILES: |
|
||||
config/mcinstanceloader/pack.mcinstance
|
||||
```
|
||||
|
||||
|
||||
@@ -1,12 +1,20 @@
|
||||
# Bukkit/Spigot
|
||||
|
||||
Enable Bukkit/Spigot server mode by adding a `-e TYPE=BUKKIT` or `-e TYPE=SPIGOT` to your command-line.
|
||||
Run a Bukkit/Spigot server type by setting the environment variable `TYPE` to "BUKKIT" or "SPIGOT".
|
||||
|
||||
```
|
||||
docker run -d -v /path/on/host:/data \
|
||||
-e TYPE=SPIGOT \
|
||||
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
|
||||
```
|
||||
!!! example
|
||||
|
||||
Command-line
|
||||
```
|
||||
docker run ... -e TYPE=SPIGOT ...
|
||||
```
|
||||
|
||||
Compose
|
||||
```yaml
|
||||
environment:
|
||||
...
|
||||
TYPE: SPIGOT
|
||||
```
|
||||
|
||||
If the downloaded server jar is corrupted, set `FORCE_REDOWNLOAD` to "true" to force a re-download during next container startup. After successfully re-downloading, you should remove that or set to "false".
|
||||
|
||||
@@ -15,16 +23,14 @@ If you are hosting your own copy of Bukkit/Spigot you can override the download
|
||||
- -e BUKKIT_DOWNLOAD_URL=<url>
|
||||
- -e SPIGOT_DOWNLOAD_URL=<url>
|
||||
|
||||
You can build spigot from source by adding `-e BUILD_FROM_SOURCE=true`
|
||||
|
||||
Plugins can either be managed within the `plugins` subdirectory of the [data directory](../../data-directory.md) or you can also [attach a `/plugins` volume](../../mods-and-plugins/index.md#optional-plugins-mods-and-config-attach-points). If you add plugins while the container is running, you'll need to restart it to pick those up.
|
||||
|
||||
[You can also auto-download plugins using `SPIGET_RESOURCES`.](../../mods-and-plugins/spiget.md)
|
||||
|
||||
!!! note
|
||||
|
||||
Some of the `VERSION` values are not as intuitive as you would think, so make sure to click into the version entry to find the **exact** version needed for the download. For example, "1.8" is not sufficient since their download naming expects `1.8-R0.1-SNAPSHOT-latest` exactly.
|
||||
|
||||
## Build from source
|
||||
|
||||
You can build spigot from source by setting the environment variable `BUILD_FROM_SOURCE` to "true".
|
||||
|
||||
## Alternatives
|
||||
|
||||
### Canyon
|
||||
|
||||
@@ -1,32 +1,57 @@
|
||||
Enable [Forge server](http://www.minecraftforge.net/) mode by adding a `-e TYPE=FORGE` to your command-line.
|
||||
A [Forge server](http://www.minecraftforge.net/) can be automatically downloaded, upgraded, and run by setting the environment variable `TYPE` to "FORGE".
|
||||
|
||||
The overall version is specified by `VERSION`, [as described in the section above](../../versions/minecraft.md) and will run the recommended Forge version by default. You can also choose to run a specific Forge version with `FORGE_VERSION`, such as `-e FORGE_VERSION=14.23.5.2854`.
|
||||
!!! example
|
||||
|
||||
```
|
||||
docker run -d -v /path/on/host:/data \
|
||||
-e TYPE=FORGE \
|
||||
-e VERSION=1.12.2 -e FORGE_VERSION=14.23.5.2854 \
|
||||
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
|
||||
```
|
||||
```
|
||||
docker run -e TYPE=FORGE ...
|
||||
```
|
||||
|
||||
or in a compose file
|
||||
```yaml
|
||||
environment:
|
||||
TYPE: FORGE
|
||||
```
|
||||
|
||||
To use a pre-downloaded Forge installer, place it in the attached `/data` directory and
|
||||
specify the name of the installer file with `FORGE_INSTALLER`, such as:
|
||||
The overall version is specified by `VERSION`, [as described in the section above](../../versions/minecraft.md) and provides the same benefits of upgrading as new versions are released. By default, the recommended version of Forge for that Minecraft version will be selected. The latest version can be selected instead by setting the environment variable `FORGE_VERSION` to "latest". You can also choose a specific Forge version by setting `FORGE_VERSION` with that version, such as "14.23.5.2854".
|
||||
|
||||
```
|
||||
docker run -d -v /path/on/host:/data ... \
|
||||
-e FORGE_INSTALLER=forge-1.11.2-13.20.0.2228-installer.jar ...
|
||||
```
|
||||
!!! example
|
||||
|
||||
To download a Forge installer from a custom location, such as your own file repository, specify
|
||||
the URL with `FORGE_INSTALLER_URL`, such as:
|
||||
```
|
||||
docker run -e TYPE=FORGE -e VERSION=1.12.2 -e FORGE_VERSION=14.23.5.2854 ...
|
||||
```
|
||||
|
||||
or in a compose file
|
||||
```yaml
|
||||
environment:
|
||||
TYPE: FORGE
|
||||
VERSION: "1.12.2"
|
||||
FORGE_VERSION: "14.23.5.2854"
|
||||
```
|
||||
|
||||
```
|
||||
docker run -d -v /path/on/host:/data ... \
|
||||
-e FORGE_INSTALLER_URL=http://HOST/forge-1.11.2-13.20.0.2228-installer.jar ...
|
||||
```
|
||||
To use a pre-downloaded Forge installer, place it in a location mounted into the container and specify the container path with `FORGE_INSTALLER`. To download a Forge installer from a custom location, such as your own file repository, specify the URL with `FORGE_INSTALLER_URL`.
|
||||
|
||||
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 `FORGE_VERSION` variables.
|
||||
|
||||
!!! note
|
||||
|
||||
If an error occurred while installing Forge, it might be possible to resolve by temporarily setting `FORGE_FORCE_REINSTALL` to "true". Be sure to remove that variable after successfully starting the server.
|
||||
|
||||
## Alternatives
|
||||
|
||||
### NeoForge
|
||||
|
||||
Support for [NeoForge](https://neoforged.net/) is also provided. A NeoForge server can be automatically managed by setting `TYPE` to "NEOFORGE". `VERSION` specifies the Minecraft version and `NEOFORGE_VERSION` can be set to select a specific sub-version. By default, the latest NeoForge version available for the requested Minecraft version will be used.
|
||||
|
||||
!!! example
|
||||
|
||||
```
|
||||
docker run -e TYPE=NEOFORGE -e VERSION=1.20.1 -e NEOFORGE_VERSION=47.1.79 ...
|
||||
```
|
||||
|
||||
or in a compose file
|
||||
```yaml
|
||||
environment:
|
||||
TYPE: NEOFORGE
|
||||
VERSION: "1.20.1"
|
||||
NEOFORGE_VERSION: "47.1.79"
|
||||
```
|
||||
|
||||
@@ -37,7 +37,7 @@ Configuration options with defaults:
|
||||
|
||||
!!! 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.
|
||||
Instead of using format codes in the MOTD, Limbo requires [JSON chat content](https://minecraft.wiki/w/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.
|
||||
|
||||
## Crucible
|
||||
|
||||
@@ -48,3 +48,21 @@ Configuration options with defaults:
|
||||
- `CRUCIBLE_RELEASE`=latest
|
||||
|
||||
Crucible is only available for 1.7.10, so be sure to set `VERSION=1.7.10`.
|
||||
|
||||
## Custom
|
||||
|
||||
To use a custom server jar or class files, set `TYPE` to "CUSTOM" and continue with one of the following options:
|
||||
|
||||
The custom jar to be used can be set with `CUSTOM_SERVER` as either a URL to download or the path to a file within the container.
|
||||
|
||||
Alternatively, the final `-jar` invocation can be replaced by setting `CUSTOM_JAR_EXEC` to "`-cp <classpath> <classname>`" or "`-jar <jar file>`" form, such as
|
||||
|
||||
```
|
||||
-cp worldedit.jar:Carpet-Server.jar net.minecraft.server.MinecraftServer
|
||||
```
|
||||
|
||||
!!! note
|
||||
|
||||
When using `docker run` make sure to quote the entire value since it has spaces in it, such as
|
||||
|
||||
-e CUSTOM_JAR_EXEC="-cp worldedit.jar:Carpet-Server.jar net.minecraft.server.MinecraftServer"
|
||||
@@ -48,7 +48,7 @@ alternatively, you can mount: <code>/etc/localtime:/etc/localtime:ro
|
||||
|
||||
/etc/timezone:/etc/timezone:ro</code>
|
||||
</td>
|
||||
<td><code>1G</code></td>
|
||||
<td><code>UTC</code></td>
|
||||
<td>⬜️</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -260,7 +260,7 @@ alternatively, you can mount: <code>/etc/localtime:/etc/localtime:ro
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>MODE</code></td>
|
||||
<td>Minecraft servers are configured to run in Survival mode by default. You can change the mode using MODE where you can either provide the <a href="http://minecraft.gamepedia.com/Game_mode#Game_modes">standard numerical values</a> or the shortcut values:<br />
|
||||
<td>Minecraft servers are configured to run in Survival mode by default. You can change the mode using MODE where you can either provide the <a href="http://minecraft.wiki/Game_mode#Game_modes">standard numerical values</a> or the shortcut values:<br />
|
||||
<ul>
|
||||
<li>creative</li>
|
||||
<li>survival</li>
|
||||
@@ -278,14 +278,14 @@ alternatively, you can mount: <code>/etc/localtime:/etc/localtime:ro
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>LEVEL_TYPE</code></td>
|
||||
<td>By default, a standard world is generated with hills, valleys, water, etc. A different level type can be configured by setting LEVEL_TYPE to <a href="https://minecraft.fandom.com/wiki/Server.properties#level-type">an expected type listed here</a>.
|
||||
<td>By default, a standard world is generated with hills, valleys, water, etc. A different level type can be configured by setting LEVEL_TYPE to <a href="https://minecraft.wiki/w/Server.properties#level-type">an expected type listed here</a>.
|
||||
</td>
|
||||
<td><code>minecraft:default</code></td>
|
||||
<td>⬜️</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>GENERATOR_SETTINGS</code></td>
|
||||
<td>For some of the level types, <code>GENERATOR_SETTINGS</code> can be used to further customize the world generation <a href="https://minecraft.fandom.com/wiki/Server.properties#generator-settings">as described here</a>.</td>
|
||||
<td>For some of the level types, <code>GENERATOR_SETTINGS</code> can be used to further customize the world generation <a href="https://minecraft.wiki/w/Server.properties#generator-settings">as described here</a>.</td>
|
||||
<td><code></code></td>
|
||||
<td>⬜️</td>
|
||||
</tr>
|
||||
|
||||
@@ -13,25 +13,26 @@
|
||||
|
||||
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. The `stable` tag is similar to `latest`; however, it tracks [the most recent repository release/tag](https://github.com/itzg/docker-minecraft-server/releases/latest).
|
||||
|
||||
| Tag name | Java version | Linux | JVM Type | Architecture |
|
||||
|-------------------|--------------|--------|-------------|-------------------|
|
||||
| latest | 17 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||
| stable | 17 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||
| java8 | 8 | Alpine | Hotspot | amd64 |
|
||||
| java8-jdk | 8 | Ubuntu | Hotspot+JDK | amd64 |
|
||||
| java8-multiarch | 8 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||
| java8-openj9 | 8 | Debian | OpenJ9 | amd64 |
|
||||
| java8-graalvm-ce | 8 | Oracle | GraalVM CE | amd64 |
|
||||
| java11 | 11 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||
| java11-jdk | 11 | Ubuntu | Hotspot+JDK | amd64,arm64,armv7 |
|
||||
| java11-openj9 | 11 | Debian | OpenJ9 | amd64 |
|
||||
| java17 | 17 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||
| java17-jdk | 17 | Ubuntu | Hotspot+JDK | amd64,arm64,armv7 |
|
||||
| java17-openj9 | 17 | Debian | OpenJ9 | amd64 |
|
||||
| java17-graalvm-ce | 17 | Oracle | GraalVM CE | amd64,arm64 |
|
||||
| java17-alpine | 17 | Alpine | Hotspot | amd64 |
|
||||
| java20-alpine | 19 | Alpine | Hotspot | amd64 |
|
||||
| java20 | 19 | Ubuntu | Hotspot | amd64,arm64 |
|
||||
| Tag name | Java version | Linux | JVM Type | Architecture |
|
||||
|------------------|--------------|--------|----------------|-------------------|
|
||||
| latest | 17 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||
| stable | 17 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||
| java8 | 8 | Alpine | Hotspot | amd64 |
|
||||
| java8-jdk | 8 | Ubuntu | Hotspot+JDK | amd64 |
|
||||
| java8-multiarch | 8 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||
| java8-openj9 | 8 | Debian | OpenJ9 | amd64 |
|
||||
| java8-graalvm-ce | 8 | Oracle | GraalVM CE | amd64 |
|
||||
| java11 | 11 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||
| java11-jdk | 11 | Ubuntu | Hotspot+JDK | amd64,arm64,armv7 |
|
||||
| java11-openj9 | 11 | Debian | OpenJ9 | amd64 |
|
||||
| java17 | 17 | Ubuntu | Hotspot | amd64,arm64,armv7 |
|
||||
| java17-jdk | 17 | Ubuntu | Hotspot+JDK | amd64,arm64,armv7 |
|
||||
| java17-openj9 | 17 | Debian | OpenJ9 | amd64 |
|
||||
| java17-graalvm | 17 | Oracle | Oracle GraalVM | amd64,arm64 |
|
||||
| java17-alpine | 17 | Alpine | Hotspot | amd64 |
|
||||
| java20-alpine | 20 | Alpine | Hotspot | amd64 |
|
||||
| java20 | 20 | Ubuntu | Hotspot | amd64,arm64 |
|
||||
| java21-graalvm | 21 | Oracle | Oracle GraalVM | amd64,arm64 |
|
||||
|
||||
For example, to use Java version 8 on any supported architecture:
|
||||
|
||||
@@ -53,3 +54,5 @@ The following image tags have been deprecated and are no longer receiving update
|
||||
- openj9-nightly
|
||||
- multiarch-latest
|
||||
- java16/java16-openj9
|
||||
- java17-graalvm-ce
|
||||
- java20-graalvm
|
||||
|
||||
@@ -2,7 +2,8 @@ To use a different Minecraft version, pass the `VERSION` environment variable (c
|
||||
|
||||
- LATEST (the default)
|
||||
- SNAPSHOT
|
||||
- or a specific version, such as "1.7.9"
|
||||
- a specific version, such as "1.7.9"
|
||||
- or an alpha and beta version, such as "b1.7.3" (server download might not exist)
|
||||
|
||||
For example, to use the latest snapshot:
|
||||
|
||||
|
||||
3
examples/.gitignore
vendored
3
examples/.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
data/
|
||||
modpacks/
|
||||
modpacks/
|
||||
.env
|
||||
@@ -15,7 +15,7 @@ services:
|
||||
MEMORY: 4G
|
||||
volumes:
|
||||
- mc-data:/data
|
||||
- ./downloads:/downloads
|
||||
- ../downloads:/downloads
|
||||
# Since Docker's default volume driver creates volumes owned by root, this
|
||||
# init container will change ownership to match final UID of mc service, above
|
||||
init-filebrowser:
|
||||
@@ -29,12 +29,16 @@ services:
|
||||
filebrowser:
|
||||
image: filebrowser/filebrowser
|
||||
depends_on:
|
||||
- init-filebrowser
|
||||
init-filebrowser:
|
||||
condition: service_completed_successfully
|
||||
user: "1000:1000"
|
||||
environment:
|
||||
FB_DATABASE: /database/filebrowser.db
|
||||
volumes:
|
||||
# Default FB_ROOT is /srv
|
||||
# In this example, the left-side needs to be the same as /data volume of mc service
|
||||
- mc-data:/srv
|
||||
- filebrowser-db:/database
|
||||
- ./filebrowser.json:/.filebrowser.json
|
||||
ports:
|
||||
- "25580:80"
|
||||
|
||||
|
||||
21
examples/bettermc/docker-compose.yml
Normal file
21
examples/bettermc/docker-compose.yml
Normal file
@@ -0,0 +1,21 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
mc:
|
||||
image: itzg/minecraft-server
|
||||
environment:
|
||||
EULA: true
|
||||
MOD_PLATFORM: AUTO_CURSEFORGE
|
||||
# Set CF_API_KEY=... in a .env file next to this compose file and don't source control that file
|
||||
CF_API_KEY: ${CF_API_KEY}
|
||||
CF_SLUG: better-mc-fabric-bmc1
|
||||
CF_FILENAME_MATCHER: v18.5
|
||||
MEMORY: 4G
|
||||
volumes:
|
||||
- mc:/data
|
||||
- ../downloads:/downloads
|
||||
ports:
|
||||
- "25565:25565"
|
||||
|
||||
volumes:
|
||||
mc: {}
|
||||
17
examples/curseforge-files/docker-compose.yml
Normal file
17
examples/curseforge-files/docker-compose.yml
Normal file
@@ -0,0 +1,17 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
mc:
|
||||
image: itzg/minecraft-server
|
||||
environment:
|
||||
EULA: true
|
||||
TYPE: FORGE
|
||||
# allocate from https://console.curseforge.com/ and set in .env file
|
||||
CF_API_KEY: ${CF_API_KEY}
|
||||
VERSION: 1.19.2
|
||||
CURSEFORGE_FILES: |
|
||||
geckolib
|
||||
aquaculture
|
||||
naturalist
|
||||
ports:
|
||||
- "25565:25565"
|
||||
22
examples/docker-compose-ngrok.yml
Normal file
22
examples/docker-compose-ngrok.yml
Normal file
@@ -0,0 +1,22 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
mc:
|
||||
image: itzg/minecraft-server
|
||||
tty: true
|
||||
stdin_open: true
|
||||
ports:
|
||||
- "25565:25565"
|
||||
environment:
|
||||
EULA: "TRUE"
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
# attach the relative directory 'data' to the container's /data path
|
||||
- ./data:/data
|
||||
|
||||
ngrok:
|
||||
image: shkoliar/ngrok:latest
|
||||
ports:
|
||||
- 4551:4551
|
||||
environment:
|
||||
- PARAMS=tcp -region=us -authtoken=YourAuthTokenHere mc:25565
|
||||
@@ -10,10 +10,12 @@ services:
|
||||
environment:
|
||||
EULA: "TRUE"
|
||||
TYPE: FABRIC
|
||||
MODS_FORGEAPI_PROJECTIDS: 433175
|
||||
MODS_FORGEAPI_KEY: ${MODS_FORGEAPI_KEY}
|
||||
MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES: "TRUE"
|
||||
REMOVE_OLD_FORGEAPI_MODS: "TRUE"
|
||||
MEMORY: "2G"
|
||||
CURSEFORGE_FILES: |
|
||||
fabric-api
|
||||
chunky-pregenerator
|
||||
# allocate from https://console.curseforge.com/ and set in .env file
|
||||
CF_API_KEY: ${CF_API_KEY}
|
||||
# YAML Heredoc, be sure to use '|-' this will remove the first newline and final new line.
|
||||
# This is versus '|' that will leaving with two empty strings at top and bottom.
|
||||
RCON_CMDS_STARTUP: |-
|
||||
|
||||
1
examples/downloads/.gitignore
vendored
Normal file
1
examples/downloads/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
*.jar
|
||||
@@ -10,9 +10,9 @@ services:
|
||||
environment:
|
||||
EULA: "TRUE"
|
||||
MOD_PLATFORM: MODRINTH
|
||||
MODRINTH_PROJECT: https://modrinth.com/modpack/cobblemon-fabric/version/1.3.2
|
||||
MODRINTH_MODPACK: https://modrinth.com/modpack/cobblemon-fabric/version/1.3.2
|
||||
# or for auto-upgrading to latest
|
||||
# MODRINTH_PROJECT: https://modrinth.com/modpack/cobblemon-fabric
|
||||
# MODRINTH_MODPACK: https://modrinth.com/modpack/cobblemon-fabric
|
||||
# or just cobblemon-fabric or 5FFgwNNP
|
||||
# and could replace version URL with
|
||||
# MODRINTH_VERSION: nvrqJg44
|
||||
|
||||
@@ -10,7 +10,7 @@ services:
|
||||
MODS_FILE: /extras/mods.txt
|
||||
REMOVE_OLD_MODS: "true"
|
||||
ports:
|
||||
- 25565:25565
|
||||
- "25565:25565"
|
||||
volumes:
|
||||
- data:/data
|
||||
- ./mods.txt:/extras/mods.txt:ro
|
||||
@@ -706,5 +706,5 @@ update-client-command-list: true
|
||||
register-command-list-data: true
|
||||
|
||||
# If LuckPerms should attempt to resolve Vanilla command target selectors for LP commands.
|
||||
# See here for more info: https://minecraft.gamepedia.com/Commands#Target_selectors
|
||||
# See here for more info: https://minecraft.wiki/Commands#Target_selectors
|
||||
resolve-command-selectors: false
|
||||
|
||||
@@ -14,7 +14,7 @@ services:
|
||||
# Modpack client zip must be manually downloaded from
|
||||
# https://www.curseforge.com/minecraft/modpacks/one-block-modded
|
||||
# due to authors disallowing project distribution
|
||||
CF_MODPACK_ZIP: /modpacks/Modded+OneBock.zip
|
||||
CF_MODPACK_ZIP: /modpacks/Modded+OneBlock.zip
|
||||
CF_SET_LEVEL_FROM: OVERRIDES
|
||||
DEBUG: "false"
|
||||
MEMORY: 4G
|
||||
@@ -23,4 +23,4 @@ services:
|
||||
- ./modpacks:/modpacks:ro
|
||||
|
||||
volumes:
|
||||
mc-data: {}
|
||||
mc-data: {}
|
||||
|
||||
18
examples/rlcraft/docker-compose.yml
Normal file
18
examples/rlcraft/docker-compose.yml
Normal file
@@ -0,0 +1,18 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
mc:
|
||||
image: itzg/minecraft-server:java8-multiarch
|
||||
environment:
|
||||
EULA: true
|
||||
MOD_PLATFORM: AUTO_CURSEFORGE
|
||||
# Set CF_API_KEY=... in a .env file next to this compose file and don't source control that file
|
||||
CF_API_KEY: ${CF_API_KEY}
|
||||
CF_SLUG: rlcraft
|
||||
CF_FILENAME_MATCHER: 2.9.3
|
||||
CF_FORCE_SYNCHRONIZE: true
|
||||
MEMORY: 4G
|
||||
volumes:
|
||||
- ./data:/data
|
||||
ports:
|
||||
- "25565:25565"
|
||||
@@ -45,7 +45,11 @@ if isTrue "${DEBUG_AUTOPAUSE}"; then
|
||||
knockdArgs+=(-D)
|
||||
fi
|
||||
|
||||
sudo /usr/local/sbin/knockd "${knockdArgs[@]}"
|
||||
if isTrue "${AUTOPAUSE_SUDO:-true}"; then
|
||||
sudo /usr/local/sbin/knockd "${knockdArgs[@]}"
|
||||
else
|
||||
/usr/local/sbin/knockd "${knockdArgs[@]}"
|
||||
fi
|
||||
if [ $? -ne 0 ] ; then
|
||||
logAutopause "Failed to start knockd daemon."
|
||||
logAutopause "Probable cause: Unable to attach to interface \"$AUTOPAUSE_KNOCK_INTERFACE\"."
|
||||
@@ -62,7 +66,13 @@ do
|
||||
# Server startup
|
||||
if mc_server_listening ; then
|
||||
TIME_THRESH=$(($(current_uptime)+$AUTOPAUSE_TIMEOUT_INIT))
|
||||
logAutopause "MC Server listening for connections - pausing in $AUTOPAUSE_TIMEOUT_INIT seconds"
|
||||
|
||||
if [ -e /data/.skip-pause ] ; then
|
||||
logAutopause "'/data/.skip-pause' file is present - skipping pausing"
|
||||
else
|
||||
logAutopause "MC Server listening for connections - pausing in $AUTOPAUSE_TIMEOUT_INIT seconds"
|
||||
fi
|
||||
|
||||
STATE=K
|
||||
fi
|
||||
;;
|
||||
@@ -71,6 +81,9 @@ do
|
||||
if java_clients_connected ; then
|
||||
logAutopause "Client connected - waiting for disconnect"
|
||||
STATE=E
|
||||
elif [ -e /data/.skip-pause ] ; then
|
||||
logAutopause "'/data/.skip-pause' file is present - skipping pausing"
|
||||
STATE=E
|
||||
else
|
||||
if [[ $(current_uptime) -ge $TIME_THRESH ]] ; then
|
||||
logAutopause "No client connected since startup / knocked - pausing"
|
||||
@@ -92,6 +105,10 @@ do
|
||||
if java_clients_connected ; then
|
||||
logAutopause "Client reconnected - waiting for disconnect"
|
||||
STATE=E
|
||||
elif [ -e /data/.skip-pause ] ; then
|
||||
TIME_THRESH=$(($(current_uptime)+$AUTOPAUSE_TIMEOUT_EST))
|
||||
logAutopause "'/data/.skip-pause' file is present - skipping pausing"
|
||||
STATE=E
|
||||
else
|
||||
if [[ $(current_uptime) -ge $TIME_THRESH ]] ; then
|
||||
logAutopause "No client reconnected - pausing"
|
||||
|
||||
@@ -28,7 +28,13 @@ do
|
||||
# Server startup
|
||||
if mc_server_listening ; then
|
||||
TIME_THRESH=$(($(current_uptime)+AUTOSTOP_TIMEOUT_INIT))
|
||||
logAutostop "MC Server listening for connections - stopping in $AUTOSTOP_TIMEOUT_INIT seconds"
|
||||
|
||||
if [ -e /data/.skip-stop ] ; then
|
||||
logAutostop "'/data/.skip-stop' file is present - skipping stopping"
|
||||
else
|
||||
logAutostop "MC Server listening for connections - stopping in $AUTOSTOP_TIMEOUT_INIT seconds"
|
||||
fi
|
||||
|
||||
STATE=II
|
||||
fi
|
||||
;;
|
||||
@@ -37,6 +43,9 @@ do
|
||||
if java_clients_connected ; then
|
||||
logAutostop "Client connected - waiting for disconnect"
|
||||
STATE=E
|
||||
elif [ -e /data/.skip-stop ] ; then
|
||||
logAutostop "'/data/.skip-stop' file is present - skipping stopping"
|
||||
STATE=E
|
||||
else
|
||||
if [[ $(current_uptime) -ge $TIME_THRESH ]] ; then
|
||||
logAutostop "No client connected since startup - stopping server"
|
||||
@@ -58,6 +67,10 @@ do
|
||||
if java_clients_connected ; then
|
||||
logAutostop "Client reconnected - waiting for disconnect"
|
||||
STATE=E
|
||||
elif [ -e /data/.skip-stop ] ; then
|
||||
TIME_THRESH=$(($(current_uptime)+$AUTOSTOP_TIMEOUT_EST))
|
||||
logAutostop "'/data/.skip-stop' file is present - skipping stopping"
|
||||
STATE=E
|
||||
else
|
||||
if [[ $(current_uptime) -ge $TIME_THRESH ]] ; then
|
||||
logAutostop "No client reconnected - stopping"
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
"entityculling",
|
||||
"extreme-sound-muffler",
|
||||
"ignitioncoil",
|
||||
"inmisaddon",
|
||||
"irisshaders",
|
||||
"iris-flywheel-compat",
|
||||
"just-enough-harvestcraft",
|
||||
"just-enough-resources-jer",
|
||||
"legendary-tooltips",
|
||||
@@ -38,6 +41,7 @@
|
||||
"rubidium",
|
||||
"rubidium-extra",
|
||||
"skin-layers-3d",
|
||||
"sodium",
|
||||
"textrues-rubidium-options",
|
||||
"thaumic-jei",
|
||||
"tips",
|
||||
|
||||
58
files/property-definitions.json
Normal file
58
files/property-definitions.json
Normal file
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"motd": {"env": "MOTD"},
|
||||
"gamemode": {"env": "MODE"},
|
||||
"difficulty": {"env": "DIFFICULTY"},
|
||||
"white-list": {"env": "WHITELIST_PROP"},
|
||||
"enforce-whitelist": {"env": "ENFORCE_WHITELIST"},
|
||||
"level-type": {"env": "LEVEL_TYPE"},
|
||||
"server-name": {"env": "SERVER_NAME"},
|
||||
"server-ip": {"env": "SERVER_IP"},
|
||||
"server-port": {"env": "SERVER_PORT"},
|
||||
"allow-nether": {"env": "ALLOW_NETHER"},
|
||||
"announce-player-achievements": {"env": "ANNOUNCE_PLAYER_ACHIEVEMENTS"},
|
||||
"enable-command-block": {"env": "ENABLE_COMMAND_BLOCK"},
|
||||
"spawn-animals": {"env": "SPAWN_ANIMALS"},
|
||||
"spawn-monsters": {"env": "SPAWN_MONSTERS"},
|
||||
"spawn-npcs": {"env": "SPAWN_NPCS"},
|
||||
"spawn-protection": {"env": "SPAWN_PROTECTION"},
|
||||
"generate-structures": {"env": "GENERATE_STRUCTURES"},
|
||||
"view-distance": {"env": "VIEW_DISTANCE"},
|
||||
"hardcore": {"env": "HARDCORE"},
|
||||
"snooper-enabled": {"env": "SNOOPER_ENABLED"},
|
||||
"max-build-height": {"env": "MAX_BUILD_HEIGHT"},
|
||||
"force-gamemode": {"env": "FORCE_GAMEMODE"},
|
||||
"max-tick-time": {"env": "MAX_TICK_TIME"},
|
||||
"enable-query": {"env": "ENABLE_QUERY"},
|
||||
"query.port": {"env": "QUERY_PORT"},
|
||||
"enable-rcon": {"env": "ENABLE_RCON"},
|
||||
"rcon.password": {"env": "RCON_PASSWORD"},
|
||||
"rcon.port": {"env": "RCON_PORT"},
|
||||
"max-players": {"env": "MAX_PLAYERS"},
|
||||
"max-world-size": {"env": "MAX_WORLD_SIZE"},
|
||||
"level-name": {"env": "LEVEL"},
|
||||
"level-seed": {"env": "SEED"},
|
||||
"pvp": {"env": "PVP"},
|
||||
"generator-settings": {"env": "GENERATOR_SETTINGS"},
|
||||
"online-mode": {"env": "ONLINE_MODE"},
|
||||
"allow-flight": {"env": "ALLOW_FLIGHT"},
|
||||
"resource-pack": {"env": "RESOURCE_PACK"},
|
||||
"resource-pack-sha1": {"env": "RESOURCE_PACK_SHA1"},
|
||||
"require-resource-pack": {"env": "RESOURCE_PACK_ENFORCE"},
|
||||
"player-idle-timeout": {"env": "PLAYER_IDLE_TIMEOUT"},
|
||||
"broadcast-console-to-ops": {"env": "BROADCAST_CONSOLE_TO_OPS"},
|
||||
"broadcast-rcon-to-ops": {"env": "BROADCAST_RCON_TO_OPS"},
|
||||
"enable-jmx-monitoring": {"env": "ENABLE_JMX"},
|
||||
"sync-chunk-writes": {"env": "SYNC_CHUNK_WRITES"},
|
||||
"enable-status": {"env": "ENABLE_STATUS"},
|
||||
"entity-broadcast-range-percentage": {"env": "ENTITY_BROADCAST_RANGE_PERCENTAGE"},
|
||||
"function-permission-level": {"env": "FUNCTION_PERMISSION_LEVEL"},
|
||||
"network-compression-threshold": {"env": "NETWORK_COMPRESSION_THRESHOLD"},
|
||||
"op-permission-level": {"env": "OP_PERMISSION_LEVEL"},
|
||||
"prevent-proxy-connections": {"env": "PREVENT_PROXY_CONNECTIONS"},
|
||||
"use-native-transport": {"env": "USE_NATIVE_TRANSPORT"},
|
||||
"simulation-distance": {"env": "SIMULATION_DISTANCE"},
|
||||
"previews-chat": {"env": "PREVIEWS_CHAT"},
|
||||
"enforce-secure-profile": {"env": "ENFORCE_SECURE_PROFILE"},
|
||||
"initial-enabled-packs": {"env": "INITIAL_ENABLED_PACKS"},
|
||||
"initial-disabled-packs": {"env": "INITIAL_DISABLED_PACKS"}
|
||||
}
|
||||
13
mkdocs.yml
13
mkdocs.yml
@@ -1,13 +1,12 @@
|
||||
---
|
||||
site_name: Minecraft Server on Docker (Java Edition)
|
||||
site_url: https://docker-minecraft-server.readthedocs.io/
|
||||
site_url: https://docker-minecraft-server.readthedocs.io/en/latest/
|
||||
site_description: Documentation for Minecraft Server on Docker
|
||||
repo_url: https://github.com/itzg/docker-minecraft-server
|
||||
edit_uri: blob/master/docs/
|
||||
theme:
|
||||
name: material
|
||||
features:
|
||||
- navigation.instant
|
||||
- navigation.tracking
|
||||
- navigation.tabs
|
||||
- navigation.tabs.sticky
|
||||
@@ -54,9 +53,6 @@ copyright: Copyright © itzg 2023.
|
||||
plugins:
|
||||
- search
|
||||
- autorefs
|
||||
- literate-nav:
|
||||
nav_file: README.md
|
||||
implicit_index: true
|
||||
- mkdocstrings:
|
||||
handlers:
|
||||
python:
|
||||
@@ -68,8 +64,11 @@ plugins:
|
||||
show_signature_annotations: true
|
||||
# https://github.com/ultrabug/mkdocs-static-i18n
|
||||
- i18n:
|
||||
default_language: en
|
||||
languages:
|
||||
en:
|
||||
- locale: en
|
||||
name: English
|
||||
build: true
|
||||
default: true
|
||||
- literate-nav:
|
||||
nav_file: README.md
|
||||
implicit_index: true
|
||||
|
||||
1
notes/.gitignore
vendored
Normal file
1
notes/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/*.bkp
|
||||
BIN
notes/container-network-namespaces.drawio.png
Normal file
BIN
notes/container-network-namespaces.drawio.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 130 KiB |
93
notes/rbac-processing.mmd
Normal file
93
notes/rbac-processing.mmd
Normal file
@@ -0,0 +1,93 @@
|
||||
[Scia Reto](https://sciareto.org) mind map
|
||||
> __version__=`1.1`,showJumps=`true`
|
||||
---
|
||||
|
||||
# RBAC processing
|
||||
|
||||
## inputs
|
||||
|
||||
### whitelist
|
||||
|
||||
#### command or space limited
|
||||
|
||||
##### uuid
|
||||
|
||||
##### username
|
||||
|
||||
### ops
|
||||
|
||||
#### username
|
||||
|
||||
#### uuid
|
||||
|
||||
### whitelist file
|
||||
|
||||
#### url?
|
||||
|
||||
##### yes
|
||||
|
||||
###### download
|
||||
|
||||
##### no
|
||||
|
||||
###### copy
|
||||
|
||||
### override whitelist?
|
||||
|
||||
#### yes
|
||||
|
||||
##### replace all with given input list
|
||||
|
||||
#### no
|
||||
|
||||
##### append only
|
||||
|
||||
## format
|
||||
|
||||
### version \< 1\.7\.6?
|
||||
|
||||
#### yes
|
||||
|
||||
##### text file listing usernames
|
||||
|
||||
###### white\-list\.txt
|
||||
|
||||
###### ops\.txt
|
||||
|
||||
#### no
|
||||
> leftSide=`true`
|
||||
|
||||
|
||||
##### json file
|
||||
|
||||
###### array of objects
|
||||
|
||||
####### name
|
||||
|
||||
######## can be any string, even an empty one
|
||||
|
||||
####### uuid
|
||||
> leftSide=`true`
|
||||
|
||||
|
||||
######## username to UUID API
|
||||
- LINK
|
||||
<pre>https://wiki.vg/Mojang_API#Username_to_UUID</pre>
|
||||
|
||||
######## needs to be "dashed" UUID syntax
|
||||
> leftSide=`true`
|
||||
|
||||
|
||||
####### ops?
|
||||
|
||||
######## yes
|
||||
|
||||
######### also includes
|
||||
|
||||
########## level
|
||||
|
||||
########### integer, usually a 4
|
||||
|
||||
########## bypassesPlayerLimit
|
||||
|
||||
########### boolean
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 67 KiB |
@@ -8,7 +8,6 @@
|
||||
: "${GID:=1000}"
|
||||
|
||||
umask 0002
|
||||
chmod g+w /data
|
||||
|
||||
if isTrue "${ENABLE_RCON:-true}" && ! [ -v RCON_PASSWORD ] && ! [ -v RCON_PASSWORD_FILE ]; then
|
||||
RCON_PASSWORD=$(openssl rand -hex 12)
|
||||
|
||||
@@ -135,7 +135,7 @@ then
|
||||
"${SCRIPTS:-/}start-rconcmds"
|
||||
fi
|
||||
|
||||
: ${MOD_PLATFORM:=}
|
||||
: "${MOD_PLATFORM:=}"
|
||||
case "${TYPE^^}" in
|
||||
AUTO_CURSEFORGE|MODRINTH|CURSEFORGE|FTB|FTBA)
|
||||
MOD_PLATFORM="$TYPE"
|
||||
@@ -159,6 +159,11 @@ if [[ $MOD_PLATFORM ]]; then
|
||||
MODRINTH)
|
||||
exec "${SCRIPTS:-/}start-deployModrinth" "$@"
|
||||
;;
|
||||
|
||||
*)
|
||||
log "ERROR; Invalid MOD_PLATFORM: '$MOD_PLATFORM'"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
@@ -180,6 +185,10 @@ case "${TYPE^^}" in
|
||||
exec "${SCRIPTS:-/}start-deployForge" "$@"
|
||||
;;
|
||||
|
||||
NEOFORGE|NEOFORGED)
|
||||
exec "${SCRIPTS:-/}start-deployNeoForge" "$@"
|
||||
;;
|
||||
|
||||
FABRIC)
|
||||
exec "${SCRIPTS:-/}start-deployFabric" "$@"
|
||||
;;
|
||||
@@ -237,10 +246,10 @@ case "${TYPE^^}" in
|
||||
;;
|
||||
|
||||
*)
|
||||
log "Invalid type: '$TYPE'"
|
||||
log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTBA (multiarch-only),"
|
||||
log " CURSEFORGE, SPONGEVANILLA, PURPUR, CUSTOM,"
|
||||
log " MAGMA, MOHIST, CATSERVER, AIRPLANE, PUFFERFISH, CANYON, LIMBO, CRUCIBLE"
|
||||
log "ERROR: Invalid TYPE: '$TYPE'"
|
||||
log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FOLIA, PURPUR, FABRIC, QUILT,"
|
||||
log " SPONGEVANILLA, CUSTOM, MAGMA, MOHIST, CATSERVER, AIRPLANE, PUFFERFISH,"
|
||||
log " CANYON, LIMBO, CRUCIBLE"
|
||||
exit 1
|
||||
;;
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ function buildSpigotFromSource {
|
||||
|
||||
logn ''
|
||||
curl -sSL -o /data/temp/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar && \
|
||||
java $jvmOpts -jar /data/temp/BuildTools.jar --rev $VANILLA_VERSION 2>&1 |tee /data/spigot_build.log| while read l; do echo -n .; done; log "done"
|
||||
java $jvmOpts -jar /data/temp/BuildTools.jar --rev "$VERSION" 2>&1 |tee /data/spigot_build.log| while read l; do echo -n .; done; log "done"
|
||||
|
||||
case ${TYPE^^} in
|
||||
SPIGOT)
|
||||
|
||||
@@ -29,4 +29,4 @@ fi
|
||||
|
||||
export FAMILY=HYBRID
|
||||
|
||||
exec "${SCRIPTS:-/}start-setupWorld" "$@"
|
||||
exec "${SCRIPTS:-/}start-spiget" "$@"
|
||||
|
||||
@@ -57,4 +57,4 @@ fi
|
||||
export SERVER
|
||||
export FAMILY=HYBRID
|
||||
|
||||
exec "${SCRIPTS:-$(dirname "$0")}/start-setupWorld" "$@"
|
||||
exec "${SCRIPTS:-/}start-spiget" "$@"
|
||||
|
||||
@@ -1,18 +1,22 @@
|
||||
#!/bin/bash
|
||||
|
||||
: "${CUSTOM_SERVER:=}"
|
||||
: "${GENERIC_PACK:=}"
|
||||
: "${CUSTOM_JAR_EXEC:=}"
|
||||
|
||||
# shellcheck source=start-utils
|
||||
. "${SCRIPTS:-/}start-utils"
|
||||
isDebugging && set -x
|
||||
|
||||
if isURL ${CUSTOM_SERVER}; then
|
||||
filename=$(basename ${CUSTOM_SERVER})
|
||||
if isURL "${CUSTOM_SERVER}"; then
|
||||
filename=$(basename "${CUSTOM_SERVER}")
|
||||
export SERVER=/data/${filename}
|
||||
|
||||
if [[ -f ${SERVER} ]] || [ -n "$FORCE_REDOWNLOAD" ]; then
|
||||
log "Using previously downloaded jar at ${SERVER}"
|
||||
else
|
||||
log "Downloading custom server jar from ${CUSTOM_SERVER} ..."
|
||||
if ! curl -sSL -o ${SERVER} ${CUSTOM_SERVER}; then
|
||||
if ! curl -sSL -o "${SERVER}" "${CUSTOM_SERVER}"; then
|
||||
log "Failed to download from ${CUSTOM_SERVER}"
|
||||
exit 2
|
||||
fi
|
||||
@@ -25,6 +29,9 @@ elif [[ ${GENERIC_PACK} ]]; then
|
||||
log "Using custom server jar from generic pack at ${CUSTOM_SERVER} ..."
|
||||
export SERVER=${CUSTOM_SERVER}
|
||||
|
||||
elif [[ ${CUSTOM_JAR_EXEC} ]]; then
|
||||
log "CUSTOM_JAR_EXEC is in use, so \$SERVER will not be set"
|
||||
|
||||
else
|
||||
log "CUSTOM_SERVER is not properly set to a URL or existing jar file"
|
||||
exit 2
|
||||
@@ -34,4 +41,4 @@ fi
|
||||
# Allow for overriding Family on custom for testing.
|
||||
export FAMILY="${FAMILY:-HYBRID}"
|
||||
|
||||
exec ${SCRIPTS:-/}start-setupWorld $@
|
||||
exec "${SCRIPTS:-/}start-setupWorld" "$@"
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
: "${FTB_FORCE_REINSTALL:=false}"
|
||||
|
||||
ftbInstallMarker=".ftb-installed"
|
||||
|
||||
# shellcheck source=start-utils
|
||||
@@ -32,7 +34,7 @@ elif ! [[ ${FTB_MODPACK_VERSION_ID} =~ [0-9]+ ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! [ -f "${ftbInstallMarker}" ] || [ "$(cat "${ftbInstallMarker}")" != "${FTB_MODPACK_ID}=${FTB_MODPACK_VERSION_ID}" ]; then
|
||||
if isTrue "$FTB_FORCE_REINSTALL" || ! [ -f "${ftbInstallMarker}" ] || [ "$(cat "${ftbInstallMarker}")" != "${FTB_MODPACK_ID}=${FTB_MODPACK_VERSION_ID}" ]; then
|
||||
ftbInstaller=/data/ftb-installer
|
||||
if ! [[ -f "${ftbInstaller}" ]]; then
|
||||
log "Downloading FTB installer"
|
||||
@@ -64,6 +66,8 @@ fi
|
||||
forgeVersion=$(jq -r '.targets|unique[] | select(.name == "forge") | .version' version.json)
|
||||
fabricVersion=$(jq -r '.targets|unique[] | select(.name == "fabric") | .version' version.json)
|
||||
mcVersion=$(jq -r '.targets|unique[] | select(.name == "minecraft") | .version' version.json)
|
||||
VERSION="$mcVersion"
|
||||
export VERSION
|
||||
|
||||
variants=(
|
||||
"forge-${mcVersion}-${forgeVersion}.jar"
|
||||
|
||||
@@ -26,4 +26,4 @@ fi
|
||||
export SERVER
|
||||
export FAMILY=HYBRID
|
||||
|
||||
exec "${SCRIPTS:-/}start-setupWorld" "$@"
|
||||
exec "${SCRIPTS:-/}start-spiget" "$@"
|
||||
|
||||
@@ -6,18 +6,28 @@ set -eu
|
||||
|
||||
resultsFile=/data/.install-modrinth.env
|
||||
|
||||
requireVar MODRINTH_PROJECT
|
||||
: "${MODRINTH_MODPACK:=${MODRINTH_PROJECT:-}}"
|
||||
: "${MODRINTH_LOADER:=}"
|
||||
: "${MODRINTH_VERSION:=${MODRINTH_VERSION_ID:-}}"
|
||||
: "${MODRINTH_IGNORE_MISSING_FILES:=}"
|
||||
|
||||
if [[ ! $MODRINTH_MODPACK ]]; then
|
||||
log "ERROR: MODRINTH_MODPACK must be set when using TYPE/MOD_PLATFORM of MODRINTH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
isDebugging && set -x
|
||||
|
||||
args=(
|
||||
--results-file="$resultsFile"
|
||||
--project="${MODRINTH_PROJECT}"
|
||||
--project="${MODRINTH_MODPACK}"
|
||||
--output-directory=/data
|
||||
)
|
||||
|
||||
if [[ $MODRINTH_IGNORE_MISSING_FILES ]]; then
|
||||
args+=(--ignore-missing-files "$MODRINTH_IGNORE_MISSING_FILES")
|
||||
fi
|
||||
|
||||
case "${VERSION^^}" in
|
||||
LATEST)
|
||||
: "${MODRINTH_DEFAULT_VERSION_TYPE:=release}"
|
||||
|
||||
@@ -40,4 +40,4 @@ fi
|
||||
|
||||
export FAMILY=HYBRID
|
||||
|
||||
exec "${SCRIPTS:-$(dirname "$0")}/start-setupWorld" "$@"
|
||||
exec "${SCRIPTS:-/}start-spiget" "$@"
|
||||
|
||||
30
scripts/start-deployNeoForge
Normal file
30
scripts/start-deployNeoForge
Normal file
@@ -0,0 +1,30 @@
|
||||
#!/bin/bash
|
||||
|
||||
: "${NEOFORGE_VERSION:=latest}"
|
||||
: "${NEOFORGE_FORCE_REINSTALL:=false}}"
|
||||
|
||||
# shellcheck source=start-utils
|
||||
. "${SCRIPTS:-$(dirname "$0")}/start-utils"
|
||||
isDebugging && set -x
|
||||
|
||||
resultsFile=/data/.run-neoforge.env
|
||||
|
||||
if ! mc-image-helper install-neoforge \
|
||||
--output-directory=/data \
|
||||
--results-file=${resultsFile} \
|
||||
--minecraft-version="${VERSION}" \
|
||||
--neoforge-version="${NEOFORGE_VERSION}" \
|
||||
--force-reinstall="${NEOFORGE_FORCE_REINSTALL}"; then
|
||||
log "ERROR failed to install Forge"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# grab SERVER and export it
|
||||
set -a
|
||||
# shellcheck disable=SC1090
|
||||
source ${resultsFile}
|
||||
set +a
|
||||
|
||||
export FAMILY=FORGE
|
||||
|
||||
exec "${SCRIPTS:-/}start-setupWorld" "$@"
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
: "${DEBUG_EXEC:=false}"
|
||||
: "${SETUP_ONLY:=false}"
|
||||
: "${CUSTOM_JAR_EXEC:=}"
|
||||
|
||||
# shellcheck source=start-utils
|
||||
. "${SCRIPTS:-/}start-utils"
|
||||
@@ -220,12 +221,18 @@ function copyFilesForCurseForge() {
|
||||
cp -f /data/eula.txt "${FTB_DIR}/"
|
||||
}
|
||||
|
||||
if versionLessThan 1.7; then
|
||||
if versionLessThan 'b1.8'; then
|
||||
echo "
|
||||
DISABLE_HEALTHCHECK=true
|
||||
" > /data/.mc-health.env
|
||||
elif versionLessThan 1.7; then
|
||||
echo "
|
||||
MC_HEALTH_EXTRA_ARGS=(
|
||||
--use-server-list-ping
|
||||
)
|
||||
" > /data/.mc-health.env
|
||||
else
|
||||
rm -f /data/.mc-health.env
|
||||
fi
|
||||
|
||||
mcServerRunnerArgs=(
|
||||
@@ -295,12 +302,23 @@ else
|
||||
|
||||
log "Starting the Minecraft server..."
|
||||
|
||||
# Specifically want the variables to expand to args, so...
|
||||
# shellcheck disable=SC2206
|
||||
finalArgs=(
|
||||
$JVM_XX_OPTS
|
||||
$JVM_OPTS
|
||||
$expandedDOpts
|
||||
-jar "$SERVER"
|
||||
)
|
||||
|
||||
if [[ $CUSTOM_JAR_EXEC ]]; then
|
||||
# shellcheck disable=SC2206
|
||||
finalArgs+=($CUSTOM_JAR_EXEC)
|
||||
else
|
||||
finalArgs+=(-jar "$SERVER")
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2206
|
||||
finalArgs+=(
|
||||
"$@" $EXTRA_ARGS
|
||||
)
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
set -e -o pipefail
|
||||
|
||||
: "${VANILLATWEAKS_FILE:=}"
|
||||
: "${VANILLATWEAKS_SHARECODE:=}"
|
||||
: "${REMOVE_OLD_DATAPACKS:=false}"
|
||||
: "${DATAPACKS_FILE:=}"
|
||||
: "${REMOVE_OLD_DATAPACKS_DEPTH:=1} "
|
||||
@@ -74,4 +76,12 @@ elif [[ "$DATAPACKS_FILE" ]]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
exec "${SCRIPTS:-/}start-setupForgeApiMods" "$@"
|
||||
if [[ ${VANILLATWEAKS_FILE} || ${VANILLATWEAKS_SHARECODE} ]]; then
|
||||
mc-image-helper vanillatweaks \
|
||||
--output-directory="/data" \
|
||||
--world-subdir="${LEVEL:-world}" \
|
||||
--share-codes="$VANILLATWEAKS_SHARECODE" \
|
||||
--pack-files="$VANILLATWEAKS_FILE"
|
||||
fi
|
||||
|
||||
exec "${SCRIPTS:-/}start-setupModpack" "$@"
|
||||
|
||||
@@ -8,14 +8,14 @@ set -e
|
||||
: "${REPLACE_ENV_IN_PLACE:=${REPLACE_ENV_VARIABLES:-false}}"
|
||||
: "${REPLACE_ENV_PATHS:=/data}"
|
||||
: "${REPLACE_ENV_SUFFIXES:=yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml}"
|
||||
: "${REPLACE_ENV_VARIABLE_PREFIX:=${ENV_VARIABLE_PREFIX:-CFG_}}"
|
||||
: "${REPLACE_ENV_VARIABLE_PREFIX=${ENV_VARIABLE_PREFIX:-CFG_}}"
|
||||
: "${REPLACE_ENV_VARIABLES_EXCLUDES:=}"
|
||||
: "${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}"
|
||||
: "${PATCH_DEFINITIONS:=}"
|
||||
: "${DEBUG:=false}"
|
||||
|
||||
if isTrue "${REPLACE_ENV_IN_PLACE}"; then
|
||||
log "Replacing env variables in ${REPLACE_ENV_PATHS} that match the prefix $REPLACE_ENV_VARIABLE_PREFIX ..."
|
||||
log "Replacing env variables in ${REPLACE_ENV_PATHS} that match the prefix '$REPLACE_ENV_VARIABLE_PREFIX' ..."
|
||||
|
||||
mc-image-helper interpolate \
|
||||
--replace-env-file-suffixes="${REPLACE_ENV_SUFFIXES}" \
|
||||
|
||||
@@ -1,244 +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}"
|
||||
: "${MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES:=false}"
|
||||
: "${MODS_FORGEAPI_IGNORE_GAMETYPE:=false}"
|
||||
: "${REMOVE_OLD_MODS_DEPTH:=1} "
|
||||
: "${REMOVE_OLD_MODS_INCLUDE:=*.jar,*-version.json}"
|
||||
|
||||
# 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
|
||||
FILTER_BY_FAMILY=false
|
||||
DOWNLOADED_MODIDS=()
|
||||
out_dir=/data/mods
|
||||
|
||||
# shellcheck source=start-utils
|
||||
. "${SCRIPTS:-/}start-utils"
|
||||
isDebugging && set -x
|
||||
|
||||
# Remove old mods/plugins
|
||||
if isTrue "${REMOVE_OLD_FORGEAPI_MODS}"; then
|
||||
removeOldMods "/data/mods"
|
||||
fi
|
||||
|
||||
# Family filter is on by default for Forge, Fabric, and Bukkit
|
||||
updateFamilyFilter(){
|
||||
if isFamily "FORGE" "FABRIC" "BUKKIT"; then
|
||||
FILTER_BY_FAMILY=true
|
||||
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,,}" ] || [ 1 = "${releaseType,,}" ]; then
|
||||
RELEASE_NUMBER_FILTER=1
|
||||
elif [ "beta" = "${releaseType,,}" ] || [ 2 = "${releaseType,,}" ]; then
|
||||
RELEASE_NUMBER_FILTER=2
|
||||
elif [ "alpha" = "${releaseType,,}" ] || [ 3 = "${releaseType,,}" ]; then
|
||||
RELEASE_NUMBER_FILTER=3
|
||||
fi
|
||||
}
|
||||
|
||||
retrieveVersionTypeNumber(){
|
||||
VERSION_NAME=$(get_major_version "$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. Check Forge API key or supplied Minecraft version"
|
||||
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
|
||||
project_id_file_name=$3
|
||||
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"
|
||||
unset 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.
|
||||
if [ "$project_id_file_name" ]; then
|
||||
# Looks for file by name
|
||||
current_project_file=$(jq -n "$project_files" | jq --arg FILE_NAME "$project_id_file_name" -jc '
|
||||
.data | map(select(.fileName<=($FILE_NAME))) | .[0] // empty')
|
||||
elif isFalse "${MODS_FORGEAPI_IGNORE_GAMETYPE}" && $FILTER_BY_FAMILY ; then
|
||||
# Looks for file by version and server type in lowercase
|
||||
current_project_file=$(jq -n "$project_files" | jq --arg RELEASE_FILTER "$RELEASE_NUMBER_FILTER" --arg GAME_TYPE "${FAMILY,,}" --arg VERSION "$VANILLA_VERSION" -jc '
|
||||
.data | sort_by(.id) | reverse | map(select(.gameVersions[] | ascii_downcase | contains ($GAME_TYPE))) | map(select(.gameVersions[] | contains ($VERSION))) | map(select(.releaseType<=($RELEASE_FILTER|tonumber))) | .[0] // empty')
|
||||
else
|
||||
# Looks for file by version only.
|
||||
current_project_file=$(jq -n "$project_files" | jq --arg RELEASE_FILTER "$RELEASE_NUMBER_FILTER" --arg VERSION "$VANILLA_VERSION" -jc '
|
||||
.data | sort_by(.id) | reverse | map(select(.gameVersions[] | contains ($VERSION))) | map(select(.releaseType<=($RELEASE_FILTER|tonumber))) | .[0] // empty')
|
||||
fi
|
||||
|
||||
# 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 // empty' )
|
||||
PROJECT_FILE_ID=$(jq -n "$PROJECT_FILE" | jq -jc '.id // empty' )
|
||||
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
|
||||
if [ ! "$PROJECT_FILE" ]; then
|
||||
log "ERROR: Unable to retrieve any files for ${project_id}, Release Type: ${RELEASE_NUMBER_FILTER}, FAMILY_TYPE: ${FAMILY,,}"
|
||||
exit 2
|
||||
fi
|
||||
}
|
||||
|
||||
downloadModPackfromModFile() {
|
||||
if [ ! "$PROJECT_FILE" ]; then
|
||||
log "ERROR: Project File not found from the ForgeAPI"
|
||||
exit 2
|
||||
fi
|
||||
# trys to make the output directory incase it doesnt exist.
|
||||
mkdir -p "$out_dir"
|
||||
debug "DEBUG: PROJECT_FILE: ${PROJECT_FILE}"
|
||||
# grabs needed values from our json return
|
||||
file_name=$(jq -n "$PROJECT_FILE" | jq -jc '.fileName // empty' )
|
||||
download_url=$(jq -n "$PROJECT_FILE" | jq -jc '.downloadUrl // empty' )
|
||||
mod_id=$(jq -n "$PROJECT_FILE" | jq -jc '.modId // empty' )
|
||||
|
||||
if [ ! -f "${out_dir}/${file_name}" ]; then
|
||||
echo "Downloading ${download_url}"
|
||||
# Track the mods we have downloaded.
|
||||
DOWNLOADED_MODIDS+=("${mod_id}")
|
||||
if ! get --skip-up-to-date -o "${out_dir}/${file_name}" "${download_url}"; then
|
||||
log "ERROR: failed to download from ${download_url}"
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
downloadDependencies(){
|
||||
if [ "$PROJECT_FILE" ]; then
|
||||
dependencies=$(jq -n "$PROJECT_FILE" | jq -jc '.dependencies' )
|
||||
required_dependencies=$(jq -n "$dependencies" | jq --arg REQUIRED_FILTER "3" -jc '
|
||||
map(select(.relationType==($REQUIRED_FILTER|tonumber)))')
|
||||
if [ "$required_dependencies" ]; then
|
||||
while read -r current_dependency; do
|
||||
mod_id=$(jq -n "$current_dependency" | jq -jc '.modId' )
|
||||
# Validate we have not tried to download the mod yet.
|
||||
if [[ ! "${DOWNLOADED_MODIDS[*]}" =~ $mod_id ]]; then
|
||||
modFileByProjectID "$mod_id" "release"
|
||||
downloadModPackfromModFile
|
||||
fi
|
||||
# needs to be piped in to keep look in main process
|
||||
done < <(jq -n "$required_dependencies" | jq -c '.[]?')
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Use forge api json file to filter and download the correct mods
|
||||
if [ "$MODS_FORGEAPI_FILE" ] && [ -z "$MODS_FORGEAPI_PROJECTIDS" ]; then
|
||||
ensureModKey
|
||||
updateFamilyFilter
|
||||
if [ ! -f "$MODS_FORGEAPI_FILE" ]; then
|
||||
log "ERROR: given MODS_FORGEAPI_FILE file does not exist"
|
||||
exit 2
|
||||
fi
|
||||
debug "DEBUG: MODS_FORGEAPI_KEY: ${MODS_FORGEAPI_FILE}"
|
||||
# Needs loop here to look up release types befor calling download.
|
||||
while read -r current_project; do
|
||||
debug "DEBUG: current_project: ${current_project}"
|
||||
# Per stack overflow we can use //empty to return empty string that works with -z
|
||||
project_id=$(jq -n "$current_project" | jq -r '.projectId // empty' )
|
||||
current_release_type=$(jq -n "$current_project" | jq -r '.releaseType // empty' )
|
||||
current_file_name=$(jq -n "$current_project" | jq -r '.fileName // empty' )
|
||||
|
||||
# Validate we have not tried to download the mod yet.
|
||||
if [[ ! "${DOWNLOADED_MODIDS[*]}" =~ $project_id ]]; then
|
||||
modFileByProjectID "$project_id" "$current_release_type" "$current_file_name"
|
||||
downloadModPackfromModFile
|
||||
if isTrue "${MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES}"; then
|
||||
downloadDependencies
|
||||
fi
|
||||
fi
|
||||
# needs to be piped in to keep look in main process
|
||||
done < <(jq -c '.[]?' $MODS_FORGEAPI_FILE)
|
||||
fi
|
||||
|
||||
# Use only project ids and global release data.
|
||||
if [ "$MODS_FORGEAPI_PROJECTIDS" ] && [ -z "$MODS_FORGEAPI_FILE" ]; then
|
||||
ensureModKey
|
||||
updateFamilyFilter
|
||||
for project_id in ${MODS_FORGEAPI_PROJECTIDS//,/ }; do
|
||||
# Validate we have not tried to download the mod yet.
|
||||
if [[ ! "${DOWNLOADED_MODIDS[*]}" =~ $project_id ]]; then
|
||||
modFileByProjectID $project_id
|
||||
downloadModPackfromModFile
|
||||
if isTrue "${MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES}"; then
|
||||
downloadDependencies
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
exec "${SCRIPTS:-/}start-setupModpack" "$@"
|
||||
@@ -143,51 +143,6 @@ function handleListings() {
|
||||
fi
|
||||
}
|
||||
|
||||
function handleCurseForgeManifest() {
|
||||
if [[ "$MANIFEST" ]]; then
|
||||
if [[ -e "$MANIFEST" ]]; then
|
||||
EFFECTIVE_MANIFEST_FILE=$MANIFEST
|
||||
elif isURL "$MANIFEST"; then
|
||||
EFFECTIVE_MANIFEST_FILE=/tmp/manifest.json
|
||||
EFFECTIVE_MANIFEST_URL=$(curl -Ls -o /dev/null -w "%{effective_url}" "$MANIFEST")
|
||||
curl -Ls -o $EFFECTIVE_MANIFEST_FILE "$EFFECTIVE_MANIFEST_URL"
|
||||
else
|
||||
log "MANIFEST='$MANIFEST' is not a valid manifest url or location"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
case "X$EFFECTIVE_MANIFEST_FILE" in
|
||||
X*.json)
|
||||
if [ -f "${EFFECTIVE_MANIFEST_FILE}" ]; then
|
||||
MOD_DIR=${FTB_BASE_DIR:-/data}/mods
|
||||
if [ ! -d "$MOD_DIR" ]
|
||||
then
|
||||
log "Creating mods dir $MOD_DIR"
|
||||
mkdir -p "$MOD_DIR"
|
||||
fi
|
||||
log "Starting manifest download..."
|
||||
jq -r '.files[] | (.projectID|tostring) + " " + (.fileID|tostring)' "${EFFECTIVE_MANIFEST_FILE}" | while read -r p f
|
||||
do
|
||||
if [ ! -f $MOD_DIR/${p}_${f}.jar ]
|
||||
then
|
||||
redirect_url="$(curl -Ls -o /dev/null -w "%{effective_url}" "${CURSE_URL_BASE}/${p}")"
|
||||
url="$redirect_url/download/${f}/file"
|
||||
log Downloading curseforge mod $url
|
||||
# Manifest usually doesn't have mod names. Using id should be fine, tho
|
||||
curl -sSL "${url}" -o $MOD_DIR/${p}_${f}.jar
|
||||
fi
|
||||
done
|
||||
else
|
||||
log "Could not find manifest file, insufficient privileges, or malformed path."
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
log "Invalid manifest file for modpack. Please make sure it is a .json file."
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
function handleGenericPacks() {
|
||||
: "${GENERIC_PACKS:=${GENERIC_PACK}}"
|
||||
: "${GENERIC_PACKS_PREFIX:=}"
|
||||
@@ -274,8 +229,12 @@ function handleGenericPacks() {
|
||||
|
||||
function handleModrinthProjects() {
|
||||
: "${MODRINTH_PROJECTS:=}"
|
||||
: "${MODRINTH_DOWNLOAD_OPTIONAL_DEPENDENCIES:=true}"
|
||||
: "${MODRINTH_ALLOWED_VERSION_TYPE:=release}"
|
||||
: "${MODRINTH_DOWNLOAD_DEPENDENCIES:=none}"
|
||||
if [[ -v MODRINTH_DOWNLOAD_OPTIONAL_DEPENDENCIES ]]; then
|
||||
log "WARNING The variable MODRINTH_DOWNLOAD_OPTIONAL_DEPENDENCIES is removed."
|
||||
log " Use MODRINTH_DOWNLOAD_DEPENDENCIES=optional instead"
|
||||
fi
|
||||
|
||||
if [[ $MODRINTH_PROJECTS ]] && isFamily HYBRID FORGE FABRIC SPIGOT; then
|
||||
if isFamily HYBRID FORGE; then
|
||||
@@ -291,21 +250,56 @@ function handleModrinthProjects() {
|
||||
--projects="${MODRINTH_PROJECTS}" \
|
||||
--game-version="${VERSION}" \
|
||||
--loader="$loader" \
|
||||
--download-optional-dependencies="$MODRINTH_DOWNLOAD_OPTIONAL_DEPENDENCIES" \
|
||||
--download-dependencies="$MODRINTH_DOWNLOAD_DEPENDENCIES" \
|
||||
--allowed-version-type="$MODRINTH_ALLOWED_VERSION_TYPE"
|
||||
fi
|
||||
}
|
||||
|
||||
function handleCurseForgeFiles() {
|
||||
args=()
|
||||
if usesMods && ! usesPlugins; then
|
||||
args+=(--default-category mc-mods)
|
||||
elif usesPlugins && ! usesMods; then
|
||||
args+=(--default-category bukkit-plugins)
|
||||
fi
|
||||
|
||||
case "${TYPE,,}" in
|
||||
forge|fabric|quilt)
|
||||
args+=(--mod-loader "$TYPE")
|
||||
;;
|
||||
esac
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
# since we want CURSEFORGE_FILES to expand
|
||||
mc-image-helper curseforge-files \
|
||||
"${args[@]}" \
|
||||
${CURSEFORGE_FILES}
|
||||
}
|
||||
|
||||
handlePackwiz
|
||||
|
||||
handleModpackZip
|
||||
|
||||
handleListings
|
||||
|
||||
handleCurseForgeManifest
|
||||
if [[ $MANIFEST ]]; then
|
||||
log "ERROR: MANIFEST is no longer supported."
|
||||
log " Use MOD_PLATFORM=AUTO_CURSEFORGE and CF_MODPACK_MANIFEST instead"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ $MODS_FORGEAPI_KEY || $MODS_FORGEAPI_FILE || $MODS_FORGEAPI_PROJECTIDS ]]; then
|
||||
log "ERROR the MODS_FORGEAPI_FILE / MODS_FORGEAPI_PROJECTIDS feature is no longer supported"
|
||||
log " Use CURSEFORGE_FILES instead."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
handleGenericPacks
|
||||
|
||||
handleModrinthProjects
|
||||
|
||||
if usesMods || usesPlugins; then
|
||||
handleCurseForgeFiles
|
||||
fi
|
||||
|
||||
exec "${SCRIPTS:-/}start-setupModconfig" "$@"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
: "${SYNC_SKIP_NEWER_IN_DESTINATION:=${PLUGINS_SYNC_UPDATE:-true}}"
|
||||
: "${REPLACE_ENV_DURING_SYNC:=true}"
|
||||
: "${REPLACE_ENV_SUFFIXES:=yml,yaml,txt,cfg,conf,properties,hjson,json,tml,toml}"
|
||||
: "${REPLACE_ENV_VARIABLE_PREFIX:=${ENV_VARIABLE_PREFIX:-CFG_}}"
|
||||
: "${REPLACE_ENV_VARIABLE_PREFIX=${ENV_VARIABLE_PREFIX:-CFG_}}"
|
||||
: "${REPLACE_ENV_VARIABLES_EXCLUDES:=}"
|
||||
: "${REPLACE_ENV_VARIABLES_EXCLUDE_PATHS:=}"
|
||||
: "${DEBUG:=false}"
|
||||
|
||||
@@ -1,98 +1,87 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
: "${EXISTING_OPS_FILE:=SKIP}"
|
||||
: "${EXISTING_WHITELIST_FILE:=SKIP}"
|
||||
|
||||
if [[ -v APPEND_OPS ]] && isTrue "${APPEND_OPS}"; then
|
||||
EXISTING_OPS_FILE=MERGE
|
||||
elif [[ -v OVERRIDE_OPS ]] && isTrue "${OVERRIDE_OPS}"; then
|
||||
EXISTING_OPS_FILE=SYNCHRONIZE
|
||||
fi
|
||||
|
||||
if [[ -v APPEND_WHITELIST ]] && isTrue "${APPEND_WHITELIST}"; then
|
||||
EXISTING_WHITELIST_FILE=MERGE
|
||||
elif [[ -v OVERRIDE_WHITELIST ]] && isTrue "${OVERRIDE_WHITELIST}"; then
|
||||
EXISTING_WHITELIST_FILE=SYNCHRONIZE
|
||||
fi
|
||||
|
||||
# shellcheck source=start-utils
|
||||
. "${SCRIPTS:-/}start-utils"
|
||||
isDebugging && set -x
|
||||
|
||||
if versionLessThan 1.7.6; then
|
||||
opsFile=ops.txt
|
||||
whitelistFile=white-list.txt
|
||||
else
|
||||
opsFile=ops.json
|
||||
whitelistFile=whitelist.json
|
||||
sharedArgs=(--version="$VERSION")
|
||||
if isFalse "${ONLINE_MODE:-true}"; then
|
||||
sharedArgs+=( --offline )
|
||||
fi
|
||||
|
||||
function process_user_file() {
|
||||
local output=$1
|
||||
local source=$2
|
||||
|
||||
if isURL "$source"; then
|
||||
log "Downloading $output from $source"
|
||||
if ! get -o "/data/$output" "$source"; then
|
||||
log "ERROR: failed to download from $source"
|
||||
exit 2
|
||||
fi
|
||||
else
|
||||
log "Copying $output from $source"
|
||||
if ! cp "$source" "/data/$output"; then
|
||||
log "ERROR: failed to copy from $source"
|
||||
exit 1
|
||||
fi
|
||||
if [[ -v OPS_FILE ]]; then
|
||||
existing="$EXISTING_OPS_FILE"
|
||||
if [[ "$EXISTING_OPS_FILE" = SYNC_FILE_MERGE_LIST ]]; then
|
||||
existing=SYNCHRONIZE
|
||||
fi
|
||||
}
|
||||
|
||||
function process_user_csv() {
|
||||
local output=$1
|
||||
local list=$2
|
||||
local playerDataList
|
||||
|
||||
if [[ "$output" == *"ops"* ]]; then
|
||||
# Extra data for ops.json
|
||||
userData='{"uuid": .id, "name": .username, "level": 4}'
|
||||
else
|
||||
userData='{"uuid": .id, "name": .username}'
|
||||
mc-image-helper manage-users \
|
||||
"${sharedArgs[@]}" \
|
||||
--type=JAVA_OPS \
|
||||
--input-is-file \
|
||||
--existing="${existing}" \
|
||||
"$OPS_FILE"
|
||||
fi
|
||||
if [[ -v OPS ]]; then
|
||||
args=()
|
||||
if isTrue "${APPEND_OPS:-false}" || isFalse "${OVERRIDE_OPS:-true}"; then
|
||||
args+=(--append-only)
|
||||
fi
|
||||
|
||||
log "Updating ${output%.*}"
|
||||
for i in ${list//,/ }
|
||||
do
|
||||
if [ -e "$output" ] && grep -q "$i" "$output"; then
|
||||
log "$i already present in $output, skipping"
|
||||
continue
|
||||
fi
|
||||
if ! playerData=$(get "https://playerdb.co/api/player/minecraft/$i" | jq -re ".data.player"); then
|
||||
log "WARNING: Could not lookup user $i for ${output} addition"
|
||||
else
|
||||
playerDataList=$playerDataList$(echo "$playerData" | jq -r "$userData")
|
||||
fi
|
||||
done
|
||||
local newUsers=$(echo "$playerDataList" | jq -s .)
|
||||
if [[ $output =~ .*\.txt ]]; then
|
||||
# username list for txt config (Minecraft <= 1.7.5)
|
||||
echo $newUsers | jq -r '.[].name' >> "/data/${output}"
|
||||
sort -u /data/${output} -o /data/${output}
|
||||
elif [ -e /data/${output} ]; then
|
||||
# Merge with existing json file
|
||||
local currentUsers=$(cat "/data/${output}")
|
||||
jq --argjson current "$currentUsers" --argjson new "$newUsers" -n '$new + $current | unique_by(.uuid)' > "/data/${output}"
|
||||
else
|
||||
# New json file
|
||||
echo $newUsers > "/data/${output}"
|
||||
existing="$EXISTING_OPS_FILE"
|
||||
if [[ "$EXISTING_OPS_FILE" = SYNC_FILE_MERGE_LIST ]]; then
|
||||
existing=MERGE
|
||||
fi
|
||||
}
|
||||
|
||||
if isTrue "${OVERRIDE_OPS}"; then
|
||||
log "Recreating ${opsFile} file at server startup"
|
||||
rm -f /data/${opsFile}
|
||||
fi
|
||||
if [ -n "${OPS_FILE}" ] && [ ! -e "/data/${opsFile}" ]; then
|
||||
process_user_file ${opsFile} "$OPS_FILE"
|
||||
fi
|
||||
if [ -n "${OPS}" ]; then
|
||||
process_user_csv ${opsFile} "$OPS"
|
||||
# shellcheck disable=SC2086
|
||||
mc-image-helper manage-users \
|
||||
"${sharedArgs[@]}" "${args[@]}" \
|
||||
--type=JAVA_OPS \
|
||||
--existing="${existing}" \
|
||||
$OPS
|
||||
fi
|
||||
|
||||
if isTrue "${OVERRIDE_WHITELIST}"; then
|
||||
log "Recreating ${whitelistFile} file at server startup"
|
||||
rm -f /data/${whitelistFile}
|
||||
if [[ -v WHITELIST_FILE ]]; then
|
||||
existing="$EXISTING_WHITELIST_FILE"
|
||||
if [[ "$EXISTING_WHITELIST_FILE" = SYNC_FILE_MERGE_LIST ]]; then
|
||||
existing=SYNCHRONIZE
|
||||
fi
|
||||
mc-image-helper manage-users \
|
||||
"${sharedArgs[@]}" \
|
||||
--type=JAVA_WHITELIST \
|
||||
--input-is-file \
|
||||
--existing="${existing}" \
|
||||
"$WHITELIST_FILE"
|
||||
fi
|
||||
if [ -n "${WHITELIST_FILE}" ] && [ ! -e "/data/${whitelistFile}" ]; then
|
||||
process_user_file ${whitelistFile} "$WHITELIST_FILE"
|
||||
if [[ -v WHITELIST ]]; then
|
||||
args=()
|
||||
if isTrue "${APPEND_WHITELIST:-false}" || isFalse "${OVERRIDE_WHITELIST:-true}"; then
|
||||
args+=(--append-only)
|
||||
fi
|
||||
existing="$EXISTING_WHITELIST_FILE"
|
||||
if [[ "$EXISTING_WHITELIST_FILE" = SYNC_FILE_MERGE_LIST ]]; then
|
||||
existing=MERGE
|
||||
fi
|
||||
# shellcheck disable=SC2086
|
||||
mc-image-helper manage-users \
|
||||
"${sharedArgs[@]}" "${args[@]}" \
|
||||
--type=JAVA_WHITELIST \
|
||||
--existing="${existing}" \
|
||||
$WHITELIST
|
||||
fi
|
||||
if [ -n "${WHITELIST}" ]; then
|
||||
process_user_csv ${whitelistFile} "$WHITELIST"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
exec "${SCRIPTS:-/}start-finalExec" "$@"
|
||||
|
||||
@@ -8,49 +8,18 @@
|
||||
: "${SKIP_SERVER_PROPERTIES:=false}"
|
||||
: "${ENABLE_WHITELIST:=}"
|
||||
|
||||
# FUNCTIONS
|
||||
function setServerPropValue {
|
||||
local prop=$1
|
||||
local value=$2
|
||||
# normalize booleans
|
||||
case ${value^^} in
|
||||
TRUE|FALSE)
|
||||
value=${value,,} ;;
|
||||
esac
|
||||
if [[ $prop =~ password ]]; then
|
||||
showValue="*****"
|
||||
else
|
||||
showValue="$value"
|
||||
fi
|
||||
if [ -f "$SERVER_PROPERTIES" ] && grep "${prop}" "$SERVER_PROPERTIES" > /dev/null; then
|
||||
debug "Setting ${prop} to '${showValue}' in ${SERVER_PROPERTIES}"
|
||||
sed -i "/^${prop}\s*=/ c ${prop}=${value//\\/\\\\}" "$SERVER_PROPERTIES"
|
||||
else
|
||||
debug "Adding ${prop} with '${showValue}' in ${SERVER_PROPERTIES}"
|
||||
echo "${prop}=${value}" >> "$SERVER_PROPERTIES"
|
||||
fi
|
||||
}
|
||||
|
||||
function setServerProp {
|
||||
local prop=$1
|
||||
local varName=$2
|
||||
|
||||
if [ -v $varName ]; then
|
||||
setServerPropValue "$prop" "${!varName}"
|
||||
fi
|
||||
}
|
||||
|
||||
function customizeServerProps {
|
||||
local firstSetup=$1
|
||||
# Whitelist processing
|
||||
if [ -n "$WHITELIST" ] || [ -n "$WHITELIST_FILE" ] || isTrue "${ENABLE_WHITELIST}"; then
|
||||
log "Enabling whitelist functionality"
|
||||
setServerPropValue "white-list" "true"
|
||||
setServerPropValue "enforce-whitelist" "true"
|
||||
WHITELIST_PROP=true
|
||||
ENFORCE_WHITELIST=true
|
||||
export WHITELIST_PROP ENFORCE_WHITELIST
|
||||
elif isTrue "$firstSetup" || isFalse "${ENABLE_WHITELIST}"; then
|
||||
log "Disabling whitelist functionality"
|
||||
setServerPropValue "white-list" "false"
|
||||
setServerProp "enforce-whitelist" ENFORCE_WHITELIST
|
||||
WHITELIST_PROP=false
|
||||
export WHITELIST_PROP
|
||||
fi
|
||||
|
||||
# normalize MOTD
|
||||
@@ -59,101 +28,11 @@ function customizeServerProps {
|
||||
MOTD="{\"text\":\"${MOTD}\"}"
|
||||
fi
|
||||
fi
|
||||
|
||||
setServerProp "server-name" SERVER_NAME
|
||||
setServerProp "server-ip" SERVER_IP
|
||||
setServerProp "server-port" SERVER_PORT
|
||||
setServerProp "allow-nether" ALLOW_NETHER
|
||||
setServerProp "announce-player-achievements" ANNOUNCE_PLAYER_ACHIEVEMENTS
|
||||
setServerProp "enable-command-block" ENABLE_COMMAND_BLOCK
|
||||
setServerProp "spawn-animals" SPAWN_ANIMALS
|
||||
setServerProp "spawn-monsters" SPAWN_MONSTERS
|
||||
setServerProp "spawn-npcs" SPAWN_NPCS
|
||||
setServerProp "spawn-protection" SPAWN_PROTECTION
|
||||
setServerProp "generate-structures" GENERATE_STRUCTURES
|
||||
setServerProp "view-distance" VIEW_DISTANCE
|
||||
setServerProp "hardcore" HARDCORE
|
||||
setServerProp "snooper-enabled" SNOOPER_ENABLED
|
||||
setServerProp "max-build-height" MAX_BUILD_HEIGHT
|
||||
setServerProp "force-gamemode" FORCE_GAMEMODE
|
||||
setServerProp "max-tick-time" MAX_TICK_TIME
|
||||
setServerProp "enable-query" ENABLE_QUERY
|
||||
setServerProp "query.port" QUERY_PORT
|
||||
setServerProp "enable-rcon" ENABLE_RCON
|
||||
setServerProp "rcon.password" RCON_PASSWORD
|
||||
setServerProp "rcon.port" RCON_PORT
|
||||
setServerProp "max-players" MAX_PLAYERS
|
||||
setServerProp "max-world-size" MAX_WORLD_SIZE
|
||||
setServerProp "level-name" LEVEL
|
||||
setServerProp "level-seed" SEED
|
||||
setServerProp "pvp" PVP
|
||||
setServerProp "generator-settings" GENERATOR_SETTINGS
|
||||
setServerProp "online-mode" ONLINE_MODE
|
||||
setServerProp "allow-flight" ALLOW_FLIGHT
|
||||
setServerProp "resource-pack" RESOURCE_PACK
|
||||
setServerProp "resource-pack-sha1" RESOURCE_PACK_SHA1
|
||||
setServerProp "require-resource-pack" RESOURCE_PACK_ENFORCE
|
||||
setServerProp "player-idle-timeout" PLAYER_IDLE_TIMEOUT
|
||||
setServerProp "broadcast-console-to-ops" BROADCAST_CONSOLE_TO_OPS
|
||||
setServerProp "broadcast-rcon-to-ops" BROADCAST_RCON_TO_OPS
|
||||
setServerProp "enable-jmx-monitoring" ENABLE_JMX
|
||||
setServerProp "sync-chunk-writes" SYNC_CHUNK_WRITES
|
||||
setServerProp "enable-status" ENABLE_STATUS
|
||||
setServerProp "entity-broadcast-range-percentage" ENTITY_BROADCAST_RANGE_PERCENTAGE
|
||||
setServerProp "function-permission-level" FUNCTION_PERMISSION_LEVEL
|
||||
setServerProp "network-compression-threshold" NETWORK_COMPRESSION_THRESHOLD
|
||||
setServerProp "op-permission-level" OP_PERMISSION_LEVEL
|
||||
setServerProp "prevent-proxy-connections" PREVENT_PROXY_CONNECTIONS
|
||||
setServerProp "use-native-transport" USE_NATIVE_TRANSPORT
|
||||
setServerProp "simulation-distance" SIMULATION_DISTANCE
|
||||
setServerProp "previews-chat" PREVIEWS_CHAT
|
||||
setServerProp "enforce-secure-profile" ENFORCE_SECURE_PROFILE
|
||||
setServerProp "initial-enabled-packs" INITIAL_ENABLED_PACKS
|
||||
setServerProp "initial-disabled-packs" INITIAL_DISABLED_PACKS
|
||||
if [[ $MOTD ]]; then
|
||||
setServerPropValue "motd" "$(echo "$MOTD" | mc-image-helper asciify)"
|
||||
fi
|
||||
[[ $LEVEL_TYPE ]] && setServerPropValue "level-type" "${LEVEL_TYPE^^}"
|
||||
|
||||
if [ -n "$DIFFICULTY" ]; then
|
||||
case ${DIFFICULTY,,} in
|
||||
peaceful|0)
|
||||
if versionLessThan 1.13; then
|
||||
DIFFICULTY=0
|
||||
else
|
||||
DIFFICULTY=peaceful
|
||||
fi
|
||||
;;
|
||||
easy|1)
|
||||
if versionLessThan 1.13; then
|
||||
DIFFICULTY=1
|
||||
else
|
||||
DIFFICULTY=easy
|
||||
fi
|
||||
;;
|
||||
normal|2)
|
||||
if versionLessThan 1.13; then
|
||||
DIFFICULTY=2
|
||||
else
|
||||
DIFFICULTY=normal
|
||||
fi
|
||||
;;
|
||||
hard|3)
|
||||
if versionLessThan 1.13; then
|
||||
DIFFICULTY=3
|
||||
else
|
||||
DIFFICULTY=hard
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
log "DIFFICULTY must be peaceful, easy, normal, or hard."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
setServerPropValue "difficulty" "$DIFFICULTY"
|
||||
MOTD="$(echo "$MOTD" | mc-image-helper asciify)"
|
||||
fi
|
||||
|
||||
if [ -n "$MODE" ]; then
|
||||
if [[ -v MODE ]]; then
|
||||
log "Setting mode"
|
||||
case ${MODE,,} in
|
||||
su*|0)
|
||||
@@ -189,8 +68,58 @@ function customizeServerProps {
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
setServerPropValue "gamemode" "$MODE"
|
||||
fi
|
||||
|
||||
if [[ -v DIFFICULTY ]]; then
|
||||
case ${DIFFICULTY,,} in
|
||||
peaceful|0)
|
||||
if versionLessThan 1.13; then
|
||||
DIFFICULTY=0
|
||||
else
|
||||
DIFFICULTY=peaceful
|
||||
fi
|
||||
;;
|
||||
easy|1)
|
||||
if versionLessThan 1.13; then
|
||||
DIFFICULTY=1
|
||||
else
|
||||
DIFFICULTY=easy
|
||||
fi
|
||||
;;
|
||||
normal|2)
|
||||
if versionLessThan 1.13; then
|
||||
DIFFICULTY=2
|
||||
else
|
||||
DIFFICULTY=normal
|
||||
fi
|
||||
;;
|
||||
hard|3)
|
||||
if versionLessThan 1.13; then
|
||||
DIFFICULTY=3
|
||||
else
|
||||
DIFFICULTY=hard
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
log "DIFFICULTY must be peaceful, easy, normal, or hard."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if [[ -v LEVEL_TYPE ]]; then
|
||||
LEVEL_TYPE="${LEVEL_TYPE^^}"
|
||||
fi
|
||||
|
||||
setPropertiesArgs=(
|
||||
--definitions "/image/property-definitions.json"
|
||||
)
|
||||
if [[ -v CUSTOM_SERVER_PROPERTIES ]]; then
|
||||
setPropertiesArgs+=(--custom-properties "$CUSTOM_SERVER_PROPERTIES")
|
||||
fi
|
||||
|
||||
mc-image-helper set-properties "${setPropertiesArgs[@]}" "$SERVER_PROPERTIES"
|
||||
|
||||
}
|
||||
|
||||
# Deploy server.properties file
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e -o pipefail
|
||||
|
||||
: "${VANILLATWEAKS_FILE:=}"
|
||||
: "${VANILLATWEAKS_SHARECODE:=}"
|
||||
|
||||
# shellcheck source=start-utils
|
||||
. "${SCRIPTS:-/}start-utils"
|
||||
|
||||
if [[ ${VANILLATWEAKS_FILE} || ${VANILLATWEAKS_SHARECODE} ]]; then
|
||||
mc-image-helper vanillatweaks \
|
||||
--output-directory="/data" \
|
||||
--world-subdir="${LEVEL:-world}" \
|
||||
--share-codes="$VANILLATWEAKS_SHARECODE" \
|
||||
--pack-files="$VANILLATWEAKS_FILE"
|
||||
fi
|
||||
|
||||
exec "${SCRIPTS:-/}start-setupDatapack" "$@"
|
||||
@@ -48,7 +48,7 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
||||
count=$(echo "$baseDirs" | wc -l)
|
||||
if [[ $count -gt 1 ]]; then
|
||||
baseDirsNoSpigotSuffix=$(echo "$baseDirs" | sed -re 's:(_nether|_the_end)/?$::' | sort -u)
|
||||
if [ $(echo "$baseDirsNoSpigotSuffix" | wc -l) -eq 1 ]; then
|
||||
if [ "$(echo "$baseDirsNoSpigotSuffix" | wc -l)" -eq 1 ]; then
|
||||
baseDir="$baseDirsNoSpigotSuffix"
|
||||
baseName=$(basename "$baseDir")
|
||||
log "Found Spigot naming conventions, taking $baseName as main dimension"
|
||||
@@ -123,4 +123,4 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
||||
fi
|
||||
fi
|
||||
|
||||
exec "${SCRIPTS:-/}start-setupVanillaTweaks" "$@"
|
||||
exec "${SCRIPTS:-/}start-setupDatapack" "$@"
|
||||
|
||||
@@ -208,14 +208,17 @@ eula=${EULA,,}
|
||||
function removeOldMods {
|
||||
if [ -d "$1" ]; then
|
||||
log "Removing old mods including:${REMOVE_OLD_MODS_INCLUDE} excluding:${REMOVE_OLD_MODS_EXCLUDE}"
|
||||
mc-image-helper find \
|
||||
--delete \
|
||||
--type file,directory \
|
||||
--min-depth=1 --max-depth "${REMOVE_OLD_MODS_DEPTH:-16}" \
|
||||
--name "${REMOVE_OLD_MODS_INCLUDE:-*}" \
|
||||
--exclude-name "${REMOVE_OLD_MODS_EXCLUDE:-}" \
|
||||
--quiet \
|
||||
"$1"
|
||||
args=(
|
||||
--delete
|
||||
--type file
|
||||
--min-depth=1 --max-depth "${REMOVE_OLD_MODS_DEPTH:-16}"
|
||||
--name "${REMOVE_OLD_MODS_INCLUDE:-*}"
|
||||
--exclude-name "${REMOVE_OLD_MODS_EXCLUDE:-}"
|
||||
)
|
||||
if ! isDebugging; then
|
||||
args+=(--quiet)
|
||||
fi
|
||||
mc-image-helper find "${args[@]}" "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
22
tests/setuponlytests/cf_files/docker-compose.yml
Normal file
22
tests/setuponlytests/cf_files/docker-compose.yml
Normal file
@@ -0,0 +1,22 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
mc:
|
||||
restart: "no"
|
||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
||||
environment:
|
||||
EULA: "TRUE"
|
||||
SETUP_ONLY: "TRUE"
|
||||
TYPE: FABRIC
|
||||
VERSION: 1.18.2
|
||||
# Contains mix of Forge and Fabric mods
|
||||
CURSEFORGE_FILES: |
|
||||
https://www.curseforge.com/minecraft/mc-mods/clumps/files/4153343
|
||||
jei
|
||||
306612
|
||||
@/extras/listing.txt
|
||||
CF_API_KEY: ${CF_API_KEY}
|
||||
volumes:
|
||||
- ./data:/data
|
||||
- ./fake.jar:/servers/fake.jar:ro
|
||||
- ./listing.txt:/extras/listing.txt:ro
|
||||
1
tests/setuponlytests/cf_files/listing.txt
Normal file
1
tests/setuponlytests/cf_files/listing.txt
Normal file
@@ -0,0 +1 @@
|
||||
architectury-api@4.11.93
|
||||
1
tests/setuponlytests/cf_files/require.sh
Normal file
1
tests/setuponlytests/cf_files/require.sh
Normal file
@@ -0,0 +1 @@
|
||||
[[ $CF_API_KEY ]] || exit 1
|
||||
5
tests/setuponlytests/cf_files/verify.sh
Normal file
5
tests/setuponlytests/cf_files/verify.sh
Normal file
@@ -0,0 +1,5 @@
|
||||
mc-image-helper assert fileExists "/data/mods/architectury-*-fabric.jar"
|
||||
mc-image-helper assert fileExists "/data/mods/Clumps-fabric-*.jar"
|
||||
mc-image-helper assert fileExists "/data/mods/fabric-api-*.jar"
|
||||
mc-image-helper assert fileExists "/data/mods/jei-*-fabric-*.jar"
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
[[ $EXTENDED_TESTS ]] || exit 1
|
||||
@@ -0,0 +1 @@
|
||||
[[ $EXTENDED_TESTS ]] || exit 1
|
||||
@@ -1,27 +0,0 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
mc:
|
||||
restart: "no"
|
||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
||||
environment:
|
||||
EULA: "TRUE"
|
||||
SETUP_ONLY: "TRUE"
|
||||
DEBUG: "FALSE"
|
||||
# Using custom to bypass Fabric setup
|
||||
TYPE: CUSTOM
|
||||
# Using family to test FORGEAPI Family filter.
|
||||
FAMILY: FABRIC
|
||||
CUSTOM_SERVER: /servers/fake.jar
|
||||
VERSION: 1.18.2
|
||||
MODS_FORGEAPI_FILE: /config/forgeapi_mods.json
|
||||
# Key is passed by Github Workflow
|
||||
# This should be coming from github secrets.
|
||||
MODS_FORGEAPI_KEY: ${MODS_FORGEAPI_KEY}
|
||||
REMOVE_OLD_FORGEAPI_MODS: "TRUE"
|
||||
# Validates that Fabric API gets download as a dependency.
|
||||
MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES: "TRUE"
|
||||
volumes:
|
||||
- ./forgeapi_mods.json:/config/forgeapi_mods.json:ro
|
||||
- ./data:/data
|
||||
- ./fake.jar:/servers/fake.jar
|
||||
@@ -1,11 +0,0 @@
|
||||
[
|
||||
{
|
||||
"name": "Flan (Land Claim Tool)",
|
||||
"projectId": "404578"
|
||||
},
|
||||
{
|
||||
"name": "Fabric Voice Mod",
|
||||
"projectId": "416089",
|
||||
"releaseType": "beta"
|
||||
}
|
||||
]
|
||||
@@ -1,2 +0,0 @@
|
||||
[[ $MINECRAFT_VERSION == LATEST ]] || exit 1
|
||||
[[ $MODS_FORGEAPI_KEY ]] || exit 1
|
||||
@@ -1,5 +0,0 @@
|
||||
# Validates specific beta call out for specific mod:
|
||||
mc-image-helper assert fileExists "/data/mods/voicechat-fabric*"
|
||||
mc-image-helper assert fileExists "/data/mods/flan*"
|
||||
# Dependent of flan:
|
||||
mc-image-helper assert fileExists "/data/mods/fabric-api*"
|
||||
@@ -1,30 +0,0 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
mc:
|
||||
restart: "no"
|
||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
||||
environment:
|
||||
EULA: "TRUE"
|
||||
SETUP_ONLY: "TRUE"
|
||||
DEBUG: "FALSE"
|
||||
# Using custom to bypass Fabric setup
|
||||
TYPE: CUSTOM
|
||||
# Using family to test FORGEAPI Family filter.
|
||||
FAMILY: FABRIC
|
||||
CUSTOM_SERVER: /servers/fake.jar
|
||||
VERSION: 1.18.2
|
||||
# Validate Skip Gametype Filter:
|
||||
MODS_FORGEAPI_IGNORE_GAMETYPE: "TRUE"
|
||||
# Validates that Biomes does not download terrablender
|
||||
# Using default false for testing:
|
||||
MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES: "FALSE"
|
||||
# Contains mix of Forge and Fabric mods
|
||||
MODS_FORGEAPI_PROJECTIDS: 416089,493246
|
||||
# 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"
|
||||
volumes:
|
||||
- ./data:/data
|
||||
- ./fake.jar:/servers/fake.jar
|
||||
@@ -1,2 +0,0 @@
|
||||
[[ $MINECRAFT_VERSION == LATEST ]] || exit 1
|
||||
[[ $MODS_FORGEAPI_KEY ]] || exit 1
|
||||
@@ -1,5 +0,0 @@
|
||||
# testing dependencies don't get downloaded when download dependencies is set to false.
|
||||
mc-image-helper assert fileExists "/data/mods/voicechat-fabric*"
|
||||
mc-image-helper assert fileExists "/data/mods/flan*"
|
||||
# Dependent of flan, but dependencies are set to false:
|
||||
! mc-image-helper assert fileExists "/data/mods/fabric-api*"
|
||||
@@ -1,26 +0,0 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
mc:
|
||||
restart: "no"
|
||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
||||
environment:
|
||||
EULA: "TRUE"
|
||||
SETUP_ONLY: "TRUE"
|
||||
# Using custom to bypass Fabric setup
|
||||
TYPE: CUSTOM
|
||||
# Validate Skip Gametype Filter for vanilla
|
||||
# - Currently we do not support filtering on vanilla.
|
||||
FAMILY: VANILLA
|
||||
CUSTOM_SERVER: /servers/fake.jar
|
||||
VERSION: 1.18.2
|
||||
MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES: "TRUE"
|
||||
# Contains mix of Forge and Fabric mods
|
||||
MODS_FORGEAPI_PROJECTIDS: 416089,419697
|
||||
# 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"
|
||||
volumes:
|
||||
- ./data:/data
|
||||
- ./fake.jar:/servers/fake.jar
|
||||
@@ -1,2 +0,0 @@
|
||||
[[ $MINECRAFT_VERSION == LATEST ]] || exit 1
|
||||
[[ $MODS_FORGEAPI_KEY ]] || exit 1
|
||||
@@ -1,6 +0,0 @@
|
||||
# No family filter applied, DO NOT use Fabric or Forge specific name validation as it may cause random breakage.
|
||||
mc-image-helper assert fileExists "/data/mods/voicechat-fabric-1*"
|
||||
# Should be pull v4 and higher for 1.18.2:
|
||||
mc-image-helper assert fileExists "/data/mods/architectury-4*"
|
||||
mc-image-helper assert fileExists "/data/mods/fabric-api*"
|
||||
|
||||
1
tests/setuponlytests/icon-file-exact/require.sh
Normal file
1
tests/setuponlytests/icon-file-exact/require.sh
Normal file
@@ -0,0 +1 @@
|
||||
[[ $EXTENDED_TESTS ]] || exit 1
|
||||
1
tests/setuponlytests/icon-gif-multiframe/require.sh
Normal file
1
tests/setuponlytests/icon-gif-multiframe/require.sh
Normal file
@@ -0,0 +1 @@
|
||||
[[ $EXTENDED_TESTS ]] || exit 1
|
||||
1
tests/setuponlytests/icon-png-atscale/require.sh
Normal file
1
tests/setuponlytests/icon-png-atscale/require.sh
Normal file
@@ -0,0 +1 @@
|
||||
[[ $EXTENDED_TESTS ]] || exit 1
|
||||
@@ -0,0 +1 @@
|
||||
[[ $EXTENDED_TESTS ]] || exit 1
|
||||
@@ -0,0 +1 @@
|
||||
[[ $EXTENDED_TESTS ]] || exit 1
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user