{moduleWithSystem, ...}: { flake.nixosModules.containerPaperless = moduleWithSystem ({pkgs, ...}: {config, ...}: { virtualisation.oci-containers.containers."paperless-ngx-broker" = { image = "docker.io/valkey/valkey:9-alpine"; volumes = [ "/containers/paperless-ngx/redisdata:/data:rw" ]; log-driver = "journald"; extraOptions = [ "--network-alias=broker" "--network=paperless-ngx_default" ]; }; systemd.services."podman-paperless-ngx-broker" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-paperless-ngx_default.service" ]; requires = [ "podman-network-paperless-ngx_default.service" ]; partOf = [ "podman-compose-paperless-ngx-root.target" ]; wantedBy = [ "podman-compose-paperless-ngx-root.target" ]; }; virtualisation.oci-containers.containers."paperless-ngx-db" = { image = "docker.io/library/postgres:18"; environmentFiles = [config.sops.templates."paperless.env".path]; environment = { "POSTGRES_DB" = "paperless"; "POSTGRES_USER" = "paperless"; }; volumes = [ "/containers/paperless-ngx/pgdata:/var/lib/postgresql:rw" ]; log-driver = "journald"; extraOptions = [ "--network-alias=db" "--network=paperless-ngx_default" ]; }; systemd.services."podman-paperless-ngx-db" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-paperless-ngx_default.service" ]; requires = [ "podman-network-paperless-ngx_default.service" ]; partOf = [ "podman-compose-paperless-ngx-root.target" ]; wantedBy = [ "podman-compose-paperless-ngx-root.target" ]; }; virtualisation.oci-containers.containers."paperless-ngx-webserver" = { image = "ghcr.io/paperless-ngx/paperless-ngx:latest"; environmentFiles = [config.sops.templates."paperless.env".path]; environment = { "PAPERLESS_DBENGINE" = "postgresql"; "PAPERLESS_DBHOST" = "db"; "PAPERLESS_OCR_LANGUAGE" = "eng"; "PAPERLESS_REDIS" = "redis://broker:6379"; "PAPERLESS_TIME_ZONE" = "Europe/London"; "PAPERLESS_URL" = "https://paperless.voidarc.co.uk"; "USERMAP_GID" = "0"; "USERMAP_UID" = "0"; }; volumes = [ "/containers/paperless-ngx/consume:/usr/src/paperless/consume:rw" "/containers/paperless-ngx/data:/usr/src/paperless/data:rw" "/containers/paperless-ngx/export:/usr/src/paperless/export:rw" "/containers/paperless-ngx/media:/usr/src/paperless/media:rw" ]; ports = [ "8000:8000/tcp" ]; dependsOn = [ "paperless-ngx-broker" "paperless-ngx-db" ]; log-driver = "journald"; extraOptions = [ "--network-alias=webserver" "--network=paperless-ngx_default" ]; }; systemd.services."podman-paperless-ngx-webserver" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-paperless-ngx_default.service" ]; requires = [ "podman-network-paperless-ngx_default.service" ]; partOf = [ "podman-compose-paperless-ngx-root.target" ]; wantedBy = [ "podman-compose-paperless-ngx-root.target" ]; }; # Networks systemd.services."podman-network-paperless-ngx_default" = { path = [pkgs.podman]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; ExecStop = "podman network rm -f paperless-ngx_default"; }; script = '' podman network inspect paperless-ngx_default || podman network create paperless-ngx_default ''; partOf = ["podman-compose-paperless-ngx-root.target"]; wantedBy = ["podman-compose-paperless-ngx-root.target"]; }; # Root service # When started, this will automatically create all resources and start # the containers. When stopped, this will teardown all resources. systemd.targets."podman-compose-paperless-ngx-root" = { unitConfig = { Description = "Root target generated by compose2nix."; }; wantedBy = ["multi-user.target"]; }; }); }