95 lines
No EOL
28 KiB
HTML
95 lines
No EOL
28 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="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> » <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> · 3 min · 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>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=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 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=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>"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><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+N0F5OwfYvG3V3z6ok58df7p4js91/a9lcki2ywxw/Dy
|
||
Q3aeieiGITkd/zMNjTydy4XjkScoRFFlL5GVZ2WNjO8CvjpEv3nK7EX6jRt5leMV
|
||
0D0DESMnOQzgo4a1CuNHrYPHKPaMVpJ/1aKOUZwyPC9j8/70irAJpoA2jdBgSsxw
|
||
7p/hYijX0vGJ8+WSFj6707dh6hNRk5ZaNc0cElpkE4kXA31H0h/fRwPPteT4wjGA
|
||
JWQAyEUu3Vx/U0BnN6R9Lne+5cqxO0Kh8VrcBpyH2VpqH3fDk1fIHk1RdhDxwKD7
|
||
OzvAT5XXRS5Q6Udc7Nsa9T/OYG+elcgMAMFXosItqTRJNG72OyWloLVc/OrJ5Qsc
|
||
s81FbfcHp1dgjJ2gtO2Eyb/wb1WkyvrQegNnjuJzMt3awBN1BWex5Nn4Bz+UbLDz
|
||
g6dGQxcpfDJ6F9Tjz/ru7RZ9Yic/bo8vVvKaa6FhSAwF4SluKWS3cf3meE4GQD5r
|
||
NrClzg0Vujk/3zP/6yhCL7I0SwQ+NeW2HoUHeoawApBmFt/q5du4ftIx2iMMeWoH
|
||
F91H35CchRtKArxjpwFNt/J1QAPvKx9UvzA2uAl+LNOWXf/gomXH6Tqm9vnWr/aX
|
||
sczdH6N2E0+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 &#39;no space left&#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>© 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> |