Compare commits
	
		
			3 commits
		
	
	
		
			main
			...
			feature/pi
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6bf257dbbb | |||
| 0fe50a9c62 | |||
|  | a52133cec4 | 
					 14 changed files with 64 additions and 176 deletions
				
			
		|  | @ -1,3 +0,0 @@ | ||||||
| # Leitstelle config management |  | ||||||
| 
 |  | ||||||
| To deploy, run `./deploy.sh switch <host>`, where the host is nuc or bemmer. |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| { lib, pkgs, ... }: | { lib, pkgs, ... }: | ||||||
| 
 | 
 | ||||||
| { | { | ||||||
|   boot.kernelPackages = lib.mkOverride 2000 pkgs.linuxPackages_latest; |   boot.kernelPackages = lib.mkDefault pkgs.linuxPackages_latest; | ||||||
|   boot.kernelParams = [ "quiet" ]; |   boot.kernelParams = [ "quiet" ]; | ||||||
| 
 | 
 | ||||||
|   services.openssh.enable = true; |   services.openssh.enable = true; | ||||||
|  | @ -38,7 +38,6 @@ | ||||||
|     vim |     vim | ||||||
|     wget |     wget | ||||||
|     jq |     jq | ||||||
|     lsof |  | ||||||
|   ]; |   ]; | ||||||
| 
 | 
 | ||||||
|   programs.bash.shellAliases = { |   programs.bash.shellAliases = { | ||||||
|  | @ -50,13 +49,5 @@ | ||||||
|     ll = "exa -l"; |     ll = "exa -l"; | ||||||
|     la = "exa -la"; |     la = "exa -la"; | ||||||
|     tree = "exa -T"; |     tree = "exa -T"; | ||||||
|     apt = "echo 'please use nix-env -iA nixos.<packagename> instead to install packages.'"; |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
|   users.mutableUsers = false; |  | ||||||
|   users.users.c3h = { |  | ||||||
|     isNormalUser = true; |  | ||||||
|     password = "c3h"; |  | ||||||
|     extraGroups = [ "wheel" ]; |  | ||||||
|   }; |   }; | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										19
									
								
								deploy.sh
									
										
									
									
									
								
							
							
						
						
									
										19
									
								
								deploy.sh
									
										
									
									
									
								
							|  | @ -6,30 +6,21 @@ cd "$(dirname "$0")" | ||||||
| if ! command -v nix-build &> /dev/null | if ! command -v nix-build &> /dev/null | ||||||
| then | then | ||||||
| 	echo "Nix installation could not be found. Please follow the instructions linked below." | 	echo "Nix installation could not be found. Please follow the instructions linked below." | ||||||
| 	echo "https://nixos.org/manual/nix/unstable/installation/installing-binary.html" | 	echo "https://nixos.org/manual/nix/unstable/installation/installing-binary.html#multi-user-installation" | ||||||
| 	exit | 	exit | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| mode="${1:-switch}" | mode="${1:-switch}" | ||||||
| host="${2:-nuc}" | host="${2:-nuc}" | ||||||
| target="${3:-c3h@$host.c3h}" | target="${3:-$host.c3h}" | ||||||
| 
 |  | ||||||
| if ! [ -d "hosts/$host" ] |  | ||||||
| then |  | ||||||
| 	echo "Host $host does not exist. Choose from:" |  | ||||||
| 	ls hosts |  | ||||||
| 	exit |  | ||||||
| fi |  | ||||||
| 
 | 
 | ||||||
| echo "deploying $host to $target" | echo "deploying $host to $target" | ||||||
| sleep 1 | sleep 1 | ||||||
| 
 | 
 | ||||||
|  | sources=$(nix-build nix/sources-dir.nix --no-out-link) | ||||||
|  | 
 | ||||||
| set -x | set -x | ||||||
| system_drv=$( | system_drv=$(nix-instantiate "<nixpkgs/nixos>" -I $sources -I "nixos-config=$PWD/hosts/$host/configuration.nix" | head -n1) | ||||||
|   nix-instantiate "<nixpkgs/nixos>" -A config.system.build.toplevel \ |  | ||||||
|     -I "$(nix-build nix/sources-dir.nix --no-out-link)" \ |  | ||||||
|     -I "nixos-config=$PWD/hosts/$host/configuration.nix" |  | ||||||
| ) |  | ||||||
| nix-copy-closure --to $target $system_drv | nix-copy-closure --to $target $system_drv | ||||||
| system=$(ssh $target "nix-store --realise $system_drv") | system=$(ssh $target "nix-store --realise $system_drv") | ||||||
| ssh $target "sudo nix-env -p /nix/var/nix/profiles/system -i $system && sudo /nix/var/nix/profiles/system/bin/switch-to-configuration $mode" | ssh $target "sudo nix-env -p /nix/var/nix/profiles/system -i $system && sudo /nix/var/nix/profiles/system/bin/switch-to-configuration $mode" | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ | ||||||
| 
 | 
 | ||||||
|     # services |     # services | ||||||
|     ../../shared-services/pulseaudio.nix |     ../../shared-services/pulseaudio.nix | ||||||
|     ../../shared-services/nfs-client.nix |     #../../shared-services/nfs-server.nix | ||||||
|     ../../shared-services/mpd.nix |     ../../shared-services/mpd.nix | ||||||
|     ../../shared-services/ympd.nix |     ../../shared-services/ympd.nix | ||||||
|     ../../shared-services/spotifyd.nix |     ../../shared-services/spotifyd.nix | ||||||
|  | @ -16,21 +16,28 @@ | ||||||
|     ../../shared-services/vnc.nix |     ../../shared-services/vnc.nix | ||||||
|     ../../shared-services/webserver.nix |     ../../shared-services/webserver.nix | ||||||
|   ]; |   ]; | ||||||
| 
 |   users.users.c3h = { | ||||||
|   # We import sd-image-aarch64.nix so we can build a config.system.build.sdImage |     isNormalUser = true; | ||||||
|   # But it imports some modules we don't want, so disable them |     password = "c3h"; | ||||||
|   disabledModules = [ |     extraGroups = [ "wheel" ]; | ||||||
|     "profiles/base.nix" |     packages = with pkgs; [ chromium firefox mpv youtube-dl ]; | ||||||
|     "profiles/all-hardware.nix" |   }; | ||||||
|   ]; |  | ||||||
| 
 | 
 | ||||||
|   networking.hostName = "bemmer"; |   networking.hostName = "bemmer"; | ||||||
|   networking.domain = "c3h"; |   networking.domain = "c3h"; | ||||||
|  | 
 | ||||||
|   networking.useDHCP = true; |   networking.useDHCP = true; | ||||||
| 
 | 
 | ||||||
|   nixpkgs.system = "aarch64-linux"; |   nixpkgs.system = "aarch64-linux"; | ||||||
|   hardware.raspberry-pi."4".fkms-3d.enable = true; |   boot.initrd.availableKernelModules = lib.mkForce [ "vc4" "i2c_bcm2835" ]; | ||||||
|   boot.tmpOnTmpfs = true; # building stuff on sd-card is slow |   boot.supportedFilesystems = lib.mkForce [ "ext4" "vfat" ]; | ||||||
|  |   boot.kernelPackages = pkgs.linuxPackages_rpi4; | ||||||
|  |   documentation.enable = false; | ||||||
|  | 
 | ||||||
|  |   hardware.raspberry-pi."4" = { | ||||||
|  |     fkms-3d.enable = true; | ||||||
|  |     #audio.enable = true; | ||||||
|  |   }; | ||||||
| 
 | 
 | ||||||
|   system.stateVersion = "21.05"; |   system.stateVersion = "21.05"; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ | ||||||
| 
 | 
 | ||||||
|     # services |     # services | ||||||
|     ../../shared-services/pulseaudio.nix |     ../../shared-services/pulseaudio.nix | ||||||
|     ../../shared-services/nfs-client.nix |     ../../shared-services/nfs-server.nix | ||||||
|     ../../shared-services/mpd.nix |     ../../shared-services/mpd.nix | ||||||
|     ../../shared-services/ympd.nix |     ../../shared-services/ympd.nix | ||||||
|     ../../shared-services/spotifyd.nix |     ../../shared-services/spotifyd.nix | ||||||
|  |  | ||||||
|  | @ -23,7 +23,7 @@ | ||||||
|       fsType = "vfat"; |       fsType = "vfat"; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|   fileSystems."/mnt/hdd" = |   fileSystems."/mnt" = | ||||||
|     { device = "/dev/disk/by-uuid/ff18a6f9-ee3b-452c-8671-38b74508a74c"; |     { device = "/dev/disk/by-uuid/ff18a6f9-ee3b-452c-8671-38b74508a74c"; | ||||||
|       fsType = "btrfs"; |       fsType = "btrfs"; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  | @ -1,68 +0,0 @@ | ||||||
| { config, lib, pkgs, ... }: |  | ||||||
| 
 |  | ||||||
| with lib; |  | ||||||
| 
 |  | ||||||
| let |  | ||||||
|   cfg = config.services.spotifyd; |  | ||||||
|   toml = pkgs.formats.toml {}; |  | ||||||
|   warnConfig = |  | ||||||
|     if cfg.config != "" |  | ||||||
|     then lib.trace "Using the stringly typed .config attribute is discouraged. Use the TOML typed .settings attribute instead." |  | ||||||
|     else id; |  | ||||||
|   spotifydConf = |  | ||||||
|     if cfg.settings != {} |  | ||||||
|     then toml.generate "spotify.conf" cfg.settings |  | ||||||
|     else warnConfig (pkgs.writeText "spotifyd.conf" cfg.config); |  | ||||||
| in |  | ||||||
| { |  | ||||||
|   options = { |  | ||||||
|     services.spotifyd = { |  | ||||||
|       enable = mkEnableOption "spotifyd, a Spotify playing daemon"; |  | ||||||
| 
 |  | ||||||
|       config = mkOption { |  | ||||||
|         default = ""; |  | ||||||
|         type = types.lines; |  | ||||||
|         description = '' |  | ||||||
|           (Deprecated) Configuration for Spotifyd. For syntax and directives, see |  | ||||||
|           <link xlink:href="https://github.com/Spotifyd/spotifyd#Configuration"/>. |  | ||||||
|         ''; |  | ||||||
|       }; |  | ||||||
| 
 |  | ||||||
|       settings = mkOption { |  | ||||||
|         default = {}; |  | ||||||
|         type = toml.type; |  | ||||||
|         example = { global.bitrate = 320; }; |  | ||||||
|         description = '' |  | ||||||
|           Configuration for Spotifyd. For syntax and directives, see |  | ||||||
|           <link xlink:href="https://github.com/Spotifyd/spotifyd#Configuration"/>. |  | ||||||
|         ''; |  | ||||||
|       }; |  | ||||||
|     }; |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
|   config = mkIf cfg.enable { |  | ||||||
|     assertions = [ |  | ||||||
|       { |  | ||||||
|         assertion = cfg.config == "" || cfg.settings == {}; |  | ||||||
|         message = "At most one of the .config attribute and the .settings attribute may be set"; |  | ||||||
|       } |  | ||||||
|     ]; |  | ||||||
| 
 |  | ||||||
|     systemd.services.spotifyd = { |  | ||||||
|       wantedBy = [ "multi-user.target" ]; |  | ||||||
|       after = [ "network-online.target" "sound.target" ]; |  | ||||||
|       description = "spotifyd, a Spotify playing daemon"; |  | ||||||
|       environment.SHELL = "/bin/sh"; |  | ||||||
|       serviceConfig = { |  | ||||||
|         ExecStart = "${pkgs.spotifyd}/bin/spotifyd --no-daemon --config-path ${spotifydConf}"; |  | ||||||
|         Restart = "always"; |  | ||||||
|         RestartSec = 12; |  | ||||||
|         DynamicUser = true; |  | ||||||
|         CacheDirectory = "spotifyd"; |  | ||||||
|         SupplementaryGroups = ["audio"]; |  | ||||||
|       }; |  | ||||||
|     }; |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
|   meta.maintainers = [ maintainers.anderslundstedt ]; |  | ||||||
| } |  | ||||||
|  | @ -9,6 +9,6 @@ in | ||||||
|     lib.concatStringsSep "\n" ([ |     lib.concatStringsSep "\n" ([ | ||||||
|       "mkdir $out" |       "mkdir $out" | ||||||
|     ] |     ] | ||||||
|       ++ lib.mapAttrsToList (name: source: "cp -r --reflink=auto ${source.outPath} $out/${name}") sources |       ++ lib.mapAttrsToList (name: source: "ln -s ${source.outPath} $out/${name}") sources | ||||||
|     ) |     ) | ||||||
|   ) |   ) | ||||||
|  |  | ||||||
|  | @ -5,10 +5,10 @@ | ||||||
|         "homepage": "https://github.com/nmattia/niv", |         "homepage": "https://github.com/nmattia/niv", | ||||||
|         "owner": "nmattia", |         "owner": "nmattia", | ||||||
|         "repo": "niv", |         "repo": "niv", | ||||||
|         "rev": "5830a4dd348d77e39a0f3c4c762ff2663b602d4c", |         "rev": "e0ca65c81a2d7a4d82a189f1e23a48d59ad42070", | ||||||
|         "sha256": "1d3lsrqvci4qz2hwjrcnd8h5vfkg8aypq3sjd4g3izbc8frwz5sm", |         "sha256": "1pq9nh1d8nn3xvbdny8fafzw87mj7gsmp6pxkdl65w2g18rmcmzx", | ||||||
|         "type": "tarball", |         "type": "tarball", | ||||||
|         "url": "https://github.com/nmattia/niv/archive/5830a4dd348d77e39a0f3c4c762ff2663b602d4c.tar.gz", |         "url": "https://github.com/nmattia/niv/archive/e0ca65c81a2d7a4d82a189f1e23a48d59ad42070.tar.gz", | ||||||
|         "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz" |         "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz" | ||||||
|     }, |     }, | ||||||
|     "nixos-hardware": { |     "nixos-hardware": { | ||||||
|  | @ -17,10 +17,10 @@ | ||||||
|         "homepage": "", |         "homepage": "", | ||||||
|         "owner": "NixOS", |         "owner": "NixOS", | ||||||
|         "repo": "nixos-hardware", |         "repo": "nixos-hardware", | ||||||
|         "rev": "2a7063461c3751d83869a2a0a8ebc59e34bec5b2", |         "rev": "3aabf78bfcae62f5f99474f2ebbbe418f1c6e54f", | ||||||
|         "sha256": "173ms858wni43l2p7vqjarm2bnjdhpii0zgn46750nyfff1f2184", |         "sha256": "10g240brgjz7qi20adwajxwqrqb5zxc79ii1mc20fasgqlf2a8sx", | ||||||
|         "type": "tarball", |         "type": "tarball", | ||||||
|         "url": "https://github.com/NixOS/nixos-hardware/archive/2a7063461c3751d83869a2a0a8ebc59e34bec5b2.tar.gz", |         "url": "https://github.com/NixOS/nixos-hardware/archive/3aabf78bfcae62f5f99474f2ebbbe418f1c6e54f.tar.gz", | ||||||
|         "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz" |         "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz" | ||||||
|     }, |     }, | ||||||
|     "nixpkgs": { |     "nixpkgs": { | ||||||
|  | @ -29,10 +29,10 @@ | ||||||
|         "homepage": "", |         "homepage": "", | ||||||
|         "owner": "NixOS", |         "owner": "NixOS", | ||||||
|         "repo": "nixpkgs", |         "repo": "nixpkgs", | ||||||
|         "rev": "581d2d6c9cd5c289002203581d8aa0861963a933", |         "rev": "34ad3ffe08adfca17fcb4e4a47bb5f3b113687be", | ||||||
|         "sha256": "1qpmqj075pppa6ihmkacf491lhq7rpxlcm8cm6h18raardsr3irr", |         "sha256": "02li241rz5668nfyp88zfjilxf0mr9yansa93fbl38hjwkhf3ix6", | ||||||
|         "type": "tarball", |         "type": "tarball", | ||||||
|         "url": "https://github.com/NixOS/nixpkgs/archive/581d2d6c9cd5c289002203581d8aa0861963a933.tar.gz", |         "url": "https://github.com/NixOS/nixpkgs/archive/34ad3ffe08adfca17fcb4e4a47bb5f3b113687be.tar.gz", | ||||||
|         "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz" |         "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz" | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,17 +1,13 @@ | ||||||
| { pkgs, ... }: | { pkgs, ... }: | ||||||
| 
 | 
 | ||||||
| { | { | ||||||
|   users.users.c3h.packages = with pkgs; [ |   users.mutableUsers = false; | ||||||
|     chromium |   users.users.c3h = { | ||||||
|     firefox |     isNormalUser = true; | ||||||
|     mpv |     password = "c3h"; | ||||||
|     youtube-dl |     extraGroups = [ "wheel" ]; | ||||||
|     pavucontrol |     packages = with pkgs; [ chromium firefox mpv youtube-dl ]; | ||||||
|     dosbox |   }; | ||||||
|     vlc |  | ||||||
|     ffmpeg-full |  | ||||||
|     sox |  | ||||||
|   ]; |  | ||||||
| 
 | 
 | ||||||
|   services.xserver = { |   services.xserver = { | ||||||
|     enable = true; |     enable = true; | ||||||
|  |  | ||||||
|  | @ -1,15 +0,0 @@ | ||||||
| { ... }: |  | ||||||
| 
 |  | ||||||
| { |  | ||||||
|   boot.supportedFilesystems = [ "nfs" ]; |  | ||||||
|   fileSystems."/mnt/Music" = { |  | ||||||
|     device = "10.23.42.126:/music"; |  | ||||||
|     fsType = "nfs"; |  | ||||||
|     options = [ |  | ||||||
|       "nfsvers=4.1" |  | ||||||
|       "noauto" |  | ||||||
|       "x-systemd.automount" |  | ||||||
|       "x-systemd.idle-timeout=600" |  | ||||||
|     ]; |  | ||||||
|   }; |  | ||||||
| } |  | ||||||
							
								
								
									
										17
									
								
								shared-services/nfs-server.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								shared-services/nfs-server.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | ||||||
|  | { ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   services.nfs.server = { | ||||||
|  |     enable = true; | ||||||
|  |     exports = '' | ||||||
|  |       /mnt 10.23.42.0/24(rw,fsid=0,insecure,no_subtree_check) | ||||||
|  |     ''; | ||||||
|  | 
 | ||||||
|  |     statdPort = 4000; | ||||||
|  |     lockdPort = 4001; | ||||||
|  |     mountdPort = 4002; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   networking.firewall.interfaces.enp3s0.allowedTCPPorts = [ 2049 4000 4001 4002 111 ]; | ||||||
|  |   networking.firewall.interfaces.enp3s0.allowedUDPPorts = [ 2049 4000 4001 4002 111 ]; | ||||||
|  | } | ||||||
|  | @ -5,12 +5,8 @@ | ||||||
|   sound.enable = true; |   sound.enable = true; | ||||||
|   hardware.pulseaudio.enable = true; |   hardware.pulseaudio.enable = true; | ||||||
|   hardware.pulseaudio.systemWide = true; |   hardware.pulseaudio.systemWide = true; | ||||||
|   hardware.pulseaudio.package = pkgs.pulseaudioFull; |   hardware.pulseaudio.package = pkgs.pulseaudio; | ||||||
|   hardware.pulseaudio.tcp.enable = true; |   hardware.pulseaudio.tcp.enable = true; | ||||||
|   hardware.pulseaudio.tcp.anonymousClients.allowedIpRanges = [ "127.0.0.0/8" "::/64" "10.23.42.0/24" ]; |   hardware.pulseaudio.tcp.anonymousClients.allowedIpRanges = [ "127.0.0.0/8" "::/64" "10.23.42.0/24" ]; | ||||||
|   environment.variables.PULSE_SERVER = "127.0.0.1"; |   environment.variables.PULSE_SERVER = "127.0.0.1"; | ||||||
|   hardware.pulseaudio.extraConfig = '' |  | ||||||
|     unload-module module-native-protocol-unix |  | ||||||
|     load-module module-native-protocol-unix auth-anonymous=1 |  | ||||||
|   ''; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,36 +1,12 @@ | ||||||
| { config, pkgs, ... }: | { ... }: | ||||||
| 
 | 
 | ||||||
| { | { | ||||||
|   disabledModules = [ "services/audio/spotifyd.nix" ]; |  | ||||||
|   imports = [ ../modules/spotifyd.nix ]; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   services.spotifyd = { |   services.spotifyd = { | ||||||
|     enable = true; |     enable = true; | ||||||
|     settings.global = { |     config = '' | ||||||
|       bitrate = 320; |       zeroconf_port = 18572 | ||||||
|       zeroconf_port = 18572; |  | ||||||
|     }; |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
|   networking.firewall.allowedTCPPorts = [ 4070 config.services.spotifyd.settings.global.zeroconf_port ]; |  | ||||||
|   networking.firewall.allowedUDPPorts = [ 5353 ]; |  | ||||||
| 
 |  | ||||||
|   systemd.services.restart-spotifyd = { |  | ||||||
|     serviceConfig.Type = "oneshot"; |  | ||||||
|     script = '' |  | ||||||
|       ${pkgs.systemd}/bin/systemctl restart spotifyd.service |  | ||||||
|       ${pkgs.systemd}/bin/systemctl restart pulseaudio.service |  | ||||||
|     ''; |     ''; | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   systemd.timers.restart-spotifyd = { |   networking.firewall.allowedTCPPorts = [ 18572 ]; | ||||||
|     wantedBy = [ "timers.target" ]; |  | ||||||
|     partOf = [ "restart-spotifyd.service" ]; |  | ||||||
|     timerConfig = { |  | ||||||
|       OnCalendar = "*-*-* 07:00:00"; |  | ||||||
|       Persistent = "True"; |  | ||||||
|       Unit = "restart-spotifyd.service"; |  | ||||||
|     }; |  | ||||||
|   }; |  | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue