diff --git a/hosts/nixcloud/configuration.nix b/hosts/nixcloud/configuration.nix index 7e71d64..86f2635 100644 --- a/hosts/nixcloud/configuration.nix +++ b/hosts/nixcloud/configuration.nix @@ -14,6 +14,20 @@ networking.hostName = "nixcloud"; # Define your hostname. + # podman + virtualisation.podman = { + enable = true; + autoPrune.enable = true; + dockerCompat = true; # optional; lets you use `docker` CLI + }; + virtualisation.oci-containers.backend = "podman"; + + # Enable container name DNS for all Podman networks. + networking.firewall.interfaces = let + matchAll = if !config.networking.nftables.enable then "podman+" else "podman*"; + in { + "${matchAll}".allowedUDPPorts = [ 53 ]; + }; # Define a user account. Don't forget to set a password with ‘passwd’. users.users = { diff --git a/hosts/nixcloud/services.d/minecraft.nix b/hosts/nixcloud/services.d/minecraft.nix index 74a96d7..2df802c 100644 --- a/hosts/nixcloud/services.d/minecraft.nix +++ b/hosts/nixcloud/services.d/minecraft.nix @@ -1,41 +1,98 @@ { config, pkgs, ... }: { - virtualisation.podman = { - enable = true; - autoPrune.enable = true; - dockerCompat = true; # optional; lets you use `docker` CLI + + virtualisation.oci-containers.containers."minecraft-server" = { + image = "ghcr.io/graalvm/graalvm-community:25"; + volumes = [ + "/var/lib/minecraft:/data:rw" + ]; + ports = [ + "25565:25565/tcp" + "24454:24454/udp" + ]; + extraOptions = [ + "--network-alias=minecraft-server" + "--network=minecraft_default" + "--tty" + "--interactive" + ]; + entrypoint = "/data/run.sh"; + log-driver = "journald"; }; - systemd.services.minecraft-container = { - description = "Minecraft Server Container (GraalVM JVM 25)"; - after = [ "network-online.target" ]; - wants = [ "network-online.target" ]; + systemd.services."podman-minecraft-server" = { serviceConfig = { - ExecStart = '' - ${pkgs.podman}/bin/podman run \ - --rm \ - --name minecraft-server \ - -v /var/lib/minecraft:/data \ - -p 25565:25565 \ - -p 24454:24454/udp \ - ghcr.io/graalvm/graalvm-community:25 \ - /data/run.sh - ''; - ExecStop = "${pkgs.podman}/bin/podman stop minecraft-server"; - Restart = "always"; - RestartSec = "10s"; + Restart = lib.mkOverride 90 "always"; }; + after = [ + "podman-network-minecraft_default.service" + ]; + requires = [ + "podman-network-minecraft_default.service" + ]; + partOf = [ + "podman-compose-minecraft-root.target" + ]; + wantedBy = [ + "podman-compose-minecraft-root.target" + ]; + }; - # Ensure the directory exists - preStart = '' - mkdir -p /var/lib/minecraft + # Networks + systemd.services."podman-network-minecraft_default" = { + path = [ pkgs.podman ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStop = "podman network rm -f minecraft_default"; + }; + script = '' + podman network inspect minecraft_default || podman network create minecraft_default ''; + partOf = [ "podman-compose-minecraft-root.target" ]; + wantedBy = [ "podman-compose-minecraft-root.target" ]; + }; + + # Root service + # When started, this will automatically create all resources and start + # the containers. When stopped, this will teardown all resources. + systemd.targets."podman-compose-minecraft-root" = { + unitConfig = { + Description = "Root target"; + }; wantedBy = [ "multi-user.target" ]; }; - # Give Podman permission to access persistent storage - systemd.tmpfiles.rules = [ - "d /var/lib/minecraft 0755 root root" - ]; + #systemd.services.minecraft-container = { + # description = "Minecraft Server Container (GraalVM JVM 25)"; + # after = [ "network-online.target" ]; + # wants = [ "network-online.target" ]; + # serviceConfig = { + # ExecStart = '' + # ${pkgs.podman}/bin/podman run \ + # --rm \ + # --name minecraft-server \ + # -v /var/lib/minecraft:/data \ + # -p 25565:25565 \ + # -p 24454:24454/udp \ + # ghcr.io/graalvm/graalvm-community:25 \ + # /data/run.sh + # ''; + # ExecStop = "${pkgs.podman}/bin/podman stop minecraft-server"; + # Restart = "always"; + # RestartSec = "10s"; + # }; +# + # # Ensure the directory exists + # preStart = '' + # mkdir -p /var/lib/minecraft + # ''; + # wantedBy = [ "multi-user.target" ]; + #}; +# + ## Give Podman permission to access persistent storage + #systemd.tmpfiles.rules = [ + # "d /var/lib/minecraft 0755 root root" + #]; }