Files
ulicraft-server-v1/docker-compose.yml
Oier Bravo Urtasun c717890012 feat(compose): add dnsmasq service
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 04:11:45 +02:00

125 lines
4.4 KiB
YAML

# ──────────────────────────────────────────────────────────────────
# Minecraft 1.21.1 NeoForge + Drasl auth (with Keycloak OIDC)
# ──────────────────────────────────────────────────────────────────
# Assumes:
# - Keycloak is already running and reachable at https://keycloak.home.local
# - AdGuard Home resolves drasl.home.local -> this host's LAN IP
# - This host's LAN IP is on the same segment as the LAN party
# ──────────────────────────────────────────────────────────────────
services:
dnsmasq:
image: jpillora/dnsmasq
container_name: dnsmasq
restart: unless-stopped
ports:
# Bind DNS to the host LAN IP so it doesn't clash with systemd-resolved on :53.
- "${HOST_LAN_IP}:53:53/udp"
- "${HOST_LAN_IP}:53:53/tcp"
volumes:
- ./dnsmasq/dnsmasq.conf:/etc/dnsmasq.conf:ro
networks:
- mcnet
# The webproc UI (:8080) can be exposed later behind Caddy as dns.${BASE_DOMAIN};
# guard it with HTTP_USER / HTTP_PASS env vars.
# environment:
# HTTP_USER: "admin"
# HTTP_PASS: "change-me"
drasl:
image: unmojang/drasl:latest
container_name: drasl
restart: unless-stopped
ports:
- "25585:25585" # Drasl web UI + Yggdrasil API
volumes:
- ./drasl/config:/etc/drasl:ro
- drasl_state:/var/lib/drasl
networks:
- mcnet
# No env vars needed — all config is in ./drasl/config/config.toml
minecraft:
image: itzg/minecraft-server:java21
container_name: minecraft
restart: unless-stopped
stdin_open: true
tty: true
ports:
- "25565:25565"
- "24454:24454/udp" # Simple Voice Chat, if used
environment:
EULA: "TRUE"
TYPE: "NEOFORGE"
VERSION: "1.21.1"
NEOFORGE_VERSION: "21.1.209" # pin a known-good build; update deliberately
# ── Memory / performance ────────────────────────────────────
INIT_MEMORY: "4G"
MAX_MEMORY: "10G" # 8 players + 100 mods comfortably
USE_AIKAR_FLAGS: "TRUE"
JVM_XX_OPTS: "-XX:+UseG1GC"
# ── Auth: offline mode + authlib-injector pointing at Drasl ─
ONLINE_MODE: "FALSE"
# mount authlib-injector.jar at /extras/authlib-injector.jar
JVM_OPTS: "-javaagent:/extras/authlib-injector.jar=http://drasl.home.local:25585/authlib-injector"
# ── Server config ───────────────────────────────────────────
DIFFICULTY: "normal"
MODE: "survival"
MOTD: "LAN party — kitchen sink"
MAX_PLAYERS: "10"
VIEW_DISTANCE: "10"
SIMULATION_DISTANCE: "8"
ENFORCE_SECURE_PROFILE: "FALSE" # required for authlib-injector on 1.21+
ALLOW_FLIGHT: "TRUE" # many tech mods need this
# ── Mod sources (Modrinth recommended over CF) ──────────────
MODRINTH_PROJECTS: "@/extras/modrinth-mods.txt"
MODRINTH_DOWNLOAD_DEPENDENCIES: "required"
# Optional, only if you need CF-exclusive mods:
# CF_API_KEY: ${CF_API_KEY}
# CURSEFORGE_FILES: "@/extras/cf-mods.txt"
# ── RCON for remote admin ───────────────────────────────────
ENABLE_RCON: "TRUE"
RCON_PASSWORD: ${RCON_PASSWORD}
RCON_PORT: 25575
TZ: "Europe/Madrid"
volumes:
- mc_data:/data
- ./extras:/extras:ro # authlib-injector.jar + mod lists live here
depends_on:
- drasl
networks:
- mcnet
# Optional: backups
mc-backup:
image: itzg/mc-backup
container_name: mc-backup
restart: unless-stopped
environment:
BACKUP_INTERVAL: "6h"
RCON_HOST: "minecraft"
RCON_PASSWORD: ${RCON_PASSWORD}
PRUNE_BACKUPS_DAYS: "14"
TZ: "Europe/Madrid"
volumes:
- mc_data:/data:ro
- ./backups:/backups
depends_on:
- minecraft
networks:
- mcnet
volumes:
drasl_state:
mc_data:
networks:
mcnet:
driver: bridge