From 41af486c3523180889655803517a63dbab22b5e5 Mon Sep 17 00:00:00 2001 From: Filip Wandzio Date: Sun, 25 Jan 2026 00:50:42 +0100 Subject: Implement basic paper server configuration --- compose.yml | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 compose.yml (limited to 'compose.yml') diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..2aea7b0 --- /dev/null +++ b/compose.yml @@ -0,0 +1,109 @@ +services: + init-dirs: + image: alpine:latest + container_name: "${SERVER_NAME}_init" + command: > + /bin/sh -c " + mkdir -p /data /backups && + chown -R ${MC_UID}:${MC_GID} /data /backups" + volumes: + - "${PWD}/${DATA_PATH}:/data" + - "${PWD}/${BACKUP_PATH}:/backups" + restart: "no" + + minecraft: + image: "${MC_IMAGE}" + container_name: "${SERVER_NAME}_minecraft" + ports: + - "${SERVER_PORT}:${MC_INTERNAL_PORT}" + environment: + EULA: "${MC_EULA}" + TYPE: "${TYPE}" + ENABLE_WHITELIST: "${ENABLE_WHITELIST}" + ICON: "${ICON}" + OVERRIDE_ICON: "true" + USE_AIKAR_FLAGS: "true" + USE_MEOWICE_FLAGS: "true" + ENFORCE_WHITELIST: "${ENFORCE_WHITELIST}" + MEMORY: "${MC_MEMORY}" + VERSION: "${VERSION}" + PAPER_CHANNEL: "${PAPER_CHANNEL}" + ENABLE_RCON: "${ENABLE_RCON}" + RCON_PASSWORD: "${RCON_PASSWORD}" + RCON_PORT: "${RCON_PORT}" + UID: "${MC_UID}" + GID: "${MC_GID}" + NETTY_NATIVE_WORKDIR: /data/tmp + volumes: + - "${PWD}/${DATA_PATH}:/data" + restart: "${RESTART_POLICY}" + tmpfs: + - /tmp:exec + cap_drop: + - ALL + cap_add: + - CHOWN + - SETUID + - SETGID + security_opt: + - ${SECURITY_OPT} + networks: + - mc_net + logging: + driver: "${LOG_DRIVER}" + options: + max-size: "${LOG_MAX_SIZE}" + max-file: "${LOG_MAX_FILE}" + depends_on: + - init-dirs + + backup: + image: "${BACKUP_IMAGE}" + container_name: "${SERVER_NAME}_backup" + depends_on: + - minecraft + - init-dirs + volumes: + - "${PWD}/${DATA_PATH}:/data" + - "${PWD}/${BACKUP_PATH}:/backups" + environment: + BACKUP_INTERVAL: "${BACKUP_INTERVAL}" + SERVER_NAME: "${SERVER_NAME}" + MAX_BACKUPS: "${MAX_BACKUPS}" + BACKUP_LOG_PREFIX: "${BACKUP_LOG_PREFIX}" + entrypoint: | + /bin/sh -c ' + : "${BACKUP_INTERVAL:?BACKUP_INTERVAL not set}" + : "${SERVER_NAME:?SERVER_NAME not set}" + : "${MAX_BACKUPS:?MAX_BACKUPS not set}" + + while [ ! -d /data/world ] || [ -z "$(ls -A /data/world)" ]; do + echo "[${SERVER_NAME}] Waiting for world generation..." + sleep 5 + done + + while true; do + TIMESTAMP=$$(date +%Y%m%d_%H%M%S) + BACKUP_FILE=/backups/${SERVER_NAME}_$$TIMESTAMP.tar.gz + if [ -d /data/world ] && [ "$(ls -A /data/world)" ]; then + tar -czf $$BACKUP_FILE -C /data . + echo "[${BACKUP_LOG_PREFIX:-${SERVER_NAME}}] Backup completed: $$BACKUP_FILE" + ls -1tr /backups/${SERVER_NAME}_*.tar.gz | head -n -${MAX_BACKUPS} | xargs -r rm -f + else + echo "[${SERVER_NAME}] World still empty, skipping backup" + fi + sleep ${BACKUP_INTERVAL} + done + ' + restart: "${RESTART_POLICY}" + networks: + - mc_net + logging: + driver: "${BACKUP_LOG_DRIVER}" + options: + max-size: "${BACKUP_LOG_MAX_SIZE}" + max-file: "${BACKUP_LOG_MAX_FILE}" + +networks: + mc_net: + driver: bridge -- cgit v1.2.3