{ config, lib, pkgs, ... }: let cfg = config.homelab.apps.calibre; PUID = toString config.users.users.calibre.uid; PGID = toString config.users.groups.media.gid; books = "/srv/books"; calibre-config = "/srv/calibre-config"; calibre-web-config = "/srv/calibre-web-config"; networkName = "calibre"; proxyNet = config.homelab.apps.traefik.sharedNetworkName; in { options.homelab.apps.calibre = { enable = lib.mkEnableOption "Calibre (Desktop + Web)"; desktop.enable = lib.mkEnableOption "Calibre Desktop (KasmVNC)"; web.enable = lib.mkEnableOption "Calibre Web"; }; config = lib.mkMerge [ { homelab.apps.calibre = lib.mkIf cfg.enable { desktop.enable = true; web.enable = true; }; } # Common (lib.mkIf (cfg.desktop.enable || cfg.web.enable) { homelab = { users.media.enable = true; virtualisation.containers.enable = true; }; homelab.appUsers.calibre = { uid = 3010; group = config.users.groups.media.name; }; homelab.nfsMounts."${books}" = { device = "192.168.0.11:/mnt/SMALL/MEDIA/BOOKS"; extraOptions = [ "auto" "rsize=1048576" "wsize=1048576" "timeo=600" "retrans=2" "_netdev" ]; }; # Make sure the Docker network exists. homelab.dockerNetworks."${networkName}" = { requiredBy = [ "docker-calibre.service" ]; }; }) # Calibre desktop (lib.mkIf cfg.desktop.enable { homelab.nfsMounts."${calibre-config}" = { device = "192.168.0.11:/mnt/SMALL/CONFIG/CALIBRE"; extraOptions = [ "auto" "rsize=1048576" "wsize=1048576" "timeo=600" "retrans=2" "_netdev" ]; }; virtualisation.oci-containers.containers.calibre = let innerPort = 8080; in { hostname = "calibre"; image = "lscr.io/linuxserver/calibre:v8.10.0-ls354"; autoStart = true; ports = [ # Open ports if you don't use Traefik "9480:${toString innerPort}" # Calibre desktop GUI #"9481:8181" # Calibre desktop GUI HTTPS #"9581:8081" # Calibre webserver gui ]; extraOptions = [ "--network=${networkName}" "--network=${proxyNet}" # syscalls are unkown to Docker #"--security-opt" "seccomp=unconfined" ]; environment = { inherit PUID PGID; #UMASK = "022"; TZ = config.time.timeZone; #PASSWORD = ""; #CLI_ARGS = ""; }; volumes = [ "${calibre-config}:/config" "${books}:/media/books" ]; labels = { "traefik.enable" = "true"; "traefik.docker.network" = proxyNet; "traefik.http.routers.calibre.rule" = "Host(`calibre.depeuter.dev`)"; "traefik.http.services.calibre.loadbalancer.server.port" = toString innerPort; }; }; }) # Calibre Web (lib.mkIf cfg.web.enable { homelab.nfsMounts."${calibre-web-config}" = { device = "192.168.0.11:/mnt/SMALL/CONFIG/CALIBRE-WEB"; extraOptions = [ "auto" "rsize=1048576" "wsize=1048576" "timeo=600" "retrans=2" "_netdev" ]; }; virtualisation.oci-containers.containers.calibre-web = let innerPort = 8083; in { hostname = "calibre-web"; image = "lscr.io/linuxserver/calibre-web:0.6.25-ls346"; autoStart = true; ports = [ # Open ports if you don't use Traefik "8083:${toString innerPort}" # Web UI ]; extraOptions = [ "--network=${networkName}" "--network=${proxyNet}" ]; environment = { inherit PUID PGID; #UMASK = "022"; TZ = config.time.timeZone; # (x86-64 only) Adds the ability to perform ebook conversion DOCKER_MODS = "linuxserver/mods:universal-calibre"; # Allow Google Oauth #OAUTHLIB_RELAX_TOKEN_SCOPE = "1"; }; volumes = [ "${calibre-web-config}:/config" "${books}:/media/books" ]; labels = { "traefik.enable" = "true"; "traefik.docker.network" = proxyNet; "traefik.http.routers.calibre-web.rule" = "Host(`books.depeuter.dev`)"; "traefik.http.services.calibre-web.loadbalancer.server.port" = toString innerPort; }; }; }) ]; }