2025-07-09 10:05:20 +00:00
---
2025-04-13 16:18:40 +01:00
apiVersion : v1
kind : ConfigMap
metadata :
name : nginx-config
namespace : minecraft
data :
nginx.conf : |
2025-07-09 10:33:45 +00:00
user nginx;
worker_processes 1;
2025-07-09 10:05:20 +00:00
error_log /var/log/nginx/error.log warn;
2025-07-09 10:02:13 +00:00
pid /var/run/nginx.pid;
2025-07-09 09:49:30 +00:00
2025-04-13 16:18:40 +01:00
events {
2025-07-09 10:33:45 +00:00
worker_connections 1024;
2025-04-13 16:18:40 +01:00
}
2025-07-09 09:49:30 +00:00
2025-04-13 16:18:40 +01:00
http {
2025-07-09 10:33:45 +00:00
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
2025-07-09 13:16:41 +00:00
# Custom 502 error page with auto-refresh
2025-07-09 12:32:52 +00:00
error_page 502 /502.html;
location = /502.html {
internal;
return 200 '<!DOCTYPE html><html><head><meta charset="utf-8"><title>Server Loading</title><style>body{font-family:Arial,sans-serif;text-align:center;margin-top:100px;background:#f0f0f0}h1{color:#333}p{color:#666;font-size:18px}</style></head><body><h1>Server is loading probably...</h1><p>Please wait a moment and try refreshing the page.</p><script>setTimeout(function(){window.location.reload();}, 10000);</script></body></html>';
add_header Content-Type text/html;
}
2025-07-09 13:16:41 +00:00
# Main location - proxy to Minecraft Dynmap
2025-07-09 10:33:45 +00:00
location / {
2025-07-09 13:16:41 +00:00
# Proxy configuration for Dynmap server
2025-07-09 10:33:45 +00:00
proxy_pass http://localhost:8123;
2025-07-09 11:01:13 +00:00
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
2025-07-09 11:17:37 +00:00
2025-07-09 13:16:41 +00:00
# Inject user authentication meta tag into HTML head
2025-07-09 11:12:54 +00:00
sub_filter '<head>' '<head><meta name="remote-user" content="$http_x_authentik_username">';
2025-07-09 11:17:37 +00:00
2025-07-09 13:16:41 +00:00
# Replace default Dynmap title with custom server name
2025-07-09 10:33:45 +00:00
sub_filter 'Minecraft Dynamic Map' "Hexor's MC server";
2025-07-09 13:16:41 +00:00
2025-07-09 13:19:37 +00:00
# Inject main JavaScript functions before closing body tag
sub_filter "</body>" '<script>function getUsername(){var headers=document.querySelectorAll("meta");for(var i=0;i<headers.length;i++){if(headers[i].getAttribute("name")==="remote-user"){return headers[i].getAttribute("content");}}var jwt=document.cookie.split("; ").find(row=>row.startsWith("authentik_session="));if(jwt){try{var token=jwt.split("=")[1];var payload=JSON.parse(atob(token.split(".")[1]));return payload.sub||payload.username||"web-user";}catch(e){}}return "web-user";}var username=getUsername();console.log("Username found:", username);if(username && username!=="web-user" && window.location.search.indexOf("playername=")===-1){var currentUrl=new URL(window.location.href);currentUrl.searchParams.set("playername",username);console.log("Redirecting to:", currentUrl.href);window.location.href=currentUrl.href;}document.addEventListener("DOMContentLoaded",function(){var userBlock=document.createElement("div");userBlock.style.cssText="background-color: #CEC6CB; color: black; padding: 8px; text-align: center; font-size: medium; border-radius: 4px; position: absolute; top: 10px; right: 10px; max-width: 200px;";userBlock.innerHTML="Logged in as: <b>"+username+"</b>";document.body.appendChild(userBlock);});</script></body>';
# Add server information panel
sub_filter '</body>' '<p style="background-color: #CEC6CB; color: black; padding: 10px 10px; text-align: center; font-size: large; text-decoration: none; display: inline-block; border-radius: 4px; position: absolute; top: 10px; left: 150px;">Get <a href="https://github.com/PrismLauncher/PrismLauncher/releases/tag/8.4" >Prism Launcher</a> and <a href="/clients/1.12.2.zip" >client.zip</a> for this server. Server address <b>minecraft.hexor.cy:30565</b><br><br><a href="#" onclick="showInstallModal(); return false;" style="color: black; text-decoration: underline;">Windows Install Script</a></p></body>';
# Add installation modal
sub_filter '</body>' '<div id="installModal" style="display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5);"><div style="background-color: #CEC6CB; margin: 15% auto; padding: 10px; border-radius: 4px; width: 70%; max-width: 500px; text-align: center; color: black; font-size: large;"><h3 style="margin-top: 0; color: black;">Windows Installation</h3><p style="color: black;">Copy and paste this command into PowerShell (run as Administrator):</p><textarea id="scriptCommand" readonly style="width: 90%; height: 60px; font-family: monospace; padding: 8px; border: 1px solid #888; border-radius: 4px; resize: none; background-color: white; color: black;">iwr -useb https://minecraft.hexor.cy/clients/win-install.ps1 | iex</textarea><br><br><button id="copyButton" onclick="copyToClipboard()" style="background-color: #CEC6CB; color: black; padding: 10px 15px; border: 1px solid #888; border-radius: 4px; cursor: pointer; margin-right: 10px; font-size: large; text-decoration: none;">Copy</button><button onclick="closeInstallModal()" style="background-color: #CEC6CB; color: black; padding: 10px 15px; border: 1px solid #888; border-radius: 4px; cursor: pointer; font-size: large; text-decoration: none;">Close</button></div></div></body>';
# Add modal control functions
sub_filter '</body>' '<script>function showInstallModal() { document.getElementById("installModal").style.display = "block"; } function closeInstallModal() { document.getElementById("installModal").style.display = "none"; } function copyToClipboard() { var textarea = document.getElementById("scriptCommand"); textarea.select(); textarea.setSelectionRange(0, 99999); if (document.execCommand("copy")) { var button = document.getElementById("copyButton"); button.style.borderColor = "#4CAF50"; setTimeout(function() { button.style.borderColor = "#888"; }, 2000); } } window.onclick = function(event) { var modal = document.getElementById("installModal"); if (event.target == modal) { closeInstallModal(); } }</script></body>';
2025-07-09 13:16:41 +00:00
# Apply sub_filter replacements globally (not just once)
2025-07-09 10:33:45 +00:00
sub_filter_once off;
}
2025-07-09 13:16:41 +00:00
# Static file serving for client downloads
2025-07-09 10:33:45 +00:00
location /clients/ {
alias /mc/clients/;
2025-07-09 13:16:41 +00:00
sendfile on; # Enable efficient file serving
add_header Content-Disposition "attachment"; # Force download
autoindex on; # Enable directory listing
gzip off; # Disable compression for downloads
chunked_transfer_encoding off; # Disable chunked encoding
2025-07-09 10:33:45 +00:00
}
2025-04-13 16:18:40 +01:00
}
}
2025-07-09 10:02:13 +00:00
2025-04-13 16:18:40 +01:00
---
apiVersion : apps/v1
kind : Deployment
metadata :
name : minecraft
namespace : minecraft
labels :
app : minecraft
spec :
selector :
matchLabels :
app : minecraft
replicas : 1
strategy :
type : Recreate
template :
metadata :
labels :
app : minecraft
spec :
nodeSelector :
kubernetes.io/hostname : master.tail2fe2d.ts.net
volumes :
- name : storage
hostPath :
path : /k8s/mc-server/
2025-04-24 21:23:37 +00:00
type : DirectoryOrCreate
2025-04-13 16:18:40 +01:00
- name : nginx-config
configMap :
name : nginx-config
terminationGracePeriodSeconds : 10
containers :
- name : nginx
image : nginx:latest
ports :
- containerPort : 80
volumeMounts :
- name : nginx-config
mountPath : /etc/nginx/nginx.conf
subPath : nginx.conf
- name : storage
mountPath : /mc
- name : minecraft
image : 'openjdk:8-jdk-alpine'
command : [ "java" ]
args :
2025-06-25 21:51:03 +00:00
- -Xms4G
- -Xmx4G
2025-04-13 16:18:40 +01:00
- -XX:+UseG1GC
- -XX:+ParallelRefProcEnabled
- -XX:MaxGCPauseMillis=200
- -XX:+UnlockExperimentalVMOptions
- -XX:+DisableExplicitGC
- -XX:+AlwaysPreTouch
- -XX:G1NewSizePercent=30
- -XX:G1MaxNewSizePercent=40
- -XX:G1HeapRegionSize=8M
- -XX:G1ReservePercent=20
- -XX:G1HeapWastePercent=5
- -XX:G1MixedGCCountTarget=4
- -XX:InitiatingHeapOccupancyPercent=15
- -XX:G1MixedGCLiveThresholdPercent=90
- -XX:G1RSetUpdatingPauseTimePercent=5
- -XX:SurvivorRatio=32
- -XX:+PerfDisableSharedMem
- -XX:MaxTenuringThreshold=1
- -jar
- forge-1.12.2-14.23.5.2854.jar
- nogui
workingDir : /mc/
resources :
limits :
2025-06-25 21:51:03 +00:00
memory : 8Gi
2025-04-13 16:18:40 +01:00
#cpu: 1
requests :
2025-06-25 21:51:03 +00:00
memory : 5Gi
2025-04-13 16:18:40 +01:00
#cpu: 100m
ports :
- name : game
containerPort : 25565
protocol : TCP
- name : dynmap
containerPort : 8123
protocol : TCP
volumeMounts :
- name : storage
mountPath : /mc
---
apiVersion : v1
kind : Service
metadata :
name : minecraft-exporter
namespace : minecraft
spec :
selector :
app : minecraft
ports :
- protocol : TCP
port : 19565
targetPort : 19565