Skip to content

Commit

Permalink
pinchflat: init at v2024.12.10
Browse files Browse the repository at this point in the history
  • Loading branch information
charludo committed Dec 11, 2024
1 parent 115709c commit 2b573e5
Show file tree
Hide file tree
Showing 7 changed files with 1,227 additions and 0 deletions.
6 changes: 6 additions & 0 deletions maintainers/maintainer-list.nix
Original file line number Diff line number Diff line change
Expand Up @@ -3862,6 +3862,12 @@
githubId = 6608071;
name = "Charles Huyghues-Despointes";
};
charludo = {
email = "[email protected]";
github = "charludo";
githubId = 47758554;
name = "Charlotte Harludo";
};
chayleaf = {
email = "[email protected]";
github = "chayleaf";
Expand Down
2 changes: 2 additions & 0 deletions nixos/doc/manual/release-notes/rl-2505.section.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

- [crab-hole](https://github.com/LuckyTurtleDev/crab-hole), a cross platform Pi-hole clone written in Rust using hickory-dns/trust-dns. Available as [services.crab-hole](#opt-services.crab-hole.enable).

- [Pinchflat](https://github.com/kieraneglin/pinchflat), a selfhosted YouTube media manager used to track channels and download videos on release. Available as [services.pinchflat](#opt-services.pinchflat.enable).

- [Amazon CloudWatch Agent](https://github.com/aws/amazon-cloudwatch-agent), the official telemetry collector for AWS CloudWatch and AWS X-Ray. Available as [services.amazon-cloudwatch-agent](options.html#opt-services.amazon-cloudwatch-agent.enable).

- [Bat](https://github.com/sharkdp/bat), a {manpage}`cat(1)` clone with wings. Available as [programs.bat](options.html#opt-programs.bat).
Expand Down
2 changes: 2 additions & 0 deletions nixos/modules/misc/ids.nix
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,7 @@ in
rstudio-server = 324;
localtimed = 325;
automatic-timezoned = 326;
pinchflat = 328;

# When adding a uid, make sure it doesn't match an existing gid.
#
Expand Down Expand Up @@ -683,6 +684,7 @@ in
localtimed = 325;
automatic-timezoned = 326;
uinput = 327;
pinchflat = 328;

# When adding a gid, make sure it doesn't match an existing
# uid. Users and groups with the same name should have equal
Expand Down
1 change: 1 addition & 0 deletions nixos/modules/module-list.nix
Original file line number Diff line number Diff line change
Expand Up @@ -824,6 +824,7 @@
./services/misc/parsoid.nix
./services/misc/persistent-evdev.nix
./services/misc/pghero.nix
./services/misc/pinchflat.nix
./services/misc/pinnwand.nix
./services/misc/plex.nix
./services/misc/plikd.nix
Expand Down
150 changes: 150 additions & 0 deletions nixos/modules/services/misc/pinchflat.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
{
config,
pkgs,
lib,
...
}:

with lib;

let
cfg = config.services.pinchflat;
in
{
options = {
services.pinchflat = {
enable = mkEnableOption "pinchflat";

dataDir = mkOption {
type = types.str;
default = "/var/lib/pinchflat";
description = "The directory where Pinchflat stores its config and database.";
};

mediaDir = mkOption {
type = types.str;
default = "/var/lib/pinchflat/media";
description = "The directory into which Pinchflat downloads videos.";
};

port = mkOption {
type = types.port;
default = 8945;
description = "Port on which Pinchflat should listen.";
};

openFirewall = mkOption {
type = types.bool;
default = false;
description = "Open ports in the firewall for the Pinchflat web interface";
};

user = mkOption {
type = types.str;
default = "pinchflat";
description = "User account under which Pinchflat runs.";
};

group = mkOption {
type = types.str;
default = "pinchflat";
description = "Group under which Pinchflat runs.";
};

extraConfig = lib.mkOption {
type =
with lib.types;
attrsOf (
nullOr (oneOf [
bool
int
str
])
);
default = { };
example = lib.literalExpression ''
{
LOG_LEVEL = "info";
}
'';
description = ''
The configuration of Pinchflat is handled through environment variables.
The available configuration options can be found in [the Pinchflat README](https://github.com/kieraneglin/pinchflat/README.md#environment-variables).
'';
};

secretsFile = lib.mkOption {
type = with lib.types; nullOr path;
example = "/run/secrets/pinchflat";
description = ''
Secrets like {env}`SECRET_KEY_BASE` and {env}`BASIC_AUTH_PASSWORD`
should be passed to the service without adding them to the world-readable Nix store.
Note that this file needs to be available on the host on which `pinchflat` is running.
Further, `SECRET_KEY_BASE` has a minimum length requirement of 64 bytes.
As an example, the contents of the file might look like this:
```
SECRET_KEY_BASE=...copy-paste a secret token here...
BASIC_AUTH_USERNAME=...basic auth username...
BASIC_AUTH_PASSWORD=...basic auth password...
```
'';
};

package = mkPackageOption pkgs "pinchflat" { };
};
};

config = mkIf cfg.enable {
systemd.services.pinchflat = {
description = "pinchflat";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
path = [
pkgs.apprise
pkgs.yt-dlp
];

serviceConfig = {
Type = "simple";
User = cfg.user;
Group = cfg.group;
Environment = [
"PORT=${builtins.toString cfg.port}"
"TZ=${config.time.timeZone}"
"MEDIA_PATH=${cfg.mediaDir}"
"CONFIG_PATH=${cfg.dataDir}"
"DATABASE_PATH=${cfg.dataDir}/db/pinchflat.db"
"LOG_PATH=${cfg.dataDir}/logs/pinchflat.log"
"METADATA_PATH=${cfg.dataDir}/metadata"
"EXTRAS_PATH=${cfg.dataDir}/extras"
"TMPFILE_PATH=${cfg.dataDir}/tmp"
"TZ_DATA_PATH=${cfg.dataDir}/extras/elixir_tz_data"
"PHX_SERVER=true"
] ++ lib.attrValues (lib.mapAttrs (name: value: name + "=" + lib.toString value) cfg.extraConfig);
EnvironmentFile = lib.optional (cfg.secretsFile != null) cfg.secretsFile;
ExecStartPre = "${cfg.package}/bin/migrate";
ExecStart = "${cfg.package}/bin/pinchflat start";
Restart = "on-failure";
};
};

networking.firewall = mkIf cfg.openFirewall {
allowedTCPPorts = [ cfg.port ];
};

users.users = mkIf (cfg.user == "pinchflat") {
pinchflat = {
group = cfg.group;
home = cfg.dataDir;
createHome = true;
uid = config.ids.uids.pinchflat;
};
};

users.groups = mkIf (cfg.group == "pinchflat") {
pinchflat.gid = config.ids.gids.pinchflat;
};
};
}
Loading

0 comments on commit 2b573e5

Please sign in to comment.