{ lib, config, namespace, ... }: let inherit (lib.${namespace}) mkOpt mkModule; name = "your-spotify"; cfg = config.${namespace}.services.${name}; in { imports = [ (mkModule { inherit config name; description = "Your Spotify — self-hosted Spotify stats"; options = { serverPort = mkOpt lib.types.int 7777 "Port for the API server container"; webPort = mkOpt lib.types.int 7778 "Port for the web client container"; imageServer = mkOpt lib.types.str "yooooomi/your_spotify_server" "Server OCI image"; imageWeb = mkOpt lib.types.str "yooooomi/your_spotify_client" "Web client OCI image"; }; moduleConfig = { virtualisation.oci-containers.containers."${name}-server" = { autoStart = true; image = cfg.imageServer; volumes = [ "${cfg.configDir}:/root/.your-spotify" ]; ports = [ "${toString cfg.serverPort}:8080" ]; dependsOn = [ "mongo" ]; environment = { PUID = cfg.puid; PGID = cfg.pgid; TZ = cfg.timeZone; API_ENDPOINT = "https://your-spotify-server.mjallen.dev"; CLIENT_ENDPOINT = "https://your-spotify.mjallen.dev"; # TODO: move Spotify API keys to sops secrets SPOTIFY_PUBLIC = "e270589d72a6494680a17d325af8670d"; SPOTIFY_SECRET = "423cb7b69fe8486e89eccd01e0c22924"; MONGO_ENDPOINT = "mongodb://10.0.1.3:27017"; }; }; virtualisation.oci-containers.containers."${name}-web" = { autoStart = true; image = cfg.imageWeb; ports = [ "${toString cfg.webPort}:3000" ]; environment = { PUID = cfg.puid; PGID = cfg.pgid; TZ = cfg.timeZone; API_ENDPOINT = "https://your-spotify-server.mjallen.dev"; }; }; }; }) ]; }