/ 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 }