nixfiles/hosts/hetzner-vm/containers/music/default.nix

148 lines
3.3 KiB
Nix
Raw Normal View History

{
2023-09-18 03:56:58 +01:00
self,
hostPath,
tree,
lib,
inputs,
config,
pkgs,
...
}: let
2023-09-18 03:56:58 +01:00
inherit (lib.modules) mkMerge;
inherit (lib.lists) forEach;
containerAddresses = import "${hostPath}/data/containerAddresses.nix";
hostIP = containerAddresses.host;
containerIP = containerAddresses.containers.${containerName};
containerName = "music";
containerConfig = config.containers.${containerName}.config;
containerLib = import "${self}/lib/containerLib.nix" {
inherit lib;
};
# Using secrets from Host
secrets = config.services.secrets.secrets;
2023-09-18 03:56:58 +01:00
secretsList = [
"mpd_control_password"
"slskd_env"
];
2023-09-18 03:56:58 +01:00
ports = import ./data/ports.nix;
in {
containers.music = {
autoStart = true;
privateNetwork = true;
hostAddress = hostIP;
localAddress = containerIP;
2023-09-18 03:56:58 +01:00
bindMounts = containerLib.genBindHostsForSecrets secrets secretsList;
specialArgs = {
inherit inputs;
inherit tree;
2023-09-18 03:56:58 +01:00
inherit self;
inherit hostPath;
hostSecrets = secrets;
};
config = {config, ...}: {
nixpkgs.pkgs = pkgs;
imports = with tree;
[
2023-09-18 03:56:58 +01:00
presets.nixos.containerBase
profiles.sshd
2023-09-18 03:56:58 +01:00
profiles.firewallAllow.ssh
2023-09-18 03:56:58 +01:00
profiles.nginx
profiles.firewallAllow.httpCommon
]
++ (with hosts.hetzner-vm.containers.music; [
profiles.mpd
2023-09-18 03:56:58 +01:00
profiles.musicSync
profiles.soulseek
]);
2023-09-18 03:56:58 +01:00
networking.firewall.allowedTCPPorts = with ports; [
mpd
mpd-opus-low
mpd-opus-medium
mpd-opus-high
mpd-flac
slskd
slskd-web
];
# For Shared Secrets
systemd.tmpfiles.rules = [
"d ${config.services.secrets.secretsDir} - root root"
];
2023-09-18 03:56:58 +01:00
home-manager.users.root.home.stateVersion = "23.05";
system.stateVersion = "23.05";
};
};
services.nginx.virtualHosts."soulseek.owo.monster" = {
forceSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://${containerIP}:${toString ports.slskd-web}";
proxyWebsockets = true;
};
};
services.nginx.virtualHosts."stream.owo.monster" = let
extraConfig = ''
auth_basic "Music Password";
auth_basic_user_file ${secrets.music_stream_passwd.path};
'';
in {
forceSSL = true;
enableACME = true;
2023-09-18 03:56:58 +01:00
locations = mkMerge ([
{
"/mpd/flac" = {
proxyPass = "http://${containerIP}:${toString ports.mpd-flac}";
inherit extraConfig;
};
}
]
2023-09-18 03:56:58 +01:00
++ (forEach ["low" "medium" "high"] (quality: {
"/mpd/opus-${quality}" = {
proxyPass = "http://${containerIP}:${toString ports."mpd-opus-${quality}"}";
inherit extraConfig;
};
})));
};
# For permissions of secrets
users.users."mpd" = {
2023-09-18 03:56:58 +01:00
uid = containerConfig.ids.uids.mpd;
group = "mpd";
};
users.groups."mpd" = {
2023-09-18 03:56:58 +01:00
gid = containerConfig.ids.gids.mpd;
};
2023-09-18 03:56:58 +01:00
networking = {
nat.forwardPorts = [
{
sourcePort = ports.mpd;
destination = "${containerIP}\:${toString ports.mpd}";
}
{
sourcePort = ports.slskd;
destination = "${containerIP}\:${toString ports.slskd}";
}
];
firewall.allowedTCPPorts = with ports; [
mpd
slskd
];
};
}