mirror of
https://github.com/oddlama/nix-config.git
synced 2025-10-10 23:00:39 +02:00
feat: add minecraft server VM
This commit is contained in:
parent
45f8745ae8
commit
f4699c9663
27 changed files with 1582 additions and 3 deletions
|
@ -135,8 +135,8 @@
|
|||
enableStorageDataset = true;
|
||||
}
|
||||
// mkMicrovm "ai" {}
|
||||
#// mkMicrovm "minecraft"
|
||||
#// mkMicrovm "firefly"
|
||||
#// mkMicrovm "fasten-health"
|
||||
// mkMicrovm "minecraft" {}
|
||||
#// mkMicrovm "firefly" {}
|
||||
#// mkMicrovm "fasten-health" {}
|
||||
);
|
||||
}
|
||||
|
|
548
hosts/sire/guests/minecraft.nix
Normal file
548
hosts/sire/guests/minecraft.nix
Normal file
|
@ -0,0 +1,548 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
inherit (lib) getExe;
|
||||
|
||||
minecraftDomain = "mc.${config.repo.secrets.global.domains.me}";
|
||||
dataDir = "/var/lib/minecraft";
|
||||
|
||||
minecraft-attach = pkgs.writeShellApplication {
|
||||
name = "minecraft-attach";
|
||||
runtimeInputs = [pkgs.tmux];
|
||||
text = ''
|
||||
shopt -s nullglob
|
||||
|
||||
[[ $EUID == 0 ]] || { echo "You have to be root (or use sudo) to attach to the console." >&2; exit 1; }
|
||||
|
||||
SERVER_NAME="''${1-none}"
|
||||
TMUX_SOCKET="/run/minecraft-$1/tmux"
|
||||
|
||||
if [[ ! -e "$TMUX_SOCKET" ]]; then
|
||||
echo "error: Unknown server name '$SERVER_NAME', or service not started." >&2
|
||||
AVAILABLE=("/run/minecraft-"*"/tmux")
|
||||
if [[ "''${#AVAILABLE[@]}" == 0 ]]; then
|
||||
echo "There are currently no servers available. Check your system services." >&2
|
||||
else
|
||||
avail=("''${AVAILABLE[@]#"/run/minecraft-"}")
|
||||
avail=("''${avail[@]%"/tmux"}")
|
||||
echo "Available servers: ''${avail[*]}" >&2
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exec runuser -u minecraft -- tmux -S "$TMUX_SOCKET" attach-session
|
||||
'';
|
||||
};
|
||||
|
||||
helper-functions =
|
||||
/*
|
||||
bash
|
||||
*/
|
||||
''
|
||||
################################################################
|
||||
# General helper functions
|
||||
|
||||
function print_error() { echo "[1;31merror:[m $*" >&2; }
|
||||
function die() { print_error "$@"; exit 1; }
|
||||
|
||||
function substatus() { echo "[32m$*[m"; }
|
||||
function datetime() { date "+%Y-%m-%d %H:%M:%S"; }
|
||||
function status_time() { echo "[1;33m[$(datetime)] [1m$*[m"; }
|
||||
|
||||
function flush_stdin() {
|
||||
local empty_stdin
|
||||
# Unused variable is intentional.
|
||||
# shellcheck disable=SC2034
|
||||
while read -r -t 0.01 empty_stdin; do true; done
|
||||
}
|
||||
|
||||
function ask() {
|
||||
local response
|
||||
while true; do
|
||||
flush_stdin
|
||||
read -r -p "$* (Y/n) " response || die "Error in read"
|
||||
case "''${response,,}" in
|
||||
"") return 0 ;;
|
||||
y|yes) return 0 ;;
|
||||
n|no) return 1 ;;
|
||||
*) continue ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
################################################################
|
||||
# Download helper functions
|
||||
|
||||
# $@: command to run as minecraft if user was changed.
|
||||
# You want to pass path/to/curent/script.sh "$@".
|
||||
function become_minecaft() {
|
||||
if [[ $(id -un) != "minecraft" ]]; then
|
||||
if [[ $EUID == 0 ]] && ask "This script must be executed as the minecraft user. Change user and continue?"; then
|
||||
# shellcheck disable=SC2093
|
||||
exec runuser -u minecraft "$@"
|
||||
die "Could not change user!"
|
||||
else
|
||||
die "This script must be executed as the minecraft user!"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# $1: output file name
|
||||
function download_paper() {
|
||||
local paper_version
|
||||
local paper_build
|
||||
local paper_download
|
||||
paper_version="$(curl -s -o - "https://papermc.io/api/v2/projects/paper" | jq -r ".versions[-1]")" \
|
||||
|| die "Error while retrieving paper version"
|
||||
paper_build="$(curl -s -o - "https://papermc.io/api/v2/projects/paper/versions/$paper_version" | jq -r ".builds[-1]")" \
|
||||
|| die "Error while retrieving paper builds"
|
||||
paper_download="$(curl -s -o - "https://papermc.io/api/v2/projects/paper/versions/$paper_version/builds/$paper_build" | jq -r ".downloads.application.name")" \
|
||||
|| die "Error while retrieving paper download name"
|
||||
|
||||
substatus "Downloading paper version $paper_version build $paper_build ($paper_download)"
|
||||
wget -q --show-progress "https://papermc.io/api/v2/projects/paper/versions/$paper_version/builds/$paper_build/downloads/$paper_download" \
|
||||
-O "$1" \
|
||||
|| die "Could not download paper"
|
||||
}
|
||||
|
||||
# $1: output file name
|
||||
function download_velocity() {
|
||||
local velocity_version
|
||||
local velocity_build
|
||||
local velocity_download
|
||||
velocity_version="$(curl -s -o - "https://papermc.io/api/v2/projects/velocity" | jq -r ".versions[-1]")" \
|
||||
|| die "Error while retrieving velocity version"
|
||||
velocity_build="$(curl -s -o - "https://papermc.io/api/v2/projects/velocity/versions/$velocity_version" | jq -r ".builds[-1]")" \
|
||||
|| die "Error while retrieving velocity builds"
|
||||
velocity_download="$(curl -s -o - "https://papermc.io/api/v2/projects/velocity/versions/$velocity_version/builds/$velocity_build" | jq -r ".downloads.application.name")" \
|
||||
|| die "Error while retrieving velocity download name"
|
||||
|
||||
substatus "Downloading velocity version $velocity_version build $velocity_build ($velocity_download)"
|
||||
wget -q --show-progress "https://papermc.io/api/v2/projects/velocity/versions/$velocity_version/builds/$velocity_build/downloads/$velocity_download" \
|
||||
-O "$1" \
|
||||
|| die "Could not download velocity"
|
||||
}
|
||||
|
||||
# $1: repo, e.g. "oddlama/vane"
|
||||
declare -A LATEST_GITHUB_RELEASE_TAG_CACHE
|
||||
function latest_github_release_tag() {
|
||||
local repo=$1
|
||||
if [[ ! -v "LATEST_GITHUB_RELEASE_TAG_CACHE[$repo]" ]]; then
|
||||
local tmp
|
||||
tmp=$(curl -s "https://api.github.com/repos/$repo/releases/latest" | jq -r .tag_name) \
|
||||
|| die "Error while retrieving latest github release tag of $repo"
|
||||
LATEST_GITHUB_RELEASE_TAG_CACHE[$repo]="$tmp"
|
||||
fi
|
||||
echo "''${LATEST_GITHUB_RELEASE_TAG_CACHE[$repo]}"
|
||||
}
|
||||
|
||||
# $1: repo, e.g. "oddlama/vane"
|
||||
# $2: remote file name.
|
||||
# {TAG} will be replaced with the release tag
|
||||
# {VERSION} will be replaced with release tag excluding a leading v, if present
|
||||
# $3: output file name
|
||||
function download_latest_github_release() {
|
||||
local repo=$1
|
||||
local remote_file=$2
|
||||
local output=$3
|
||||
|
||||
local tag
|
||||
tag=$(latest_github_release_tag "$repo")
|
||||
local version="''${tag#v}" # Always strip leading v in version.
|
||||
|
||||
remote_file="''${remote_file//"{TAG}"/"$tag"}"
|
||||
remote_file="''${remote_file//"{VERSION}"/"$version"}"
|
||||
|
||||
wget -q --show-progress "https://github.com/$repo/releases/download/$tag/$remote_file" -O "$output" \
|
||||
|| die "Could not download $remote_file from github repo $repo"
|
||||
}
|
||||
|
||||
# $1: url
|
||||
# $2: output file name
|
||||
function download_file() {
|
||||
wget -q --show-progress "$1" -O "$2" || die "Could not download $1"
|
||||
}
|
||||
'';
|
||||
|
||||
server-backup-script = pkgs.writeShellApplication {
|
||||
name = "minecraft-backup";
|
||||
runtimeInputs = [pkgs.rdiff-backup];
|
||||
text = ''
|
||||
BACKUP_LOG_FILE="logs/backup.log"
|
||||
BACKUP_TO="backups"
|
||||
BACKUP_DIRS=(
|
||||
'plugins'
|
||||
'world'
|
||||
'world_nether'
|
||||
'world_the_end'
|
||||
)
|
||||
|
||||
cd ${dataDir}/server || exit 1
|
||||
${helper-functions}
|
||||
|
||||
status_time "Starting backup"
|
||||
|
||||
mkdir -p "$BACKUP_TO" &>/dev/null
|
||||
for i in "''${!BACKUP_DIRS[@]}"; do
|
||||
status_time "Backing up ''${BACKUP_DIRS[$i]}" | tee -a "$BACKUP_LOG_FILE"
|
||||
rdiff-backup "''${BACKUP_DIRS[$i]}" "$BACKUP_TO/''${BACKUP_DIRS[$i]}" &>> "$BACKUP_LOG_FILE"
|
||||
done
|
||||
|
||||
status_time "Backup finished" | tee -a "$BACKUP_LOG_FILE"
|
||||
'';
|
||||
};
|
||||
|
||||
server-start-script = pkgs.writeShellApplication {
|
||||
name = "minecraft-server-start";
|
||||
runtimeInputs = [pkgs.procps pkgs.gnugrep];
|
||||
text = ''
|
||||
cd ${dataDir}/server
|
||||
|
||||
# Update velocity secret
|
||||
VELOCITY_SECRET="$(cat ../proxy/forwarding.secret)" \
|
||||
${getExe pkgs.yq-go} -i '.proxies.velocity.secret = strenv(VELOCITY_SECRET)' \
|
||||
config/paper-global.yml
|
||||
|
||||
# Use 80% of RAM, but not more than 12GiB and not less than 1GiB
|
||||
total_ram_gibi=$(free -g | grep -oP '\d+' | head -n1)
|
||||
ram="$((total_ram_gibi * 8 / 10))"
|
||||
[[ "$ram" -le 8 ]] || ram=8
|
||||
[[ "$ram" -ge 1 ]] || ram=1
|
||||
|
||||
echo "[1;33mExecuting server using ''${ram}GiB of RAM[m"
|
||||
exec ${getExe pkgs.temurin-jre-bin} -Xms''${ram}G -Xmx''${ram}G \
|
||||
-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.jar nogui
|
||||
'';
|
||||
};
|
||||
|
||||
proxy-start-script = pkgs.writeShellApplication {
|
||||
name = "minecraft-proxy-start";
|
||||
text = ''
|
||||
cd ${dataDir}/proxy
|
||||
|
||||
echo "[1;33mExecuting proxy server[m"
|
||||
exec ${getExe pkgs.temurin-jre-bin} -Xms1G -Xmx1G -XX:+UseG1GC -XX:G1HeapRegionSize=4M -XX:+UnlockExperimentalVMOptions -XX:+ParallelRefProcEnabled -XX:+AlwaysPreTouch -XX:MaxInlineLevel=15 -jar velocity.jar
|
||||
'';
|
||||
};
|
||||
|
||||
server-update-script = pkgs.writeShellApplication {
|
||||
name = "minecraft-server-update";
|
||||
runtimeInputs = [pkgs.wget pkgs.curl pkgs.jq];
|
||||
text = ''
|
||||
cd ${dataDir}/server || exit 1
|
||||
${helper-functions}
|
||||
become_minecaft "./update.sh"
|
||||
|
||||
################################################################
|
||||
# Download paper and prepare plugins
|
||||
|
||||
download_paper paper.jar
|
||||
|
||||
# Create plugins directory
|
||||
mkdir -p plugins \
|
||||
|| die "Could not create directory 'plugins'"
|
||||
# Create optional plugins directory
|
||||
mkdir -p plugins/optional \
|
||||
|| die "Could not create directory 'plugins/optional'"
|
||||
|
||||
################################################################
|
||||
# Download plugins
|
||||
|
||||
substatus "Downloading plugins"
|
||||
for module in admin bedtime core enchantments permissions portals regions trifles; do
|
||||
download_latest_github_release "oddlama/vane" "vane-$module-{VERSION}.jar" "plugins/vane-$module.jar"
|
||||
done
|
||||
|
||||
download_file "https://ci.dmulloy2.net/job/ProtocolLib/lastSuccessfulBuild/artifact/build/libs/ProtocolLib.jar" plugins/ProtocolLib.jar
|
||||
download_latest_github_release "BlueMap-Minecraft/BlueMap" "BlueMap-{VERSION}-spigot.jar" plugins/bluemap.jar
|
||||
'';
|
||||
};
|
||||
|
||||
proxy-update-script = pkgs.writeShellApplication {
|
||||
name = "minecraft-proxy-update";
|
||||
runtimeInputs = [pkgs.wget pkgs.curl pkgs.jq];
|
||||
text = ''
|
||||
cd ${dataDir}/proxy || exit 1
|
||||
${helper-functions}
|
||||
become_minecaft "./update.sh"
|
||||
|
||||
################################################################
|
||||
# Download velocity and prepare plugins
|
||||
|
||||
download_velocity velocity.jar
|
||||
|
||||
# Create plugins directory
|
||||
mkdir -p plugins \
|
||||
|| die "Could not create directory 'plugins'"
|
||||
|
||||
################################################################
|
||||
# Download plugins
|
||||
|
||||
substatus "Downloading plugins"
|
||||
download_latest_github_release "oddlama/vane" "vane-velocity-{VERSION}.jar" "plugins/vane-velocity.jar"
|
||||
'';
|
||||
};
|
||||
|
||||
commonServiceConfig = {
|
||||
Restart = "on-failure";
|
||||
User = "minecraft";
|
||||
|
||||
# Hardening
|
||||
AmbientCapabilities = ["CAP_KILL"];
|
||||
CapabilityBoundingSet = ["CAP_KILL"];
|
||||
LockPersonality = true;
|
||||
NoNewPrivileges = true;
|
||||
PrivateDevices = true;
|
||||
PrivateTmp = true;
|
||||
PrivateUsers = true;
|
||||
ProtectClock = true;
|
||||
ProtectControlGroups = true;
|
||||
ProtectHome = true;
|
||||
ProtectHostname = true;
|
||||
ProtectKernelLogs = true;
|
||||
ProtectKernelModules = true;
|
||||
ProtectKernelTunables = true;
|
||||
ProtectProc = "invisible";
|
||||
ProtectSystem = "strict";
|
||||
RestrictNamespaces = true;
|
||||
RestrictRealtime = true;
|
||||
RestrictSUIDSGID = true;
|
||||
SystemCallArchitectures = "native";
|
||||
UMask = "0027";
|
||||
};
|
||||
in {
|
||||
microvm.mem = 1024 * 24;
|
||||
microvm.vcpu = 16;
|
||||
|
||||
wireguard.proxy-sentinel = {
|
||||
client.via = "sentinel";
|
||||
firewallRuleForNode.sentinel.allowedTCPPorts = [80 25565 25566];
|
||||
};
|
||||
|
||||
users.groups.minecraft.members = ["nginx"];
|
||||
users.users.minecraft = {
|
||||
description = "Minecraft server service user";
|
||||
home = dataDir;
|
||||
isSystemUser = true;
|
||||
group = "minecraft";
|
||||
};
|
||||
|
||||
environment.persistence."/persist".directories = [
|
||||
{
|
||||
directory = dataDir;
|
||||
user = "minecraft";
|
||||
group = "minecraft";
|
||||
mode = "0750";
|
||||
}
|
||||
];
|
||||
|
||||
nodes.sentinel = {
|
||||
# Make sure to masquerade 25565 (wan) -> 25565 (proxy-sentinel)
|
||||
# Make sure to masquerade 25566 (wan) -> 25566 (proxy-sentinel)
|
||||
networking.nftables.chains = {
|
||||
postrouting.to-minecraft = {
|
||||
after = ["hook"];
|
||||
rules = [
|
||||
"iifname wan ip daddr ${config.wireguard.proxy-sentinel.ipv4} tcp dport 25565 masquerade random"
|
||||
"iifname wan ip6 daddr ${config.wireguard.proxy-sentinel.ipv6} tcp dport 25565 masquerade random"
|
||||
"iifname wan ip daddr ${config.wireguard.proxy-sentinel.ipv4} tcp dport 25566 masquerade random"
|
||||
"iifname wan ip6 daddr ${config.wireguard.proxy-sentinel.ipv6} tcp dport 25566 masquerade random"
|
||||
];
|
||||
};
|
||||
prerouting.to-minecraft = {
|
||||
after = ["hook"];
|
||||
rules = [
|
||||
"iifname wan tcp dport 25565 dnat ip to ${config.wireguard.proxy-sentinel.ipv4}"
|
||||
"iifname wan tcp dport 25565 dnat ip6 to ${config.wireguard.proxy-sentinel.ipv6}"
|
||||
"iifname wan tcp dport 25566 dnat ip to ${config.wireguard.proxy-sentinel.ipv4}"
|
||||
"iifname wan tcp dport 25566 dnat ip6 to ${config.wireguard.proxy-sentinel.ipv6}"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
networking.providedDomains.minecraft = minecraftDomain;
|
||||
|
||||
services.nginx = {
|
||||
upstreams.minecraft = {
|
||||
servers."${config.wireguard.proxy-sentinel.ipv4}:80" = {};
|
||||
extraConfig = ''
|
||||
zone minecraft 64k;
|
||||
keepalive 2;
|
||||
'';
|
||||
};
|
||||
virtualHosts.${minecraftDomain} = {
|
||||
forceSSL = true;
|
||||
useACMEWildcardHost = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://minecraft";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services.minecraft-server = {
|
||||
description = "Minecraft Server Service";
|
||||
wantedBy = ["multi-user.target"];
|
||||
after = ["network.target"];
|
||||
path = [pkgs.ncurses]; # for infocmp
|
||||
|
||||
serviceConfig =
|
||||
commonServiceConfig
|
||||
// {
|
||||
Type = "forking";
|
||||
ExecStart = ''${getExe pkgs.tmux} -S /run/minecraft-server/tmux set -g default-shell ${getExe pkgs.bashInteractive} ";" new-session -d "${getExe pkgs.python3} ${./minecraft/server-loop.py} --block control/start.block ./start.sh :POST: ./backup.sh"'';
|
||||
ExecStop = "${getExe pkgs.tmux} -S /run/minecraft-server/tmux kill-server";
|
||||
|
||||
WorkingDirectory = "${dataDir}/server";
|
||||
RuntimeDirectory = "minecraft-server";
|
||||
ReadWritePaths = ["${dataDir}/server" "${dataDir}/web"];
|
||||
ReadOnlyPaths = "${dataDir}/proxy";
|
||||
};
|
||||
|
||||
preStart = ''
|
||||
ln -sfT ${getExe server-start-script} start.sh
|
||||
ln -sfT ${getExe server-backup-script} backup.sh
|
||||
ln -sfT ${getExe server-update-script} update.sh
|
||||
|
||||
function copyFile() {
|
||||
cp "$1" "$2"
|
||||
chmod 600 "$2"
|
||||
}
|
||||
|
||||
copyFile ${./minecraft/server/eula.txt} eula.txt
|
||||
copyFile ${./minecraft/server/server.properties} server.properties
|
||||
copyFile ${./minecraft/server/spigot.yml} spigot.yml
|
||||
copyFile ${./minecraft/server/commands.yml} commands.yml
|
||||
mkdir -p config
|
||||
copyFile ${./minecraft/server/config/paper-global.yml} config/paper-global.yml
|
||||
copyFile ${./minecraft/server/config/paper-world-defaults.yml} config/paper-world-defaults.yml
|
||||
|
||||
if [[ ! -e paper.jar ]]; then
|
||||
./update.sh
|
||||
fi
|
||||
'';
|
||||
};
|
||||
|
||||
systemd.services.minecraft-proxy = {
|
||||
description = "Minecraft Proxy Service";
|
||||
wantedBy = ["multi-user.target"];
|
||||
after = ["network.target"];
|
||||
path = [pkgs.ncurses]; # for infocmp
|
||||
|
||||
serviceConfig =
|
||||
commonServiceConfig
|
||||
// {
|
||||
Type = "forking";
|
||||
ExecStart = ''${getExe pkgs.tmux} -S /run/minecraft-proxy/tmux set -g default-shell ${getExe pkgs.bashInteractive} ";" new-session -d "${getExe pkgs.python3} ${./minecraft/server-loop.py} ./start.sh"'';
|
||||
ExecStop = "${getExe pkgs.tmux} -S /run/minecraft-proxy/tmux kill-server";
|
||||
|
||||
WorkingDirectory = "${dataDir}/proxy";
|
||||
RuntimeDirectory = "minecraft-proxy";
|
||||
ReadWritePaths = ["${dataDir}/proxy" "${dataDir}/server/control"];
|
||||
};
|
||||
|
||||
preStart = ''
|
||||
ln -sfT ${getExe proxy-start-script} start.sh
|
||||
ln -sfT ${getExe proxy-update-script} update.sh
|
||||
|
||||
function copyFile() {
|
||||
cp "$1" "$2"
|
||||
chmod 600 "$2"
|
||||
}
|
||||
|
||||
copyFile ${./minecraft/proxy/velocity.toml} velocity.toml
|
||||
mkdir -p plugins/vane-velocity
|
||||
copyFile ${./minecraft/proxy/plugins/vane-velocity/config.toml} plugins/vane-velocity/config.toml
|
||||
|
||||
if [[ ! -e velocity.jar ]]; then
|
||||
./update.sh
|
||||
fi
|
||||
'';
|
||||
};
|
||||
|
||||
systemd.tmpfiles.settings."50-minecraft" = {
|
||||
"${dataDir}".d = {
|
||||
user = "minecraft";
|
||||
mode = "0750";
|
||||
};
|
||||
"${dataDir}/server".d = {
|
||||
user = "minecraft";
|
||||
mode = "0700";
|
||||
};
|
||||
"${dataDir}/server/control".d = {
|
||||
user = "minecraft";
|
||||
mode = "0700";
|
||||
};
|
||||
"${dataDir}/proxy".d = {
|
||||
user = "minecraft";
|
||||
mode = "0700";
|
||||
};
|
||||
"${dataDir}/web".d = {
|
||||
user = "minecraft";
|
||||
mode = "0750";
|
||||
};
|
||||
};
|
||||
|
||||
environment.systemPackages = [
|
||||
minecraft-attach
|
||||
];
|
||||
|
||||
services.phpfpm.pools.dynmap = {
|
||||
user = "nginx";
|
||||
group = "nginx";
|
||||
phpPackage = pkgs.php82;
|
||||
phpOptions = ''
|
||||
error_log = 'stderr'
|
||||
log_errors = on
|
||||
'';
|
||||
settings = {
|
||||
"listen.owner" = "nginx";
|
||||
"listen.group" = "nginx";
|
||||
"listen.mode" = "0660";
|
||||
"pm" = "dynamic";
|
||||
"pm.max_children" = 75;
|
||||
"pm.start_servers" = 2;
|
||||
"pm.min_spare_servers" = 1;
|
||||
"pm.max_spare_servers" = 20;
|
||||
"pm.max_requests" = 500;
|
||||
"catch_workers_output" = true;
|
||||
};
|
||||
};
|
||||
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
recommendedSetup = false;
|
||||
virtualHosts.${minecraftDomain} = {
|
||||
root = "${dataDir}/web/dynmap";
|
||||
locations."~ \\.php$".extraConfig = ''
|
||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||
fastcgi_pass unix:${config.services.phpfpm.pools.dynmap.socket};
|
||||
include ${config.services.nginx.package}/conf/fastcgi.conf;
|
||||
include ${config.services.nginx.package}/conf/fastcgi_params;
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
[auth_multiplex.1]
|
||||
port = 25566
|
||||
allowed_uuids = [] # anyone may use this multiplexer
|
||||
|
||||
[managed_servers.server]
|
||||
display_name = "§6◊ §6§lTOHLSTE SERVER§6 ◊"
|
||||
|
||||
[managed_servers.server.online]
|
||||
favicon = "./server-icon.png"
|
||||
motd = "{SERVER_DISPLAY_NAME}\n§a\\(^-^)/§7 | {QUOTE}"
|
||||
quotes = ["Shit da ist wer, du verpasst was"]
|
||||
|
||||
[managed_servers.server.offline]
|
||||
quotes = ["Keiner da, join endlich"]
|
||||
motd = "{SERVER_DISPLAY_NAME}\n§c~(°·°)~§7 | {QUOTE}"
|
||||
|
||||
[managed_servers.server.start]
|
||||
cmd = ["rm", "../{SERVER}/control/start.block"]
|
||||
kick_msg = "{SERVER_DISPLAY_NAME} §7wird gestartet.\n§7Jetzt WARTE DOCH EINFACH §b10 Sekunden§7 GRRRR"
|
||||
allow_anyone = true
|
147
hosts/sire/guests/minecraft/proxy/velocity.toml
Normal file
147
hosts/sire/guests/minecraft/proxy/velocity.toml
Normal file
|
@ -0,0 +1,147 @@
|
|||
# Config version. Do not change this
|
||||
config-version = "2.7"
|
||||
|
||||
# What port should the proxy be bound to?
|
||||
bind = "0.0.0.0:25565"
|
||||
|
||||
# What should be the MOTD? This gets displayed when the player adds your server to
|
||||
# their server list. Only MiniMessage format is accepted.
|
||||
motd = "<#09add3>A Velocity Server"
|
||||
|
||||
# What should we display for the maximum number of players? (Velocity does not support a cap
|
||||
# on the number of players online.)
|
||||
show-max-players = 6666
|
||||
|
||||
# Should we authenticate players with Mojang? By default, this is on.
|
||||
online-mode = true
|
||||
|
||||
# Should the proxy enforce the new public key security standard? By default, this is on.
|
||||
force-key-authentication = true
|
||||
|
||||
# If client's ISP/AS sent from this proxy is different from the one from Mojang's
|
||||
# authentication server, the player is kicked. This disallows some VPN and proxy
|
||||
# connections but is a weak form of protection.
|
||||
prevent-client-proxy-connections = false
|
||||
|
||||
# Should we forward IP addresses and other data to backend servers?
|
||||
# Available options:
|
||||
# - "none": No forwarding will be done. All players will appear to be connecting
|
||||
# from the proxy and will have offline-mode UUIDs.
|
||||
# - "legacy": Forward player IPs and UUIDs in a BungeeCord-compatible format. Use this
|
||||
# if you run servers using Minecraft 1.12 or lower.
|
||||
# - "bungeeguard": Forward player IPs and UUIDs in a format supported by the BungeeGuard
|
||||
# plugin. Use this if you run servers using Minecraft 1.12 or lower, and are
|
||||
# unable to implement network level firewalling (on a shared host).
|
||||
# - "modern": Forward player IPs and UUIDs as part of the login process using
|
||||
# Velocity's native forwarding. Only applicable for Minecraft 1.13 or higher.
|
||||
player-info-forwarding-mode = "modern"
|
||||
|
||||
# If you are using modern or BungeeGuard IP forwarding, configure a file that contains a unique secret here.
|
||||
# The file is expected to be UTF-8 encoded and not empty.
|
||||
forwarding-secret-file = "forwarding.secret"
|
||||
|
||||
# Announce whether or not your server supports Forge. If you run a modded server, we
|
||||
# suggest turning this on.
|
||||
#
|
||||
# If your network runs one modpack consistently, consider using ping-passthrough = "mods"
|
||||
# instead for a nicer display in the server list.
|
||||
announce-forge = false
|
||||
|
||||
# If enabled (default is false) and the proxy is in online mode, Velocity will kick
|
||||
# any existing player who is online if a duplicate connection attempt is made.
|
||||
kick-existing-players = false
|
||||
|
||||
# Should Velocity pass server list ping requests to a backend server?
|
||||
# Available options:
|
||||
# - "disabled": No pass-through will be done. The velocity.toml and server-icon.png
|
||||
# will determine the initial server list ping response.
|
||||
# - "mods": Passes only the mod list from your backend server into the response.
|
||||
# The first server in your try list (or forced host) with a mod list will be
|
||||
# used. If no backend servers can be contacted, Velocity won't display any
|
||||
# mod information.
|
||||
# - "description": Uses the description and mod list from the backend server. The first
|
||||
# server in the try (or forced host) list that responds is used for the
|
||||
# description and mod list.
|
||||
# - "all": Uses the backend server's response as the proxy response. The Velocity
|
||||
# configuration is used if no servers could be contacted.
|
||||
ping-passthrough = "DISABLED"
|
||||
|
||||
# If not enabled (default is true) player IP addresses will be replaced by <ip address withheld> in logs
|
||||
enable-player-address-logging = true
|
||||
|
||||
[servers]
|
||||
# Configure your servers here. Each key represents the server's name, and the value
|
||||
# represents the IP address of the server to connect to.
|
||||
server = "127.0.0.1:25501"
|
||||
|
||||
# In what order we shoulid try servers when a player logs in or is kicked from a server.
|
||||
try = [
|
||||
"server"
|
||||
]
|
||||
|
||||
[forced-hosts]
|
||||
|
||||
[advanced]
|
||||
# How large a Minecraft packet has to be before we compress it. Setting this to zero will
|
||||
# compress all packets, and setting it to -1 will disable compression entirely.
|
||||
compression-threshold = 256
|
||||
|
||||
# How much compression should be done (from 0-9). The default is -1, which uses the
|
||||
# default level of 6.
|
||||
compression-level = -1
|
||||
|
||||
# How fast (in milliseconds) are clients allowed to connect after the last connection? By
|
||||
# default, this is three seconds. Disable this by setting this to 0.
|
||||
login-ratelimit = 3000
|
||||
|
||||
# Specify a custom timeout for connection timeouts here. The default is five seconds.
|
||||
connection-timeout = 5000
|
||||
|
||||
# Specify a read timeout for connections here. The default is 30 seconds.
|
||||
read-timeout = 30000
|
||||
|
||||
# Enables compatibility with HAProxy's PROXY protocol. If you don't know what this is for, then
|
||||
# don't enable it.
|
||||
haproxy-protocol = false
|
||||
|
||||
# Enables TCP fast open support on the proxy. Requires the proxy to run on Linux.
|
||||
tcp-fast-open = false
|
||||
|
||||
# Enables BungeeCord plugin messaging channel support on Velocity.
|
||||
bungee-plugin-message-channel = true
|
||||
|
||||
# Shows ping requests to the proxy from clients.
|
||||
show-ping-requests = true
|
||||
|
||||
# By default, Velocity will attempt to gracefully handle situations where the user unexpectedly
|
||||
# loses connection to the server without an explicit disconnect message by attempting to fall the
|
||||
# user back, except in the case of read timeouts. BungeeCord will disconnect the user instead. You
|
||||
# can disable this setting to use the BungeeCord behavior.
|
||||
failover-on-unexpected-server-disconnect = true
|
||||
|
||||
# Declares the proxy commands to 1.13+ clients.
|
||||
announce-proxy-commands = true
|
||||
|
||||
# Enables the logging of commands
|
||||
log-command-executions = false
|
||||
|
||||
# Enables logging of player connections when connecting to the proxy, switching servers
|
||||
# and disconnecting from the proxy.
|
||||
log-player-connections = true
|
||||
|
||||
# Allows players transferred from other hosts via the
|
||||
# Transfer packet (Minecraft 1.20.5) to be received.
|
||||
accepts-transfers = false
|
||||
|
||||
[query]
|
||||
# Whether to enable responding to GameSpy 4 query responses or not.
|
||||
enabled = false
|
||||
|
||||
# If query is enabled, on what port should the query protocol listen on?
|
||||
port = 25577
|
||||
|
||||
# This is the map name that is reported to the query services.
|
||||
map = "Velocity"
|
||||
|
||||
# Whether plugins should be shown in query response by default or not
|
||||
show-plugins = false
|
98
hosts/sire/guests/minecraft/server-loop.py
Normal file
98
hosts/sire/guests/minecraft/server-loop.py
Normal file
|
@ -0,0 +1,98 @@
|
|||
import os
|
||||
import signal
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
def exit_usage():
|
||||
print(f"usage: {sys.argv[0]} [--block blockfile] COMMAND... [:POST: POST_SCRIPT...]")
|
||||
sys.exit(1)
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
exit_usage()
|
||||
|
||||
blockfile = None
|
||||
if sys.argv[1] == "--block":
|
||||
if len(sys.argv) < 4:
|
||||
exit_usage()
|
||||
|
||||
blockfile = Path(sys.argv[2])
|
||||
cmd = sys.argv[3:]
|
||||
else:
|
||||
cmd = sys.argv[1:]
|
||||
|
||||
# Split cmd and post-cmd
|
||||
post = None
|
||||
try:
|
||||
separator = cmd.index(":POST:")
|
||||
post = cmd[separator + 1:]
|
||||
cmd = cmd[:separator]
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
# Global state
|
||||
shared_data = {
|
||||
"stop": False,
|
||||
"process": None,
|
||||
}
|
||||
|
||||
def block_start():
|
||||
if not blockfile:
|
||||
return
|
||||
print(f"Blocking on {blockfile}")
|
||||
blockfile.touch()
|
||||
while blockfile.exists() and not shared_data["stop"]:
|
||||
time.sleep(.5)
|
||||
|
||||
def run_server():
|
||||
if shared_data["stop"]:
|
||||
return
|
||||
|
||||
print(f"Starting process {cmd} ...")
|
||||
start_time = time.time()
|
||||
shared_data["process"] = subprocess.Popen(cmd, preexec_fn=os.setsid)
|
||||
shared_data["process"].wait()
|
||||
|
||||
end_time = time.time()
|
||||
if end_time - start_time < 2:
|
||||
print("Server exited abnormally fast, aborting!")
|
||||
shared_data["stop"] = True
|
||||
return
|
||||
|
||||
shared_data["process"] = None
|
||||
|
||||
# Launch post script
|
||||
if post:
|
||||
print(f"Starting post process {post} ...")
|
||||
subprocess.run(post, preexec_fn=os.setsid)
|
||||
|
||||
def signal_forward(sig, _):
|
||||
if shared_data["process"]:
|
||||
print(f"Passing signal {sig} to child ...")
|
||||
try:
|
||||
shared_data["process"].send_signal(sig)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
def signal_forward_and_stop(sig, frame):
|
||||
shared_data["stop"] = True
|
||||
signal_forward(sig, frame)
|
||||
|
||||
signal.signal(signal.SIGINT, signal_forward)
|
||||
signal.signal(signal.SIGTERM, signal_forward_and_stop)
|
||||
signal.signal(signal.SIGHUP, signal_forward_and_stop)
|
||||
|
||||
# Run until killed
|
||||
try:
|
||||
while not shared_data["stop"]:
|
||||
block_start()
|
||||
run_server()
|
||||
print("Exiting.")
|
||||
finally:
|
||||
if blockfile and blockfile.exists():
|
||||
blockfile.unlink()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
3
hosts/sire/guests/minecraft/server/commands.yml
Normal file
3
hosts/sire/guests/minecraft/server/commands.yml
Normal file
|
@ -0,0 +1,3 @@
|
|||
command-block-overrides: []
|
||||
ignore-vanilla-permissions: false
|
||||
aliases: []
|
141
hosts/sire/guests/minecraft/server/config/paper-global.yml
Normal file
141
hosts/sire/guests/minecraft/server/config/paper-global.yml
Normal file
|
@ -0,0 +1,141 @@
|
|||
# This is the global configuration file for Paper.
|
||||
# As you can see, there's a lot to configure. Some options may impact gameplay, so use
|
||||
# with caution, and make sure you know what each option does before configuring.
|
||||
#
|
||||
# If you need help with the configuration or have any questions related to Paper,
|
||||
# join us in our Discord or check the docs page.
|
||||
#
|
||||
# The world configuration options have been moved inside
|
||||
# their respective world folder. The files are named paper-world.yml
|
||||
#
|
||||
# Docs: https://docs.papermc.io/
|
||||
# Discord: https://discord.gg/papermc
|
||||
# Website: https://papermc.io/
|
||||
|
||||
_version: 29
|
||||
block-updates:
|
||||
disable-chorus-plant-updates: false
|
||||
disable-mushroom-block-updates: false
|
||||
disable-noteblock-updates: false
|
||||
disable-tripwire-updates: false
|
||||
chunk-loading:
|
||||
autoconfig-send-distance: true
|
||||
enable-frustum-priority: false
|
||||
global-max-chunk-load-rate: -1.0
|
||||
global-max-chunk-send-rate: -1.0
|
||||
global-max-concurrent-loads: 500.0
|
||||
max-concurrent-sends: 2
|
||||
min-load-radius: 2
|
||||
player-max-chunk-load-rate: -1.0
|
||||
player-max-concurrent-loads: 20.0
|
||||
target-player-chunk-send-rate: 100.0
|
||||
chunk-loading-advanced:
|
||||
auto-config-send-distance: true
|
||||
player-max-concurrent-chunk-generates: 0
|
||||
player-max-concurrent-chunk-loads: 0
|
||||
chunk-loading-basic:
|
||||
player-max-chunk-generate-rate: -1.0
|
||||
player-max-chunk-load-rate: 100.0
|
||||
player-max-chunk-send-rate: 75.0
|
||||
chunk-system:
|
||||
gen-parallelism: default
|
||||
io-threads: -1
|
||||
worker-threads: -1
|
||||
collisions:
|
||||
enable-player-collisions: true
|
||||
send-full-pos-for-hard-colliding-entities: true
|
||||
commands:
|
||||
fix-target-selector-tag-completion: true
|
||||
suggest-player-names-when-null-tab-completions: true
|
||||
time-command-affects-all-worlds: false
|
||||
console:
|
||||
enable-brigadier-completions: true
|
||||
enable-brigadier-highlighting: true
|
||||
has-all-permissions: false
|
||||
item-validation:
|
||||
book:
|
||||
author: 8192
|
||||
page: 16384
|
||||
title: 8192
|
||||
book-size:
|
||||
page-max: 2560
|
||||
total-multiplier: 0.98
|
||||
display-name: 8192
|
||||
lore-line: 8192
|
||||
resolve-selectors-in-books: false
|
||||
logging:
|
||||
deobfuscate-stacktraces: true
|
||||
messages:
|
||||
kick:
|
||||
authentication-servers-down: <lang:multiplayer.disconnect.authservers_down>
|
||||
connection-throttle: Connection throttled! Please wait before reconnecting.
|
||||
flying-player: <lang:multiplayer.disconnect.flying>
|
||||
flying-vehicle: <lang:multiplayer.disconnect.flying>
|
||||
no-permission: <red>I'm sorry, but you do not have permission to perform this command.
|
||||
Please contact the server administrators if you believe that this is in error.
|
||||
use-display-name-in-quit-message: false
|
||||
misc:
|
||||
chat-threads:
|
||||
chat-executor-core-size: -1
|
||||
chat-executor-max-size: -1
|
||||
compression-level: default
|
||||
fix-entity-position-desync: true
|
||||
lag-compensate-block-breaking: true
|
||||
load-permissions-yml-before-plugins: true
|
||||
max-joins-per-tick: 3
|
||||
region-file-cache-size: 256
|
||||
strict-advancement-dimension-check: false
|
||||
use-alternative-luck-formula: false
|
||||
use-dimension-type-for-custom-spawners: false
|
||||
packet-limiter:
|
||||
all-packets:
|
||||
action: KICK
|
||||
interval: 7.0
|
||||
max-packet-rate: 500.0
|
||||
kick-message: <red><lang:disconnect.exceeded_packet_rate>
|
||||
overrides:
|
||||
ServerboundPlaceRecipePacket:
|
||||
action: DROP
|
||||
interval: 4.0
|
||||
max-packet-rate: 5.0
|
||||
player-auto-save:
|
||||
max-per-tick: -1
|
||||
rate: -1
|
||||
proxies:
|
||||
bungee-cord:
|
||||
online-mode: true
|
||||
proxy-protocol: false
|
||||
velocity:
|
||||
enabled: true
|
||||
online-mode: true
|
||||
secret: ''
|
||||
scoreboards:
|
||||
save-empty-scoreboard-teams: false
|
||||
track-plugin-scoreboards: false
|
||||
spam-limiter:
|
||||
incoming-packet-threshold: 300
|
||||
recipe-spam-increment: 1
|
||||
recipe-spam-limit: 20
|
||||
tab-spam-increment: 1
|
||||
tab-spam-limit: 500
|
||||
timings:
|
||||
enabled: true
|
||||
hidden-config-entries:
|
||||
- database
|
||||
- proxies.velocity.secret
|
||||
history-interval: 300
|
||||
history-length: 3600
|
||||
server-name: Unknown Server
|
||||
server-name-privacy: false
|
||||
url: https://timings.aikar.co/
|
||||
verbose: true
|
||||
unsupported-settings:
|
||||
allow-grindstone-overstacking: false
|
||||
allow-headless-pistons: true
|
||||
allow-permanent-block-break-exploits: true
|
||||
allow-piston-duplication: true
|
||||
compression-format: ZLIB
|
||||
perform-username-validation: true
|
||||
watchdog:
|
||||
early-warning-delay: 10000
|
||||
early-warning-every: 5000
|
|
@ -0,0 +1,301 @@
|
|||
# This is the world defaults configuration file for Paper.
|
||||
# As you can see, there's a lot to configure. Some options may impact gameplay, so use
|
||||
# with caution, and make sure you know what each option does before configuring.
|
||||
#
|
||||
# If you need help with the configuration or have any questions related to Paper,
|
||||
# join us in our Discord or check the docs page.
|
||||
#
|
||||
# Configuration options here apply to all worlds, unless you specify overrides inside
|
||||
# the world-specific config file inside each world folder.
|
||||
#
|
||||
# Docs: https://docs.papermc.io/
|
||||
# Discord: https://discord.gg/papermc
|
||||
# Website: https://papermc.io/
|
||||
|
||||
_version: 30
|
||||
anticheat:
|
||||
anti-xray:
|
||||
enabled: true
|
||||
engine-mode: 1
|
||||
hidden-blocks:
|
||||
- copper_ore
|
||||
- deepslate_copper_ore
|
||||
- gold_ore
|
||||
- deepslate_gold_ore
|
||||
- iron_ore
|
||||
- deepslate_iron_ore
|
||||
- coal_ore
|
||||
- deepslate_coal_ore
|
||||
- lapis_ore
|
||||
- deepslate_lapis_ore
|
||||
- mossy_cobblestone
|
||||
- obsidian
|
||||
- chest
|
||||
- diamond_ore
|
||||
- deepslate_diamond_ore
|
||||
- redstone_ore
|
||||
- deepslate_redstone_ore
|
||||
- clay
|
||||
- emerald_ore
|
||||
- deepslate_emerald_ore
|
||||
- ender_chest
|
||||
lava-obscures: false
|
||||
max-block-height: 64
|
||||
replacement-blocks:
|
||||
- stone
|
||||
- oak_planks
|
||||
- deepslate
|
||||
update-radius: 2
|
||||
use-permission: false
|
||||
obfuscation:
|
||||
items:
|
||||
hide-durability: false
|
||||
hide-itemmeta: false
|
||||
hide-itemmeta-with-visual-effects: false
|
||||
chunks:
|
||||
auto-save-interval: default
|
||||
delay-chunk-unloads-by: 10s
|
||||
entity-per-chunk-save-limit:
|
||||
arrow: -1
|
||||
ender_pearl: -1
|
||||
experience_orb: -1
|
||||
fireball: -1
|
||||
small_fireball: -1
|
||||
snowball: -1
|
||||
fixed-chunk-inhabited-time: -1
|
||||
flush-regions-on-save: false
|
||||
max-auto-save-chunks-per-tick: 24
|
||||
prevent-moving-into-unloaded-chunks: false
|
||||
collisions:
|
||||
allow-player-cramming-damage: false
|
||||
allow-vehicle-collisions: true
|
||||
fix-climbing-bypassing-cramming-rule: false
|
||||
max-entity-collisions: 8
|
||||
only-players-collide: false
|
||||
entities:
|
||||
armor-stands:
|
||||
do-collision-entity-lookups: true
|
||||
tick: true
|
||||
behavior:
|
||||
allow-spider-world-border-climbing: true
|
||||
baby-zombie-movement-modifier: 0.5
|
||||
disable-chest-cat-detection: false
|
||||
disable-creeper-lingering-effect: false
|
||||
disable-player-crits: false
|
||||
door-breaking-difficulty:
|
||||
husk:
|
||||
- HARD
|
||||
vindicator:
|
||||
- NORMAL
|
||||
- HARD
|
||||
zombie:
|
||||
- HARD
|
||||
zombie_villager:
|
||||
- HARD
|
||||
zombified_piglin:
|
||||
- HARD
|
||||
ender-dragons-death-always-places-dragon-egg: false
|
||||
experience-merge-max-value: -1
|
||||
mobs-can-always-pick-up-loot:
|
||||
skeletons: false
|
||||
zombies: false
|
||||
nerf-pigmen-from-nether-portals: false
|
||||
parrots-are-unaffected-by-player-movement: false
|
||||
phantoms-do-not-spawn-on-creative-players: true
|
||||
phantoms-only-attack-insomniacs: true
|
||||
phantoms-spawn-attempt-max-seconds: 119
|
||||
phantoms-spawn-attempt-min-seconds: 60
|
||||
piglins-guard-chests: true
|
||||
pillager-patrols:
|
||||
disable: false
|
||||
spawn-chance: 0.2
|
||||
spawn-delay:
|
||||
per-player: false
|
||||
ticks: 12000
|
||||
start:
|
||||
day: 5
|
||||
per-player: false
|
||||
player-insomnia-start-ticks: 72000
|
||||
should-remove-dragon: false
|
||||
spawner-nerfed-mobs-should-jump: false
|
||||
zombie-villager-infection-chance: default
|
||||
zombies-target-turtle-eggs: true
|
||||
entities-target-with-follow-range: false
|
||||
markers:
|
||||
tick: true
|
||||
mob-effects:
|
||||
immune-to-wither-effect:
|
||||
wither: true
|
||||
wither-skeleton: true
|
||||
spiders-immune-to-poison-effect: true
|
||||
undead-immune-to-certain-effects: true
|
||||
sniffer:
|
||||
boosted-hatch-time: default
|
||||
hatch-time: default
|
||||
spawning:
|
||||
all-chunks-are-slime-chunks: false
|
||||
alt-item-despawn-rate:
|
||||
enabled: false
|
||||
items:
|
||||
cobblestone: 300
|
||||
count-all-mobs-for-spawning: false
|
||||
creative-arrow-despawn-rate: default
|
||||
despawn-ranges:
|
||||
ambient:
|
||||
hard: 128
|
||||
soft: 32
|
||||
axolotls:
|
||||
hard: 128
|
||||
soft: 32
|
||||
creature:
|
||||
hard: 128
|
||||
soft: 32
|
||||
misc:
|
||||
hard: 128
|
||||
soft: 32
|
||||
monster:
|
||||
hard: 128
|
||||
soft: 32
|
||||
underground_water_creature:
|
||||
hard: 128
|
||||
soft: 32
|
||||
water_ambient:
|
||||
hard: 64
|
||||
soft: 32
|
||||
water_creature:
|
||||
hard: 128
|
||||
soft: 32
|
||||
disable-mob-spawner-spawn-egg-transformation: false
|
||||
duplicate-uuid:
|
||||
mode: SAFE_REGEN
|
||||
safe-regen-delete-range: 32
|
||||
filter-bad-tile-entity-nbt-from-falling-blocks: true
|
||||
filtered-entity-tag-nbt-paths:
|
||||
- Pos
|
||||
- Motion
|
||||
- SleepingX
|
||||
- SleepingY
|
||||
- SleepingZ
|
||||
iron-golems-can-spawn-in-air: false
|
||||
monster-spawn-max-light-level: default
|
||||
non-player-arrow-despawn-rate: default
|
||||
per-player-mob-spawns: true
|
||||
scan-for-legacy-ender-dragon: true
|
||||
skeleton-horse-thunder-spawn-chance: default
|
||||
slime-spawn-height:
|
||||
slime-chunk:
|
||||
maximum: 40.0
|
||||
surface-biome:
|
||||
maximum: 70.0
|
||||
minimum: 50.0
|
||||
spawn-limits:
|
||||
ambient: -1
|
||||
axolotls: -1
|
||||
creature: -1
|
||||
monster: -1
|
||||
underground_water_creature: -1
|
||||
water_ambient: -1
|
||||
water_creature: -1
|
||||
wandering-trader:
|
||||
spawn-chance-failure-increment: 25
|
||||
spawn-chance-max: 75
|
||||
spawn-chance-min: 25
|
||||
spawn-day-length: 24000
|
||||
spawn-minute-length: 1200
|
||||
wateranimal-spawn-height:
|
||||
maximum: default
|
||||
minimum: default
|
||||
tracking-range-y:
|
||||
animal: default
|
||||
display: default
|
||||
enabled: false
|
||||
misc: default
|
||||
monster: default
|
||||
other: default
|
||||
player: default
|
||||
environment:
|
||||
disable-explosion-knockback: false
|
||||
disable-ice-and-snow: false
|
||||
disable-teleportation-suffocation-check: false
|
||||
disable-thunder: false
|
||||
fire-tick-delay: 30
|
||||
frosted-ice:
|
||||
delay:
|
||||
max: 40
|
||||
min: 20
|
||||
enabled: true
|
||||
generate-flat-bedrock: false
|
||||
nether-ceiling-void-damage-height: disabled
|
||||
optimize-explosions: false
|
||||
portal-create-radius: 16
|
||||
portal-search-radius: 128
|
||||
portal-search-vanilla-dimension-scaling: true
|
||||
treasure-maps:
|
||||
enabled: true
|
||||
find-already-discovered:
|
||||
loot-tables: default
|
||||
villager-trade: false
|
||||
water-over-lava-flow-speed: 5
|
||||
feature-seeds:
|
||||
generate-random-seeds-for-all: false
|
||||
fishing-time-range:
|
||||
maximum: 600
|
||||
minimum: 100
|
||||
fixes:
|
||||
disable-unloaded-chunk-enderpearl-exploit: false
|
||||
falling-block-height-nerf: disabled
|
||||
fix-curing-zombie-villager-discount-exploit: true
|
||||
fix-items-merging-through-walls: false
|
||||
prevent-tnt-from-moving-in-water: false
|
||||
split-overstacked-loot: true
|
||||
tnt-entity-height-nerf: disabled
|
||||
hopper:
|
||||
cooldown-when-full: true
|
||||
disable-move-event: true
|
||||
ignore-occluding-blocks: false
|
||||
lootables:
|
||||
auto-replenish: true
|
||||
max-refills: -1
|
||||
refresh-max: 2d
|
||||
refresh-min: 12h
|
||||
reset-seed-on-fill: true
|
||||
restrict-player-reloot: true
|
||||
restrict-player-reloot-time: 2d
|
||||
maps:
|
||||
item-frame-cursor-limit: 128
|
||||
item-frame-cursor-update-interval: 10
|
||||
max-growth-height:
|
||||
bamboo:
|
||||
max: 16
|
||||
min: 11
|
||||
cactus: 3
|
||||
reeds: 3
|
||||
misc:
|
||||
disable-end-credits: false
|
||||
disable-relative-projectile-velocity: false
|
||||
disable-sprint-interruption-on-attack: false
|
||||
light-queue-size: 20
|
||||
max-leash-distance: 10.0
|
||||
redstone-implementation: VANILLA
|
||||
shield-blocking-delay: 5
|
||||
show-sign-click-command-failure-msgs-to-player: false
|
||||
update-pathfinding-on-block-update: true
|
||||
scoreboards:
|
||||
allow-non-player-entities-on-scoreboards: false
|
||||
use-vanilla-world-scoreboard-name-coloring: false
|
||||
spawn:
|
||||
allow-using-signs-inside-spawn-protection: false
|
||||
keep-spawn-loaded: true
|
||||
keep-spawn-loaded-range: 10
|
||||
tick-rates:
|
||||
behavior:
|
||||
villager:
|
||||
validatenearbypoi: -1
|
||||
container-update: 1
|
||||
grass-spread: 1
|
||||
mob-spawner: 1
|
||||
sensor:
|
||||
villager:
|
||||
secondarypoisensor: 40
|
||||
unsupported-settings:
|
||||
fix-invulnerable-end-crystal-exploit: true
|
1
hosts/sire/guests/minecraft/server/eula.txt
Normal file
1
hosts/sire/guests/minecraft/server/eula.txt
Normal file
|
@ -0,0 +1 @@
|
|||
eula=true
|
58
hosts/sire/guests/minecraft/server/server.properties
Normal file
58
hosts/sire/guests/minecraft/server/server.properties
Normal file
|
@ -0,0 +1,58 @@
|
|||
allow-flight=false
|
||||
allow-nether=true
|
||||
broadcast-console-to-ops=true
|
||||
broadcast-rcon-to-ops=true
|
||||
debug=false
|
||||
difficulty=hard
|
||||
enable-command-block=false
|
||||
enable-jmx-monitoring=false
|
||||
enable-query=false
|
||||
enable-rcon=false
|
||||
enable-status=true
|
||||
enforce-secure-profile=false
|
||||
enforce-whitelist=true
|
||||
entity-broadcast-range-percentage=500
|
||||
force-gamemode=false
|
||||
function-permission-level=2
|
||||
gamemode=survival
|
||||
generate-structures=true
|
||||
generator-settings={}
|
||||
hardcore=false
|
||||
hide-online-players=false
|
||||
initial-disabled-packs=
|
||||
initial-enabled-packs=vanilla
|
||||
level-name=world
|
||||
level-seed=-2875792302555269470
|
||||
level-type=minecraft\:normal
|
||||
log-ips=true
|
||||
max-chained-neighbor-updates=1000000
|
||||
max-players=6666
|
||||
max-tick-time=60000
|
||||
max-world-size=29999984
|
||||
motd=
|
||||
network-compression-threshold=256
|
||||
online-mode=false
|
||||
op-permission-level=4
|
||||
player-idle-timeout=0
|
||||
prevent-proxy-connections=false
|
||||
pvp=true
|
||||
query.port=25501
|
||||
rate-limit=0
|
||||
rcon.password=
|
||||
rcon.port=25575
|
||||
require-resource-pack=false
|
||||
resource-pack-prompt=
|
||||
resource-pack-sha1=
|
||||
resource-pack=
|
||||
server-ip=
|
||||
server-port=25501
|
||||
simulation-distance=10
|
||||
spawn-animals=true
|
||||
spawn-monsters=true
|
||||
spawn-npcs=true
|
||||
spawn-protection=0
|
||||
sync-chunk-writes=true
|
||||
text-filtering-config=
|
||||
use-native-transport=true
|
||||
view-distance=15
|
||||
white-list=false
|
177
hosts/sire/guests/minecraft/server/spigot.yml
Normal file
177
hosts/sire/guests/minecraft/server/spigot.yml
Normal file
|
@ -0,0 +1,177 @@
|
|||
# This is the main configuration file for Spigot.
|
||||
# As you can see, there's tons to configure. Some options may impact gameplay, so use
|
||||
# with caution, and make sure you know what each option does before configuring.
|
||||
# For a reference for any variable inside this file, check out the Spigot wiki at
|
||||
# http://www.spigotmc.org/wiki/spigot-configuration/
|
||||
#
|
||||
# If you need help with the configuration or have any questions related to Spigot,
|
||||
# join us at the Discord or drop by our forums and leave a post.
|
||||
#
|
||||
# Discord: https://www.spigotmc.org/go/discord
|
||||
# Forums: http://www.spigotmc.org/
|
||||
|
||||
messages:
|
||||
whitelist: You are not whitelisted on this server!
|
||||
unknown-command: Unknown command. Type "/help" for help.
|
||||
server-full: The server is full!
|
||||
outdated-client: Outdated client! Please use {0}
|
||||
outdated-server: Outdated server! I'm still on {0}
|
||||
restart: Server is restarting
|
||||
commands:
|
||||
spam-exclusions:
|
||||
- /skill
|
||||
silent-commandblock-console: false
|
||||
replace-commands:
|
||||
- setblock
|
||||
- summon
|
||||
- testforblock
|
||||
- tellraw
|
||||
log: true
|
||||
tab-complete: 0
|
||||
send-namespaced: true
|
||||
players:
|
||||
disable-saving: false
|
||||
advancements:
|
||||
disable-saving: false
|
||||
disabled:
|
||||
- minecraft:story/disabled
|
||||
config-version: 12
|
||||
settings:
|
||||
debug: false
|
||||
sample-count: 12
|
||||
player-shuffle: 0
|
||||
user-cache-size: 1000
|
||||
save-user-cache-on-stop-only: false
|
||||
netty-threads: 4
|
||||
attribute:
|
||||
maxHealth:
|
||||
max: 2048.0
|
||||
movementSpeed:
|
||||
max: 2048.0
|
||||
attackDamage:
|
||||
max: 2048.0
|
||||
log-villager-deaths: true
|
||||
log-named-deaths: true
|
||||
timeout-time: 60
|
||||
bungeecord: false
|
||||
moved-too-quickly-multiplier: 100.0
|
||||
moved-wrongly-threshold: 1.625
|
||||
restart-on-crash: false
|
||||
restart-script: invalid
|
||||
world-settings:
|
||||
default:
|
||||
seed-ancientcity: 20083232
|
||||
seed-trailruins: 83469867
|
||||
seed-buriedtreasure: 10387320
|
||||
seed-mineshaft: default
|
||||
below-zero-generation-in-existing-chunks: true
|
||||
view-distance: default
|
||||
simulation-distance: default
|
||||
thunder-chance: 100000
|
||||
item-despawn-rate: 6000
|
||||
enable-zombie-pigmen-portal-spawns: true
|
||||
hanging-tick-frequency: 100
|
||||
arrow-despawn-rate: 1200
|
||||
trident-despawn-rate: 1200
|
||||
zombie-aggressive-towards-villager: true
|
||||
nerf-spawner-mobs: false
|
||||
mob-spawn-range: 8
|
||||
entity-activation-range:
|
||||
animals: 32
|
||||
monsters: 32
|
||||
raiders: 48
|
||||
misc: 16
|
||||
water: 16
|
||||
villagers: 32
|
||||
flying-monsters: 32
|
||||
wake-up-inactive:
|
||||
animals-max-per-tick: 4
|
||||
animals-every: 1200
|
||||
animals-for: 100
|
||||
monsters-max-per-tick: 8
|
||||
monsters-every: 400
|
||||
monsters-for: 100
|
||||
villagers-max-per-tick: 4
|
||||
villagers-every: 600
|
||||
villagers-for: 100
|
||||
flying-monsters-max-per-tick: 8
|
||||
flying-monsters-every: 200
|
||||
flying-monsters-for: 100
|
||||
villagers-work-immunity-after: 100
|
||||
villagers-work-immunity-for: 20
|
||||
villagers-active-for-panic: true
|
||||
tick-inactive-villagers: true
|
||||
ignore-spectators: false
|
||||
ticks-per:
|
||||
hopper-transfer: 8
|
||||
hopper-check: 1
|
||||
hopper-amount: 1
|
||||
hopper-can-load-chunks: false
|
||||
seed-village: 10387312
|
||||
seed-desert: 14357617
|
||||
seed-igloo: 14357618
|
||||
seed-jungle: 14357619
|
||||
seed-swamp: 14357620
|
||||
seed-monument: 10387313
|
||||
seed-shipwreck: 165745295
|
||||
seed-ocean: 14357621
|
||||
seed-outpost: 165745296
|
||||
seed-endcity: 10387313
|
||||
seed-slime: 987234911
|
||||
seed-nether: 30084232
|
||||
seed-mansion: 10387319
|
||||
seed-fossil: 14357921
|
||||
seed-portal: 34222645
|
||||
seed-stronghold: default
|
||||
hunger:
|
||||
jump-walk-exhaustion: 0.05
|
||||
jump-sprint-exhaustion: 0.2
|
||||
combat-exhaustion: 0.1
|
||||
regen-exhaustion: 6.0
|
||||
swim-multiplier: 0.01
|
||||
sprint-multiplier: 0.1
|
||||
other-multiplier: 0.0
|
||||
max-tnt-per-tick: 100
|
||||
max-tick-time:
|
||||
tile: 50
|
||||
entity: 50
|
||||
growth:
|
||||
torchflower-modifier: 100
|
||||
pitcherplant-modifier: 100
|
||||
cactus-modifier: 100
|
||||
cane-modifier: 100
|
||||
melon-modifier: 100
|
||||
mushroom-modifier: 100
|
||||
pumpkin-modifier: 100
|
||||
sapling-modifier: 100
|
||||
beetroot-modifier: 100
|
||||
carrot-modifier: 100
|
||||
potato-modifier: 100
|
||||
wheat-modifier: 100
|
||||
netherwart-modifier: 100
|
||||
vine-modifier: 100
|
||||
cocoa-modifier: 100
|
||||
bamboo-modifier: 100
|
||||
sweetberry-modifier: 100
|
||||
kelp-modifier: 100
|
||||
twistingvines-modifier: 100
|
||||
weepingvines-modifier: 100
|
||||
cavevines-modifier: 100
|
||||
glowberry-modifier: 100
|
||||
verbose: false
|
||||
dragon-death-sound-radius: 256
|
||||
end-portal-sound-radius: 256
|
||||
entity-tracking-range:
|
||||
display: 128
|
||||
animals: 512
|
||||
misc: 512
|
||||
monsters: 512
|
||||
other: 512
|
||||
players: 512
|
||||
merge-radius:
|
||||
exp: 0.2
|
||||
item: 0.2
|
||||
wither-spawn-sound-radius: 256
|
||||
stats:
|
||||
disable-saving: false
|
||||
forced-stats: {}
|
1
hosts/sire/secrets/minecraft/host.pub
Normal file
1
hosts/sire/secrets/minecraft/host.pub
Normal file
|
@ -0,0 +1 @@
|
|||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJP6UQlWBR5TJdTYX3kKY/xtK+cg5jYGHVGuIQRTljNr
|
|
@ -31,5 +31,6 @@
|
|||
radicale = uidGid 978;
|
||||
podman = uidGid 977;
|
||||
maddy = uidGid 976;
|
||||
minecraft = uidGid 975;
|
||||
};
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -0,0 +1,9 @@
|
|||
age-encryption.org/v1
|
||||
-> X25519 aQjrKYupwdP3ZRQ5CGPjUAKSHMLtORyiuGsaRncR2lM
|
||||
OCClqe+ZHtMYfJh9iFRyUqsH2BIlk0j1r7K5fvMXJA0
|
||||
-> piv-p256 xqSe8Q AiZpiAPglrnrlNJryl5Ip+9cBptSURYsPSfA5IAVqHCd
|
||||
WaVxAp7tawNUPiktBz0aPO9Ll+tghAMDxtgnaNOCtlI
|
||||
-> Ub-*?-grease K*@{c0 YxDp0sq] LV
|
||||
kfROcHQ/f0n7if1p
|
||||
--- aPArSUTgMQ/xJ420wrjn0NtJwJkLJ3kT6+xqJdSSiGw
|
||||
U?Þ4âLÿÙsîm·‹îòÐ;,î|ý±/çt|ÙBJ;ì±¶”£‚ämÑE‚ð;ç¶�Ö$ï6`pÃäÖ:h«`Äþäñz0ªÝ;8‰›
|
10
secrets/generated/sire-minecraft/telegraf-influxdb-token.age
Normal file
10
secrets/generated/sire-minecraft/telegraf-influxdb-token.age
Normal file
|
@ -0,0 +1,10 @@
|
|||
age-encryption.org/v1
|
||||
-> X25519 x5/bA4HrnKggVAN0K+cfzw6UQy8rB0sl5AOnwzaPRBY
|
||||
9rgAVY2kd+VCCgO9szVMRQuP8BMk154FloMzYKKKa74
|
||||
-> piv-p256 xqSe8Q AivGC/2AIFT1OSVeK5WxwAPiO0XUwEU7svEN1aTmXb+W
|
||||
lUeg0c+Xb5IBNGgnFI86QnWxm8MRMHcf7pI31a9CGAs
|
||||
-> jP-1|[-grease gE9e`wh ~e4T
|
||||
vOxm1KfYqngWw9tmeefdahx8XZt5az+10l11taSxvTqDvLWV6jNaKYJWee5rdlvs
|
||||
Ums
|
||||
--- KBHKuTOO72icRzyKfIdNaXJZX+qK0cqx8q7zI3KmJ50
|
||||
�JÈç}¨æ¼<\„\Ìût¤¢CK‹“+n„®ú©;JÆA³À©ÒAè‘¡«åî~^¨Š�™7½`Ï=‚©ðµe¨QE=Ò”}±§](
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,7 @@
|
|||
age-encryption.org/v1
|
||||
-> ssh-ed25519 yV7lcA NXYIgippKhPrzMqLWOUPGO5oO4uLE1UqQGpP9DOXI20
|
||||
tzVLO2RqfmqYBbcwFQdLlEkDjk6MbyDVuYB+ZiK4/Dg
|
||||
-> dL:_2b-grease d]m?$_
|
||||
TAE/woDI9wQv3Ua5zHtChHiZI4Cpo9KBfknw4Y31bG93Vx1Ja8cDWtYT4PWEoQ
|
||||
--- bbm63a4+OotXMscEG/zCLhezcBC9vMIW8hFBJGNmVG4
|
||||
÷Þ·5Éæ±tÏáŸþâjâà‡¡å›ÏoXÀMSoüo£ Qæô»É_×™e.„P5Uû±P ×€æa�H½³®OÑ/‹gD¼ª°{%¬l
|
|
@ -0,0 +1,7 @@
|
|||
age-encryption.org/v1
|
||||
-> ssh-ed25519 1tdZKQ i4zgh2rbHN27RAiYDPfZFlm+RTaim64AnBf2AKfpuVw
|
||||
vp6RP8VMfKAWc9rUlP/ep4mKYoLw2nQ9R7OMVBzDo1A
|
||||
-> ]-grease <pY`!2 Tfl
|
||||
zyk
|
||||
--- 3uxINjl1OJz3nbd7KCTxjUF16EPb43rqgb/hgfTqDmk
|
||||
*%-laJ‚Ì|_Qo0±�öpeÜ“~øìÄà‚‰P;õš3ÌÿØ1”P{8“±]oïÝǼ™ªT^@®QeK%ôaÝen°fÕc2
|
|
@ -0,0 +1,7 @@
|
|||
age-encryption.org/v1
|
||||
-> ssh-ed25519 EHTwGA 06ycNL+Y739oburNHJzo5ywa0V8Ofimhu9iZ7CAKDGE
|
||||
dy/PLFFK79V+1u8+wWJtfXWJFetNxvtZDJCX2j2znUs
|
||||
-> %8r-grease ez<>. zl:dK }b
|
||||
uWiVXwUfxrnSuwrpnAQE92KJq0tGCWzzBV+1EW433+B+wKjByyYytk4
|
||||
--- B4qZoqEKJPzegmawmpM2EQWyQCp1jbbuSYSCA71GiNs
|
||||
UsMBRãù_5RlÕÍŽ^’y¨É6ÒÓRˆ…öˆhTÚ󑳟b9 ‡�ck@o£�³xb*¹kî>tgÏ�“´gzûèe¸ç‹‚š™2WóZ
|
|
@ -0,0 +1,7 @@
|
|||
age-encryption.org/v1
|
||||
-> ssh-ed25519 EHTwGA 1thFrqBMJqFLx0rw9esixG2zHYDUrV2aU7bYEplqowU
|
||||
4TwJrEQutZtLQwLD8KsNpVjD8xi20Cz9tBaZ4dwemqQ
|
||||
-> 1R-grease L=
|
||||
EiCjHuBgJOHUwb/uPAgOpG+y//MwEnE9A2eiQEcFKmBrYC67
|
||||
--- 2DOGVZ7I5GOYq+oV3SsOoYvxTNz7h8Z85LNsbHB7Jlc
|
||||
÷:Î*R�aÓn<êŇÙÊ�;̹~>ûL¯ÜÁEo$c�IB<݆6-o �³Ìx(9mîÍ}4ÿƒü¾N\MþÆØ~Wø
|
|
@ -0,0 +1,8 @@
|
|||
age-encryption.org/v1
|
||||
-> ssh-ed25519 EHTwGA COUzHGv3rhlJSURpTKSRIHqWNJIS73QB69hU3VaqszQ
|
||||
Wf7I9i8ZAI41WwwNynifG8GbUOLpoKijXkKeDQUKkjg
|
||||
-> mF[PF\-grease 'Ky1)Zkz
|
||||
JzjDcH0GLbxCZblzV7NeUW+MTUaLWQVY92knFxUetfPsnTpARsXYkIL12s+o47dm
|
||||
MHHTlB8ExD7RNynV6r/Do6UM9uNwsmwm/US8FvWTagAWbBWkocRZWh93Zw
|
||||
--- 822p/9l00Tv4a8veTfbZ2RbE7bnUBFzZVtpkeEa3hsw
|
||||
8Ñuµ7[ПȺ3õÅ)xDZ&í}r+Éê=<\•��ëGp7tÍ÷&>嵃ÞÄ|ûEm65k£±¢\\ž}Îí”êÀ’ëåѺG‚D‰Á_£
|
|
@ -0,0 +1,9 @@
|
|||
age-encryption.org/v1
|
||||
-> ssh-ed25519 EHTwGA z6epbutC22AqPSf6A+vImf5qXZMjzB1uNeUBVyYw+QY
|
||||
Wi1H1lSv1RMejpAb2A/rzqoiP1UUPVZYcx7Goh11Q1U
|
||||
-> \D$V-grease x}66D4G 2p
|
||||
s55x54FNeQhwesaZSGC5Og7TjQnwKXcSZGfrdANZF4uH469yPpotSq8HrPJK7JQv
|
||||
IbNXdGvVmoCmOwA1GaIXyxdRF8YgfJPcD31eXcDMuMVMbE0dkfbB50JcxR62Zktr
|
||||
|
||||
--- 36CMRrlw9MR/jT52W+aqYp+fxw9okj9DYd+M+8eOCkA
|
||||
G‘ÜX �2Ò¡A˜d7¦æ½nÅ]É£}à]DÊ´>»¯²xüÜ_ϳñjžˆa©UÓ;:ÌIé�†UUegñÓš
|
9
secrets/wireguard/proxy-sentinel/keys/sire-minecraft.age
Normal file
9
secrets/wireguard/proxy-sentinel/keys/sire-minecraft.age
Normal file
|
@ -0,0 +1,9 @@
|
|||
age-encryption.org/v1
|
||||
-> X25519 wD5BhJW5KI5lq37lSsED9RyDQpN3ELX6ZPh5esbVg0o
|
||||
r2h5o7gstcKAFUkbeJr6uj7Q7V7rqp87v7cReHxFwYk
|
||||
-> piv-p256 xqSe8Q AnymuZMQPqM6bSqYWE2Ju1DfFqs46xMw/lho4dSSYZ0I
|
||||
G3HUR7lINgXIhi90rJ8i6fXAhllemz2U8OtVEmS2tkw
|
||||
-> c,k.48-grease $j NDwlv8 ~Y5q!7c
|
||||
xmG2lEJzTEpc6lIokN34y/Ox
|
||||
--- /8ksWoOq9mJr2aMXhE7DZxrvcSY3mxlo/grXt0Ck8Zs
|
||||
ã ±mûÒœ“òÚŠÝ^wà—¢¢¶(Z©Xæü€Ù™½;1x¹×ZÏ‚…�ÔPghæk̛ߧÌ҄β>ã¾»ž¸þ´>
|
1
secrets/wireguard/proxy-sentinel/keys/sire-minecraft.pub
Normal file
1
secrets/wireguard/proxy-sentinel/keys/sire-minecraft.pub
Normal file
|
@ -0,0 +1 @@
|
|||
yMAdUPnWvTDhvnGJTtZSG+pKT1DiiXWQFRc2iX6MYxI=
|
|
@ -0,0 +1,9 @@
|
|||
age-encryption.org/v1
|
||||
-> X25519 Z4+MWhcHpN7ZlcH/zUeIgdsKyuSrwqYv/F3tubuwz1o
|
||||
lLonaLVVbwW9nBIzbpiRQk+NzJT8Z3lARLq11btOlrk
|
||||
-> piv-p256 xqSe8Q A5/OxbbTKTTwI1+X++UMNtcdQUxWevaXvF3uYz1Q9rK5
|
||||
+AqIBxSm5t+v3wi3cgxtxIHFIqXR39Bn3HGdaGpD+e4
|
||||
-> ,Td.O-grease jebr}f[ lq.5 7Q;f%P s2
|
||||
+/w
|
||||
--- jmueBY0AA9hP0eUaxLCZmIwAdIFFgicIX3vih1hEbso
|
||||
Ýyø=¦ø×Ÿ_p¤¬¼jh@âÂïþòÍܤs*¯,‹ä$!õɇ2 ê K\¨z¨q˜Ûq1A¹Dkxç';²DdÛWgjÉ‹
|
Loading…
Add table
Add a link
Reference in a new issue