{ config, pkgs, lib, ... }: with lib; { # Invidious - Privacy-focused YouTube frontend # Replaces Piped with native NixOS service # Secret for Invidious companion authentication sops.secrets.invidious-companion-key = { key = "invidious-companion-key"; }; # Main Invidious service services.invidious = { enable = true; domain = "invidious.cloonar.com"; port = 3000; # PostgreSQL database configuration database = { createLocally = true; }; # Enable nginx reverse proxy with automatic TLS nginx.enable = true; # Enable http3-ytproxy for video/image proxying # Handles /videoplayback, /vi/, /ggpht/, /sb/ paths http3-ytproxy.enable = true; # Signature helper - crashes with current YouTube player format # sig-helper = { # enable = true; # }; # Service settings settings = { # Disable registration - admin user created via init script registration_enabled = false; # Disable CAPTCHA (not needed for private instance) captcha_enabled = false; # Database configuration check_tables = true; db = { user = "invidious"; dbname = "invidious"; }; # Optional: Instance customization default_home = "Popular"; feed_menu = [ "Popular" "Trending" "Subscriptions" ]; # HTTPS configuration for proper URL generation external_port = mkForce 443; https_only = mkForce true; # YouTube compatibility settings use_quic = true; force_resolve = "ipv4"; }; }; # Use Podman for OCI containers virtualisation.oci-containers.backend = "podman"; # Create Invidious network for container communication systemd.services.init-invidious-network = { description = "Create Podman network for Invidious companion"; wantedBy = [ "multi-user.target" ]; before = [ "podman-invidious-companion.service" ]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; }; script = '' ${pkgs.podman}/bin/podman network exists invidious-net || \ ${pkgs.podman}/bin/podman network create --interface-name=podman2 --subnet=10.90.0.0/24 invidious-net ''; }; # Create systemd tmpfiles directory for Invidious config systemd.tmpfiles.rules = [ "d /var/lib/invidious 0755 root root - -" "d /run/invidious-companion 0700 root root - -" ]; # Generate companion environment file with secret key systemd.services.invidious-companion-env-generate = { description = "Generate Invidious companion environment file"; wantedBy = [ "multi-user.target" ]; before = [ "podman-invidious-companion.service" ]; after = [ "init-invidious-network.service" ]; requires = [ "init-invidious-network.service" ]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; }; script = '' COMPANION_KEY=$(cat ${config.sops.secrets.invidious-companion-key.path}) cat > /run/invidious-companion/env < /var/lib/invidious/companion-config.json <