{ pkgs, lib, ... }: { services.n8n = { enable = true; openFirewall = true; webhookUrl = "https://n8n.project-a.space/"; settings.port = 3030; }; systemd.services.n8n.environment.GENERIC_TIMEZONE = "Asia/Novosibirsk"; virtualisation.docker = { enable = true; autoPrune.enable = true; }; virtualisation.oci-containers.backend = "docker"; virtualisation.oci-containers.containers."mongodb" = { image = "mongo:latest"; environment = { "MONGO_INITDB_ROOT_PASSWORD" = "maria"; "MONGO_INITDB_ROOT_USERNAME" = "admin"; }; volumes = [ "/var/lib/n8n_mongodb_data:/data/db:rw" ]; ports = [ "27017:27017/tcp" ]; log-driver = "journald"; extraOptions = [ "--network-alias=mongodb" "--network=n8n_default" ]; }; systemd.services."docker-mongodb" = { serviceConfig = { Restart = lib.mkOverride 90 "always"; RestartMaxDelaySec = lib.mkOverride 90 "1m"; RestartSec = lib.mkOverride 90 "100ms"; RestartSteps = lib.mkOverride 90 9; }; after = [ "docker-network-n8n_default.service" ]; requires = [ "docker-network-n8n_default.service" ]; partOf = [ "docker-compose-n8n-root.target" ]; wantedBy = [ "docker-compose-n8n-root.target" ]; }; virtualisation.oci-containers.containers."redis" = { image = "redis:latest"; volumes = [ "n8n_redis_data:/data:rw" ]; ports = [ "6379:6379/tcp" ]; cmd = [ "redis-server" "--requirepass" "maria" ]; log-driver = "journald"; extraOptions = [ "--network-alias=redis" "--network=n8n_default" ]; }; systemd.services."docker-redis" = { serviceConfig = { Restart = lib.mkOverride 90 "always"; RestartMaxDelaySec = lib.mkOverride 90 "1m"; RestartSec = lib.mkOverride 90 "100ms"; RestartSteps = lib.mkOverride 90 9; }; after = [ "docker-network-n8n_default.service" "docker-volume-n8n_redis_data.service" ]; requires = [ "docker-network-n8n_default.service" "docker-volume-n8n_redis_data.service" ]; partOf = [ "docker-compose-n8n-root.target" ]; wantedBy = [ "docker-compose-n8n-root.target" ]; }; systemd.services."docker-network-n8n_default" = { path = [ pkgs.docker ]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; ExecStop = "docker network rm -f n8n_default"; }; script = '' docker network inspect n8n_default || docker network create n8n_default ''; partOf = [ "docker-compose-n8n-root.target" ]; wantedBy = [ "docker-compose-n8n-root.target" ]; }; systemd.services."docker-volume-n8n_redis_data" = { path = [ pkgs.docker ]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; }; script = '' docker volume inspect n8n_redis_data || docker volume create n8n_redis_data ''; partOf = [ "docker-compose-n8n-root.target" ]; wantedBy = [ "docker-compose-n8n-root.target" ]; }; systemd.targets."docker-compose-n8n-root" = { unitConfig.Description = "Root target generated by compose2nix."; wantedBy = [ "multi-user.target" ]; }; }