Compare commits

...

23 Commits

Author SHA1 Message Date
dependabot[bot]
6402e72fda build(deps): bump mkdocstrings-python from 2.0.2 to 2.0.3 in /docs in the patches group (#3952) 2026-02-23 08:08:22 -06:00
Geoff Bourne
8b2f26535d Refactor issue label workflow for Discord notifications (#3950) 2026-02-21 17:15:30 -06:00
Spencer
e202239e66 Update link to example compose file for HTTP Proxy config (#3949) 2026-02-19 18:35:16 -06:00
Geoff Bourne
4e4d6959e4 Bump latest to java 25 in images.json (#3948) 2026-02-16 16:08:58 -06:00
renovate[bot]
92f3200b4c chore(deps): update dependency itzg/restify to v1.7.12 (#3947) 2026-02-16 15:36:58 -06:00
renovate[bot]
02b8993561 chore(deps): update dependency itzg/mc-monitor to v0.16.1 (#3946)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-16 14:17:57 -06:00
Geoff Bourne
4466c778db Markup other dependencies in Dockerfile for Renovate (#3945) 2026-02-16 14:11:57 -06:00
renovate[bot]
f5616795bd chore(deps): update dependency itzg/mc-image-helper to v1.54.1 (#3944)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-16 13:43:20 -06:00
Geoff Bourne
a00062ba64 build: fix regex pattern that was bad in docs (#3943) 2026-02-16 13:34:05 -06:00
Geoff Bourne
d217e21903 Corrected enabled managers reference (#3936) 2026-02-16 11:51:50 -06:00
dependabot[bot]
dd5e2be036 build(deps): bump griffe from 1.15.0 to 2.0.0 in /docs (#3941)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-16 11:50:18 -06:00
dependabot[bot]
b818a72e54 build(deps): bump the patches group in /docs with 5 updates (#3940) 2026-02-16 08:52:26 -06:00
dependabot[bot]
fe1cadcb0d build(deps): bump docker/build-push-action from 6.18.0 to 6.19.2 in the updates group (#3939) 2026-02-16 08:50:24 -06:00
Geoff Bourne
ac125dc15e Temporarily replace GTNH ServerPacks call with restify+jq (#3938) 2026-02-15 17:33:46 -06:00
Andre Blanke
4c0fd104c6 Exit early on failed GTNH packs retrieval (#3931) 2026-02-15 13:20:18 -06:00
Geoff Bourne
cca86e6a3d Tuning renovate config to just custom regex (#3928) 2026-02-15 09:52:49 -06:00
renovate[bot]
67ec9e1b3c chore: Configure Renovate (#3923)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Geoff Bourne <itzgeoff@gmail.com>
2026-02-14 14:46:05 -06:00
Kim
5847c54c8f Add 'neoculus' to cf-exclude-include.json (#3920) 2026-02-10 13:51:06 -06:00
Máté Farkas
796849f9d8 Install Neoforge from a local file (#3918)
Co-authored-by: Geoff Bourne <itzgeoff@gmail.com>
2026-02-09 16:19:04 -06:00
Tomás Alegre Sepúlveda
6e05807865 Support Purpur and Pufferfish config repos & optimize server.properties handling (#3914) 2026-02-09 15:03:15 -06:00
Jan Rohwer
fbbe29507e Documention added for FABRIC_META_BASE_URL (#3917) 2026-02-09 10:14:32 -06:00
dependabot[bot]
2bcc7d81bf build(deps): bump mkdocstrings from 1.0.2 to 1.0.3 in /docs in the patches group (#3916) 2026-02-09 07:29:32 -06:00
Geoff Bourne
41e50d3e9f Resolve Apache CXF vulnerability (#3913) 2026-02-07 17:15:08 -06:00
29 changed files with 266 additions and 161 deletions

1
.github/release.yml vendored
View File

@@ -2,6 +2,7 @@ changelog:
exclude: exclude:
authors: authors:
- dependabot - dependabot
- renovate
categories: categories:
- title: Enhancements - title: Enhancements
labels: labels:

View File

@@ -17,6 +17,7 @@ on:
- "compose-docs.yml" - "compose-docs.yml"
- "zensical.toml" - "zensical.toml"
- ".readthedocs.yaml" - ".readthedocs.yaml"
- "renovate.json5"
jobs: jobs:
build: build:
@@ -137,7 +138,7 @@ jobs:
uses: docker/setup-qemu-action@v3.7.0 uses: docker/setup-qemu-action@v3.7.0
- name: Build for test - name: Build for test
uses: docker/build-push-action@v6.18.0 uses: docker/build-push-action@v6.19.2
with: with:
platforms: linux/amd64 platforms: linux/amd64
tags: ${{ env.IMAGE_TO_TEST }} tags: ${{ env.IMAGE_TO_TEST }}
@@ -177,7 +178,7 @@ jobs:
password: ${{ github.token }} password: ${{ github.token }}
- name: Build and push - name: Build and push
uses: docker/build-push-action@v6.18.0 uses: docker/build-push-action@v6.19.2
if: github.actor == github.repository_owner if: github.actor == github.repository_owner
with: with:
platforms: ${{ matrix.platforms }} platforms: ${{ matrix.platforms }}

View File

@@ -1,33 +1,15 @@
name: Issue labels name: Issues notify
on: on:
issues: issues:
types: [labeled, reopened, closed, deleted] types:
- opened
env: - labeled
DISCORD_WEBHOOK: ${{ secrets.DISCORD_ISSUES_WEBHOOK }} - unlabeled
- closed
jobs: jobs:
labelNotify: notify:
runs-on: ubuntu-latest uses: itzg/github-workflows/.github/workflows/issues-notify-discord.yml@main
timeout-minutes: 5 secrets:
steps: discordWebhook: "${{secrets.DISCORD_ISSUES_WEBHOOK}}"
- name: notify on label
if: >
github.event.label.name == 'enhancement'
|| github.event.label.name == 'bug'
|| github.event.label.name == 'help wanted'
|| github.event.label.name == 'priority/high'
|| github.event.label.name == 'question'
|| github.event.label.name == 'status/waiting on upstream'
uses: Ilshidur/action-discord@master
with:
args: "[${{ github.event.issue.title }} (#${{ github.event.issue.number }})](<${{ github.event.issue.html_url }}>) added `${{ github.event.label.name }}` label"
- name: notify on action change
if: >
github.event.action == 'closed'
|| github.event.action == 'reopened'
|| github.event.action == 'deleted'
uses: Ilshidur/action-discord@master
with:
args: "[${{ github.event.issue.title }} (#${{ github.event.issue.number }})](<${{ github.event.issue.html_url }}>) has been `${{ github.event.action }}` by `${{ github.event.sender.login }}`"

View File

@@ -14,6 +14,7 @@ on:
- "compose-docs.yml" - "compose-docs.yml"
- "zensical.toml" - "zensical.toml"
- ".readthedocs.yaml" - ".readthedocs.yaml"
- "renovate.json5"
jobs: jobs:
build: build:
@@ -61,7 +62,7 @@ jobs:
uses: docker/setup-buildx-action@v3.12.0 uses: docker/setup-buildx-action@v3.12.0
- name: Confirm multi-arch build - name: Confirm multi-arch build
uses: docker/build-push-action@v6.18.0 uses: docker/build-push-action@v6.19.2
with: with:
platforms: ${{ matrix.platforms }} platforms: ${{ matrix.platforms }}
# ensure latest base image is used # ensure latest base image is used
@@ -72,7 +73,7 @@ jobs:
cache-from: type=gha,scope=${{ matrix.variant }} cache-from: type=gha,scope=${{ matrix.variant }}
- name: Build for test - name: Build for test
uses: docker/build-push-action@v6.18.0 uses: docker/build-push-action@v6.19.2
with: with:
# Only build single platform since loading multi-arch image into daemon fails with # Only build single platform since loading multi-arch image into daemon fails with
# "docker exporter does not currently support exporting manifest lists" # "docker exporter does not currently support exporting manifest lists"

View File

@@ -25,31 +25,37 @@ EXPOSE 25565
ARG APPS_REV=1 ARG APPS_REV=1
ARG GITHUB_BASEURL=https://github.com ARG GITHUB_BASEURL=https://github.com
# renovate: datasource=github-releases packageName=itzg/easy-add
ARG EASY_ADD_VERSION=0.8.11 ARG EASY_ADD_VERSION=0.8.11
ADD ${GITHUB_BASEURL}/itzg/easy-add/releases/download/${EASY_ADD_VERSION}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add ADD ${GITHUB_BASEURL}/itzg/easy-add/releases/download/${EASY_ADD_VERSION}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add
RUN chmod +x /usr/bin/easy-add RUN chmod +x /usr/bin/easy-add
ARG RESTIFY_VERSION=1.7.11 # renovate: datasource=github-releases packageName=itzg/restify
ARG RESTIFY_VERSION=1.7.12
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=${RESTIFY_VERSION} --var app=restify --file {{.app}} \ --var version=${RESTIFY_VERSION} --var app=restify --file {{.app}} \
--from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
# renovate: datasource=github-releases packageName=itzg/rcon-cli
ARG RCON_CLI_VERSION=1.7.3 ARG RCON_CLI_VERSION=1.7.3
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=${RCON_CLI_VERSION} --var app=rcon-cli --file {{.app}} \ --var version=${RCON_CLI_VERSION} --var app=rcon-cli --file {{.app}} \
--from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
ARG MC_MONITOR_VERSION=0.16.0 # renovate: datasource=github-releases packageName=itzg/mc-monitor
ARG MC_MONITOR_VERSION=0.16.1
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=${MC_MONITOR_VERSION} --var app=mc-monitor --file {{.app}} \ --var version=${MC_MONITOR_VERSION} --var app=mc-monitor --file {{.app}} \
--from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
# renovate: datasource=github-releases packageName=itzg/mc-server-runner
ARG MC_SERVER_RUNNER_VERSION=1.14.1 ARG MC_SERVER_RUNNER_VERSION=1.14.1
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
--var version=${MC_SERVER_RUNNER_VERSION} --var app=mc-server-runner --file {{.app}} \ --var version=${MC_SERVER_RUNNER_VERSION} --var app=mc-server-runner --file {{.app}} \
--from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz --from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
ARG MC_HELPER_VERSION=1.53.2 # renovate: datasource=github-releases packageName=itzg/mc-image-helper versioning=loose
ARG MC_HELPER_VERSION=1.54.1
ARG MC_HELPER_BASE_URL=${GITHUB_BASEURL}/itzg/mc-image-helper/releases/download/${MC_HELPER_VERSION} ARG MC_HELPER_BASE_URL=${GITHUB_BASEURL}/itzg/mc-image-helper/releases/download/${MC_HELPER_VERSION}
# used for cache busting local copy of mc-image-helper # used for cache busting local copy of mc-image-helper
ARG MC_HELPER_REV=1 ARG MC_HELPER_REV=1

15
compose-dev.yml Normal file
View File

@@ -0,0 +1,15 @@
services:
mc-dev:
build:
context: .
environment:
EULA: true
volumes:
- ./scripts:/image/scripts:ro
- data:/data
ports:
- "25565:25565"
stdin_open: true
tty: true
volumes:
data:

View File

@@ -166,7 +166,7 @@ such as:
## HTTP Proxy ## HTTP Proxy
You may configure the use of an HTTP/HTTPS proxy by passing the proxy's "host:port" via the environment variable `PROXY`. In [the example compose file](https://github.com/itzg/docker-minecraft-server/blob/master/examples/docker-compose-proxied.yml) it references a Squid proxy. The host and port can be separately passed via the environment variables `PROXY_HOST` and `PROXY_PORT`. A `|` delimited list of hosts to exclude from proxying can be passed via `PROXY_NON_PROXY_HOSTS`. You may configure the use of an HTTP/HTTPS proxy by passing the proxy's "host:port" via the environment variable `PROXY`. In [the example compose file](https://github.com/itzg/docker-minecraft-server/blob/master/examples/proxied/compose.yml) it references a Squid proxy. The host and port can be separately passed via the environment variables `PROXY_HOST` and `PROXY_PORT`. A `|` delimited list of hosts to exclude from proxying can be passed via `PROXY_NON_PROXY_HOSTS`.
## Using "noconsole" option ## Using "noconsole" option

View File

@@ -11,61 +11,15 @@ Adding a new server `TYPE` can vary due to the complexity of obtaining and confi
## Iterative script development ## Iterative script development
Individual scripts can be iteratively developed, debugged, and tested using the following procedure. The included `compose-dev.yml` will mount the local `scripts` code into the container and allow for iterative development. Replace `[-e key=value]` with any environment variables you wish to set for testing the modified scripts.
First, build a baseline of the image to include the packages needed by existing or new scripts:
PowerShell: (Example of building and testing ForgeAPI)
```powershell
$env:FOLDER_TO_TEST="forgeapimods_projectids"
$env:IMAGE_TO_TEST="mc-dev"
docker build -t $env:IMAGE_TO_TEST .
pushd "tests/setuponlytests/$env:FOLDER_TO_TEST/"
docker compose run mc
docker compose down -v --remove-orphans
popd
```
PowerShell: Building different images of Java for testing
```powershell
$env:BASE_IMAGE='eclipse-temurin:8u312-b07-jre'
$env:IMAGE_TO_TEST="mc-dev"
docker build --build-arg BASE_IMAGE=$env:BASE_IMAGE -t $env:IMAGE_TO_TEST .
```
Bash: (Example of building and testing ForgeAPI)
```bash
export FOLDER_TO_TEST="forgeapimods_file"
export IMAGE_TO_TEST="mc-dev"
docker build -t $IMAGE_TO_TEST .
pushd tests/setuponlytests/$FOLDER_TO_TEST/
docker compose run mc
docker compose down -v --remove-orphans
popd
```
Using the baseline image, an interactive container can be started to iteratively run the scripts to be developed. By attaching the current workspace directory, you can use the local editor of your choice to iteratively modify scripts while using the container to run them.
```shell ```shell
docker run -it --rm -v ${PWD}:/image/scripts --entrypoint bash mc-dev docker compose -f compose-dev.yml run --rm -it [-e key=value] mc-dev
``` ```
From within the container you can run individual scripts via the attached `/image/scripts/` path; however, be sure to set any environment variables expected by the scripts by either `export`ing them manually: !!! tip
```shell To speed up the development cycle, it is recommended to set `SETUP_ONLY` to `true` as part of the run command above.
export VERSION=1.12.2
/image/scripts/start-deployFabric
```
...or pre-pending script execution:
```shell
VERSION=1.12.2 /image/scripts/start-deployFabric
```
!!! note
You may want to temporarily add an `exit` statement near the end of your script to isolate execution to just the script you're developing.
## Using development copy of tools ## Using development copy of tools

View File

@@ -2,21 +2,21 @@ click==8.3.1
colorama==0.4.6 colorama==0.4.6
deepmerge==2.0 deepmerge==2.0
ghp-import==2.1.0 ghp-import==2.1.0
griffe==1.15.0 griffe==2.0.0
Jinja2==3.1.6 Jinja2==3.1.6
Markdown==3.10.1 Markdown==3.10.2
MarkupSafe==3.0.3 MarkupSafe==3.0.3
mergedeep==1.3.4 mergedeep==1.3.4
mkdocs==1.6.1 mkdocs==1.6.1
mkdocs-autorefs==1.4.3 mkdocs-autorefs==1.4.4
mkdocs-get-deps==0.2.0 mkdocs-get-deps==0.2.0
mkdocstrings==1.0.2 mkdocstrings==1.0.3
mkdocstrings-python==2.0.1 mkdocstrings-python==2.0.3
packaging==26.0 packaging==26.0
pathspec==1.0.4 pathspec==1.0.4
platformdirs==4.5.1 platformdirs==4.9.2
Pygments==2.19.2 Pygments==2.19.2
pymdown-extensions==10.20.1 pymdown-extensions==10.21
python-dateutil==2.9.0.post0 python-dateutil==2.9.0.post0
PyYAML==6.0.3 PyYAML==6.0.3
pyyaml_env_tag==1.1 pyyaml_env_tag==1.1

View File

@@ -41,6 +41,8 @@ A specific loader or launcher version other than the latest can be requested usi
FABRIC_LOADER_VERSION: 0.13.1 FABRIC_LOADER_VERSION: 0.13.1
``` ```
The container fetches Fabric loader and game version metadata from the [Fabric meta API](https://meta.fabricmc.net). You can override the base URL with `FABRIC_META_BASE_URL` (default: `https://meta.fabricmc.net`), for example when using a mirror or custom meta endpoint.
!!! note !!! note
See the [Working with mods and plugins](../../mods-and-plugins/index.md) section to set up Fabric mods and configuration. See the [Working with mods and plugins](../../mods-and-plugins/index.md) section to set up Fabric mods and configuration.

View File

@@ -1,6 +1,6 @@
A [PaperMC server](https://papermc.io/) can be automatically downloaded, upgraded, and run by setting the environment variable TYPE to "PAPER". A [PaperMC server](https://papermc.io/) can be automatically downloaded, upgraded, and run by setting the environment variable TYPE to "PAPER".
By default, the container will find and download the latest build for the `VERSION` chosen. If `VERSION` is not specified, then the latest Minecraft version released by PaperMC is selected. Along with a specific `VERSION`, a specific Paper build can be selected by setting the environment variable `PAPER_BUILD`. By default, the container will find and download the latest build for the `VERSION` chosen. If `VERSION` is not specified, then the latest Minecraft version released by PaperMC is selected. Along with a specific `VERSION`, a specific Paper build can be selected by setting the environment variable `PAPER_BUILD`.
To allow for the selection of experimental builds, set `PAPER_CHANNEL` to "experimental", otherwise only release/default channel builds are selected. To allow for the selection of experimental builds, set `PAPER_CHANNEL` to "experimental", otherwise only release/default channel builds are selected.
@@ -65,6 +65,7 @@ A [Pufferfish](https://github.com/pufferfish-gg/Pufferfish) server, which is "a
The `VERSION` variable is used to select branch latest, 1.18, or 1.17. Use PUFFERFISH_BUILD to really select the SERVER VERSION number. The `VERSION` variable is used to select branch latest, 1.18, or 1.17. Use PUFFERFISH_BUILD to really select the SERVER VERSION number.
Extra variables: Extra variables:
- `PUFFERFISH_BUILD=lastSuccessfulBuild` : set a specific Pufferfish build to use. Example: selecting build 47 => 1.18.1, or build 50 => 1.18.2 etc - `PUFFERFISH_BUILD=lastSuccessfulBuild` : set a specific Pufferfish build to use. Example: selecting build 47 => 1.18.1, or build 50 => 1.18.2 etc
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded - `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the built-in [Flare](https://blog.airplane.gg/flare) profiler - `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the built-in [Flare](https://blog.airplane.gg/flare) profiler
@@ -80,6 +81,7 @@ A [Purpur](https://purpurmc.org/) server, which is "a drop-in replacement for Pa
The `VERSION` variable is used to lookup a build of Purpur to download The `VERSION` variable is used to lookup a build of Purpur to download
Extra variables: Extra variables:
- `PURPUR_BUILD=LATEST` : set a specific Purpur build to use - `PURPUR_BUILD=LATEST` : set a specific Purpur build to use
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded - `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the built-in [Flare](https://blog.airplane.gg/flare) profiler - `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the built-in [Flare](https://blog.airplane.gg/flare) profiler
@@ -129,4 +131,23 @@ If you have attached a host directory to the `/data` volume, then you can instal
## Extra config ## Extra config
- `SKIP_DOWNLOAD_DEFAULTS`: when set to "true" startup will entirely skip checking for default Paper/Bukkit/Spigot config files to download - `SKIP_DOWNLOAD_DEFAULTS`: when set to "true" startup will entirely skip checking for default Paper/Bukkit/Spigot config files to download
## Configuration Repositories
You can automatically download optimized or custom configuration files (e.g., `bukkit.yml`, `spigot.yml`, `paper-global.yml`, `purpur.yml`) by setting a repository URL. The container will automatically append the Minecraft version to the URL (e.g., `<REPO_URL>/1.21.1/<FILE>`).
| Server Type | Variable |
| :--- | :--- |
| Paper | `PAPER_CONFIG_REPO` |
| Pufferfish | `PUFFERFISH_CONFIG_REPO` |
| Purpur | `PURPUR_CONFIG_REPO` |
### Server Properties
You can also download a base `server.properties` file using `SERVER_PROPERTIES_REPO_URL`.
- **Smart Mode**: If the URL does **not** end in `.properties`, the script treats it as a base URL and appends `/${VERSION}/server.properties` (matching the behavior of the config repos).
- **Direct Mode**: If the URL ends in `.properties`, it downloads that specific file.
**Note**: Environment variables (like `MOTD`, `DIFFICULTY`, `MAX_PLAYERS`) defined in your Docker configuration will **override** values in the downloaded `server.properties` file.

View File

@@ -1,60 +0,0 @@
# A Form to Load New Config Files to Paper MC
In this example, we illustrate how to efficiently load and manage different configuration files to optimize a Paper Minecraft server. To implement this, it is necessary to create a dedicated repository where the configuration files can be stored and later retrieved. The repository should adhere to a specific structure to facilitate seamless integration with your Docker setup. Notably, the configurations must be organized into a folder named after the version of Minecraft you are using.
For reference, I have provided this [repository](https://github.com/Alpha018/paper-config-optimized), which contains optimized configuration files for the latest version of Minecraft. You can use this repository by linking directly to the configuration files in your Docker file, as demonstrated in the example below.
## Usage
You can directly use the optimized configuration files from this repository by accessing them through the GitHub raw URLs. Simply replace the env var like the docker compose with any other repo with different configurations.
To use the raw files, you can download or link to them using the following pattern:
```yaml
services:
mc:
image: itzg/minecraft-server
container_name: paper
environment:
EULA: "true"
TYPE: "PAPER"
VIEW_DISTANCE: 10
MEMORY: 2G
PAPER_CONFIG_REPO: "https://raw.githubusercontent.com/[your-username]/[your-repository]/main/[file-path]"
ports:
- "25565:25565"
volumes:
- mc-paper:/data
restart: unless-stopped
volumes:
mc-paper: {}
```
For example:
```yaml
services:
mc:
image: itzg/minecraft-server
container_name: paper
environment:
EULA: "true"
TYPE: "PAPER"
VIEW_DISTANCE: 10
MEMORY: 2G
PAPER_CONFIG_REPO: "https://raw.githubusercontent.com/Alpha018/paper-config-optimized/main"
ports:
- "25565:25565"
volumes:
- mc-paper:/data
restart: unless-stopped
volumes:
mc-paper: {}
```
Feel free to explore and use the configurations in this repo to enhance your Minecraft server's performance.
## Contribution
If you'd like to improve or suggest changes to these configurations, feel free to submit a pull request in this [repository](https://github.com/Alpha018/paper-config-optimized). We welcome contributions from the community!

View File

@@ -0,0 +1,129 @@
# Optimized Server Configuration (Paper, Purpur, Pufferfish)
This example demonstrates how to automatically download and apply optimized configuration files for your Minecraft server from a remote Git repository. This is useful for maintaining a standard, high-performance configuration across multiple server instances.
## Features
- **Automatic Download**: Fetches `bukkit.yml`, `spigot.yml`, and server-specific configs (`paper-global.yml`, `purpur.yml`, `pufferfish.yml`) on startup.
- **Version Aware**: Downloads configurations from a folder matching your Minecraft version (e.g., `1.21.1`).
- **Base `server.properties`**: Optionally download a base `server.properties` file while still allowing environment variable overrides.
## Repository Structure
Your configuration repository should be structured by Minecraft version. For example:
```text
my-config-repo/
├── 1.21.1/
│ ├── bukkit.yml
│ ├── spigot.yml
│ ├── purpur.yml
│ ├── pufferfish.yml
│ └── server.properties
├── 1.20.4/
│ └── ...
└── README.md
```
## Docker Compose Examples
### 1. Paper Server
For Paper, use `PAPER_CONFIG_REPO`.
```yaml
version: "3.8"
services:
mc:
image: itzg/minecraft-server
environment:
EULA: "TRUE"
TYPE: "PAPER"
VERSION: "1.21.1"
# URL to the root of your config repository (e.g. raw.githubusercontent.com)
# The script automatically appends "/<VERSION>/<FILE>" to this URL.
PAPER_CONFIG_REPO: "https://raw.githubusercontent.com/Alpha018/paper-config-optimized/refs/heads/main"
```
### 2. Purpur Server
For Purpur, use `PURPUR_CONFIG_REPO`.
```yaml
version: "3.8"
services:
mc:
image: itzg/minecraft-server
environment:
EULA: "TRUE"
TYPE: "PURPUR"
VERSION: "1.21.1"
# URL to the root of your config repository (e.g. raw.githubusercontent.com)
# The script automatically appends "/<VERSION>/<FILE>" to this URL.
PURPUR_CONFIG_REPO: "https://raw.githubusercontent.com/Alpha018/paper-config-optimized/refs/heads/main"
```
### 2. Pufferfish Server
For Pufferfish, use `PUFFERFISH_CONFIG_REPO`.
```yaml
version: "3.8"
services:
mc:
image: itzg/minecraft-server
environment:
EULA: "TRUE"
TYPE: "PUFFERFISH"
VERSION: "1.21.1" # Must match a folder in your repo
# Automagically download optimized configs (bukkit.yml, spigot.yml, pufferfish.yml)
PUFFERFISH_CONFIG_REPO: "https://raw.githubusercontent.com/Alpha018/paper-config-optimized/refs/heads/main"
```
### 3. Downloading `server.properties` (Optional)
If you also want to download a base `server.properties` file from your repository, you must explicitly set `SERVER_PROPERTIES_REPO_URL`.
**Smart Feature**:
- If you provide a **base URL** (like the repo root), the script will automatically append `/<VERSION>/server.properties`.
- If you provide a **full URL** (ending in `.properties`), it will download that specific file.
**Crucial Note**: Environment variables (like `MOTD`, `DIFFICULTY`, `MAX_PLAYERS`) in your Docker Compose **WILL override** values in the downloaded file. This allows you to have a shared optimized base but customize specifics per instance.
```yaml
environment:
# ... other vars ...
# Option A: Base URL (Smart)
# Will look for: https://.../main/1.21.1/server.properties
SERVER_PROPERTIES_REPO_URL: "https://raw.githubusercontent.com/Alpha018/paper-config-optimized/refs/heads/main"
# Option B: Specific URL (Manual)
# SERVER_PROPERTIES_REPO_URL: "https://gist.githubusercontent.com/.../server.properties"
# These will OVERRIDE settings in the downloaded file
MOTD: "My Custom Instance"
MAX_PLAYERS: 50
```
## Supported Variables
| Variable | Description |
| :--- | :--- |
| `PAPER_CONFIG_REPO` | Base URL for Paper configs. Downloads `paper-global.yml`, `bukkit.yml`, `spigot.yml`, etc. |
| `PURPUR_CONFIG_REPO` | Base URL for Purpur configs. Downloads `purpur.yml`, `bukkit.yml`, `spigot.yml`. |
| `PUFFERFISH_CONFIG_REPO` | Base URL for Pufferfish configs. Downloads `pufferfish.yml`, `bukkit.yml`, `spigot.yml`. |
| `SERVER_PROPERTIES_REPO_URL` | Boolean/URL. Set to download `server.properties`. Can be a base URL or direct file link. |
## Contribution
Got ideas to squeeze even more performance out of these configs? Or maybe you found a better way to structure things?
I'd love to see your improvements! Feel free to open a Pull Request or an Issue in the [repository](https://github.com/Alpha018/paper-config-optimized). Let's make these configs the best they can be together.

View File

@@ -110,6 +110,7 @@
"mouse-tweaks", "mouse-tweaks",
"neat", "neat",
"nekos-enchanted-books", "nekos-enchanted-books",
"neoculus",
"no-nv-flash", "no-nv-flash",
"no-recipe-book", "no-recipe-book",
"not-enough-animations", "not-enough-animations",

View File

@@ -2,7 +2,7 @@
{ {
"tag": "latest", "tag": "latest",
"notes": "Always tracks the most recent commit on the main branch", "notes": "Always tracks the most recent commit on the main branch",
"java": "21", "java": "25",
"distribution": "ubuntu", "distribution": "ubuntu",
"jvm": "hotspot", "jvm": "hotspot",
"architectures": ["amd64", "arm64"], "architectures": ["amd64", "arm64"],
@@ -141,4 +141,5 @@
{"tag": "java8-jdk", "deprecated": true}, {"tag": "java8-jdk", "deprecated": true},
{"tag": "java8-openj9", "deprecated": true}, {"tag": "java8-openj9", "deprecated": true},
{"tag": "java8-graalvm-ce", "deprecated": true} {"tag": "java8-graalvm-ce", "deprecated": true}
]
]

16
renovate.json5 Normal file
View File

@@ -0,0 +1,16 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"enabledManagers": [
"custom.regex"
],
"customManagers": [
{
"customType": "regex",
"managerFilePatterns": ["/^Dockerfile$/"],
"matchStrings": [
"# renovate: datasource=(?<datasource>[a-z-]+?)(?: packageName=(?<packageName>.+?))?(?: versioning=(?<versioning>[a-z-]+))?\\s(?:ENV|ARG) .+?_VERSION=(?<currentValue>.+?)\\s"
]
}
],
"labels": ["dependencies"]
}

0
scripts/start-deployAutoCF Normal file → Executable file
View File

0
scripts/start-deployFolia Normal file → Executable file
View File

3
scripts/start-deployGTNH Normal file → Executable file
View File

@@ -8,10 +8,11 @@ function getGTNHdownloadPath(){
gtnh_download_path="" gtnh_download_path=""
current_java_version=$(mc-image-helper java-release) current_java_version=$(mc-image-helper java-release)
if ! mapfile -t packs < <(curl -sfL 'http://downloads.gtnewhorizons.com/ServerPacks/?raw'); then if ! packs_data="$(restify --tag=a https://www.gtnewhorizons.com/version-history/ | jq -r '.[].href | select(test("Server"))')"; then
logError "Failed to retrieve data from http://downloads.gtnewhorizons.com/ServerPacks/?raw" logError "Failed to retrieve data from http://downloads.gtnewhorizons.com/ServerPacks/?raw"
exit 1 exit 1
fi fi
mapfile -t packs <<< "$packs_data"
log "Start locating server files..." log "Start locating server files..."
for pack in "${packs[@]}"; do for pack in "${packs[@]}"; do

0
scripts/start-deployLeaf Normal file → Executable file
View File

0
scripts/start-deployModrinth Normal file → Executable file
View File

12
scripts/start-deployNeoForge Normal file → Executable file
View File

@@ -2,6 +2,7 @@
: "${NEOFORGE_VERSION:=latest}" : "${NEOFORGE_VERSION:=latest}"
: "${NEOFORGE_FORCE_REINSTALL:=false}}" : "${NEOFORGE_FORCE_REINSTALL:=false}}"
: "${NEOFORGE_INSTALLER:=}"
# shellcheck source=start-utils # shellcheck source=start-utils
. "${SCRIPTS:-$(dirname "$0")}/start-utils" . "${SCRIPTS:-$(dirname "$0")}/start-utils"
@@ -9,14 +10,19 @@ isDebugging && set -x
resultsFile=/data/.run-neoforge.env resultsFile=/data/.run-neoforge.env
if ! mc-image-helper install-neoforge \ if [[ ${NEOFORGE_INSTALLER} ]]; then
if ! mc-image-helper install-neoforge --neoforge-installer="${NEOFORGE_INSTALLER}" --output-directory=/data --results-file=${resultsFile} --minecraft-version="${VERSION}" --force-reinstall="${NEOFORGE_FORCE_REINSTALL}"; then
logError "Failed to installForge given installer ${NEOFORGE_INSTALLER}"
exit 1
fi
elif ! mc-image-helper install-neoforge \
--output-directory=/data \ --output-directory=/data \
--results-file=${resultsFile} \ --results-file=${resultsFile} \
--minecraft-version="${VERSION}" \ --minecraft-version="${VERSION}" \
--neoforge-version="${NEOFORGE_VERSION}" \ --neoforge-version="${NEOFORGE_VERSION}" \
--force-reinstall="${NEOFORGE_FORCE_REINSTALL}"; then --force-reinstall="${NEOFORGE_FORCE_REINSTALL}"; then
logError "Failed to install NeoForge" logError "Failed to install NeoForge"
exit 1 exit 1
fi fi
applyResultsFile ${resultsFile} applyResultsFile ${resultsFile}

0
scripts/start-deployPoseidon Normal file → Executable file
View File

View File

@@ -41,6 +41,11 @@ if [[ ! -f "$SERVER" ]] || isTrue "${FORCE_REDOWNLOAD:-false}"; then
exit 3 exit 3
fi fi
fi fi
if [[ "${PUFFERFISH_CONFIG_REPO}" ]]; then
defaultTopLevelConfigs=(bukkit.yml spigot.yml pufferfish.yml)
DOWNLOAD_DEFAULTS=$(buildDownloadList "$PUFFERFISH_CONFIG_REPO" "$VERSION" "${defaultTopLevelConfigs[@]}")
export DOWNLOAD_DEFAULTS
fi
# Normalize on Spigot for later operations # Normalize on Spigot for later operations
export FAMILY=SPIGOT export FAMILY=SPIGOT

View File

@@ -4,6 +4,7 @@ IFS=$'\n\t'
: "${PURPUR_BUILD:=LATEST}" : "${PURPUR_BUILD:=LATEST}"
: "${PURPUR_DOWNLOAD_URL:=}" : "${PURPUR_DOWNLOAD_URL:=}"
: "${PURPUR_CONFIG_REPO:=}"
# shellcheck source=start-utils # shellcheck source=start-utils
. "$(dirname "$0")/start-utils" . "$(dirname "$0")/start-utils"
@@ -36,6 +37,12 @@ fi
applyResultsFile ${resultsFile} applyResultsFile ${resultsFile}
if [[ "${PURPUR_CONFIG_REPO}" ]]; then
defaultTopLevelConfigs=(bukkit.yml spigot.yml purpur.yml)
DOWNLOAD_DEFAULTS=$(buildDownloadList "$PURPUR_CONFIG_REPO" "$VERSION" "${defaultTopLevelConfigs[@]}")
export DOWNLOAD_DEFAULTS
fi
# Normalize on Spigot for later operations # Normalize on Spigot for later operations
export FAMILY=SPIGOT export FAMILY=SPIGOT

0
scripts/start-rconcmds Normal file → Executable file
View File

0
scripts/start-setupRbac Normal file → Executable file
View File

View File

@@ -134,6 +134,22 @@ if [[ ${TYPE} == "CURSEFORGE" ]]; then
fi fi
if ! isTrue "${SKIP_SERVER_PROPERTIES}"; then if ! isTrue "${SKIP_SERVER_PROPERTIES}"; then
if [ ! -e "$SERVER_PROPERTIES" ] && [[ "${SERVER_PROPERTIES_REPO_URL:-}" ]]; then
# Helper to support base URLs (like the config repos)
# If the URL doesn't end in .properties, assume it is a base and append version/file
if [[ "${SERVER_PROPERTIES_REPO_URL}" != *".properties" ]]; then
SERVER_PROPERTIES_REPO_URL=$(buildDownloadList "$SERVER_PROPERTIES_REPO_URL" "$VERSION" server.properties)
fi
if ! mc-image-helper mcopy \
--to "$(dirname "$SERVER_PROPERTIES")" \
--skip-existing \
--ignore-missing-sources \
"$SERVER_PROPERTIES_REPO_URL"; then
logWarning "Failed to download server.properties from ${SERVER_PROPERTIES_REPO_URL}"
fi
fi
if [ ! -e "$SERVER_PROPERTIES" ]; then if [ ! -e "$SERVER_PROPERTIES" ]; then
log "Creating server properties in ${SERVER_PROPERTIES}" log "Creating server properties in ${SERVER_PROPERTIES}"