{
  "manifest_version": "1.0.0",
  "template": {
    "id": "4932229d-ae0d-45d0-bd8c-1bd99b1bdc30",
    "slug": "flowise-workers",
    "name": "Flowise | AI Agents with Workers",
    "description": "Flowise queue mode: main + worker, Postgres (pgvector), Redis, S3 bucket.",
    "url": "https://railway.com/deploy/flowise-workers",
    "upstream": {
      "repo_url": "https://github.com/nomideusz/flowise-railway"
    }
  },
  "services": [
    {
      "name": "worker",
      "source": {
        "repo": "https://github.com/nomideusz/flowise-railway"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "redis",
      "source": {
        "repo": "https://github.com/nomideusz/flowise-railway"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "flowise",
      "source": {
        "repo": "https://github.com/nomideusz/flowise-railway"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "postgres",
      "source": {
        "repo": "https://github.com/nomideusz/flowise-railway"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "worker",
      "description": "Worker healthcheck port. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "5566"
    },
    {
      "key": "REDIS_URL",
      "service": "worker",
      "description": "Same queue as main.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DATABASE_HOST",
      "service": "worker",
      "description": "Postgres host on the private network.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "S3_ENDPOINT_URL",
      "service": "worker",
      "description": "Bucket S3 endpoint.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DATABASE_PASSWORD",
      "service": "worker",
      "description": "Postgres password.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_STORAGE_REGION",
      "service": "worker",
      "description": "Bucket region.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WORKER_CONCURRENCY",
      "service": "worker",
      "description": "Jobs one worker runs at once. Flows are I/O-bound; raise or add replicas for throughput.",
      "secret": false,
      "strategy": "default",
      "default": "100"
    },
    {
      "key": "S3_STORAGE_BUCKET_NAME",
      "service": "worker",
      "description": "Railway bucket for uploads and document stores (shared by main and worker).",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_STORAGE_ACCESS_KEY_ID",
      "service": "worker",
      "description": "Bucket access key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLOWISE_SECRETKEY_OVERWRITE",
      "service": "worker",
      "description": "Must equal the main instance key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_STORAGE_SECRET_ACCESS_KEY",
      "service": "worker",
      "description": "Bucket secret key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILWAY_HEALTHCHECK_TIMEOUT_SEC",
      "service": "worker",
      "description": "Give the worker time to reach the queue.",
      "secret": false,
      "strategy": "default",
      "default": "600"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "redis",
      "description": "Auto-generated queue password.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "flowise",
      "description": "Port Flowise listens on and Railway probes. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "APP_URL",
      "service": "flowise",
      "description": "Public URL, used in invite/reset links.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "REDIS_URL",
      "service": "flowise",
      "description": "BullMQ connection. ?family=0 makes ioredis dual-stack (Railway private DNS is IPv6-only).",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DATABASE_HOST",
      "service": "flowise",
      "description": "Postgres host on the private network.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "S3_ENDPOINT_URL",
      "service": "flowise",
      "description": "Bucket S3 endpoint.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DATABASE_PASSWORD",
      "service": "flowise",
      "description": "Postgres password.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_STORAGE_REGION",
      "service": "flowise",
      "description": "Bucket region.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "TOKEN_HASH_SECRET",
      "service": "flowise",
      "description": "API key hashing secret.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "JWT_AUTH_TOKEN_SECRET",
      "service": "flowise",
      "description": "Auth token secret.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "EXPRESS_SESSION_SECRET",
      "service": "flowise",
      "description": "Session secret.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "S3_STORAGE_BUCKET_NAME",
      "service": "flowise",
      "description": "Railway bucket for uploads and document stores (shared by main and worker).",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "JWT_REFRESH_TOKEN_SECRET",
      "service": "flowise",
      "description": "Refresh token secret.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "S3_STORAGE_ACCESS_KEY_ID",
      "service": "flowise",
      "description": "Bucket access key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLOWISE_SECRETKEY_OVERWRITE",
      "service": "flowise",
      "description": "Encryption key for stored credentials. Must match the worker; changing it orphans saved API keys.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "S3_STORAGE_SECRET_ACCESS_KEY",
      "service": "flowise",
      "description": "Bucket secret key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILWAY_HEALTHCHECK_TIMEOUT_SEC",
      "service": "flowise",
      "description": "First boot runs DB migrations; give it time.",
      "secret": false,
      "strategy": "default",
      "default": "600"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "postgres",
      "description": "Auto-generated database password.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "flowise-workers"
      }
    },
    "cli": "railway deploy --template flowise-workers",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "4932229d-ae0d-45d0-bd8c-1bd99b1bdc30",
            "serializedConfig": {
              "buckets": {
                "14e3864d-a726-4b8f-a9c3-3eaedd3a23f9": {
                  "name": "storage"
                }
              },
              "services": {
                "0927db3c-6e1f-4f2c-8572-d81918fd53f9": {
                  "icon": "https://images.seeklogo.com/logo-png/68/2/flowise-logo-png_seeklogo-681976.png",
                  "name": "worker",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/healthz",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/nomideusz/flowise-railway",
                    "rootDirectory": "/worker"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Worker healthcheck port. Do not change.",
                      "defaultValue": "5566"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "Same queue as main.",
                      "defaultValue": "redis://:${{redis.REDIS_PASSWORD}}@${{redis.RAILWAY_PRIVATE_DOMAIN}}:6379?family=0"
                    },
                    "DATABASE_HOST": {
                      "isOptional": false,
                      "description": "Postgres host on the private network.",
                      "defaultValue": "${{postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "S3_ENDPOINT_URL": {
                      "isOptional": false,
                      "description": "Bucket S3 endpoint.",
                      "defaultValue": "${{storage.ENDPOINT}}"
                    },
                    "DATABASE_PASSWORD": {
                      "isOptional": false,
                      "description": "Postgres password.",
                      "defaultValue": "${{postgres.POSTGRES_PASSWORD}}"
                    },
                    "S3_STORAGE_REGION": {
                      "isOptional": false,
                      "description": "Bucket region.",
                      "defaultValue": "${{storage.REGION}}"
                    },
                    "WORKER_CONCURRENCY": {
                      "isOptional": false,
                      "description": "Jobs one worker runs at once. Flows are I/O-bound; raise or add replicas for throughput.",
                      "defaultValue": "100"
                    },
                    "S3_STORAGE_BUCKET_NAME": {
                      "isOptional": false,
                      "description": "Railway bucket for uploads and document stores (shared by main and worker).",
                      "defaultValue": "${{storage.BUCKET}}"
                    },
                    "S3_STORAGE_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "Bucket access key.",
                      "defaultValue": "${{storage.ACCESS_KEY_ID}}"
                    },
                    "FLOWISE_SECRETKEY_OVERWRITE": {
                      "isOptional": false,
                      "description": "Must equal the main instance key.",
                      "defaultValue": "${{flowise.FLOWISE_SECRETKEY_OVERWRITE}}"
                    },
                    "S3_STORAGE_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Bucket secret key.",
                      "defaultValue": "${{storage.SECRET_ACCESS_KEY}}"
                    },
                    "RAILWAY_HEALTHCHECK_TIMEOUT_SEC": {
                      "isOptional": false,
                      "description": "Give the worker time to reach the queue.",
                      "defaultValue": "600"
                    }
                  }
                },
                "5d08fb2a-45e0-4bb2-882a-85892bd84ccb": {
                  "icon": "https://devicons.railway.com/i/redis.svg",
                  "name": "redis",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/nomideusz/flowise-railway",
                    "rootDirectory": "/redis"
                  },
                  "variables": {
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Auto-generated queue password.",
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "5d08fb2a-45e0-4bb2-882a-85892bd84ccb": {
                      "mountPath": "/data"
                    }
                  }
                },
                "9a5cee55-1f18-435c-8b82-7f32aa5ad844": {
                  "icon": "https://images.seeklogo.com/logo-png/68/2/flowise-logo-png_seeklogo-681976.png",
                  "name": "flowise",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/api/v1/ping",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/nomideusz/flowise-railway",
                    "rootDirectory": "/main"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Port Flowise listens on and Railway probes. Do not change.",
                      "defaultValue": "3000"
                    },
                    "APP_URL": {
                      "isOptional": false,
                      "description": "Public URL, used in invite/reset links.",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "BullMQ connection. ?family=0 makes ioredis dual-stack (Railway private DNS is IPv6-only).",
                      "defaultValue": "redis://:${{redis.REDIS_PASSWORD}}@${{redis.RAILWAY_PRIVATE_DOMAIN}}:6379?family=0"
                    },
                    "DATABASE_HOST": {
                      "isOptional": false,
                      "description": "Postgres host on the private network.",
                      "defaultValue": "${{postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "S3_ENDPOINT_URL": {
                      "isOptional": false,
                      "description": "Bucket S3 endpoint.",
                      "defaultValue": "${{storage.ENDPOINT}}"
                    },
                    "DATABASE_PASSWORD": {
                      "isOptional": false,
                      "description": "Postgres password.",
                      "defaultValue": "${{postgres.POSTGRES_PASSWORD}}"
                    },
                    "S3_STORAGE_REGION": {
                      "isOptional": false,
                      "description": "Bucket region.",
                      "defaultValue": "${{storage.REGION}}"
                    },
                    "TOKEN_HASH_SECRET": {
                      "isOptional": false,
                      "description": "API key hashing secret.",
                      "defaultValue": "{{TOKEN_HASH_SECRET}}"
                    },
                    "JWT_AUTH_TOKEN_SECRET": {
                      "isOptional": false,
                      "description": "Auth token secret.",
                      "defaultValue": "{{JWT_AUTH_TOKEN_SECRET}}"
                    },
                    "EXPRESS_SESSION_SECRET": {
                      "isOptional": false,
                      "description": "Session secret.",
                      "defaultValue": "{{EXPRESS_SESSION_SECRET}}"
                    },
                    "S3_STORAGE_BUCKET_NAME": {
                      "isOptional": false,
                      "description": "Railway bucket for uploads and document stores (shared by main and worker).",
                      "defaultValue": "${{storage.BUCKET}}"
                    },
                    "JWT_REFRESH_TOKEN_SECRET": {
                      "isOptional": false,
                      "description": "Refresh token secret.",
                      "defaultValue": "{{JWT_REFRESH_TOKEN_SECRET}}"
                    },
                    "S3_STORAGE_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "Bucket access key.",
                      "defaultValue": "${{storage.ACCESS_KEY_ID}}"
                    },
                    "FLOWISE_SECRETKEY_OVERWRITE": {
                      "isOptional": false,
                      "description": "Encryption key for stored credentials. Must match the worker; changing it orphans saved API keys.",
                      "defaultValue": "{{FLOWISE_SECRETKEY_OVERWRITE}}"
                    },
                    "S3_STORAGE_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Bucket secret key.",
                      "defaultValue": "${{storage.SECRET_ACCESS_KEY}}"
                    },
                    "RAILWAY_HEALTHCHECK_TIMEOUT_SEC": {
                      "isOptional": false,
                      "description": "First boot runs DB migrations; give it time.",
                      "defaultValue": "600"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:3000": {
                        "port": 3000
                      }
                    }
                  }
                },
                "db3dddad-0856-4ae7-b005-74dda471cf7c": {
                  "icon": "https://devicons.railway.com/i/postgresql.svg",
                  "name": "postgres",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/nomideusz/flowise-railway",
                    "rootDirectory": "/postgres"
                  },
                  "variables": {
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Auto-generated database password.",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "db3dddad-0856-4ae7-b005-74dda471cf7c": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "flowise",
      "method": "GET",
      "path": "/api/v1/ping",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 4,
    "needs_volume": true
  },
  "generated_at": "2026-09-07T23:54:17.958Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-08T00:05:19.507Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_28cf3ee7737f4b25a7f2",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "healthcheck",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 270,
    "typical_build_seconds": 71,
    "typical_start_seconds": 61,
    "slowest_service": "worker"
  }
}
