aboutsummaryrefslogtreecommitdiffstats
path: root/compose.yml
diff options
context:
space:
mode:
authorFilip Wandzio <contact@philw.dev>2026-01-25 00:50:42 +0100
committerFilip Wandzio <contact@philw.dev>2026-01-25 00:50:42 +0100
commit41af486c3523180889655803517a63dbab22b5e5 (patch)
tree700295043e5a1579613143b3b4b4377cdcd7bea5 /compose.yml
downloadmcsv-41af486c3523180889655803517a63dbab22b5e5.tar.gz
mcsv-41af486c3523180889655803517a63dbab22b5e5.zip
Implement basic paper server configurationHEADmaster
Diffstat (limited to 'compose.yml')
-rw-r--r--compose.yml109
1 files changed, 109 insertions, 0 deletions
diff --git a/compose.yml b/compose.yml
new file mode 100644
index 0000000..2aea7b0
--- /dev/null
+++ b/compose.yml
@@ -0,0 +1,109 @@
1services:
2 init-dirs:
3 image: alpine:latest
4 container_name: "${SERVER_NAME}_init"
5 command: >
6 /bin/sh -c "
7 mkdir -p /data /backups &&
8 chown -R ${MC_UID}:${MC_GID} /data /backups"
9 volumes:
10 - "${PWD}/${DATA_PATH}:/data"
11 - "${PWD}/${BACKUP_PATH}:/backups"
12 restart: "no"
13
14 minecraft:
15 image: "${MC_IMAGE}"
16 container_name: "${SERVER_NAME}_minecraft"
17 ports:
18 - "${SERVER_PORT}:${MC_INTERNAL_PORT}"
19 environment:
20 EULA: "${MC_EULA}"
21 TYPE: "${TYPE}"
22 ENABLE_WHITELIST: "${ENABLE_WHITELIST}"
23 ICON: "${ICON}"
24 OVERRIDE_ICON: "true"
25 USE_AIKAR_FLAGS: "true"
26 USE_MEOWICE_FLAGS: "true"
27 ENFORCE_WHITELIST: "${ENFORCE_WHITELIST}"
28 MEMORY: "${MC_MEMORY}"
29 VERSION: "${VERSION}"
30 PAPER_CHANNEL: "${PAPER_CHANNEL}"
31 ENABLE_RCON: "${ENABLE_RCON}"
32 RCON_PASSWORD: "${RCON_PASSWORD}"
33 RCON_PORT: "${RCON_PORT}"
34 UID: "${MC_UID}"
35 GID: "${MC_GID}"
36 NETTY_NATIVE_WORKDIR: /data/tmp
37 volumes:
38 - "${PWD}/${DATA_PATH}:/data"
39 restart: "${RESTART_POLICY}"
40 tmpfs:
41 - /tmp:exec
42 cap_drop:
43 - ALL
44 cap_add:
45 - CHOWN
46 - SETUID
47 - SETGID
48 security_opt:
49 - ${SECURITY_OPT}
50 networks:
51 - mc_net
52 logging:
53 driver: "${LOG_DRIVER}"
54 options:
55 max-size: "${LOG_MAX_SIZE}"
56 max-file: "${LOG_MAX_FILE}"
57 depends_on:
58 - init-dirs
59
60 backup:
61 image: "${BACKUP_IMAGE}"
62 container_name: "${SERVER_NAME}_backup"
63 depends_on:
64 - minecraft
65 - init-dirs
66 volumes:
67 - "${PWD}/${DATA_PATH}:/data"
68 - "${PWD}/${BACKUP_PATH}:/backups"
69 environment:
70 BACKUP_INTERVAL: "${BACKUP_INTERVAL}"
71 SERVER_NAME: "${SERVER_NAME}"
72 MAX_BACKUPS: "${MAX_BACKUPS}"
73 BACKUP_LOG_PREFIX: "${BACKUP_LOG_PREFIX}"
74 entrypoint: |
75 /bin/sh -c '
76 : "${BACKUP_INTERVAL:?BACKUP_INTERVAL not set}"
77 : "${SERVER_NAME:?SERVER_NAME not set}"
78 : "${MAX_BACKUPS:?MAX_BACKUPS not set}"
79
80 while [ ! -d /data/world ] || [ -z "$(ls -A /data/world)" ]; do
81 echo "[${SERVER_NAME}] Waiting for world generation..."
82 sleep 5
83 done
84
85 while true; do
86 TIMESTAMP=$$(date +%Y%m%d_%H%M%S)
87 BACKUP_FILE=/backups/${SERVER_NAME}_$$TIMESTAMP.tar.gz
88 if [ -d /data/world ] && [ "$(ls -A /data/world)" ]; then
89 tar -czf $$BACKUP_FILE -C /data .
90 echo "[${BACKUP_LOG_PREFIX:-${SERVER_NAME}}] Backup completed: $$BACKUP_FILE"
91 ls -1tr /backups/${SERVER_NAME}_*.tar.gz | head -n -${MAX_BACKUPS} | xargs -r rm -f
92 else
93 echo "[${SERVER_NAME}] World still empty, skipping backup"
94 fi
95 sleep ${BACKUP_INTERVAL}
96 done
97 '
98 restart: "${RESTART_POLICY}"
99 networks:
100 - mc_net
101 logging:
102 driver: "${BACKUP_LOG_DRIVER}"
103 options:
104 max-size: "${BACKUP_LOG_MAX_SIZE}"
105 max-file: "${BACKUP_LOG_MAX_FILE}"
106
107networks:
108 mc_net:
109 driver: bridge