IT
January 24, 2024

Minecraft server

Про сервер майнкрафта. Сидел я после нового года, 3 января в 2 часа ночи, и решил расслабиться и поднять сервер по майнкрафту. Как хостинг выбрал timeweb, после подключения к серверу я сразу же создал нового пользователя и перезашел с новыми кредами.
Решил я сделать ванильный сервер с парой плагинов, изначально было выбрано ядро Paper, чуть позже я отказался от него.
Скачиваем с их официального сайта файл .jar и запускаем его

java -Xms2G -Xmx2G -jar paper.jar --nogui

Он докачает нужные файлы и сгенерирует новый мир, а также нужно согласиться с правилами отредактировав файл eula.txt
После этого я задумался, что не хватает плагинов и поставил несколько из них
Плагины:
- SkinsRestorer - плагин для восстановления скинов
- TabList - информация в Tab меню
- SinglePlayerSleep - чтобы спал один игрок и ночь пропускалась
- squaremap - вебсервер с картой мира
- WanderingTrades - кастомные трейды у странствующего торговца
- PrometheusExporter - плагин для сбора статистики с сервера
Тут начинается самое интересное, я создаю nginx конфиг, для вебсервера с картой, и вешаю на свой поддомен minecraft.kill-your-soul.ru
Также в паре с прометеем работаю графана, которая делает красивые графики из данных прометея. Тут произошла ошибка, я никак не мог настроить reverse proxy, чтобы url minecraft.kill-your-soul.ru ввел именно на графану. Как итог все, что нужно было сделать, так это настроить конфиг в графане, что и было сделано

[server]
root_url = %(protocol)s://%(domain)s/grafana/

Однако развернуть прометей и графану просто так было бы скучно, поэтому я написал(украл) `docker-compose.yml`, чтобы развернуть все это в докере

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    ports:
      - 9090:9090
    restart: unless-stopped
    volumes:
      - ./prometheus:/etc/prometheus
      - prom_data:/prometheus
  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - 3000:3000
    restart: unless-stopped
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=grafana
    volumes:
      - ./grafana:/etc/grafana/provisioning/datasources
      - ./grafana.ini:/etc/grafana/grafana.ini
volumes:
  prom_data:

Итоговый вариант конфига для nginx выглядит так:

map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

upstream grafana {
  server localhost:3000;
}

server { # listens on port 80 # listen to all addresses on port 80
  root /var/www/minecraft.kill-your-soul.ru/html; # sets the root dir
  index index.html; # the index file name
    server_name minecraft.kill-your-soul.ru; # the name of the server
  location /grafana {
    rewrite  ^/grafana/(.*)  /$1 break;
    proxy_set_header Host $http_host;
    #proxy_pass http://grafana;
    proxy_pass http://127.0.0.1:3000;
  }
  location /grafana/api/live/ {
    rewrite  ^/grafana/(.*)  /$1 break;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header Host $http_host;
    # proxy_pass http://grafana;
    proxy_pass http://127.0.0.1:3000;
  }
    location / { # location of your files
    try_files $uri $uri/ =404; # if location == null return 404
  }  
  listen [::]:443 ssl ipv6only=on; # managed by Certbot
  listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/minecraft.kill-your-soul.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/minecraft.kill-your-soul.ru/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
  }
  
  server {
    if ($host = minecraft.kill-your-soul.ru) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
  listen 80;
  listen [::]:80;
  server_name minecraft.kill-your-soul.ru;
  return 404; # managed by Certbot
  }


Так же был получен сертификат для сайта(ИБ все таки) по этому гайду
https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/

Но пока мы играли вышло так, что сервер начал переодически падать, я зашел на официальный сайт papermc.io и воспользовался разделом с оптимальными флагами, что не сильно помогло, но так как они используются в финальном результате покажу вам их

#!/bin/bash
java -Xms2G -Xmx3G -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 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar paper-1.20.4-370.jar --nogui

Как итог был выбран другой сервер, который является форком от papermc - это purpur, я просто скачал его .jar файл и поменял в запуске paper на purpur