diff --git a/Dockerfile b/Dockerfile index bbb57d7101ed381e338fe4a9bd29f1a1da82d339..872300c5d865ad37c03101367415fc2fa67fed82 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,10 @@ # Base image on OpenJDK 11 JRE FROM openjdk:11.0-jre-slim -LABEL org.label-schema.name="clspigot-docker" -LABEL org.label-schema.description="Docker Container for an Papermc Server" -LABEL org.label-schema.vcs-url="https://gitlab.cl.uni-heidelberg.de/tmueller/clspigot-docker/" -LABEL maintainer="mueller@tobistech.ovh" -LABEL org.label-schema.schema-version=1.0 +LABEL org.label-schema.name="clspigot-docker" \ + org.label-schema.description="Docker Container for an Papermc Server" \ + org.label-schema.vcs-url="https://gitlab.cl.uni-heidelberg.de/tmueller/clspigot-docker/" \ + maintainer="mueller@tobistech.ovh" \ + org.label-schema.schema-version=1.0 # Execute all the following instructions in the container as user "root" USER root @@ -24,25 +24,29 @@ ENV MC_VERSION="latest" \ JAVA_OPTS="-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true" \ #Man kann nun auch die guid des eigenen benutzers passen und mus somit nichtmehr die rechte des hostsystems anpassen, bitte die GUID eines non-root users nehmen der an dem speicherort zugriff hat. GUID=61000 \ - TZ=Europe/Berlin -# Copy over the three script files (entrypoint, backup and restore) -COPY papermc.sh / -COPY backup.sh / -COPY restore.sh / -COPY health.sh / -COPY test.sh / + TZ=Europe/Berlin \ + TM_BASE_AUTH="tmueller:supercooles_passwort_hier_einfuegen" \ + TM_BASE_URL="https://tobistechblog.de/uni/initial.tar.gz" +# Copy over the three script files (entrypoint, backup, restore, helath, test(optional) and crontab +COPY papermc.sh backup.sh restore.sh health.sh test.sh / +COPY crontab /etc/cron.d/backup + # Set Timezone RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone -# Create /papermc and /backup directories -RUN mkdir /papermc /backup +# Create /papermc and /backup directories and /web for the dynmap +RUN mkdir /papermc /backup /web + +#sets permission for the cronjobs +RUN chmod 0644 /etc/cron.d/backup +#starts the service for cron -# Add papermc user and group, then change ownership of /papermc and /backup to this user -RUN groupadd -g ${GUID} ${papermc_group} -RUN useradd -g ${GUID} -l -M -s /bin/false -u ${GUID} ${papermc_user} -RUN chown -R ${papermc_user} /papermc -RUN chown -R ${papermc_user} /backup +# Add papermc user and group, then change ownership of /papermc and /backup to this user +RUN groupadd -g ${GUID} ${papermc_group} +RUN useradd -g ${GUID} -l -M -s /bin/false -u ${GUID} ${papermc_user} +RUN chown -R ${GUID} /papermc/ +RUN chown -R ${GUID} /backup/ # Get package lists, install needed packages, then remove the package lists again (to save space) # "webp" is needed to generate images with better compression for the dynamic map (optional, needs further configuration in dynmap-plugin´s config file) @@ -55,8 +59,9 @@ RUN apt-get update && apt-get install -y \ jq \ screen \ webp \ - && rm -rf /var/lib/apt/lists/* - + nano \ + && rm -rf /var/lib/apt/lists/* \ + service cron start # Execute all following commands as the papermc user USER $papermc_user @@ -70,6 +75,8 @@ HEALTHCHECK --interval=10s --timeout=10s --start-period=30s \ # Container setup, specifies needed ports. May be adjusted or overwritten if plugins need other ports EXPOSE 25565/tcp EXPOSE 25565/udp + #Specifies the datastructure in the container VOLUME /papermc VOLUME /backup +VOLUME /web diff --git a/README-dev.md.txt b/README-dev.md similarity index 71% rename from README-dev.md.txt rename to README-dev.md index a248204a9d2a191a604d0abbcf91db2a8e344f6b..6ca1815d5ece5d41cd61fabc742271b750ff0ec9 100644 --- a/README-dev.md.txt +++ b/README-dev.md @@ -1,16 +1,16 @@ # TODOs (Next Merge request) - [ ] Automatisierung des testscripts, evtl in git so integrieren damit wenn alle essentiellen tests bestanden sind -und ein Approval gegeben ist automatisch in meinem branch played-around gemerged werden (if possible) -- [ ] +und ein Approval gegeben ist automatisch gemerged werden (if possible) +- [x] Backupscript unabhängig von essentials machen +- [x] Alternative Übergangslösung zum verwalten der minecraft configs falls container ohne bind-mounts erstellt wird (z.B. nano) +- [ ] Dokumentation mit Struktur (z.B. docs/user docs/admin etc) # Future Plans - [ ] Entwikclung einer Weboberfläche für einfache administration (Jedoch keine klassische Ready-to-buy-Lösung sondern eine minimalistische effiziente Variante In erster Linie für Verwaltung von Spielinternen dingen wie z.B. Rechteverwaltung, Spielerliste, Banliste, evtl Aktuelle Auslastung etc - [ ] Automatische Pluginupdates -- [ ] -- [ ] -- [ ] +- [ ] inkrementelle Backups zur Effizienteren Speicherplatzbelegung - [ ] diff --git a/README.md b/README.md index d49282c51dff1be339dc8e14f374919a07cac0ad..2539acd1e3c310a42b24ae3031175bc15468ac98 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Maintainer: Tobias Müller <tmueller@cl.uni-heidelberg.de> -Dieses Image basiert auf der Arbeit von https://github.com/Phyremaster/papermc-docker und wurde so modifiziert, dass nur noch ein Befehl genutzt werden muss, um das Image auf einem beliebigen Server zu starten. +Dieses Image basiert auf der Arbeit von https://github.com/Phyremaster/papermc-docker und wurde um Sicherheitsanpassungen und weiteren Funktionen erweitert. ## :whale: Setup mit Docker @@ -80,12 +80,26 @@ Der Platzhalter `NAME_DER_VARIABLE` wird durch den Namen der Umgebungsvariable e | `PAPER_BUILD` | Nummer des zu verwendenden PaperMC-Builds | `#355` | Normalerweise irrelevant (kann bei „latest“ belassen werden) | | `MC_RAM` | Speichermenge in Mega- oder Gigabyte | `4G` | Für die Flags der Java VM, die der Maintainer aktuell nutzt, empfiehlt es sich 6GB minimum zuzuweisen oder maximal 10GB | | `JAVA_OPTS` | Javaspezifische Parameter | *siehe unten* | Nur ändern, wenn es notwendig ist und man weiß, was man tut! Ausnahme: Wenn der Server mit weniger RAM laufen soll, kann man hier die für Spigot üblichen Flags (siehe SpigotMC-Docs) einsetzen, um Aikars Flags zu überschreiben | +| `TM_BASE_AUTH` | Passwort für tarball mit vorkonfigurierten Minecraftserver (Nur Uniintern)| passwort | Falls Tarball nicht per .htaccess gesichert (nicht Empfohlen kann diese variable leergelassen werden | +| `TM_BASE_URL` | URL unter der, der Tarball heruntergeladen werden kann | https://example.tld/... | Wird zusammen mit TM_BASE_AUTH bei bedarf in docker-compose im Abschnitt `environment:` spezifiziert | ### Beispiel für javaspezifische Parameter ``` -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true ``` +## :floppy_disk: Backups + +Jeden Tag um 7:30 wird ein Backup des Servers gemacht und unter `/backups` im Container gespeichert. `Backups` wird als eigenes Volume gespeichert. +Um manuell ein Backup zu initieren geht das entweder (Falls EssentialsX installiert und konfiguriert ist) von minecraft aus per `/backup` + + Zum wiederherstellen eines backups muss folgende befehle vom Haost-System ausgeführt werden: + ``` +# docker exec -it papermc_papermc_1 /bin/bash +$ bash restore.sh +``` + +Ihr bekommt die verfügbaren Backups angezeigt und könnt dann das Datum als Auswahl eingeben zum wiederherstellen. ## :clipboard: Befehle @@ -131,6 +145,10 @@ In diesem Fall stürzt der Minecraft-Server immer wieder ab und wird direkt dana ## :books: Weitere Ressourcen +In kürze verfügbar: + +- [Read the Docs] (https://gitlab.cl.uni-heidelberg.de/tmueller/clspigot-docker/-/blob/beta/docs/user.md) + Projektsites des ursprünglichen Images von Phyremaster: - [GitHub](https://github.com/Phyremaster/papermc-docker) diff --git a/backup.sh b/backup.sh index 57310d0903b4821cd14482d7a9489c7674db97e8..d97a8c491f2453b24caa9613fd82db364356f02b 100755 --- a/backup.sh +++ b/backup.sh @@ -10,8 +10,10 @@ dateformat=$(date +%F_%H)UTC$ext else mkdir -p $backupdir fi - tar -czvf $backupdir$dateformat --exclude="plugins/dynmap/web/tiles" --exclude="cache/" --exclude="*.gz" --exclude="spigo*.jar" --exclude="paper*.jar" * - chmod +rw $backupdir$dateformat + screen -r mc -p 0 -X stuff "save-off^M" #Sends an input to screen-session conatining the papermc-server to disable world saving from minecraft + tar -czf $backupdir$dateformat --exclude="plugins/dynmap/web/tiles" --exclude="cache/" --exclude="*.gz" --exclude="spigo*.jar" --exclude="paper*.jar" papermc/* #creates a compressed tarball of the minecraft folder + screen -r mc -p 0 -X stuff "save-on^M" #enables it again + chmod +rw $backupdir$dateformat echo "Backup complete." exit 0 \ No newline at end of file diff --git a/crontab b/crontab new file mode 100644 index 0000000000000000000000000000000000000000..5fb2ee789257c14423ae55e03192ed70c66acf6c --- /dev/null +++ b/crontab @@ -0,0 +1 @@ +30 7 * * * /papermc/backup.sh diff --git a/docs/user.md b/docs/user.md new file mode 100644 index 0000000000000000000000000000000000000000..2af08096c14aaac3435404eb16a5e759039acdde --- /dev/null +++ b/docs/user.md @@ -0,0 +1,7 @@ +# Fachschaftsminecraftserver Dokumentation + +Maintainer: Tobias Müller <tmueller@cl.uni-heidelberg.de> + +Dieses Image basiert auf der Arbeit von https://github.com/Phyremaster/papermc-docker und wurde so modifiziert, dass nur noch ein Befehl genutzt werden muss, um das Image auf einem beliebigen Server zu starten. + +## (emoji_spacer) \ No newline at end of file diff --git a/papermc.sh b/papermc.sh index 088ea73295379e457f3522d236a6633064635844..7157e397259c61ebe559dd2e3e01fd84f20d14e4 100755 --- a/papermc.sh +++ b/papermc.sh @@ -2,8 +2,6 @@ # Configuration PAPER_URL=https://papermc.io/api/v2/projects/paper -TM_BASE_AUTH=tmueller:supercooles_passwort_hier_einfuegen -TM_BASE_URL=https://tobistechblog.de/uni/initial.tar.gz # Enter server directory cd /papermc @@ -43,11 +41,11 @@ if [ ! -e ${JAR_NAME} ] fi # Download base plugins, worlds and configuration by Tobias Müller -#if [ ! -d "plugins" ] -# then -# curl -u ${TM_BASE_AUTH} ${TM_BASE_URL} --output initial.tar.gz -# tar -xvzf initial.tar.gz -#fi +if [ ! -d "plugins" ] + then + curl -u ${TM_BASE_AUTH} ${TM_BASE_URL} --output initial.tar.gz + tar -xvzf initial.tar.gz +fi exec_stop () { echo "\n## Recieved SIGINT/SIGTERM; Shutting down container..." diff --git a/restore.sh b/restore.sh index b08d95abf75e35468f5883390ca857b414aeeb85..126c5dca9a53768e348716fbba5aed3f01c170c8 100755 --- a/restore.sh +++ b/restore.sh @@ -1,8 +1,10 @@ #!/bin/bash #script zum wiederherstellen eines backups -cd /backups +cd /backup ls -l read -p "Gib das auszuwählende backup ein ohne Dateiendung: " var +echo "Alle Daten werden nach bestätigung gelöscht und das ausgewählte Backup wiederhergestellt." +read rm -r /papermc/* tar xvzf $var.tar.gz --directory=/papermc echo diff --git a/test.sh b/test.sh index 0e85ab7bbffddef9c8db6b2a7228752eb2f1590f..5c34f941d2e01c9a7f6969d3c819d04adede1471 100644 --- a/test.sh +++ b/test.sh @@ -9,9 +9,8 @@ if [ $? = 1 ] echo "Health: Test_Passed" fi -screen -r mc -p 0 -X stuff "backup^M" -echo "Give it some time to start the backup process..." -sleep 10 +bash /backup.sh + LEER="true" && ls /backup/* 2> /dev/null > /dev/null && LEER="false" if [ $LEER = "true" ] then @@ -20,8 +19,19 @@ if [ $LEER = "true" ] echo "Backup: Test_Passed" fi +echo "Log for additional uncatched Problems" tail /papermc/logs/latest.log echo "Optionale Tests:" +echo "Backup Job in cron found?" +cat /etc/cron.d/backup -ls -lanR /papermc/plugins/dynmap/web/standalone \ No newline at end of file +if [ -d "/papermc/plugins/dynmap/web/standanlone" ] + then + echo "Dynmap exists: Test_Passed" + echo "Check permissions manually:" + ls -lanR /papermc/plugins/dynmap/web/standalone + else + echo "Backup: Test_Failed" + echo "Dynmap nicht vorhanden" +fi \ No newline at end of file