# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).
{
  config,
  lib,
  pkgs,
  ...
}: let
  secrets = config.my.secrets;
in {
  imports = [
    # Include the results of the hardware scan.
    ./hardware-configuration.nix

    ./home.nix
    ./secrets.nix
  ];

  boot.loader.systemd-boot.enable = false;
  boot.loader.grub = {
    enable = true;
    efiSupport = false;
    devices = ["/dev/sda" "/dev/sdb"];
  };

  boot.tmp.useTmpfs = true;

  networking.hostName = "hades"; # Define your hostname.
  networking.domain = "alarsyo.net";

  # Set your time zone.
  time.timeZone = "Europe/Paris";

  networking.useDHCP = false;
  networking.interfaces.enp35s0.ipv4.addresses = [
    {
      address = "95.217.121.60";
      prefixLength = 26;
    }
  ];
  networking.interfaces.enp35s0.ipv6.addresses = [
    {
      address = "2a01:4f9:4a:3649::2";
      prefixLength = 64;
    }
  ];
  networking.defaultGateway = "95.217.121.1";
  networking.defaultGateway6 = {
    address = "fe80::1";
    interface = "enp35s0";
  };
  networking.nameservers = ["1.1.1.1" "1.0.0.1"];
  my.networking.externalInterface = "enp35s0";

  # List services that you want to enable:
  my.services = {
    fail2ban.enable = true;

    forgejo = {
      enable = true;
      privatePort = 8082;
    };

    immich = {
      enable = true;
      port = 8089;
    };

    jellyfin = {
      enable = true;
    };

    lohr = {
      enable = true;
      port = 8083;
    };

    matrix = {
      enable = true;
      secretConfigFile = config.age.secrets."matrix-synapse/secret-config".path;
    };

    mealie = {
      enable = true;
      port = 8090;
      credentialsFile = config.age.secrets."mealie/secret-config".path;
    };

    microbin = {
      enable = true;
      privatePort = 8088;
      passwordFile = config.age.secrets."microbin/secret-config".path;
    };

    miniflux = {
      enable = true;
      adminCredentialsFile = config.age.secrets."miniflux/admin-credentials".path;
      privatePort = 8080;
    };

    navidrome = {
      enable = true;
      musicFolder.path = "${config.services.nextcloud.home}/data/alarsyo/files/Musique/Songs";
    };

    nextcloud = {
      enable = true;
      adminpassFile = config.age.secrets."nextcloud/admin-pass".path;
    };

    nginx.enable = true;

    paperless = {
      enable = true;
      port = 8085;
      passwordFile = config.age.secrets."paperless/admin-password".path;
      secretKeyFile = config.age.secrets."paperless/secret-key".path;
    };

    pleroma = {
      enable = true;
      port = 8086;
      secretConfigFile = config.age.secrets."pleroma/pleroma-config".path;
    };

    restic-backup = {
      enable = true;
      repo = "b2:hades-backup-alarsyo";
      passwordFile = config.age.secrets."restic-backup/hades-password".path;
      environmentFile = config.age.secrets."restic-backup/hades-credentials".path;
      paths = ["/home/alarsyo"];
    };

    scribe = {
      enable = true;
      port = 8087;
    };

    tailscale = {
      enable = true;
      useRoutingFeatures = "server";
    };

    transmission = {
      enable = true;
      username = "alarsyo";
    };

    vaultwarden = {
      enable = true;
      privatePort = 8081;
      websocketPort = 3012;
    };
  };

  services = {
    openssh.enable = true;
    vnstat.enable = true;
  };

  virtualisation.docker.enable = true;

  environment.systemPackages = with pkgs; [
    docker-compose
  ];

  # Takes a long while to build
  documentation.nixos.enable = false;
}