/ nix-dokploy / dokploy-stack.nix
dokploy-stack.nix
  1  # Docker stack configuration for Dokploy
  2  {
  3    cfg,
  4    lib,
  5  }:
  6  {
  7    version = "3.8";
  8  
  9    services = {
 10      postgres = {
 11        image = "postgres:16";
 12        environment = {
 13          POSTGRES_USER = "dokploy";
 14          POSTGRES_PASSWORD = "\${POSTGRES_PASSWORD}";
 15          POSTGRES_DB = "dokploy";
 16        };
 17        volumes = [
 18          "dokploy-postgres:/var/lib/postgresql/data"
 19        ];
 20        networks = {
 21          dokploy-network = {
 22            aliases = [ "dokploy-postgres" ];
 23          };
 24        };
 25        deploy = {
 26          placement.constraints = [ "node.role == manager" ];
 27          restart_policy.condition = "any";
 28        };
 29      };
 30  
 31      redis = {
 32        image = "redis:7";
 33        volumes = [
 34          "dokploy-redis:/data"
 35        ];
 36        networks = {
 37          dokploy-network = {
 38            aliases = [ "dokploy-redis" ];
 39          };
 40        };
 41        deploy = {
 42          placement.constraints = [ "node.role == manager" ];
 43          restart_policy.condition = "any";
 44        };
 45      };
 46  
 47      dokploy = {
 48        inherit (cfg) image;
 49        depends_on = [
 50          "postgres"
 51          "redis"
 52        ];
 53  
 54        environment = {
 55          ADVERTISE_ADDR = "\${ADVERTISE_ADDR}";
 56        }
 57        // cfg.environment;
 58  
 59        networks = {
 60          dokploy-network = {
 61            aliases = [ "dokploy-app" ];
 62          };
 63        };
 64  
 65        volumes = [
 66          "/var/run/docker.sock:/var/run/docker.sock"
 67          "${cfg.dataDir}:/etc/dokploy"
 68          "dokploy:/root/.docker"
 69        ];
 70  
 71        deploy = {
 72          replicas = 1;
 73          placement.constraints = [ "node.role == manager" ];
 74          update_config = {
 75            parallelism = 1;
 76            order = "stop-first";
 77          };
 78          restart_policy.condition = "any";
 79        }
 80        // lib.optionalAttrs cfg.lxc {
 81          endpoint_mode = "dnsrr";
 82        };
 83      }
 84      // lib.optionalAttrs (cfg.port != null) {
 85        ports =
 86          let
 87            parts = lib.splitString ":" cfg.port;
 88            len = builtins.length parts;
 89          in
 90          [
 91            (
 92              {
 93                target = lib.strings.toInt (lib.last parts);
 94                published = lib.strings.toInt (builtins.elemAt parts (len - 2));
 95                mode = "host";
 96              }
 97              // lib.optionalAttrs (len == 3) {
 98                host_ip = builtins.head parts;
 99              }
100            )
101          ];
102      };
103    };
104  
105    networks = {
106      dokploy-network = {
107        name = "dokploy-network";
108        driver = "overlay";
109        attachable = true;
110      };
111    };
112  
113    volumes = {
114      dokploy-postgres = { };
115      dokploy-redis = { };
116      dokploy = { };
117    };
118  }