74 lines
No EOL
39 KiB
HTML
74 lines
No EOL
39 KiB
HTML
<!doctype html><html lang=en dir=auto><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=robots content="index, follow"><title>Dockerizing my Minecraft Server + Geyser: from 'no space left' to stable releases | AlipourIm journeys</title>
|
||
<meta name=keywords content="minecraft,docker,paper,papermod,geyser,linux,lvm"><meta name=description content="How I containerized a Java Minecraft server with Geyser, hit a /var space wall, and locked the server to the latest stable release."><meta name=author content="Iman Alipour"><link rel=canonical href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/posts/minecraft_server/><link crossorigin=anonymous href=/assets/css/stylesheet.51e3b550fcc0c3f3a10e2d7b70445c6cb21171bed36521d66dc7427208cafbf9.css integrity="sha256-UeO1UPzAw/OhDi17cERcbLIRcb7TZSHWbcdCcgjK+/k=" rel="preload stylesheet" as=style><link rel=icon href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/favicon.ico><link rel=icon type=image/png sizes=16x16 href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/favicon-32x32.png><link rel=apple-touch-icon href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/apple-touch-icon.png><link rel=mask-icon href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/safari-pinned-tab.svg><meta name=theme-color content="#2e2e33"><meta name=msapplication-TileColor content="#2e2e33"><link rel=alternate hreflang=en href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/posts/minecraft_server/><noscript><style>#theme-toggle,.top-link{display:none}</style><style>@media(prefers-color-scheme:dark){:root{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--code-block-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--theme)}.list:not(.dark)::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-thumb{border-color:var(--theme)}}</style></noscript><meta property="og:url" content="http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/posts/minecraft_server/"><meta property="og:site_name" content="AlipourIm journeys"><meta property="og:title" content="Dockerizing my Minecraft Server + Geyser: from 'no space left' to stable releases"><meta property="og:description" content="How I containerized a Java Minecraft server with Geyser, hit a /var space wall, and locked the server to the latest stable release."><meta property="og:locale" content="en"><meta property="og:type" content="article"><meta property="article:section" content="posts"><meta property="article:published_time" content="2025-09-29T09:06:29+00:00"><meta property="article:modified_time" content="2025-09-29T09:06:29+00:00"><meta property="article:tag" content="Minecraft"><meta property="article:tag" content="Docker"><meta property="article:tag" content="Paper"><meta property="article:tag" content="Papermod"><meta property="article:tag" content="Geyser"><meta property="article:tag" content="Linux"><meta name=twitter:card content="summary"><meta name=twitter:title content="Dockerizing my Minecraft Server + Geyser: from 'no space left' to stable releases"><meta name=twitter:description content="How I containerized a Java Minecraft server with Geyser, hit a /var space wall, and locked the server to the latest stable release."><script type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Posts","item":"http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/posts/"},{"@type":"ListItem","position":2,"name":"Dockerizing my Minecraft Server + Geyser: from 'no space left' to stable releases","item":"http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/posts/minecraft_server/"}]}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"BlogPosting","headline":"Dockerizing my Minecraft Server + Geyser: from 'no space left' to stable releases","name":"Dockerizing my Minecraft Server \u002b Geyser: from \u0027no space left\u0027 to stable releases","description":"How I containerized a Java Minecraft server with Geyser, hit a /var space wall, and locked the server to the latest stable release.","keywords":["minecraft","docker","paper","papermod","geyser","linux","lvm"],"articleBody":"Why I’ve been running a Java Minecraft world (with Bedrock players via Geyser) in tmux. I moved it to Docker for easier updates, backups, and restarts. Along the way I hit:\nfailed to register layer: ... no space left on device Client saying: “Outdated client, please use 1.21.9 Pre-Release 2” Wanting config in a neat .env and no whitelist Here’s exactly what I did.\nFolder layout ~/minecraft/ ├─ docker-compose.yml ├─ .env └─ plugins/ .env (secrets \u0026 knobs) Use the latest stable (not snapshots/pre-releases) by setting VERSION=LATEST.\n# Minecraft server configuration EULA=TRUE TYPE=PAPER VERSION=LATEST MEMORY=4G USE_AIKAR_FLAGS=true # RCON (remote console) ENABLE_RCON=true RCON_PASSWORD=superSecretPassword123 I don’t use a whitelist, so no WHITELIST/ENFORCE_WHITELIST variables.\ndocker-compose.yml services: mc: image: itzg/minecraft-server:latest container_name: mc restart: unless-stopped ports: - \"25565:25565\" # Java - \"19132:19132/udp\" # Bedrock via Geyser plugin env_file: - .env volumes: - mc-data:/data - ./plugins:/plugins:ro volumes: mc-data: {} The version: key in Compose is obsolete now, so I dropped it.\nAdd Geyser (and optional Floodgate) as plugins mkdir -p ~/minecraft/plugins cd ~/minecraft/plugins # Geyser (Spigot/Paper) wget https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/spigot -O Geyser-Spigot.jar # Floodgate (optional: Bedrock accounts without Java linking) wget https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot -O Floodgate-Spigot.jar Start it up:\ndocker compose up -d On first run, Geyser writes its config to /data/plugins/Geyser-Spigot/. Open UDP 19132 on your firewall.\nHit a wall: /var ran out of space Docker stores layers at /var/lib/docker by default. My /var LV was tiny:\n/ d e v / m a p p e r / u b u n t u - - v g - v a r 3 . 9 G 3 . 4 G 3 3 3 M 9 2 % v a r Quick cleanup docker system df docker system prune -f docker builder prune -af sudo apt-get clean sudo journalctl --vacuum-size=100M If that’s not enough, you have two good options:\nOption A — Move Docker’s data off /var sudo systemctl stop docker sudo mkdir -p /home/docker sudo rsync -aHAX --info=progress2 /var/lib/docker/ /home/docker/ echo '{ \"data-root\": \"/home/docker\" }' | sudo tee /etc/docker/daemon.json sudo systemctl start docker docker info | grep \"Docker Root Dir\" If all looks good, free the old space:\nsudo rm -rf /var/lib/docker/* Option B — Grow /var (LVM) Check free space in the VG:\nsudo vgdisplay # look for \"Free PE / Size\" If available, extend /var by +5G:\nsudo lvextend -L +5G /dev/mapper/ubuntu--vg-var sudo resize2fs /dev/mapper/ubuntu--vg-var The version mismatch: pre-release vs stable My logs showed:\nS t a r t i n g m i n e c r a f t s e r v e r v e r s i o n 1 . 2 1 . 9 P r e - R e l e a s e 2 That happens if the server pulls a pre-release build (or if VERSION=LATEST). Fix:\nEnsure .env has: VERSION=LATEST_RELEASE Recreate: docker compose down docker compose pull docker compose up -d Verify: docker logs mc | grep \"Starting minecraft server version\" # -\u003e Starting minecraft server version 1.21.1 (example) Tip: If you want to pin and avoid auto-updates entirely, set VERSION=1.21.1 (or whatever stable you’ve validated).\nNo whitelist Because I don’t set WHITELIST/ENFORCE_WHITELIST, anyone can join (subject to online-mode, bans, and Geyser/Floodgate auth settings). Manage ops/permissions via:\ndocker exec -it mc rcon-cli \"op YourJavaIGN\" (or edit /data/ops.json).\nBackup \u0026 updates World/data live under the mc-data volume → back up /data regularly. Update cleanly: docker compose pull \u0026\u0026 docker compose up -d Watch space: watch -n5 'df -h /var; docker system df' TL;DR Put Geyser/Floodgate jars in ./plugins and expose 19132/udp. Keep configs in .env. Fix /var space by pruning, moving Docker’s data-root, or extending /var via LVM. Verify version in logs after each change. Happy block-breaking! 🧱🚀\n","wordCount":"609","inLanguage":"en","datePublished":"2025-09-29T09:06:29Z","dateModified":"2025-09-29T09:06:29Z","author":{"@type":"Person","name":"Iman Alipour"},"mainEntityOfPage":{"@type":"WebPage","@id":"http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/posts/minecraft_server/"},"publisher":{"@type":"Organization","name":"AlipourIm journeys","logo":{"@type":"ImageObject","url":"http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/favicon.ico"}}}</script></head><body id=top><script>localStorage.getItem("pref-theme")==="dark"?document.body.classList.add("dark"):localStorage.getItem("pref-theme")==="light"?document.body.classList.remove("dark"):window.matchMedia("(prefers-color-scheme: dark)").matches&&document.body.classList.add("dark")</script><header class=header><nav class=nav><div class=logo><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/ accesskey=h title="AlipourIm journeys (Alt + H)">AlipourIm journeys</a><div class=logo-switches><button id=theme-toggle accesskey=t title="(Alt + T)" aria-label="Toggle theme"><svg id="moon" width="24" height="18" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg><svg id="sun" width="24" height="18" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg></button></div></div><ul id=menu><li><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/posts/ title=Posts><span>Posts</span></a></li><li><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/phd_journey/ title=PhD_journey><span>PhD_journey</span></a></li><li><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/about/ title=About><span>About</span></a></li></ul></nav></header><main class=main><article class=post-single><header class=post-header><div class=breadcrumbs><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/>Home</a> » <a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/posts/>Posts</a></div><h1 class="post-title entry-hint-parent">Dockerizing my Minecraft Server + Geyser: from 'no space left' to stable releases</h1><div class=post-meta><span title='2025-09-29 09:06:29 +0000 UTC'>September 29, 2025</span> · 3 min · Iman Alipour
|
||
<span class=post-meta-item><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/posts/minecraft_server/#isso-thread class=isso-comments-link>Comments</a></span></div></header><div class=post-content><h2 id=why>Why<a hidden class=anchor aria-hidden=true href=#why>#</a></h2><p>I’ve been running a Java Minecraft world (with Bedrock players via <strong>Geyser</strong>) in <code>tmux</code>. I moved it to Docker for easier updates, backups, and restarts. Along the way I hit:</p><ul><li><code>failed to register layer: ... no space left on device</code></li><li>Client saying: <strong>“Outdated client, please use 1.21.9 Pre-Release 2”</strong></li><li>Wanting config in a neat <code>.env</code> and <strong>no whitelist</strong></li></ul><p>Here’s exactly what I did.</p><hr><h2 id=folder-layout>Folder layout<a hidden class=anchor aria-hidden=true href=#folder-layout>#</a></h2><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>~/minecraft/
|
||
</span></span><span style=display:flex><span>├─ docker-compose.yml
|
||
</span></span><span style=display:flex><span>├─ .env
|
||
</span></span><span style=display:flex><span>└─ plugins/
|
||
</span></span></code></pre></div><hr><h2 id=env-secrets--knobs><code>.env</code> (secrets & knobs)<a hidden class=anchor aria-hidden=true href=#env-secrets--knobs>#</a></h2><p>Use the <strong>latest stable</strong> (not snapshots/pre-releases) by setting <code>VERSION=LATEST</code>.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-env data-lang=env><span style=display:flex><span><span style=color:#75715e># Minecraft server configuration</span>
|
||
</span></span><span style=display:flex><span>EULA<span style=color:#f92672>=</span>TRUE
|
||
</span></span><span style=display:flex><span>TYPE<span style=color:#f92672>=</span>PAPER
|
||
</span></span><span style=display:flex><span>VERSION<span style=color:#f92672>=</span>LATEST
|
||
</span></span><span style=display:flex><span>MEMORY<span style=color:#f92672>=</span>4G
|
||
</span></span><span style=display:flex><span>USE_AIKAR_FLAGS<span style=color:#f92672>=</span>true
|
||
</span></span><span style=display:flex><span>
|
||
</span></span><span style=display:flex><span><span style=color:#75715e># RCON (remote console)</span>
|
||
</span></span><span style=display:flex><span>ENABLE_RCON<span style=color:#f92672>=</span>true
|
||
</span></span><span style=display:flex><span>RCON_PASSWORD<span style=color:#f92672>=</span>superSecretPassword123
|
||
</span></span></code></pre></div><blockquote><p>I don’t use a whitelist, so no <code>WHITELIST</code>/<code>ENFORCE_WHITELIST</code> variables.</p></blockquote><hr><h2 id=docker-composeyml><code>docker-compose.yml</code><a hidden class=anchor aria-hidden=true href=#docker-composeyml>#</a></h2><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-yaml data-lang=yaml><span style=display:flex><span><span style=color:#f92672>services</span>:
|
||
</span></span><span style=display:flex><span> <span style=color:#f92672>mc</span>:
|
||
</span></span><span style=display:flex><span> <span style=color:#f92672>image</span>: <span style=color:#ae81ff>itzg/minecraft-server:latest</span>
|
||
</span></span><span style=display:flex><span> <span style=color:#f92672>container_name</span>: <span style=color:#ae81ff>mc</span>
|
||
</span></span><span style=display:flex><span> <span style=color:#f92672>restart</span>: <span style=color:#ae81ff>unless-stopped</span>
|
||
</span></span><span style=display:flex><span> <span style=color:#f92672>ports</span>:
|
||
</span></span><span style=display:flex><span> - <span style=color:#e6db74>"25565:25565"</span> <span style=color:#75715e># Java</span>
|
||
</span></span><span style=display:flex><span> - <span style=color:#e6db74>"19132:19132/udp"</span> <span style=color:#75715e># Bedrock via Geyser plugin</span>
|
||
</span></span><span style=display:flex><span> <span style=color:#f92672>env_file</span>:
|
||
</span></span><span style=display:flex><span> - <span style=color:#ae81ff>.env</span>
|
||
</span></span><span style=display:flex><span> <span style=color:#f92672>volumes</span>:
|
||
</span></span><span style=display:flex><span> - <span style=color:#ae81ff>mc-data:/data</span>
|
||
</span></span><span style=display:flex><span> - <span style=color:#ae81ff>./plugins:/plugins:ro</span>
|
||
</span></span><span style=display:flex><span><span style=color:#f92672>volumes</span>:
|
||
</span></span><span style=display:flex><span> <span style=color:#f92672>mc-data</span>: {}
|
||
</span></span></code></pre></div><blockquote><p>The <code>version:</code> key in Compose is obsolete now, so I dropped it.</p></blockquote><hr><h2 id=add-geyser-and-optional-floodgate-as-plugins>Add Geyser (and optional Floodgate) as plugins<a hidden class=anchor aria-hidden=true href=#add-geyser-and-optional-floodgate-as-plugins>#</a></h2><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>mkdir -p ~/minecraft/plugins
|
||
</span></span><span style=display:flex><span>cd ~/minecraft/plugins
|
||
</span></span><span style=display:flex><span>
|
||
</span></span><span style=display:flex><span><span style=color:#75715e># Geyser (Spigot/Paper)</span>
|
||
</span></span><span style=display:flex><span>wget https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/spigot -O Geyser-Spigot.jar
|
||
</span></span><span style=display:flex><span>
|
||
</span></span><span style=display:flex><span><span style=color:#75715e># Floodgate (optional: Bedrock accounts without Java linking)</span>
|
||
</span></span><span style=display:flex><span>wget https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot -O Floodgate-Spigot.jar
|
||
</span></span></code></pre></div><p>Start it up:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>docker compose up -d
|
||
</span></span></code></pre></div><p>On first run, Geyser writes its config to <code>/data/plugins/Geyser-Spigot/</code>. Open UDP <strong>19132</strong> on your firewall.</p><hr><h2 id=hit-a-wall-var-ran-out-of-space>Hit a wall: <code>/var</code> ran out of space<a hidden class=anchor aria-hidden=true href=#hit-a-wall-var-ran-out-of-space>#</a></h2><p>Docker stores layers at <code>/var/lib/docker</code> by default. My <code>/var</code> LV was tiny:</p><div class="goat svg-container"><svg font-family="Menlo,Lucida Console,monospace" viewBox="0 0 448 25"><g transform="translate(8,16)"><path d="M404 8V24" fill="none" stroke="currentcolor"/><text text-anchor="middle" x="0" y="4" fill="currentcolor" style="font-size:1em">/</text><text text-anchor="middle" x="8" y="4" fill="currentcolor" style="font-size:1em">d</text><text text-anchor="middle" x="16" y="4" fill="currentcolor" style="font-size:1em">e</text><text text-anchor="middle" x="24" y="4" fill="currentcolor" style="font-size:1em">v</text><text text-anchor="middle" x="32" y="4" fill="currentcolor" style="font-size:1em">/</text><text text-anchor="middle" x="40" y="4" fill="currentcolor" style="font-size:1em">m</text><text text-anchor="middle" x="48" y="4" fill="currentcolor" style="font-size:1em">a</text><text text-anchor="middle" x="56" y="4" fill="currentcolor" style="font-size:1em">p</text><text text-anchor="middle" x="64" y="4" fill="currentcolor" style="font-size:1em">p</text><text text-anchor="middle" x="72" y="4" fill="currentcolor" style="font-size:1em">e</text><text text-anchor="middle" x="80" y="4" fill="currentcolor" style="font-size:1em">r</text><text text-anchor="middle" x="88" y="4" fill="currentcolor" style="font-size:1em">/</text><text text-anchor="middle" x="96" y="4" fill="currentcolor" style="font-size:1em">u</text><text text-anchor="middle" x="104" y="4" fill="currentcolor" style="font-size:1em">b</text><text text-anchor="middle" x="112" y="4" fill="currentcolor" style="font-size:1em">u</text><text text-anchor="middle" x="120" y="4" fill="currentcolor" style="font-size:1em">n</text><text text-anchor="middle" x="128" y="4" fill="currentcolor" style="font-size:1em">t</text><text text-anchor="middle" x="136" y="4" fill="currentcolor" style="font-size:1em">u</text><text text-anchor="middle" x="144" y="4" fill="currentcolor" style="font-size:1em">-</text><text text-anchor="middle" x="152" y="4" fill="currentcolor" style="font-size:1em">-</text><text text-anchor="middle" x="160" y="4" fill="currentcolor" style="font-size:1em">v</text><text text-anchor="middle" x="168" y="4" fill="currentcolor" style="font-size:1em">g</text><text text-anchor="middle" x="176" y="4" fill="currentcolor" style="font-size:1em">-</text><text text-anchor="middle" x="184" y="4" fill="currentcolor" style="font-size:1em">v</text><text text-anchor="middle" x="192" y="4" fill="currentcolor" style="font-size:1em">a</text><text text-anchor="middle" x="200" y="4" fill="currentcolor" style="font-size:1em">r</text><text text-anchor="middle" x="232" y="4" fill="currentcolor" style="font-size:1em">3</text><text text-anchor="middle" x="240" y="4" fill="currentcolor" style="font-size:1em">.</text><text text-anchor="middle" x="248" y="4" fill="currentcolor" style="font-size:1em">9</text><text text-anchor="middle" x="256" y="4" fill="currentcolor" style="font-size:1em">G</text><text text-anchor="middle" x="280" y="4" fill="currentcolor" style="font-size:1em">3</text><text text-anchor="middle" x="288" y="4" fill="currentcolor" style="font-size:1em">.</text><text text-anchor="middle" x="296" y="4" fill="currentcolor" style="font-size:1em">4</text><text text-anchor="middle" x="304" y="4" fill="currentcolor" style="font-size:1em">G</text><text text-anchor="middle" x="328" y="4" fill="currentcolor" style="font-size:1em">3</text><text text-anchor="middle" x="336" y="4" fill="currentcolor" style="font-size:1em">3</text><text text-anchor="middle" x="344" y="4" fill="currentcolor" style="font-size:1em">3</text><text text-anchor="middle" x="352" y="4" fill="currentcolor" style="font-size:1em">M</text><text text-anchor="middle" x="376" y="4" fill="currentcolor" style="font-size:1em">9</text><text text-anchor="middle" x="384" y="4" fill="currentcolor" style="font-size:1em">2</text><text text-anchor="middle" x="392" y="4" fill="currentcolor" style="font-size:1em">%</text><text text-anchor="middle" x="416" y="4" fill="currentcolor" style="font-size:1em">v</text><text text-anchor="middle" x="424" y="4" fill="currentcolor" style="font-size:1em">a</text><text text-anchor="middle" x="432" y="4" fill="currentcolor" style="font-size:1em">r</text></g></svg></div><h3 id=quick-cleanup>Quick cleanup<a hidden class=anchor aria-hidden=true href=#quick-cleanup>#</a></h3><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>docker system df
|
||
</span></span><span style=display:flex><span>docker system prune -f
|
||
</span></span><span style=display:flex><span>docker builder prune -af
|
||
</span></span><span style=display:flex><span>sudo apt-get clean
|
||
</span></span><span style=display:flex><span>sudo journalctl --vacuum-size<span style=color:#f92672>=</span>100M
|
||
</span></span></code></pre></div><p>If that’s not enough, you have two good options:</p><h3 id=option-a--move-dockers-data-off-var>Option A — Move Docker’s data off <code>/var</code><a hidden class=anchor aria-hidden=true href=#option-a--move-dockers-data-off-var>#</a></h3><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>sudo systemctl stop docker
|
||
</span></span><span style=display:flex><span>sudo mkdir -p /home/docker
|
||
</span></span><span style=display:flex><span>sudo rsync -aHAX --info<span style=color:#f92672>=</span>progress2 /var/lib/docker/ /home/docker/
|
||
</span></span><span style=display:flex><span>echo <span style=color:#e6db74>'{ "data-root": "/home/docker" }'</span> | sudo tee /etc/docker/daemon.json
|
||
</span></span><span style=display:flex><span>sudo systemctl start docker
|
||
</span></span><span style=display:flex><span>docker info | grep <span style=color:#e6db74>"Docker Root Dir"</span>
|
||
</span></span></code></pre></div><p>If all looks good, free the old space:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>sudo rm -rf /var/lib/docker/*
|
||
</span></span></code></pre></div><h3 id=option-b--grow-var-lvm>Option B — Grow <code>/var</code> (LVM)<a hidden class=anchor aria-hidden=true href=#option-b--grow-var-lvm>#</a></h3><p>Check free space in the VG:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>sudo vgdisplay <span style=color:#75715e># look for "Free PE / Size"</span>
|
||
</span></span></code></pre></div><p>If available, extend <code>/var</code> by +5G:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>sudo lvextend -L +5G /dev/mapper/ubuntu--vg-var
|
||
</span></span><span style=display:flex><span>sudo resize2fs /dev/mapper/ubuntu--vg-var
|
||
</span></span></code></pre></div><hr><h2 id=the-version-mismatch-pre-release-vs-stable>The version mismatch: pre-release vs stable<a hidden class=anchor aria-hidden=true href=#the-version-mismatch-pre-release-vs-stable>#</a></h2><p>My logs showed:</p><div class="goat svg-container"><svg font-family="Menlo,Lucida Console,monospace" viewBox="0 0 440 25"><g transform="translate(8,16)"><text text-anchor="middle" x="0" y="4" fill="currentcolor" style="font-size:1em">S</text><text text-anchor="middle" x="8" y="4" fill="currentcolor" style="font-size:1em">t</text><text text-anchor="middle" x="16" y="4" fill="currentcolor" style="font-size:1em">a</text><text text-anchor="middle" x="24" y="4" fill="currentcolor" style="font-size:1em">r</text><text text-anchor="middle" x="32" y="4" fill="currentcolor" style="font-size:1em">t</text><text text-anchor="middle" x="40" y="4" fill="currentcolor" style="font-size:1em">i</text><text text-anchor="middle" x="48" y="4" fill="currentcolor" style="font-size:1em">n</text><text text-anchor="middle" x="56" y="4" fill="currentcolor" style="font-size:1em">g</text><text text-anchor="middle" x="72" y="4" fill="currentcolor" style="font-size:1em">m</text><text text-anchor="middle" x="80" y="4" fill="currentcolor" style="font-size:1em">i</text><text text-anchor="middle" x="88" y="4" fill="currentcolor" style="font-size:1em">n</text><text text-anchor="middle" x="96" y="4" fill="currentcolor" style="font-size:1em">e</text><text text-anchor="middle" x="104" y="4" fill="currentcolor" style="font-size:1em">c</text><text text-anchor="middle" x="112" y="4" fill="currentcolor" style="font-size:1em">r</text><text text-anchor="middle" x="120" y="4" fill="currentcolor" style="font-size:1em">a</text><text text-anchor="middle" x="128" y="4" fill="currentcolor" style="font-size:1em">f</text><text text-anchor="middle" x="136" y="4" fill="currentcolor" style="font-size:1em">t</text><text text-anchor="middle" x="152" y="4" fill="currentcolor" style="font-size:1em">s</text><text text-anchor="middle" x="160" y="4" fill="currentcolor" style="font-size:1em">e</text><text text-anchor="middle" x="168" y="4" fill="currentcolor" style="font-size:1em">r</text><text text-anchor="middle" x="176" y="4" fill="currentcolor" style="font-size:1em">v</text><text text-anchor="middle" x="184" y="4" fill="currentcolor" style="font-size:1em">e</text><text text-anchor="middle" x="192" y="4" fill="currentcolor" style="font-size:1em">r</text><text text-anchor="middle" x="208" y="4" fill="currentcolor" style="font-size:1em">v</text><text text-anchor="middle" x="216" y="4" fill="currentcolor" style="font-size:1em">e</text><text text-anchor="middle" x="224" y="4" fill="currentcolor" style="font-size:1em">r</text><text text-anchor="middle" x="232" y="4" fill="currentcolor" style="font-size:1em">s</text><text text-anchor="middle" x="240" y="4" fill="currentcolor" style="font-size:1em">i</text><text text-anchor="middle" x="248" y="4" fill="currentcolor" style="font-size:1em">o</text><text text-anchor="middle" x="256" y="4" fill="currentcolor" style="font-size:1em">n</text><text text-anchor="middle" x="272" y="4" fill="currentcolor" style="font-size:1em">1</text><text text-anchor="middle" x="280" y="4" fill="currentcolor" style="font-size:1em">.</text><text text-anchor="middle" x="288" y="4" fill="currentcolor" style="font-size:1em">2</text><text text-anchor="middle" x="296" y="4" fill="currentcolor" style="font-size:1em">1</text><text text-anchor="middle" x="304" y="4" fill="currentcolor" style="font-size:1em">.</text><text text-anchor="middle" x="312" y="4" fill="currentcolor" style="font-size:1em">9</text><text text-anchor="middle" x="328" y="4" fill="currentcolor" style="font-size:1em">P</text><text text-anchor="middle" x="336" y="4" fill="currentcolor" style="font-size:1em">r</text><text text-anchor="middle" x="344" y="4" fill="currentcolor" style="font-size:1em">e</text><text text-anchor="middle" x="352" y="4" fill="currentcolor" style="font-size:1em">-</text><text text-anchor="middle" x="360" y="4" fill="currentcolor" style="font-size:1em">R</text><text text-anchor="middle" x="368" y="4" fill="currentcolor" style="font-size:1em">e</text><text text-anchor="middle" x="376" y="4" fill="currentcolor" style="font-size:1em">l</text><text text-anchor="middle" x="384" y="4" fill="currentcolor" style="font-size:1em">e</text><text text-anchor="middle" x="392" y="4" fill="currentcolor" style="font-size:1em">a</text><text text-anchor="middle" x="400" y="4" fill="currentcolor" style="font-size:1em">s</text><text text-anchor="middle" x="408" y="4" fill="currentcolor" style="font-size:1em">e</text><text text-anchor="middle" x="424" y="4" fill="currentcolor" style="font-size:1em">2</text></g></svg></div><p>That happens if the server pulls a pre-release build (or if <code>VERSION=LATEST</code>). Fix:</p><ol><li>Ensure <code>.env</code> has:<div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-env data-lang=env><span style=display:flex><span>VERSION<span style=color:#f92672>=</span>LATEST_RELEASE
|
||
</span></span></code></pre></div></li><li>Recreate:<div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>docker compose down
|
||
</span></span><span style=display:flex><span>docker compose pull
|
||
</span></span><span style=display:flex><span>docker compose up -d
|
||
</span></span></code></pre></div></li><li>Verify:<div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>docker logs mc | grep <span style=color:#e6db74>"Starting minecraft server version"</span>
|
||
</span></span><span style=display:flex><span><span style=color:#75715e># -> Starting minecraft server version 1.21.1 (example)</span>
|
||
</span></span></code></pre></div></li></ol><blockquote><p>Tip: If you <strong>want to pin</strong> and avoid auto-updates entirely, set <code>VERSION=1.21.1</code> (or whatever stable you’ve validated).</p></blockquote><hr><h2 id=no-whitelist>No whitelist<a hidden class=anchor aria-hidden=true href=#no-whitelist>#</a></h2><p>Because I don’t set <code>WHITELIST</code>/<code>ENFORCE_WHITELIST</code>, anyone can join (subject to online-mode, bans, and Geyser/Floodgate auth settings). Manage ops/permissions via:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>docker exec -it mc rcon-cli <span style=color:#e6db74>"op YourJavaIGN"</span>
|
||
</span></span></code></pre></div><p>(or edit <code>/data/ops.json</code>).</p><hr><h2 id=backup--updates>Backup & updates<a hidden class=anchor aria-hidden=true href=#backup--updates>#</a></h2><ul><li>World/data live under the <code>mc-data</code> volume → back up <code>/data</code> regularly.</li><li>Update cleanly:<div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>docker compose pull <span style=color:#f92672>&&</span> docker compose up -d
|
||
</span></span></code></pre></div></li><li>Watch space:<div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>watch -n5 <span style=color:#e6db74>'df -h /var; docker system df'</span>
|
||
</span></span></code></pre></div></li></ul><hr><h2 id=tldr>TL;DR<a hidden class=anchor aria-hidden=true href=#tldr>#</a></h2><ul><li>Put <strong>Geyser/Floodgate</strong> jars in <code>./plugins</code> and expose <strong>19132/udp</strong>.</li><li>Keep configs in <code>.env</code>.</li><li>Fix <code>/var</code> space by pruning, <strong>moving Docker’s data-root</strong>, or <strong>extending <code>/var</code></strong> via LVM.</li><li>Verify version in logs after each change.</li></ul><p>Happy block-breaking! 🧱🚀</p></div><footer class=post-footer><ul class=post-tags><li><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/tags/minecraft/>Minecraft</a></li><li><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/tags/docker/>Docker</a></li><li><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/tags/paper/>Paper</a></li><li><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/tags/papermod/>Papermod</a></li><li><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/tags/geyser/>Geyser</a></li><li><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/tags/linux/>Linux</a></li><li><a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/tags/lvm/>Lvm</a></li></ul><nav class=paginav><a class=prev href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/phd_journey/september_2025/><span class=title>« Prev</span><br><span>September '25</span>
|
||
</a><a class=next href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/posts/tor_clearnet_blog/><span class=title>Next »</span><br><span>Running my blog on Tor (.onion) and the Clearnet with Hugo + PaperMod</span></a></nav></footer><div class=comments-switch style="display:flex;gap:.5rem;margin:.5rem 0 1rem"><button id=btn-isso type=button aria-pressed=true>Anonymous (Isso)</button>
|
||
<button id=btn-giscus type=button aria-pressed=false>GitHub (Giscus)</button>
|
||
<a href=https://github.com/AlipourIm/blog-comments/discussions/categories/comments target=_blank rel=noopener>Open on GitHub ↗</a></div><div id=panel-isso><section id=isso-thread></section><script src=/isso/js/embed.min.js data-isso=/isso data-isso-css=true data-isso-lang=en data-isso-max-comments-nested=5 data-isso-sorting=newest async></script><small class=isso-powered style="display:block;margin:.5rem 0;color:var(--secondary,#888)">Comments powered by <a href=https://isso-comments.de target=_blank rel=noopener>Isso</a></small></div><div id=panel-giscus style=display:none><section id=giscus-thread></section></div><script>(function(){var t=document.getElementById("btn-isso"),n=document.getElementById("btn-giscus"),o=document.getElementById("panel-isso"),i=document.getElementById("panel-giscus"),s=!1;function e(e){var a,r=e==="isso";o.style.display=r?"":"none",i.style.display=r?"none":"",t.setAttribute("aria-pressed",r),n.setAttribute("aria-pressed",!r),!r&&!s&&(a=document.createElement("script"),a.src="https://giscus.app/client.js",a.async=!0,a.crossOrigin="anonymous",a.setAttribute("data-repo","AlipourIm/blog-comments"),a.setAttribute("data-repo-id","R_kgDOQGARyA"),a.setAttribute("data-category","Comments"),a.setAttribute("data-category-id","DIC_kwDOQGARyM4Cw3x-"),a.setAttribute("data-mapping","pathname"),a.setAttribute("data-strict","0"),a.setAttribute("data-reactions-enabled","1"),a.setAttribute("data-emit-metadata","0"),a.setAttribute("data-input-position","bottom"),a.setAttribute("data-theme","preferred_color_scheme"),a.setAttribute("data-lang","en"),document.getElementById("giscus-thread").appendChild(a),s=!0)}t.addEventListener("click",function(){e("isso")}),n.addEventListener("click",function(){e("giscus")}),e("isso")})()</script></article></main><footer class=footer><span>© 2025 <a href=http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/>AlipourIm journeys</a></span> ·
|
||
<span>Powered by
|
||
<a href=https://gohugo.io/ rel="noopener noreferrer" target=_blank>Hugo</a> &
|
||
<a href=https://github.com/adityatelange/hugo-PaperMod/ rel=noopener target=_blank>PaperMod</a></span></footer><a href=#top aria-label="go to top" title="Go to Top (Alt + G)" class=top-link id=top-link accesskey=g><svg viewBox="0 0 12 6" fill="currentcolor"><path d="M12 6H0l6-6z"/></svg>
|
||
</a><a href=/index.xml rel=alternate type=application/rss+xml title=RSS class=rss-link><svg viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 11a9 9 0 019 9"/><path d="M4 4a16 16 0 0116 16"/><circle cx="5" cy="19" r="1"/></svg>
|
||
<span>RSS</span>
|
||
</a><script>let menu=document.getElementById("menu");menu&&(menu.scrollLeft=localStorage.getItem("menu-scroll-position"),menu.onscroll=function(){localStorage.setItem("menu-scroll-position",menu.scrollLeft)}),document.querySelectorAll('a[href^="#"]').forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();var t=this.getAttribute("href").substr(1);window.matchMedia("(prefers-reduced-motion: reduce)").matches?document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView():document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView({behavior:"smooth"}),t==="top"?history.replaceState(null,null," "):history.pushState(null,null,`#${t}`)})})</script><script>var mybutton=document.getElementById("top-link");window.onscroll=function(){document.body.scrollTop>800||document.documentElement.scrollTop>800?(mybutton.style.visibility="visible",mybutton.style.opacity="1"):(mybutton.style.visibility="hidden",mybutton.style.opacity="0")}</script><script>document.getElementById("theme-toggle").addEventListener("click",()=>{document.body.className.includes("dark")?(document.body.classList.remove("dark"),localStorage.setItem("pref-theme","light")):(document.body.classList.add("dark"),localStorage.setItem("pref-theme","dark"))})</script><script>document.querySelectorAll("pre > code").forEach(e=>{const n=e.parentNode.parentNode,t=document.createElement("button");t.classList.add("copy-code"),t.innerHTML="copy";function s(){t.innerHTML="copied!",setTimeout(()=>{t.innerHTML="copy"},2e3)}t.addEventListener("click",t=>{if("clipboard"in navigator){navigator.clipboard.writeText(e.textContent),s();return}const n=document.createRange();n.selectNodeContents(e);const o=window.getSelection();o.removeAllRanges(),o.addRange(n);try{document.execCommand("copy"),s()}catch{}o.removeRange(n)}),n.classList.contains("highlight")?n.appendChild(t):n.parentNode.firstChild==n||(e.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName=="TABLE"?e.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(t):e.parentNode.appendChild(t))})</script></body></html> |