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