mysite/public-clearnet/posts/minecraft_server/index.html

95 lines
No EOL
28 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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="noindex, nofollow"><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=https://blog.alipour.eu/posts/minecraft_server/><link crossorigin=anonymous href=/assets/css/stylesheet.31b150d909186c48d6dbbf653acc2489945fa9ac2c8f8cd3fe8448e89e40fccf.css integrity="sha256-MbFQ2QkYbEjW279lOswkiZRfqawsj4zT/oRI6J5A/M8=" rel="preload stylesheet" as=style><link rel=icon href=https://blog.alipour.eu/favicon.ico><link rel=icon type=image/png sizes=16x16 href=https://blog.alipour.eu/favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href=https://blog.alipour.eu/favicon-32x32.png><link rel=apple-touch-icon href=https://blog.alipour.eu/apple-touch-icon.png><link rel=mask-icon href=https://blog.alipour.eu/safari-pinned-tab.svg><meta name=theme-color content="#2e2e33"><meta name=msapplication-TileColor content="#2e2e33"><link rel=alternate hreflang=en href=https://blog.alipour.eu/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><script>(function(){window.goatcounter={endpoint:"/count"};const e=document.createElement("script");e.async=!0,e.src="/js/count.js",document.head.appendChild(e)})()</script><script>(function(){const s="",t=new Intl.NumberFormat,o="visit",i="visits";function a(e){document.readyState==="complete"||document.readyState==="interactive"?setTimeout(e,0):document.addEventListener("DOMContentLoaded",e)}function r(){try{return window.goatcounter&&window.goatcounter.get_data?window.goatcounter.get_data().p:location.pathname}catch{return location.pathname}}async function e(e,t){try{const o=new URLSearchParams({t:String(Date.now())});t&&o.set("start",t);const a=`${s}/counter/${encodeURIComponent(e)}.json?${o}`,n=await fetch(a,{credentials:"omit"});if(n.status===404)return 0;if(!n.ok)throw 0;const r=await n.json(),i=Number(String(r.count).replace(/,/g,""));return Number.isFinite(i)?i:0}catch{return null}}const n=e=>e===null?"—":`${t.format(e)} ${e===1?o:i}`;a(async function(){const s=document.querySelector(".post-single");if(s){const t=s.querySelector(".post-header .post-meta, .post-header .entry-meta, .post-meta"),o=await e(r());if(t){let e=t.querySelector(".post-views");e||(e=document.createElement("span"),e.className="post-views",t.appendChild(e)),e.textContent=n(o??0)}}const i=document.querySelectorAll("article.post-entry");await Promise.all(Array.from(i).map(async t=>{const s=t.querySelector(".entry-footer, .post-meta"),o=t.querySelector("a.entry-link, h2 a, .entry-title a");if(!s||!o)return;try{const i=new URL(o.getAttribute("href"),location.origin);if(i.origin!==location.origin)return;let t=s.querySelector(".post-views");t||(t=document.createElement("span"),t.className="post-views",s.appendChild(t)),t.textContent=n(await e(i.pathname)??0)}catch{}}));const o=document.getElementById("gc_site_visitors_week");if(o){const n=await e("TOTAL","week");o.textContent=n===null?"—":t.format(n)}})})()</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=https://blog.alipour.eu/ 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=https://blog.alipour.eu/posts/ title=Posts><span>Posts</span></a></li><li><a href=https://blog.alipour.eu/phd_journey/ title=PhD_journey><span>PhD_journey</span></a></li><li><a href=https://blog.alipour.eu/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=https://blog.alipour.eu/>Home</a>&nbsp;»&nbsp;<a href=https://blog.alipour.eu/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>&nbsp;·&nbsp;3 min&nbsp;·&nbsp;Iman Alipour
<span class=post-meta-item><a href=https://blog.alipour.eu/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>Ive 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>Heres 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 dont 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>&#34;25565:25565&#34;</span> <span style=color:#75715e># Java</span>
</span></span><span style=display:flex><span> - <span style=color:#e6db74>&#34;19132:19132/udp&#34;</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=mermaid>/dev/mapper/ubuntu--vg-var 3.9G 3.4G 333M 92% /var</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 thats not enough, you have two good options:</p><h3 id=option-a--move-dockers-data-off-var>Option A — Move Dockers 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>&#39;{ &#34;data-root&#34;: &#34;/home/docker&#34; }&#39;</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>&#34;Docker Root Dir&#34;</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 &#34;Free PE / Size&#34;</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=mermaid>Starting minecraft server version 1.21.9 Pre-Release 2</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>&#34;Starting minecraft server version&#34;</span>
</span></span><span style=display:flex><span><span style=color:#75715e># -&gt; 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 youve 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 dont 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>&#34;op YourJavaIGN&#34;</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>&amp;&amp;</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>&#39;df -h /var; docker system df&#39;</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 Dockers 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><hr><div class=signature-block style=margin-top:1rem><p><strong>Downloads:</strong>
<a href=/sources/posts/minecraft_server.md>Markdown</a> ·
<a href=/sources/posts/minecraft_server.md.asc>Signature (.asc)</a></p><details class=signature><summary>View OpenPGP signature</summary><pre style=font-size:.85em;overflow-x:auto;padding:.75rem>-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEVaKl3oR5K6zGyu4/tYgoUOBMjSoFAmpkbuAACgkQtYgoUOBM
jSrrmBAAuVoSvB3tRIzD&#43;N0F5OwfYvG3V3z6ok58df7p4js91/a9lcki2ywxw/Dy
Q3aeieiGITkd/zMNjTydy4XjkScoRFFlL5GVZ2WNjO8CvjpEv3nK7EX6jRt5leMV
0D0DESMnOQzgo4a1CuNHrYPHKPaMVpJ/1aKOUZwyPC9j8/70irAJpoA2jdBgSsxw
7p/hYijX0vGJ8&#43;WSFj6707dh6hNRk5ZaNc0cElpkE4kXA31H0h/fRwPPteT4wjGA
JWQAyEUu3Vx/U0BnN6R9Lne&#43;5cqxO0Kh8VrcBpyH2VpqH3fDk1fIHk1RdhDxwKD7
OzvAT5XXRS5Q6Udc7Nsa9T/OYG&#43;elcgMAMFXosItqTRJNG72OyWloLVc/OrJ5Qsc
s81FbfcHp1dgjJ2gtO2Eyb/wb1WkyvrQegNnjuJzMt3awBN1BWex5Nn4Bz&#43;UbLDz
g6dGQxcpfDJ6F9Tjz/ru7RZ9Yic/bo8vVvKaa6FhSAwF4SluKWS3cf3meE4GQD5r
NrClzg0Vujk/3zP/6yhCL7I0SwQ&#43;NeW2HoUHeoawApBmFt/q5du4ftIx2iMMeWoH
F91H35CchRtKArxjpwFNt/J1QAPvKx9UvzA2uAl&#43;LNOWXf/gomXH6Tqm9vnWr/aX
sczdH6N2E0&#43;7KDO7NwjBJWa/QwdXKUlOq5fFgAop22v3vWOml1M=
=NmxL
-----END PGP SIGNATURE-----
</pre></details><p><em>Verify locally:</em></p><pre style=font-size:.85em;overflow-x:auto;padding:.75rem>curl -fSLO https://blog.alipour.eu/sources/posts/minecraft_server.md
curl -fSLO https://blog.alipour.eu/sources/posts/minecraft_server.md.asc
gpg --verify minecraft_server.md.asc minecraft_server.md
</pre></div></div><footer class=post-footer><ul class=post-tags><li><a href=https://blog.alipour.eu/tags/minecraft/>Minecraft</a></li><li><a href=https://blog.alipour.eu/tags/docker/>Docker</a></li><li><a href=https://blog.alipour.eu/tags/paper/>Paper</a></li><li><a href=https://blog.alipour.eu/tags/papermod/>PaperMod</a></li><li><a href=https://blog.alipour.eu/tags/geyser/>Geyser</a></li><li><a href=https://blog.alipour.eu/tags/linux/>Linux</a></li><li><a href=https://blog.alipour.eu/tags/lvm/>Lvm</a></li></ul><nav class=paginav><a class=prev href=https://blog.alipour.eu/phd_journey/september_2025/><span class=title>« Prev</span><br><span>September '25</span>
</a><a class=next href=https://blog.alipour.eu/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-giscus style=display:none><section id=giscus-thread></section></div><div id=panel-isso><section id=isso-thread data-isso-id=/posts/minecraft_server/ data-title="Dockerizing my Minecraft Server + Geyser: from &amp;#39;no space left&amp;#39; to stable releases"><noscript>Javascript needs to be activated to view comments.</noscript></section><script src=/isso/js/embed.min.js data-isso=/isso/ data-isso-css=false 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><script>(function(){var i=document.getElementById("panel-isso"),a=document.getElementById("panel-giscus"),e=document.getElementById("btn-isso"),t=document.getElementById("btn-giscus"),s=!1;function r(){if(n=localStorage.getItem("pref-theme"),n==="dark")return!0;if(n==="light")return!1;var n,e=document.documentElement,t=document.body;return!!(e.classList&&e.classList.contains("dark")||t.classList&&t.classList.contains("dark")||e.getAttribute("data-theme")==="dark"||t.getAttribute("data-theme")==="dark"||e.classList&&e.classList.contains("theme-dark")||t.classList&&t.classList.contains("theme-dark"))||window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches}function o(){return r()?"dark_dimmed":"noborder_light"}function c(){if(s)return;var t,n,e=document.createElement("script");e.src="https://giscus.app/client.js",e.async=!0,e.crossOrigin="anonymous",e.setAttribute("data-repo","AlipourIm/blog-comments"),e.setAttribute("data-repo-id","R_kgDOQGARyA"),e.setAttribute("data-category","Comments"),e.setAttribute("data-category-id","DIC_kwDOQGARyM4Cw3x-"),e.setAttribute("data-mapping","pathname"),e.setAttribute("data-strict","0"),e.setAttribute("data-reactions-enabled","1"),e.setAttribute("data-emit-metadata","0"),e.setAttribute("data-input-position","bottom"),e.setAttribute("data-lang","en"),e.setAttribute("data-theme",o()),document.getElementById("giscus-thread").appendChild(e);function i(){var e=document.querySelector("iframe.giscus-frame");e&&e.contentWindow&&e.contentWindow.postMessage({giscus:{setConfig:{theme:o()}}},"https://giscus.app")}t=document.getElementById("theme-toggle"),t&&t.addEventListener("click",function(){setTimeout(i,0)}),n=new MutationObserver(function(){i()}),n.observe(document.documentElement,{attributes:!0,attributeFilter:["class","data-theme"]}),n.observe(document.body,{attributes:!0,attributeFilter:["class","data-theme"]}),s=!0}function n(n){var s=n==="isso";i.style.display=s?"block":"none",a.style.display=s?"none":"block",e&&e.setAttribute("aria-pressed",s?"true":"false"),t&&t.setAttribute("aria-pressed",s?"false":"true"),s||c()}e&&e.addEventListener("click",function(e){e.preventDefault(),n("isso")}),t&&t.addEventListener("click",function(e){e.preventDefault(),n("giscus")}),n("isso")})()</script></article></main><footer class=footer><span>&copy; 2026 <a href=https://blog.alipour.eu/>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><div class=site-meta-row style=display:flex;align-items:center;gap:.75rem;flex-wrap:wrap><a href=/index.xml rel=alternate type=application/rss+xml title=RSS class=rss-link style=display:inline-flex;align-items:center;gap:.35rem><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><span aria-hidden=true>·</span>
<span>Visitors this week: <span id=gc_site_visitors_week></span></span></div><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>