diff --git a/.gitignore b/.gitignore index 3bbaaed..ad8082c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -.gitlab +data/ +world/ +versions/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..1abb03c --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,21 @@ +variables: + CI_PROJECT_NAME: "minecraft" + CI_PROJECT_DIR: "." + CI_REGISTRY_IMAGE: hub.ducoterra.net/ducoterra/minecraft + +stages: + - build + - test + - deploy + +build: + only: + variables: + - $CI_COMMIT_TAG + stage: build + image: + name: gcr.io/kaniko-project/executor:debug + entrypoint: [""] + script: + - echo $DEPLOY + - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG \ No newline at end of file diff --git a/.gitlab/.gitignore b/.gitlab/.gitignore new file mode 100644 index 0000000..3bbaaed --- /dev/null +++ b/.gitlab/.gitignore @@ -0,0 +1 @@ +.gitlab diff --git a/.gitlab/Makefile b/.gitlab/Makefile new file mode 100644 index 0000000..f5ca9c1 --- /dev/null +++ b/.gitlab/Makefile @@ -0,0 +1,21 @@ +SHELL := /bin/bash + +PROJECT_NAME ?= $(shell git config --local remote.origin.url | sed -n 's\#.*/\([^.]*\)\.git\#\1\#p') +VERSION ?= $(shell cat VERSION) +IMAGE ?= $(shell cat IMAGE):$(VERSION) +IMAGE_LATEST ?= $(shell cat IMAGE):latest +PWD ?= $(shell pwd) +STASH ?= "common-update-stash" +MAKE_BRANCH ?= main + +include .gitlab/make/docker.makefile +include .gitlab/make/helm.makefile +include .gitlab/make/kaniko.makefile +include .gitlab/make/truenas.makefile +include .gitlab/make/git.makefile +include .gitlab/make/kubectl.makefile + +# git subtree add --prefix .gitlab --squash --message "Merge update from Common" -q git@gitlab.ducoterra.net:services/common.git main +.PHONY: make-update +make-update: + @git subtree pull --prefix .gitlab --squash --message "Merge update from Common" -q git@gitlab.ducoterra.net:services/common.git $(MAKE_BRANCH) diff --git a/.gitlab/README.md b/.gitlab/README.md new file mode 100644 index 0000000..5680c6b --- /dev/null +++ b/.gitlab/README.md @@ -0,0 +1,9 @@ +# Adding the "common" subtree as your .gitlab folder + +```bash +# Add the subtree as a remote +git subtree add --prefix .gitlab git@gitlab.ducoterra.net:services/common.git main --squash --message "Add Common .gitlab Subtree" + +# Now you can run the following to update +make make-update +``` diff --git a/make/docker.makefile b/.gitlab/make/docker.makefile similarity index 100% rename from make/docker.makefile rename to .gitlab/make/docker.makefile diff --git a/make/git.makefile b/.gitlab/make/git.makefile similarity index 100% rename from make/git.makefile rename to .gitlab/make/git.makefile diff --git a/make/helm.makefile b/.gitlab/make/helm.makefile similarity index 100% rename from make/helm.makefile rename to .gitlab/make/helm.makefile diff --git a/make/kaniko.makefile b/.gitlab/make/kaniko.makefile similarity index 100% rename from make/kaniko.makefile rename to .gitlab/make/kaniko.makefile diff --git a/make/kubectl.makefile b/.gitlab/make/kubectl.makefile similarity index 100% rename from make/kubectl.makefile rename to .gitlab/make/kubectl.makefile diff --git a/make/truenas.makefile b/.gitlab/make/truenas.makefile similarity index 100% rename from make/truenas.makefile rename to .gitlab/make/truenas.makefile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0d12498 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM openjdk:8-jdk-bullseye + +RUN apt update && apt install -y unzip + +RUN groupadd -r minecraft -g 2000 +RUN useradd --no-log-init minecraft -u 2000 -g 2000 -m +WORKDIR /mc_data +RUN chown -R minecraft:minecraft . + +# Copy the modpack +COPY versions/the-1122-pack_1.3.7.1.zip /the-1122-pack/the-1122-pack.zip +RUN chown -R minecraft:minecraft /the-1122-pack + +USER minecraft diff --git a/IMAGE b/IMAGE new file mode 100644 index 0000000..30eb29f --- /dev/null +++ b/IMAGE @@ -0,0 +1 @@ +ducoterra/the-1122-pack diff --git a/Makefile b/Makefile index f5ca9c1..29f2834 100644 --- a/Makefile +++ b/Makefile @@ -1,21 +1,19 @@ SHELL := /bin/bash -PROJECT_NAME ?= $(shell git config --local remote.origin.url | sed -n 's\#.*/\([^.]*\)\.git\#\1\#p') -VERSION ?= $(shell cat VERSION) -IMAGE ?= $(shell cat IMAGE):$(VERSION) -IMAGE_LATEST ?= $(shell cat IMAGE):latest -PWD ?= $(shell pwd) -STASH ?= "common-update-stash" -MAKE_BRANCH ?= main +include .gitlab/Makefile -include .gitlab/make/docker.makefile -include .gitlab/make/helm.makefile -include .gitlab/make/kaniko.makefile -include .gitlab/make/truenas.makefile -include .gitlab/make/git.makefile -include .gitlab/make/kubectl.makefile +.PHONY: run +run: + docker-compose run --service-ports minecraft -# git subtree add --prefix .gitlab --squash --message "Merge update from Common" -q git@gitlab.ducoterra.net:services/common.git main -.PHONY: make-update -make-update: - @git subtree pull --prefix .gitlab --squash --message "Merge update from Common" -q git@gitlab.ducoterra.net:services/common.git $(MAKE_BRANCH) +.PHONY: update-version +update-version: +ifdef VERSION + @echo $(VERSION) > VERSION + @yq e ".version = \"$(VERSION)\"" -i helm/Chart.yaml + @yq e ".appVersion = \"$(VERSION)\"" -i helm/Chart.yaml + @yq e ".services.*.image = \"$(IMAGE)\"" -i docker-compose.yaml + @yq e ".image = \"$(IMAGE)\"" -i helm/values.yaml +else + @echo 'VERSION not defined or VERSION file not found/empty' +endif diff --git a/README.md b/README.md index 5680c6b..81bb2a4 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,53 @@ -# Adding the "common" subtree as your .gitlab folder +# Minecraft + +## Running Locally ```bash -# Add the subtree as a remote -git subtree add --prefix .gitlab git@gitlab.ducoterra.net:services/common.git main --squash --message "Add Common .gitlab Subtree" +# download the most recent version of minecraft +make get-server -# Now you can run the following to update -make make-update +# Run the server +docker-compose up ``` + +## Uploading to Docker Hub + +1. Update the version in the VERSION file. +2. Build and push the new version + + ```bash + make build + make push + ``` + +## Running in kubernetes + +Requires helm v3. Edit values.yaml and run the following: + +```bash +helm upgrade --install minecraft +``` + +Your minecraft server will be available on port 25565 by default. + +## Create a Backup + +```bash +kubectl cp :/mc_data +``` + +## Restore from Backup + +```bash +kubectl cp :/mc_data +``` + +## Cool seeds + +### 7485786574821478084 + +Spawns you next to a nether portal with golden axe and pickaxe. River and Village close by. + +### -8018833100564192815 + +Use with an amplified world, massive island diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..7dea76e --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.0.1 diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..f631875 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,13 @@ +version: '3' +services: + minecraft: + image: ducoterra/the-1122-pack:1.0.1 + stdin_open: true + tty: true + volumes: + - ./world:/mc_data + ports: + - 25565:25565 + environment: + - MAX_RAM=1 + - MIN_RAM=1 diff --git a/helm/.helmignore b/helm/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/helm/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/helm/Chart.yaml b/helm/Chart.yaml new file mode 100644 index 0000000..5815e8d --- /dev/null +++ b/helm/Chart.yaml @@ -0,0 +1,20 @@ +apiVersion: v2 +name: minecraft +description: A Minecraft server for kubernetes +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 1.0.1 +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +appVersion: 1.0.1 diff --git a/helm/templates/configmap.yaml b/helm/templates/configmap.yaml new file mode 100644 index 0000000..43a784a --- /dev/null +++ b/helm/templates/configmap.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }} +data: + eula.txt: | + eula=true + server.properties: {{ toYaml .Values.server_props | indent 2 }} \ No newline at end of file diff --git a/helm/templates/deploy.yaml b/helm/templates/deploy.yaml new file mode 100644 index 0000000..075e755 --- /dev/null +++ b/helm/templates/deploy.yaml @@ -0,0 +1,80 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }} +spec: + selector: + matchLabels: + app: {{ .Release.Name }} + strategy: + type: Recreate + template: + metadata: + labels: + app: {{ .Release.Name }} + spec: + initContainers: + - name: unzip + image: {{ .Values.image }} + imagePullPolicy: Always + command: ["/bin/bash"] + args: ["-c", "rm -f forge*.jar && unzip -o -d . /the-1122-pack/the-1122-pack.zip"] + volumeMounts: + - mountPath: /mc_data + name: data + - name: rename + image: {{ .Values.image }} + imagePullPolicy: Always + command: ["/bin/bash"] + args: ["-c", "mv $(find . -maxdepth 1 -name 'forge*.jar') forge.jar"] + volumeMounts: + - mountPath: /mc_data + name: data + - name: copy-properties + image: debian:latest + imagePullPolicy: Always + command: ["/bin/bash"] + args: ["-c", "cp -f /server.properties /mc_data/server.properties"] + volumeMounts: + - mountPath: /mc_data + name: data + - name: properties + mountPath: /server.properties + subPath: server.properties + containers: + - name: server + image: {{ .Values.image }} + imagePullPolicy: Always + command: ["/bin/bash"] + args: ["-c", 'java -server -Xmx"$MAX_RAM"G -Dfml.queryResult=confirm -jar forge.jar nogui'] + ports: + - containerPort: 25565 + volumeMounts: + - mountPath: /mc_data + name: data + - name: properties + mountPath: /mc_data/eula.txt + subPath: eula.txt + tty: true + stdin: true + env: + - name: MAX_RAM + value: {{ .Values.max_ram | quote }} + - name: MIN_RAM + value: "1" + resources: + requests: + memory: {{ div .Values.max_ram 2 }}Gi + cpu: 1m + limits: + memory: {{ add 1 .Values.max_ram }}Gi + cpu: {{ .Values.max_cpu | quote }} + volumes: + - name: data + persistentVolumeClaim: + claimName: {{ .Release.Name }} + - name: properties + configMap: + name: {{ .Release.Name }} + securityContext: + fsGroup: 2000 diff --git a/helm/templates/pvc.yaml b/helm/templates/pvc.yaml new file mode 100644 index 0000000..e825a00 --- /dev/null +++ b/helm/templates/pvc.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Release.Name }} + annotations: + "helm.sh/resource-policy": keep +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 32Gi \ No newline at end of file diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml new file mode 100644 index 0000000..eade03e --- /dev/null +++ b/helm/templates/service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }} +spec: + selector: + app: {{ .Release.Name }} + ports: + - port: {{ .Values.port }} + targetPort: 25565 + name: {{ .Release.Name }} + type: LoadBalancer \ No newline at end of file diff --git a/helm/values.yaml b/helm/values.yaml new file mode 100644 index 0000000..3d20259 --- /dev/null +++ b/helm/values.yaml @@ -0,0 +1,42 @@ +image: ducoterra/the-1122-pack:1.0.1 +port: 20102 +max_cpu: 4 +max_ram: 6 +server_props: | + max-tick-time=-1 + query.port=25565 + generator-settings= + force-gamemode=false + allow-nether=true + gamemode=0 + enable-query=true + player-idle-timeout=0 + difficulty=1 + spawn-monsters=true + op-permission-level=4 + pvp=true + snooper-enabled=true + level-type=BIOMESOP + hardcore=false + enable-command-block=false + max-players=10 + network-compression-threshold=256 + resource-pack-sha1= + max-world-size=29999984 + server-port=25565 + server-ip=0.0.0.0 + spawn-npcs=true + allow-flight=true + level-name=world + view-distance=24 + resource-pack= + spawn-animals=true + white-list=true + generate-structures=true + online-mode=true + max-build-height=256 + level-seed= + prevent-proxy-connections=false + use-native-transport=true + enable-rcon=false + motd=\u00A7lThe 1.12.2 Pack Server v1.3.7 diff --git a/servers.md b/servers.md new file mode 100644 index 0000000..67a699d --- /dev/null +++ b/servers.md @@ -0,0 +1,19 @@ +# Servers + +## Minecraft + +```bash +helm upgrade --install minecraft ./helm --set tag=1.15.2_7 --set port=25565 +``` + +## Pubcraft + +```bash +helm upgrade --install pubcraft ./helm --set tag=1.15.2_7 --set port=20100 +``` + +## TestCraft + +```bash +helm upgrade --install testcraft ./helm --set tag=1.16.1_2 --set port=25566 +```