From 10289cb9302f3d26e02ebf196c908f7180e6e758 Mon Sep 17 00:00:00 2001
From: Gabe Venberg <gabevenberg@gmail.com>
Date: Fri, 11 Apr 2025 23:38:32 +0200
Subject: [PATCH] added minecraft server. Backup solution is a bit ugly ATM.

---
 configs/home-manager/yazi.nix                 |  8 ++--
 configs/nixos/docker.nix                      |  5 +-
 configs/nixos/factorio-docker.nix             |  1 -
 configs/nixos/minecraft-docker.nix            | 48 +++++++++++++++++++
 ...rve-static.nix => miniserve-directory.nix} |  2 +-
 configs/nixos/nginx-static.nix                | 13 +++++
 hosts/cirrostratus/default.nix                |  4 +-
 hosts/cirrostratus/restic.nix                 | 22 ++++++++-
 8 files changed, 94 insertions(+), 9 deletions(-)
 create mode 100644 configs/nixos/minecraft-docker.nix
 rename configs/nixos/{miniserve-static.nix => miniserve-directory.nix} (92%)
 create mode 100644 configs/nixos/nginx-static.nix

diff --git a/configs/home-manager/yazi.nix b/configs/home-manager/yazi.nix
index 323ee17..83b4116 100644
--- a/configs/home-manager/yazi.nix
+++ b/configs/home-manager/yazi.nix
@@ -6,10 +6,10 @@
 }: {
   programs.yazi.enable = true;
   # optional dependencies for yazi.
-  programs={
-    fzf.enable=true;
-    ripgrep.enable=true;
-    zoxide.enable=true;
+  programs = {
+    fzf.enable = true;
+    ripgrep.enable = true;
+    zoxide.enable = true;
   };
   home.packages = with pkgs; [
     ffmpeg
diff --git a/configs/nixos/docker.nix b/configs/nixos/docker.nix
index c9451cd..4137898 100644
--- a/configs/nixos/docker.nix
+++ b/configs/nixos/docker.nix
@@ -5,6 +5,9 @@
   lib,
   ...
 }: {
-  virtualisation.docker.enable = true;
+  virtualisation.docker = {
+    enable = true;
+    autoPrune.enable = true;
+  };
   users.users.${config.host.user}.extraGroups = ["docker"];
 }
diff --git a/configs/nixos/factorio-docker.nix b/configs/nixos/factorio-docker.nix
index c678598..922d317 100644
--- a/configs/nixos/factorio-docker.nix
+++ b/configs/nixos/factorio-docker.nix
@@ -13,7 +13,6 @@
       hostname = "factorio";
       ports = [
         "34197:34197/udp"
-        "27015:27015/tcp"
       ];
       environment = {UPDATE_MODS_ON_START = "true";};
     };
diff --git a/configs/nixos/minecraft-docker.nix b/configs/nixos/minecraft-docker.nix
new file mode 100644
index 0000000..66fd4ed
--- /dev/null
+++ b/configs/nixos/minecraft-docker.nix
@@ -0,0 +1,48 @@
+{
+  inputs,
+  config,
+  pkgs,
+  lib,
+  ...
+}: {
+  virtualisation.oci-containers = {
+    backend = "docker";
+    containers.minecraft = {
+      image = "itzg/minecraft-server";
+      volumes = ["/storage/minecraft:/data"];
+      hostname = "minecraft";
+      ports = [
+        "25565:25565"
+      ];
+      environment = {
+        EULA = "TRUE";
+        TYPE = "FORGE";
+        VERSION = "1.20.1";
+        PACKWIZ_URL = "https://static.venberg.xyz/minecraft/less-than-compact-2/pack.toml";
+        MEMORY = "16G";
+        USE_AIKAR_FLAGS = "true";
+        UID = "1000";
+        GID = "100";
+        STOP_SERVER_ANNOUNCE_DELAY = "30";
+        ENABLE_ROLLING_LOGS = "true";
+        GUI = "FALSE";
+        # SETUP_ONLY = "true";
+        MOTD = "Welcome!";
+        DIFFICULTY = "normal";
+        OPS = ''
+          TheToric
+        '';
+        ENFORCE_WHITELIST = "true";
+        ENABLE_WHITELIST = "true";
+        ANNOUNCE_PLAYER_ACHIEVEMENTS = "true";
+        ALLOW_FLIGHT = "TRUE";
+        ENABLE_AUTOPAUSE = "true";
+        MAX_TICK_TIME = "-1";
+      };
+      extraOptions = ["--stop-timeout=60"];
+    };
+  };
+  imports = [
+    ./docker.nix
+  ];
+}
diff --git a/configs/nixos/miniserve-static.nix b/configs/nixos/miniserve-directory.nix
similarity index 92%
rename from configs/nixos/miniserve-static.nix
rename to configs/nixos/miniserve-directory.nix
index c0854d3..93b85a5 100644
--- a/configs/nixos/miniserve-static.nix
+++ b/configs/nixos/miniserve-directory.nix
@@ -25,7 +25,7 @@ in {
       ];
     };
   };
-  services.nginx.virtualHosts."static.venberg.xyz" = {
+  services.nginx.virtualHosts."directory.venberg.xyz" = {
     enableACME = true;
     forceSSL = true;
     locations."/" = {
diff --git a/configs/nixos/nginx-static.nix b/configs/nixos/nginx-static.nix
new file mode 100644
index 0000000..77fd255
--- /dev/null
+++ b/configs/nixos/nginx-static.nix
@@ -0,0 +1,13 @@
+{
+  inputs,
+  config,
+  pkgs,
+  lib,
+  ...
+}: {
+  services.nginx.virtualHosts."static.venberg.xyz" = {
+    enableACME = true;
+    forceSSL = true;
+    root = "/storage/static";
+  };
+}
diff --git a/hosts/cirrostratus/default.nix b/hosts/cirrostratus/default.nix
index 5ab3755..b1a05f9 100644
--- a/hosts/cirrostratus/default.nix
+++ b/hosts/cirrostratus/default.nix
@@ -24,7 +24,9 @@ inputs.nixpkgs.lib.nixosSystem {
     ../../configs/nixos/grocy.nix
     ../../configs/nixos/factorio-docker.nix
     ../../configs/nixos/cyberchef.nix
-    ../../configs/nixos/miniserve-static.nix
+    ../../configs/nixos/miniserve-directory.nix
+    ../../configs/nixos/minecraft-docker.nix
+    ../../configs/nixos/nginx-static.nix
     ({
       config,
       pkgs,
diff --git a/hosts/cirrostratus/restic.nix b/hosts/cirrostratus/restic.nix
index ec4c372..68e9cc6 100644
--- a/hosts/cirrostratus/restic.nix
+++ b/hosts/cirrostratus/restic.nix
@@ -6,6 +6,23 @@
   ...
 }: let
   port = "8090";
+  # TODO: I should really make restic a custom module at this point, with an enable option, a option for being the host,
+  # and the ability to add paths and pre/post commands from multiple places.
+  preBackup = pkgs.writeShellScriptBin "mc-docker-pre-backup" ''
+    set -euxo pipefail
+
+    docker exec minecraft rcon-cli "say server backing up, expect minor lag"
+    sleep 10
+    docker exec minecraft rcon-cli "save-all flush"
+    docker exec minecraft rcon-cli "save-off"
+    sleep 10
+  '';
+  postBackup = pkgs.writeShellScriptBin "mc-docker-post-backup" ''
+    set -euxo pipefail
+
+    docker exec minecraft rcon-cli "save-on"
+    docker exec minecraft rcon-cli "say server backup succsessful!"
+  '';
 in {
   services.restic.server = lib.mkIf (inputs ? nix-secrets) {
     enable = true;
@@ -46,11 +63,14 @@ in {
       repositoryFile = "/backup/restic/";
       passwordFile = config.sops.secrets.restic-password.path;
       initialize = true;
+      backupPrepareCommand = "${preBackup}/bin/mc-docker-pre-backup";
+      backupCleanupCommand = "${postBackup}/bin/mc-docker-post-backup";
       paths = [
         "/storage/syncthing"
         "/storage/factorio"
+        "/storage/minecraft"
       ];
-      pruneOpts=[
+      pruneOpts = [
         "--keep-within 14d"
         "--keep-daily 14"
         "--keep-weekly 8"