From 618b10bc22852d4a52bd274482c28f1929ffd908 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 11 Nov 2025 20:04:36 -0600 Subject: [PATCH] feat: added midnight miner --- modules/nixos/default.nix | 1 + modules/nixos/guests/midnight/default.nix | 146 ++++++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 modules/nixos/guests/midnight/default.nix diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix index b4d8dac..649eb9a 100755 --- a/modules/nixos/default.nix +++ b/modules/nixos/default.nix @@ -56,6 +56,7 @@ in # logrotate mastodon microvm + midnight # minecraft # ollamaCeres # postgresCeres diff --git a/modules/nixos/guests/midnight/default.nix b/modules/nixos/guests/midnight/default.nix new file mode 100644 index 0000000..a63396f --- /dev/null +++ b/modules/nixos/guests/midnight/default.nix @@ -0,0 +1,146 @@ +{ + flake, + pkgs, + ... +}: +let + inherit (flake.config.people) user0; +in +{ + microvm = { + vms = { + miner = { + autostart = true; + config = + let + macAddress = "02:00:00:00:00:57"; + workers = 45; + in + { + environment.systemPackages = [ + pkgs.git + pkgs.ncurses + pkgs.python313 + ]; + + microvm = { + forwardPorts = [ + { + from = "host"; + host.port = 2057; + guest.port = 22; + } + ]; + hypervisor = "qemu"; + interfaces = [ + { + type = "tap"; + id = "vm-miner"; + mac = "02:00:00:00:57:57"; + } + { + type = "user"; + id = "uservm-miner"; + mac = macAddress; + } + ]; + mem = 52100; + shares = [ + { + mountPoint = "/nix/.ro-store"; + proto = "virtiofs"; + source = "/nix/store"; + tag = "read_only_nix_store"; + } + { + mountPoint = "/var/lib/midnight-data"; + proto = "virtiofs"; + source = "/var/lib/midnight-data"; + tag = "midnight_data"; + } + ]; + vcpu = workers; + }; + + networking.firewall.allowedTCPPorts = [ + 22 + ]; + + services = { + openssh = { + enable = true; + settings.PasswordAuthentication = false; + }; + }; + + system.stateVersion = "25.05"; + + systemd = { + network = { + enable = true; + networks."20-user" = { + matchConfig.MACAddress = macAddress; + networkConfig = { + DHCP = "yes"; + }; + }; + }; + + tmpfiles.rules = [ + "d /var/lib/midnight-data 0755 root root - -" + ]; + + services = { + midnight-miner = { + after = [ "network-online.target" ]; + description = "MidnightMiner - Cardano NIGHT token miner"; + serviceConfig = { + Environment = [ + "PATH=/run/current-system/sw/bin" + "TERM=xterm-256color" + ]; + ExecStartPre = pkgs.writeShellScript "setup-miner" '' + # Create venv if not already present (persists on virtiofs mount) + if [ ! -d /var/lib/midnight-data/venv ]; then + ${pkgs.python313}/bin/python -m venv /var/lib/midnight-data/venv + fi + + # Install/upgrade dependencies + /var/lib/midnight-data/venv/bin/pip install --upgrade pip + /var/lib/midnight-data/venv/bin/pip install requests pycardano cbor2 portalocker + + # Clone repo if not already present + if [ ! -d /var/lib/midnight-data/MidnightMiner ]; then + cd /var/lib/midnight-data + ${pkgs.git}/bin/git clone https://github.com/djeanql/MidnightMiner.git + else + cd /var/lib/midnight-data/MidnightMiner + ${pkgs.git}/bin/git pull + fi + ''; + ExecStart = pkgs.writeShellScript "run-miner" '' + export PATH=/run/current-system/sw/bin:$PATH + cd /var/lib/midnight-data/MidnightMiner + /var/lib/midnight-data/venv/bin/python miner.py --workers ${toString workers} --no-donation + ''; + Restart = "always"; + RestartSec = 10; + }; + wants = [ "network-online.target" ]; + wantedBy = [ "multi-user.target" ]; + }; + }; + }; + + time.timeZone = "America/Winnipeg"; + + users.users.root.openssh.authorizedKeys.keys = flake.config.people.users.${user0}.sshKeys; + + }; + }; + }; + }; + systemd.tmpfiles.rules = [ + "d /var/lib/midnight-data 0751 microvm wheel - -" + ]; +}