Compare commits
No commits in common. "1df130d20398083516db6fc1e9503ca114d33039" and "b80228d8afb313be43a211945164ef7d074bfe01" have entirely different histories.
1df130d203
...
b80228d8af
7
hosts/hetzner-arm/containers/music/data/ports.nix
Normal file
7
hosts/hetzner-arm/containers/music/data/ports.nix
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
mpd = 6600;
|
||||||
|
mpd-opus-low = 4242;
|
||||||
|
mpd-opus-medium = 4243;
|
||||||
|
mpd-opus-high = 4244;
|
||||||
|
mpd-flac = 4245;
|
||||||
|
}
|
125
hosts/hetzner-arm/containers/music/default.nix
Normal file
125
hosts/hetzner-arm/containers/music/default.nix
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
{
|
||||||
|
self,
|
||||||
|
hostPath,
|
||||||
|
tree,
|
||||||
|
lib,
|
||||||
|
inputs,
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib.modules) mkMerge;
|
||||||
|
inherit (lib.lists) forEach;
|
||||||
|
|
||||||
|
containerName = "music";
|
||||||
|
|
||||||
|
containerAddresses = import "${hostPath}/data/containerAddresses.nix";
|
||||||
|
|
||||||
|
hostIP = containerAddresses.host;
|
||||||
|
containerIP = containerAddresses.containers.${containerName};
|
||||||
|
|
||||||
|
ports = import ./data/ports.nix;
|
||||||
|
|
||||||
|
# these secrets should probs be in host but im lazy
|
||||||
|
containerSecrets = config.containers.${containerName}.config.services.secrets.secrets;
|
||||||
|
pathInContainer = path: "/var/lib/nixos-containers/${containerName}" + path;
|
||||||
|
in {
|
||||||
|
containers.music = {
|
||||||
|
autoStart = true;
|
||||||
|
privateNetwork = true;
|
||||||
|
hostAddress = hostIP;
|
||||||
|
localAddress = containerIP;
|
||||||
|
|
||||||
|
specialArgs = {
|
||||||
|
inherit inputs;
|
||||||
|
inherit tree;
|
||||||
|
inherit self;
|
||||||
|
inherit hostPath;
|
||||||
|
};
|
||||||
|
|
||||||
|
bindMounts = {
|
||||||
|
"/dev/fuse" = {
|
||||||
|
hostPath = "/dev/fuse";
|
||||||
|
isReadOnly = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
allowedDevices = [
|
||||||
|
{
|
||||||
|
modifier = "rwm";
|
||||||
|
node = "/dev/fuse";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
modifier = "rwm";
|
||||||
|
node = "/dev/mapper/control";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
config = {...}: {
|
||||||
|
nixpkgs.pkgs = pkgs;
|
||||||
|
|
||||||
|
imports = with tree;
|
||||||
|
[
|
||||||
|
presets.nixos.containerBase
|
||||||
|
|
||||||
|
profiles.nginx
|
||||||
|
profiles.firewallAllow.httpCommon
|
||||||
|
|
||||||
|
./secrets.nix
|
||||||
|
]
|
||||||
|
++ (with hosts.hetzner-arm.containers.music.profiles; [
|
||||||
|
mpd
|
||||||
|
]);
|
||||||
|
|
||||||
|
home-manager.users.root.imports = with tree; [home.apps.musicutil];
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = with ports; [
|
||||||
|
mpd
|
||||||
|
mpd-opus-low
|
||||||
|
mpd-opus-medium
|
||||||
|
mpd-opus-high
|
||||||
|
mpd-flac
|
||||||
|
];
|
||||||
|
|
||||||
|
home-manager.users.root.home.stateVersion = "24.05";
|
||||||
|
system.stateVersion = "24.05";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx.virtualHosts."mpd.owo.monster" = let
|
||||||
|
extraConfig = ''
|
||||||
|
auth_basic "Music Password";
|
||||||
|
auth_basic_user_file ${pathInContainer containerSecrets.music_stream_passwd.path};
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
locations = mkMerge [
|
||||||
|
{
|
||||||
|
"/flac" = {
|
||||||
|
proxyPass = "http://${containerIP}:${toString ports.mpd-flac}";
|
||||||
|
inherit extraConfig;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
(mkMerge (forEach ["low" "medium" "high"] (quality: {
|
||||||
|
"/opus-${quality}" = {
|
||||||
|
proxyPass = "http://${containerIP}:${toString ports."mpd-opus-${quality}"}";
|
||||||
|
inherit extraConfig;
|
||||||
|
};
|
||||||
|
})))
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
nat.forwardPorts = [
|
||||||
|
{
|
||||||
|
sourcePort = ports.mpd;
|
||||||
|
destination = "${containerIP}\:${toString ports.mpd}";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
firewall.allowedTCPPorts = with ports; [
|
||||||
|
mpd
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
|
@ -7,14 +7,7 @@
|
||||||
inherit (lib.strings) concatStringsSep;
|
inherit (lib.strings) concatStringsSep;
|
||||||
inherit (lib.lists) forEach;
|
inherit (lib.lists) forEach;
|
||||||
|
|
||||||
ports = {
|
ports = import ../data/ports.nix;
|
||||||
mpd = 6600;
|
|
||||||
mpd-opus-low = 4242;
|
|
||||||
mpd-opus-medium = 4243;
|
|
||||||
mpd-opus-high = 4244;
|
|
||||||
mpd-flac = 4245;
|
|
||||||
};
|
|
||||||
|
|
||||||
inherit (config.services.secrets) secrets;
|
inherit (config.services.secrets) secrets;
|
||||||
in {
|
in {
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
|
@ -92,32 +85,4 @@ in {
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
services.nginx.virtualHosts."mpd.owo.monster" = let
|
|
||||||
extraConfig = ''
|
|
||||||
auth_basic "Music Password";
|
|
||||||
auth_basic_user_file ${secrets.music_stream_passwd.path};
|
|
||||||
'';
|
|
||||||
in {
|
|
||||||
forceSSL = true;
|
|
||||||
enableACME = true;
|
|
||||||
locations = mkMerge [
|
|
||||||
{
|
|
||||||
"/flac" = {
|
|
||||||
proxyPass = "http://127.0.0.1:${toString ports.mpd-flac}";
|
|
||||||
inherit extraConfig;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
(mkMerge (forEach ["low" "medium" "high"] (quality: {
|
|
||||||
"/opus-${quality}" = {
|
|
||||||
proxyPass = "http://127.0.0.1:${toString ports."mpd-opus-${quality}"}";
|
|
||||||
inherit extraConfig;
|
|
||||||
};
|
|
||||||
})))
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
networking.firewall.allowedTCPPorts = with ports; [
|
|
||||||
mpd
|
|
||||||
];
|
|
||||||
}
|
}
|
42
hosts/hetzner-arm/containers/music/secrets.nix
Normal file
42
hosts/hetzner-arm/containers/music/secrets.nix
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
{pkgs, ...}: {
|
||||||
|
services.secrets = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
vaultLogin = {
|
||||||
|
enable = true;
|
||||||
|
loginUsername = "hetzner-arm-container-music";
|
||||||
|
};
|
||||||
|
|
||||||
|
requiredVaultPaths = [
|
||||||
|
"api-keys/data/mpd"
|
||||||
|
"api-keys/data/music-stream"
|
||||||
|
];
|
||||||
|
|
||||||
|
packages = with pkgs; [
|
||||||
|
apacheHttpd
|
||||||
|
];
|
||||||
|
|
||||||
|
secrets = {
|
||||||
|
vault_password = {
|
||||||
|
manual = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
mpd_control_password = {
|
||||||
|
user = "mpd";
|
||||||
|
group = "mpd";
|
||||||
|
fetchScript = ''
|
||||||
|
simple_get "/api-keys/mpd" .password > "$secretFile"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
music_stream_passwd = {
|
||||||
|
user = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
fetchScript = ''
|
||||||
|
username=$(simple_get "/api-keys/music-stream" .username)
|
||||||
|
password=$(simple_get "/api-keys/music-stream" .password)
|
||||||
|
htpasswd -bc "$secretFile" "$username" "$password" 2>/dev/null
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -26,12 +26,12 @@ in {
|
||||||
"jellyfin"
|
"jellyfin"
|
||||||
#"grocy"
|
#"grocy"
|
||||||
"vault"
|
"vault"
|
||||||
|
"music"
|
||||||
] (name: ./containers + "/${name}"))
|
] (name: ./containers + "/${name}"))
|
||||||
++ (with hosts.hetzner-arm.profiles; [
|
++ (with hosts.hetzner-arm.profiles; [
|
||||||
staticSites
|
staticSites
|
||||||
gotosocial
|
gotosocial
|
||||||
forgejo
|
forgejo
|
||||||
mpd
|
|
||||||
restic
|
restic
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
|
@ -81,8 +81,4 @@
|
||||||
locations."/".proxyPass = "http://unix:/var/sockets/forgejo/forgejo.sock";
|
locations."/".proxyPass = "http://unix:/var/sockets/forgejo/forgejo.sock";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
networking.firewall.allowedTCPPorts = [
|
|
||||||
2222
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{pkgs, ...}: {
|
{...}: {
|
||||||
services.secrets = {
|
services.secrets = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|
||||||
|
@ -7,10 +7,6 @@
|
||||||
loginUsername = "hetzner-arm";
|
loginUsername = "hetzner-arm";
|
||||||
};
|
};
|
||||||
|
|
||||||
packages = with pkgs; [
|
|
||||||
apacheHttpd
|
|
||||||
];
|
|
||||||
|
|
||||||
requiredVaultPaths = [
|
requiredVaultPaths = [
|
||||||
"private-public-keys/data/ssh/root@hetzner-arm"
|
"private-public-keys/data/ssh/root@hetzner-arm"
|
||||||
"private-public-keys/data/ssh/root@hetzner-arm-decrypt"
|
"private-public-keys/data/ssh/root@hetzner-arm-decrypt"
|
||||||
|
@ -21,9 +17,6 @@
|
||||||
"api-keys/data/chaos_mail/gotosocial"
|
"api-keys/data/chaos_mail/gotosocial"
|
||||||
|
|
||||||
"private-public-keys/data/restic/Forgejo"
|
"private-public-keys/data/restic/Forgejo"
|
||||||
|
|
||||||
"api-keys/data/mpd"
|
|
||||||
"api-keys/data/music-stream"
|
|
||||||
];
|
];
|
||||||
|
|
||||||
secrets = {
|
secrets = {
|
||||||
|
@ -87,24 +80,6 @@
|
||||||
simple_get "/private-public-keys/restic/Forgejo" .password > "$secretFile"
|
simple_get "/private-public-keys/restic/Forgejo" .password > "$secretFile"
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
mpd_control_password = {
|
|
||||||
user = "mpd";
|
|
||||||
group = "mpd";
|
|
||||||
fetchScript = ''
|
|
||||||
simple_get "/api-keys/mpd" .password > "$secretFile"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
music_stream_passwd = {
|
|
||||||
user = "nginx";
|
|
||||||
group = "nginx";
|
|
||||||
fetchScript = ''
|
|
||||||
username=$(simple_get "/api-keys/music-stream" .username)
|
|
||||||
password=$(simple_get "/api-keys/music-stream" .password)
|
|
||||||
htpasswd -bc "$secretFile" "$username" "$password" 2>/dev/null
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue