瀏覽代碼

Start transition of home lab to nixos

Johan Rong 1 月之前
父節點
當前提交
d7ade94e83

+ 24 - 0
nixos/modules/hardware/networking/server.nix

@@ -0,0 +1,24 @@
+{ config, pkgs, ... }:
+
+{
+  networking = {
+    useDHCP = false; 
+
+    networkmanager.enable = true; 
+
+    interfaces.eth0.ipv4.addresses = [{
+      prefixLength = 24;
+    }];
+
+    defaultGateway = "192.168.1.1";
+    nameservers = [ "1.1.1.1" "8.8.8.8" ];
+  };
+
+  services.openssh = {
+    enable = true;
+    settings = {
+      PermitRootLogin = "no";
+      PasswordAuthentication = false;
+    };
+  };
+}

+ 152 - 0
nixos/modules/server/docker/containers/gogs.nix

@@ -0,0 +1,152 @@
+# Auto-generated by compose2nix.
+
+{ pkgs, lib, config, ... }:
+
+{
+  # Runtime
+  virtualisation.podman = {
+    enable = true;
+    autoPrune.enable = true;
+    dockerCompat = true;
+  };
+
+  # 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 ];
+  };
+
+  virtualisation.oci-containers.backend = "podman";
+
+  # Containers
+  virtualisation.oci-containers.containers."caddy" = {
+    image = "caddy:latest";
+    volumes = [
+      "${pkgs.writeText "Caddyfile" ''
+          git.johron.no {
+              tls johanhrong@icloud.com
+              reverse_proxy gogs:3000
+          }
+      ''}:/etc/caddy/Caddyfile:rw"
+      "gogs_caddy_config:/config:rw"
+      "gogs_caddy_data:/data:rw"
+    ];
+    ports = [
+      "80:80/tcp"
+      "443:443/tcp"
+    ];
+    dependsOn = [
+      "gogs"
+    ];
+    log-driver = "journald";
+    extraOptions = [
+      "--network-alias=caddy"
+      "--network=gogs_default"
+    ];
+  };
+  systemd.services."podman-caddy" = {
+    serviceConfig = {
+      Restart = lib.mkOverride 90 "always";
+    };
+    after = [
+      "podman-network-gogs_default.service"
+      "podman-volume-gogs_caddy_config.service"
+      "podman-volume-gogs_caddy_data.service"
+    ];
+    requires = [
+      "podman-network-gogs_default.service"
+      "podman-volume-gogs_caddy_config.service"
+      "podman-volume-gogs_caddy_data.service"
+    ];
+    partOf = [
+      "podman-compose-gogs-root.target"
+    ];
+    wantedBy = [
+      "podman-compose-gogs-root.target"
+    ];
+  };
+  virtualisation.oci-containers.containers."gogs" = {
+    image = "gogs/gogs:latest";
+    volumes = [
+      "/home/johron/Downloads/tmp/gogs-data:/data:rw"
+    ];
+    ports = [
+      "3000:3000/tcp"
+      "22:22/tcp"
+    ];
+    log-driver = "journald";
+    extraOptions = [
+      "--network-alias=gogs"
+      "--network=gogs_default"
+    ];
+  };
+  systemd.services."podman-gogs" = {
+    serviceConfig = {
+      Restart = lib.mkOverride 90 "always";
+    };
+    after = [
+      "podman-network-gogs_default.service"
+    ];
+    requires = [
+      "podman-network-gogs_default.service"
+    ];
+    partOf = [
+      "podman-compose-gogs-root.target"
+    ];
+    wantedBy = [
+      "podman-compose-gogs-root.target"
+    ];
+  };
+
+  # Networks
+  systemd.services."podman-network-gogs_default" = {
+    path = [ pkgs.podman ];
+    serviceConfig = {
+      Type = "oneshot";
+      RemainAfterExit = true;
+      ExecStop = "podman network rm -f gogs_default";
+    };
+    script = ''
+      podman network inspect gogs_default || podman network create gogs_default
+    '';
+    partOf = [ "podman-compose-gogs-root.target" ];
+    wantedBy = [ "podman-compose-gogs-root.target" ];
+  };
+
+  # Volumes
+  systemd.services."podman-volume-gogs_caddy_config" = {
+    path = [ pkgs.podman ];
+    serviceConfig = {
+      Type = "oneshot";
+      RemainAfterExit = true;
+    };
+    script = ''
+      podman volume inspect gogs_caddy_config || podman volume create gogs_caddy_config
+    '';
+    partOf = [ "podman-compose-gogs-root.target" ];
+    wantedBy = [ "podman-compose-gogs-root.target" ];
+  };
+  systemd.services."podman-volume-gogs_caddy_data" = {
+    path = [ pkgs.podman ];
+    serviceConfig = {
+      Type = "oneshot";
+      RemainAfterExit = true;
+    };
+    script = ''
+      podman volume inspect gogs_caddy_data || podman volume create gogs_caddy_data
+    '';
+    partOf = [ "podman-compose-gogs-root.target" ];
+    wantedBy = [ "podman-compose-gogs-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-gogs-root" = {
+    unitConfig = {
+      Description = "Root target generated by compose2nix.";
+    };
+    wantedBy = [ "multi-user.target" ];
+  };
+}

+ 81 - 0
nixos/modules/server/docker/containers/navidrome.nix

@@ -0,0 +1,81 @@
+# Auto-generated by compose2nix.
+
+{ pkgs, lib, config, ... }:
+
+{
+  # Runtime
+  virtualisation.podman = {
+    enable = true;
+    autoPrune.enable = true;
+    dockerCompat = true;
+  };
+
+  # 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 ];
+  };
+
+  virtualisation.oci-containers.backend = "podman";
+
+  # Containers
+  virtualisation.oci-containers.containers."navidrome-navidrome" = {
+    image = "deluan/navidrome:latest";
+    volumes = [
+      "/opt/docker-containers/navidrome/data:/data:rw"
+      "/opt/docker-containers/navidrome/music:/music:ro"
+    ];
+    ports = [
+      "4533:4533/tcp"
+    ];
+    user = "1000:1000";
+    log-driver = "journald";
+    extraOptions = [
+      "--network-alias=navidrome"
+      "--network=navidrome_default"
+    ];
+  };
+  systemd.services."podman-navidrome-navidrome" = {
+    serviceConfig = {
+      Restart = lib.mkOverride 90 "always";
+    };
+    after = [
+      "podman-network-navidrome_default.service"
+    ];
+    requires = [
+      "podman-network-navidrome_default.service"
+    ];
+    partOf = [
+      "podman-compose-navidrome-root.target"
+    ];
+    wantedBy = [
+      "podman-compose-navidrome-root.target"
+    ];
+  };
+
+  # Networks
+  systemd.services."podman-network-navidrome_default" = {
+    path = [ pkgs.podman ];
+    serviceConfig = {
+      Type = "oneshot";
+      RemainAfterExit = true;
+      ExecStop = "podman network rm -f navidrome_default";
+    };
+    script = ''
+      podman network inspect navidrome_default || podman network create navidrome_default
+    '';
+    partOf = [ "podman-compose-navidrome-root.target" ];
+    wantedBy = [ "podman-compose-navidrome-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-navidrome-root" = {
+    unitConfig = {
+      Description = "Root target generated by compose2nix.";
+    };
+    wantedBy = [ "multi-user.target" ];
+  };
+}

+ 9 - 0
nixos/modules/server/docker/default.nix

@@ -0,0 +1,9 @@
+{ config, pkgs, lib, inputs, ... }:
+
+{
+  virtualisation = {
+    docker = {
+      enable = true;
+    };
+  };
+}

+ 19 - 0
nixos/modules/system/users-server.nix

@@ -0,0 +1,19 @@
+{ config, pkgs, ... }:
+
+let
+  users = import ../../../config/users.nix;
+in
+{
+  security = {
+    sudo = {
+      wheelNeedsPassword = true;
+    };
+  };
+
+  users.users.${users.vaktmester} = {
+    isNormalUser = true;
+    extraGroups = [ "wheel" "networkmanager" "docker" ];
+  };
+
+  users.defaultUserShell = pkgs.fish;
+}