aboutsummaryrefslogblamecommitdiff
path: root/modules/private/system/dilion.nix
blob: b9be8b073430b7e7019526b099d5bb3fcf5684f9 (plain) (tree)
1
2
3
4
5
6
7
8
9
                                 
 




                                             

                                                                                         

















                                                                  

                                                         




                                                
                                                         
 
                                        
                 
                                                               





                                                                                                            

                                                         
    



                                                                                    
 
                
                                                                                  
                            



















                                                                                                                                              


                                                                               
                                                                       
 
                                       
                                                                                                      

                             





                                       


                                             
      

    
                        

                         
                             

                                     
                                                               
      
                                                                                                                                               
    
                                               

                  




                                                                                          

    


                                                        
                                      
                                              
                                        
                                                               


                                                          





                                                 
                                                                                 

      
 





                                 
                                                       
                                                




                                         






                                                                      

                                                                       

                                                      
    
                                                                           
                                                                                               
 
                                      
                                        



                                                                                      



                                        
                            
                                 






                                    
                 
                                            
      
                    





                                                          













                                                                                                                


      






















                                                                                                    




                                                                      
                                                            

 
{ config, pkgs, name, lib, ... }:
{
  deployment = {
    targetUser = "root";
    targetHost = config.hostEnv.ips.main.ip4;
    substituteOnDestination = true;
  };
  # ssh-keyscan dilion | nix-shell -p ssh-to-age --run ssh-to-age
  secrets.ageKeys = [ "age1x49n6qa0arkdpq8530s7umgm0gqkq90exv4jep97q30rfnzknpaqate06a" ];
  nixpkgs.system = lib.mkOverride 900 "x86_64-linux";
  boot = {
    loader = {
      grub = {
        version = 2;
        devices = [ "/dev/sda" "/dev/sdb" "/dev/sdc" "/dev/sdd" ];
      };
      timeout = 1;
    };
    blacklistedKernelModules = [ "nvidiafb" ];
    supportedFilesystems = [ "zfs" ];
    kernelPackages = pkgs.linuxPackages_latest;
    kernelModules = [ "kvm-intel" ];
    initrd.availableKernelModules = [ "ahci" "sd_mod" ];
    initrd.secrets = {
      "/boot/pass.key" = "/boot/pass.key";
    };
    kernel.sysctl."vm.nr_hugepages" = 256; # for xmr-stak
    # available in nixos-20.09
    #zfs.requestEncryptionCredentials = [ "zpool/root" ];
  };
  nix.maxJobs = 8;
  powerManagement.cpuFreqGovernor = "powersave";
  hardware.enableRedistributableFirmware = true;

  myEnv = import ../../../nixops/secrets/environment.nix;

  swapDevices = [ { label = "swap"; } ];
  fileSystems = {
    "/"           = { fsType = "zfs"; device = "zpool/root"; };
    "/boot"       = { fsType = "ext4"; device = "/dev/disk/by-uuid/fd1c511e-2bc0-49d5-b8bb-95e7e8c8c816"; };
    "/etc"        = { fsType = "zfs"; device = "zpool/root/etc"; };
    "/home"       = { fsType = "zfs"; device = "zpool/root/home"; };
    "/home/immae" = { fsType = "zfs"; device = "zpool/root/home/immae"; };
    "/tmp"        = { fsType = "zfs"; device = "zpool/root/tmp"; };
    "/var"        = { fsType = "zfs"; device = "zpool/root/var"; };
    "/data"       = { fsType = "ext4"; label = "data"; };
    "/nix"        = { fsType = "ext4"; label = "nix"; };
  };

  services.udev.extraRules = ''
    ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="10:bf:48:7f:e6:3b", NAME="eth0"
  '';

  networking = {
    hostId = "27c3048d"; # generated with head -c4 /dev/urandom | od -A none -t x4
    firewall.enable = false;
    interfaces."eth0".ipv4.addresses =
      [ { address = config.hostEnv.ips.main.ip4; prefixLength = 27; } ]
      ++ pkgs.lib.attrsets.mapAttrsToList
        (n: ips: { address = ips.ip4; prefixLength = 32; })
        (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips);
    interfaces."eth0".ipv6.addresses =
      [ { address = "2a01:4f8:141:53e7::"; prefixLength = 64; } ]
      ++ pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
        (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
        config.hostEnv.ips);
    defaultGateway = { address = "176.9.10.225"; interface = "eth0"; };
    defaultGateway6 = { address = "fe80::1"; interface = "eth0"; };
    nameservers = [
      "213.133.98.98"
      "213.133.99.99"
      "213.133.100.100"
      "2a01:4f8:0:a0a1::add:1010"
      "2a01:4f8:0:a102::add:9999"
      "2a01:4f8:0:a111::add:9898"
    ];
  };

  myServices.ssh.modules = [ config.myServices.ssh.predefinedModules.regular ];
  imports = builtins.attrValues (import ../..) ++ [ ./dilion/vms.nix ];

  system.nssModules = [ pkgs.libvirt ];
  system.nssDatabases.hosts = lib.mkForce [ "files" "libvirt_guest" "mymachines" "dns" "myhostname" ];
  programs.zsh.enable = true;

  users.users.libvirt = {
    hashedPassword = "!";
    shell = pkgs.bashInteractive;
    isSystemUser = true;
    group = "libvirtd";
    packages = [ pkgs.netcat-openbsd ];
    openssh.authorizedKeys.keys = [
      config.myEnv.buildbot.ssh_key.public
      config.myEnv.sshd.rootKeys.ismael_flony
    ];
  };

  users.users.backup = {
    hashedPassword = "!";
    isSystemUser = true;
    extraGroups = [ "keys" ];
    shell = pkgs.bashInteractive;
    openssh.authorizedKeys.keys = let
      zreplConfig = config.secrets.fullPaths."zrepl/zrepl.yml";
    in
      ["command=\"${pkgs.zrepl}/bin/zrepl stdinserver --config ${zreplConfig} eldiron\",restrict ${config.myEnv.zrepl_backup.ssh_key.public}"];
  };
  security.sudo.extraRules = pkgs.lib.mkAfter [
    {
      commands = [
        { command = "/home/immae/.nix-profile/root_scripts/*"; options = [ "NOPASSWD" ]; }
      ];
      users = [ "immae" ];
      runAs = "root";
    }
  ];

  system.activationScripts.libvirtd_exports = ''
    install -m 0755 -o root -g root -d /var/lib/caldance
  '';
  virtualisation.docker.enable = true;
  virtualisation.docker.storageDriver = "zfs";
  virtualisation.libvirtd.enable = true;
  users.extraUsers.immae.extraGroups = [ "libvirtd" "docker" ];
  systemd.services.libvirtd.postStart = ''
    install -m 0770 -g libvirtd -d /var/lib/libvirt/images
  '';
  systemd.services.socat-caldance = {
    description = "Forward ssh port to caldance";
    wantedBy = [ "multi-user.target" ];
    after = [ "network.target" ];

    serviceConfig = {
      ExecStart = "${pkgs.socat}/bin/socat TCP-LISTEN:8022,fork TCP:caldance:22";
    };
  };

  time.timeZone = "Europe/Paris";
  nix = {
    useSandbox = "relaxed";
    extraOptions = ''
      keep-outputs = true
      keep-derivations = true
      allow-unsafe-native-code-during-evaluation = true
      experimental-features = nix-command flakes
      #Assumed in NUR
      allow-import-from-derivation = true
    '';
  };

  security.pki.certificateFiles = [
    (pkgs.fetchurl {
      url = "http://downloads.e.eriomem.net/eriomemca.pem";
      sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh";
    })
  ];

  # This is equivalent to setting environment.sessionVariables.NIX_PATH
  nix.nixPath = [
    "home-manager=${pkgs.sources.home-manager.url}"
    "nixpkgs=${pkgs.sources.nixpkgs-home-manager.url}"
  ];
  nix.binaryCaches = [ "https://hydra.iohk.io" "https://cache.nixos.org" ];
  nix.binaryCachePublicKeys = [ "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=" ];

  myServices.monitoring.enable = true;
  myServices.certificates.enable = true;
  security.acme.certs."${name}-immae" = config.myServices.certificates.certConfig // {
    user = "immae";
    domain = "dilion.immae.eu";
  };
  security.acme.certs."${name}" = {
    user = config.services.nginx.user;
    group = config.services.nginx.group;
    extraDomains = {
      "dev.immae.eu" = null;
      "caldance.immae.eu" = null;
    };
  };
  services.nginx = {
    enable = true;
    recommendedOptimisation = true;
    recommendedGzipSettings = true;
    recommendedProxySettings = true;
    upstreams = {
      caldance.servers."caldance:3031" = {};
    };
    virtualHosts = {
      "dev.immae.eu" = {
        acmeRoot = config.myServices.certificates.webroot;
        useACMEHost = name;
        forceSSL = true;
        root = "/home/immae/www";
      };
      "caldance.immae.eu" = {
        acmeRoot = config.myServices.certificates.webroot;
        useACMEHost = name;
        forceSSL = true;
        locations."/".extraConfig = ''
          uwsgi_pass caldance;
        '';
        locations."/static/".alias = "/var/lib/caldance/caldance/app/www/static/";
        locations."/media/".alias = "/var/lib/caldance/caldance/media/";
        extraConfig = ''
          auth_basic           "Authentification requise";
          auth_basic_user_file ${pkgs.writeText "htpasswd" config.myEnv.websites.caldance.integration.password};
        '';
      };
    };
  };

  systemd.services.zrepl.serviceConfig.RuntimeDirectory = lib.mkForce "zrepl zrepl/stdinserver";
  systemd.services.zrepl.serviceConfig.User = "backup";
  # zfs allow backup create,mount,receive,destroy,rename,snapshot,hold,bookmark,release zpool/backup
  services.zrepl = {
    enable = true;
    config = ''
      global:
        control:
          sockpath: /run/zrepl/control
        serve:
          stdinserver:
            sockdir: /run/zrepl/stdinserver
      jobs:
        - type: sink
          # must not change
          name: "backup-from-eldiron"
          root_fs: "zpool/backup"
          serve:
            type: stdinserver
            client_identities:
              - eldiron
    '';
  };
  # This value determines the NixOS release with which your system is
  # to be compatible, in order to avoid breaking some software such as
  # database servers. You should change this only after NixOS release
  # notes say you should.
  # https://nixos.org/nixos/manual/release-notes.html
  system.stateVersion = "20.03"; # Did you read the comment?
}