commit
88e3dca322
@ -0,0 +1,57 @@ |
|||||||
|
{ |
||||||
|
description = "NixOS Infrastructure"; |
||||||
|
|
||||||
|
inputs = { |
||||||
|
nixos.follows = "nixpkgs-unstable"; |
||||||
|
nixpkgs.follows = "nixpkgs-unstable"; |
||||||
|
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; |
||||||
|
nixos-hardware.url = "github:NixOS/nixos-hardware"; |
||||||
|
}; |
||||||
|
|
||||||
|
outputs = { self, nixpkgs, nixos-hardware, ... }: |
||||||
|
let |
||||||
|
# Authorization keys for user mappings (login keys per user) |
||||||
|
auth_keys = { |
||||||
|
alice = [ |
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIALiceKeyPlaceholder alice@host" |
||||||
|
]; |
||||||
|
bob = [ |
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBobKeyPlaceholder bob@host" |
||||||
|
]; |
||||||
|
}; |
||||||
|
|
||||||
|
# Sudo keys per user (keys granting sudo, applied to root) |
||||||
|
sudo_keys = [ |
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAISudoKeyPlaceholder admin@host" |
||||||
|
]; |
||||||
|
|
||||||
|
sharedModules = [ |
||||||
|
./modules/users.nix |
||||||
|
]; |
||||||
|
|
||||||
|
sharedArgs = { |
||||||
|
inherit auth_keys sudo_keys; |
||||||
|
}; |
||||||
|
in { |
||||||
|
nixosConfigurations = { |
||||||
|
auth.domain.com = nixpkgs.lib.nixosSystem { |
||||||
|
system = "x86_64-linux"; |
||||||
|
specialArgs = sharedArgs; |
||||||
|
modules = [ |
||||||
|
./machines/auth.domain.com/configuration.nix |
||||||
|
./machines/auth.domain.com/hardware-configuration.nix |
||||||
|
./modules/keycloak.nix |
||||||
|
] ++ sharedModules; |
||||||
|
}; |
||||||
|
|
||||||
|
status.domain.com = nixpkgs.lib.nixosSystem { |
||||||
|
system = "x86_64-linux"; |
||||||
|
specialArgs = sharedArgs; |
||||||
|
modules = [ |
||||||
|
./machines/status.domain.com/configuration.nix |
||||||
|
./machines/status.domain.com/hardware-configuration.nix |
||||||
|
] ++ sharedModules; |
||||||
|
}; |
||||||
|
}; |
||||||
|
}; |
||||||
|
} |
||||||
@ -0,0 +1,43 @@ |
|||||||
|
{ config, lib, pkgs, ... }: |
||||||
|
|
||||||
|
{ |
||||||
|
imports = [ |
||||||
|
./hardware-configuration.nix |
||||||
|
../../modules/keycloak.nix |
||||||
|
]; |
||||||
|
|
||||||
|
boot.loader.grub.enable = true; |
||||||
|
boot.loader.grub.device = "/dev/sda"; |
||||||
|
|
||||||
|
networking.hostName = "auth"; |
||||||
|
networking.domain = "domain.com"; |
||||||
|
|
||||||
|
time.timeZone = "UTC"; |
||||||
|
|
||||||
|
services.openssh = { |
||||||
|
enable = true; |
||||||
|
settings = { |
||||||
|
PermitRootLogin = "prohibit-password"; |
||||||
|
PasswordAuthentication = false; |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [ |
||||||
|
curl |
||||||
|
tmux |
||||||
|
wget |
||||||
|
bash |
||||||
|
]; |
||||||
|
|
||||||
|
services.keycloak = { |
||||||
|
enable = true; |
||||||
|
hostname = "auth.domain.com"; |
||||||
|
adminPasswordFile = "/etc/keycloak-admin-password"; |
||||||
|
database = { |
||||||
|
host = "localhost"; |
||||||
|
passwordFile = "/etc/keycloak-db-password"; |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
system.stateVersion = "26.05"; |
||||||
|
} |
||||||
@ -0,0 +1,28 @@ |
|||||||
|
{ config, lib, pkgs, modulesPath, ... }: |
||||||
|
|
||||||
|
{ |
||||||
|
imports = [ |
||||||
|
(modulesPath + "/installer/scan/not-detected.nix") |
||||||
|
]; |
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usb_storage" "sd_mod" "sr_mod" ]; |
||||||
|
boot.initrd.kernelModules = [ ]; |
||||||
|
boot.kernelModules = [ "kvm-intel" ]; |
||||||
|
boot.extraModulePackages = [ ]; |
||||||
|
|
||||||
|
fileSystems."/" = { |
||||||
|
device = "/dev/disk/by-label/nixos"; |
||||||
|
fsType = "ext4"; |
||||||
|
}; |
||||||
|
|
||||||
|
fileSystems."/boot" = { |
||||||
|
device = "/dev/disk/by-label/boot"; |
||||||
|
fsType = "vfat"; |
||||||
|
}; |
||||||
|
|
||||||
|
swapDevices = [ { device = "/dev/disk/by-label/swap"; } ]; |
||||||
|
|
||||||
|
networking.useDHCP = lib.mkDefault true; |
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; |
||||||
|
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; |
||||||
|
} |
||||||
@ -0,0 +1,32 @@ |
|||||||
|
{ config, lib, pkgs, ... }: |
||||||
|
|
||||||
|
{ |
||||||
|
imports = [ |
||||||
|
./hardware-configuration.nix |
||||||
|
]; |
||||||
|
|
||||||
|
boot.loader.grub.enable = true; |
||||||
|
boot.loader.grub.device = "/dev/sda"; |
||||||
|
|
||||||
|
networking.hostName = "status"; |
||||||
|
networking.domain = "domain.com"; |
||||||
|
|
||||||
|
time.timeZone = "UTC"; |
||||||
|
|
||||||
|
services.openssh = { |
||||||
|
enable = true; |
||||||
|
settings = { |
||||||
|
PermitRootLogin = "prohibit-password"; |
||||||
|
PasswordAuthentication = false; |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [ |
||||||
|
curl |
||||||
|
tmux |
||||||
|
wget |
||||||
|
bash |
||||||
|
]; |
||||||
|
|
||||||
|
system.stateVersion = "26.05"; |
||||||
|
} |
||||||
@ -0,0 +1,77 @@ |
|||||||
|
{ config, lib, pkgs, ... }: |
||||||
|
|
||||||
|
with lib; |
||||||
|
|
||||||
|
let |
||||||
|
cfg = config.services.keycloak; |
||||||
|
in { |
||||||
|
options.services.keycloak = { |
||||||
|
enable = mkEnableOption "Keycloak identity provider"; |
||||||
|
|
||||||
|
database = { |
||||||
|
host = mkOption { |
||||||
|
type = types.str; |
||||||
|
default = "localhost"; |
||||||
|
description = "Database host"; |
||||||
|
}; |
||||||
|
|
||||||
|
name = mkOption { |
||||||
|
type = types.str; |
||||||
|
default = "keycloak"; |
||||||
|
description = "Database name"; |
||||||
|
}; |
||||||
|
|
||||||
|
user = mkOption { |
||||||
|
type = types.str; |
||||||
|
default = "keycloak"; |
||||||
|
description = "Database user"; |
||||||
|
}; |
||||||
|
|
||||||
|
passwordFile = mkOption { |
||||||
|
type = types.path; |
||||||
|
description = "Path to file containing database password"; |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
adminUser = mkOption { |
||||||
|
type = types.str; |
||||||
|
default = "admin"; |
||||||
|
description = "Admin username"; |
||||||
|
}; |
||||||
|
|
||||||
|
adminPasswordFile = mkOption { |
||||||
|
type = types.path; |
||||||
|
description = "Path to file containing admin password"; |
||||||
|
}; |
||||||
|
|
||||||
|
hostname = mkOption { |
||||||
|
type = types.str; |
||||||
|
description = "Keycloak hostname"; |
||||||
|
}; |
||||||
|
|
||||||
|
settings = mkOption { |
||||||
|
type = types.attrs; |
||||||
|
default = {}; |
||||||
|
description = "Additional Keycloak settings"; |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
config = mkIf cfg.enable { |
||||||
|
services.keycloak = { |
||||||
|
enable = true; |
||||||
|
settings = { |
||||||
|
hostname = cfg.hostname; |
||||||
|
hostname-strict-backchannel = true; |
||||||
|
proxy = "edge"; |
||||||
|
db = mkDefault "postgres"; |
||||||
|
db-url = "jdbc:postgresql://${cfg.database.host}/${cfg.database.name}"; |
||||||
|
db-username = cfg.database.user; |
||||||
|
db-password-file = cfg.database.passwordFile; |
||||||
|
admin-user = cfg.adminUser; |
||||||
|
admin-password-file = cfg.adminPasswordFile; |
||||||
|
} // cfg.settings; |
||||||
|
}; |
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [ 80 443 ]; |
||||||
|
}; |
||||||
|
} |
||||||
@ -0,0 +1,10 @@ |
|||||||
|
{ config, lib, pkgs, auth_keys, sudo_keys, ... }: |
||||||
|
|
||||||
|
{ |
||||||
|
users.users = { |
||||||
|
root.openssh.authorizedKeys.keys = sudo_keys; |
||||||
|
} // (lib.mapAttrs (name: keys: { |
||||||
|
isNormalUser = true; |
||||||
|
openssh.authorizedKeys.keys = keys; |
||||||
|
}) auth_keys); |
||||||
|
} |
||||||
Loading…
Reference in new issue