forked from aylac.top/nixcfg
this repo has no description

scrl c ctrl v

Changed files
+319 -19
hosts
modules
nixos
snippets
restic
tailnet
+1
hosts/nanpi/default.nix
···
enable = true;
deduplicate = true;
};
+
arr.enable = true;
};
services = {
caddy.enable = true;
+187 -18
hosts/nanpi/services.nix
···
reverse_proxy ${config.mySnippets.tailnet.networkMap.webdav.hostName}:${toString config.mySnippets.tailnet.networkMap.webdav.port}
'';
};
+
+
"${config.mySnippets.tailnet.networkMap.bazarr.vHost}" = {
+
extraConfig = ''
+
bind tailscale/bazarr
+
encode zstd gzip
+
reverse_proxy ${config.mySnippets.tailnet.networkMap.bazarr.hostName}:${toString config.mySnippets.tailnet.networkMap.bazarr.port}
+
'';
+
};
+
+
#"${config.mySnippets.tailnet.networkMap.lidarr.vHost}" = {
+
# extraConfig = ''
+
# bind tailscale/lidarr
+
# encode zstd gzip
+
# reverse_proxy ${config.mySnippets.tailnet.networkMap.lidarr.hostName}:${toString config.mySnippets.tailnet.networkMap.lidarr.port}
+
# '';
+
#};
+
+
"${config.mySnippets.tailnet.networkMap.prowlarr.vHost}" = {
+
extraConfig = ''
+
bind tailscale/prowlarr
+
encode zstd gzip
+
reverse_proxy ${config.mySnippets.tailnet.networkMap.prowlarr.hostName}:${toString config.mySnippets.tailnet.networkMap.prowlarr.port}
+
'';
+
};
+
+
"${config.mySnippets.tailnet.networkMap.radarr.vHost}" = {
+
extraConfig = ''
+
bind tailscale/radarr
+
encode zstd gzip
+
reverse_proxy ${config.mySnippets.tailnet.networkMap.radarr.hostName}:${toString config.mySnippets.tailnet.networkMap.radarr.port}
+
'';
+
};
+
+
"${config.mySnippets.tailnet.networkMap.sonarr.vHost}" = {
+
extraConfig = ''
+
bind tailscale/sonarr
+
encode zstd gzip
+
reverse_proxy ${config.mySnippets.tailnet.networkMap.sonarr.hostName}:${toString config.mySnippets.tailnet.networkMap.sonarr.port}
+
'';
+
};
+
+
"${config.mySnippets.tailnet.networkMap.glance.vHost}" = {
+
extraConfig = ''
+
bind tailscale/glance
+
encode zstd gzip
+
reverse_proxy ${config.mySnippets.tailnet.networkMap.glance.hostName}:${toString config.mySnippets.tailnet.networkMap.glance.port}
+
'';
+
};
};
# it's failing to build because it can't download some stuff
···
};
};
-
webdav-server-rs = {
+
glance = {
enable = true;
+
openFirewall = true;
+
settings = {
-
server.listen = ["0.0.0.0:${toString config.mySnippets.tailnet.networkMap.webdav.port}" "[::]:${toString config.mySnippets.tailnet.networkMap.webdav.port}"];
-
accounts = {
-
auth-type = "htpasswd.default";
-
acct-type = "unix";
-
};
-
htpasswd.default = {
-
htpasswd = pkgs.writeText "htpasswd" ''
-
ayla:$2y$05$LD.VqJF.yVGsp.C3L6IJFO0SvYTeCKbGoGn70ZQaht4gxyEq2XbCS
-
'';
-
};
-
location = [
+
pages = [
{
-
route = ["/*path"];
-
directory = "${dataDirectory}/webdav";
-
handler = "filesystem";
-
methods = ["webdav-rw"];
-
autoindex = true;
-
auth = "true";
+
name = config.mySnippets.tailnet.networkMap.glance.vHost;
+
width = "slim";
+
hide-desktop-navigation = true;
+
center-vertically = true;
+
columns = [
+
{
+
size = "full";
+
widgets = [
+
{
+
type = "search";
+
autofocus = true;
+
}
+
{
+
type = "monitor";
+
cache = "1m";
+
title = "Public Services";
+
+
sites = [
+
{
+
title = "Forgejo";
+
url = "https://${config.mySnippets.aylac-top.networkMap.forgejo.vHost}/";
+
check-url = "http://${config.mySnippets.aylac-top.networkMap.forgejo.hostName}:${toString config.mySnippets.aylac-top.networkMap.forgejo.port}/";
+
icon = "di:forgejo";
+
}
+
{
+
title = "PDS";
+
url = "https://${config.mySnippets.aylac-top.networkMap.pds.vHost}/";
+
check-url = "http://${config.mySnippets.aylac-top.networkMap.pds.hostName}:${toString config.mySnippets.aylac-top.networkMap.pds.port}/";
+
icon = "di:bluesky";
+
}
+
{
+
title = "Vaultwarden";
+
url = "https://${config.mySnippets.aylac-top.networkMap.vaultwarden.vHost}/";
+
check-url = "http://${config.mySnippets.aylac-top.networkMap.vaultwarden.hostName}:${toString config.mySnippets.aylac-top.networkMap.vaultwarden.port}/";
+
icon = "di:vaultwarden";
+
}
+
];
+
}
+
{
+
type = "monitor";
+
cache = "1m";
+
title = "Private Services";
+
+
sites = [
+
{
+
title = "Jellyfin";
+
url = "https://${config.mySnippets.tailnet.networkMap.jellyfin.vHost}/";
+
check-url = "http://${config.mySnippets.tailnet.networkMap.jellyfin.hostName}:${toString config.mySnippets.tailnet.networkMap.jellyfin.port}/web/index.html";
+
icon = "di:jellyfin";
+
}
+
{
+
title = "Sonarr";
+
url = "https://${config.mySnippets.tailnet.networkMap.sonarr.vHost}/";
+
check-url = "http://${config.mySnippets.tailnet.networkMap.sonarr.hostName}:${toString config.mySnippets.tailnet.networkMap.sonarr.port}/";
+
icon = "di:sonarr";
+
}
+
{
+
title = "Radarr";
+
url = "https://${config.mySnippets.tailnet.networkMap.radarr.vHost}/";
+
check-url = "http://${config.mySnippets.tailnet.networkMap.radarr.hostName}:${toString config.mySnippets.tailnet.networkMap.radarr.port}/";
+
icon = "di:radarr";
+
}
+
#{
+
# title = "Lidarr";
+
# url = "https://${config.mySnippets.tailnet.networkMap.lidarr.vHost}/";
+
# check-url = "http://${config.mySnippets.tailnet.networkMap.lidarr.hostName}:${toString config.mySnippets.tailnet.networkMap.lidarr.port}/";
+
# icon = "di:lidarr";
+
#}
+
{
+
title = "Prowlarr";
+
url = "https://${config.mySnippets.tailnet.networkMap.prowlarr.vHost}/";
+
check-url = "http://${config.mySnippets.tailnet.networkMap.prowlarr.hostName}:${toString config.mySnippets.tailnet.networkMap.prowlarr.port}/";
+
icon = "di:prowlarr";
+
}
+
{
+
title = "Bazarr";
+
url = "https://${config.mySnippets.tailnet.networkMap.bazarr.vHost}/";
+
check-url = "http://${config.mySnippets.tailnet.networkMap.bazarr.hostName}:${toString config.mySnippets.tailnet.networkMap.bazarr.port}/";
+
icon = "di:bazarr";
+
}
+
{
+
title = "qBittorrent";
+
url = "https://${config.mySnippets.tailnet.networkMap.qbittorrent.vHost}/";
+
check-url = "http://${config.mySnippets.tailnet.networkMap.qbittorrent.hostName}:${toString config.mySnippets.tailnet.networkMap.qbittorrent.port}/";
+
icon = "di:qbittorrent";
+
alt-status-codes = [401];
+
}
+
{
+
title = "Uptime Kuma";
+
url = "https://${config.mySnippets.tailnet.networkMap.uptime-kuma.vHost}/";
+
check-url = "http://${config.mySnippets.tailnet.networkMap.uptime-kuma.hostName}:${toString config.mySnippets.tailnet.networkMap.uptime-kuma.port}/";
+
icon = "di:uptime-kuma";
+
}
+
{
+
title = "Radicale";
+
url = "https://${config.mySnippets.tailnet.networkMap.radicale.vHost}/";
+
check-url = "http://${config.mySnippets.tailnet.networkMap.radicale.hostName}:${toString config.mySnippets.tailnet.networkMap.radicale.port}/";
+
icon = "di:radicale";
+
}
+
];
+
}
+
];
+
}
+
];
}
];
+
+
server = {
+
host = "0.0.0.0";
+
inherit (config.mySnippets.tailnet.networkMap.glance) port;
+
};
};
+
};
+
};
+
+
services.webdav-server-rs = {
+
enable = true;
+
settings = {
+
server.listen = ["0.0.0.0:${toString config.mySnippets.tailnet.networkMap.webdav.port}" "[::]:${toString config.mySnippets.tailnet.networkMap.webdav.port}"];
+
accounts = {
+
auth-type = "htpasswd.default";
+
acct-type = "unix";
+
};
+
htpasswd.default = {
+
htpasswd = pkgs.writeText "htpasswd" ''
+
ayla:$2y$05$LD.VqJF.yVGsp.C3L6IJFO0SvYTeCKbGoGn70ZQaht4gxyEq2XbCS
+
'';
+
};
+
location = [
+
{
+
route = ["/*path"];
+
directory = "${dataDirectory}/webdav";
+
handler = "filesystem";
+
methods = ["webdav-rw"];
+
autoindex = true;
+
auth = "true";
+
}
+
];
};
};
+33
modules/nixos/profiles/arr/README.md
···
+
# \*arr Profile
+
+
Complete \*arr stack for automated media management and downloading.
+
+
## Usage
+
+
```nix
+
{
+
myNixOS.profiles.arr = {
+
enable = true;
+
dataDir = "/var/lib"; # optional, default location
+
};
+
}
+
```
+
+
## What It Enables
+
+
- **Sonarr** (port 8989): TV show management and downloading.
+
- **Radarr** (port 7878): Movie management and downloading.
+
- **Lidarr** (port 8686): Music management and downloading.
+
- **Prowlarr** (port 9696): Indexer management for all \*arr services.
+
- **Bazarr** (port 6767): Subtitle management and downloading.
+
+
## Features
+
+
- **Unified data directory**: All services store data under configurable `dataDir`.
+
- **Firewall integration**: Automatically opens required ports for web interfaces.
+
- **Proper permissions**: Sets up correct directory ownership for each service.
+
- **Directory management**: Automatically creates required data directories.
+
+
## Default Ports
+
+
All services have their standard ports opened in the firewall for web UI access.
+60
modules/nixos/profiles/arr/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
options.myNixOS.profiles.arr = {
+
enable = lib.mkEnableOption "*arr services";
+
+
dataDir = lib.mkOption {
+
type = lib.types.str;
+
default = "/var/lib";
+
description = "The directory where *arr stores its data files.";
+
};
+
};
+
+
config = lib.mkMerge [
+
(lib.mkIf config.myNixOS.profiles.arr.enable {
+
services = {
+
bazarr = {
+
enable = true;
+
dataDir = "${config.myNixOS.profiles.arr.dataDir}/bazarr";
+
openFirewall = true; # Port: 6767
+
};
+
+
#lidarr = {
+
# enable = true;
+
# dataDir = "${config.myNixOS.profiles.arr.dataDir}/lidarr/.config/Lidarr";
+
# openFirewall = true; # Port: 8686
+
#};
+
+
prowlarr = {
+
enable = true;
+
# dataDir = "${config.myNixOS.profiles.arr.dataDir}/prowlarr";
+
openFirewall = true; # Port: 9696
+
};
+
+
radarr = {
+
enable = true;
+
dataDir = "${config.myNixOS.profiles.arr.dataDir}/radarr/.config/Radarr/";
+
openFirewall = true; # Port: 7878
+
};
+
+
sonarr = {
+
enable = true;
+
dataDir = "${config.myNixOS.profiles.arr.dataDir}/sonarr/.config/NzbDrone/";
+
openFirewall = true; # Port: 8989
+
};
+
};
+
+
systemd = {
+
tmpfiles.rules = [
+
#"d ${config.services.lidarr.dataDir} 0755 lidarr lidarr"
+
"d ${config.services.radarr.dataDir} 0755 radarr radarr"
+
"d ${config.services.readarr.dataDir} 0755 readarr readarr"
+
"d ${config.services.sonarr.dataDir} 0755 sonarr sonarr"
+
];
+
};
+
})
+
];
+
}
+1
modules/nixos/profiles/default.nix
···
{...}: {
imports = [
+
./arr
./base
./btrfs
./backups
+1 -1
modules/snippets/restic/default.nix
···
#OnCalendar = "*-*-* 02,14:00:00";
#OnCalendar = "*-*-* 03:14:00";
Persistent = true;
-
RandomizedDelaySec = "1200";
+
RandomizedDelaySec = "600";
};
};
};
+36
modules/snippets/tailnet/default.nix
···
port = 4918;
vHost = "webdav.${config.mySnippets.tailnet.name}";
};
+
+
glance = {
+
hostName = "nanpi";
+
port = 9090;
+
vHost = "glance.${config.mySnippets.tailnet.name}";
+
};
+
+
bazarr = {
+
hostName = "nanpi";
+
port = 6767;
+
vHost = "bazarr.${config.mySnippets.tailnet.name}";
+
};
+
+
#lidarr = {
+
# hostName = "nanpi";
+
# port = 8686;
+
# vHost = "lidarr.${config.mySnippets.tailnet.name}";
+
#};
+
+
prowlarr = {
+
hostName = "nanpi";
+
port = 9696;
+
vHost = "prowlarr.${config.mySnippets.tailnet.name}";
+
};
+
+
radarr = {
+
hostName = "nanpi";
+
port = 7878;
+
vHost = "radarr.${config.mySnippets.tailnet.name}";
+
};
+
+
sonarr = {
+
hostName = "nanpi";
+
port = 8989;
+
vHost = "sonarr.${config.mySnippets.tailnet.name}";
+
};
};
};
};