{
  "manifest_version": "1.0.0",
  "template": {
    "id": "0b25a327-cd30-4261-9f17-a47730a3107f",
    "slug": "growthbook-analytics",
    "name": "GrowthBook",
    "description": "Feature flags, experimentation, product analytics, SDK edge proxy",
    "url": "https://railway.com/deploy/growthbook-analytics",
    "upstream": {
      "image": "growthbook/proxy:latest"
    }
  },
  "services": [
    {
      "name": "growthbook-proxy",
      "source": {
        "image": "growthbook/proxy:latest"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "MongoDB",
      "source": {
        "image": "mongo:8.0"
      },
      "needs_volume": true,
      "volume_mount_path": "/data/db",
      "http": false
    },
    {
      "name": "Redis",
      "source": {
        "image": "redis:8.2"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "gateway",
      "source": {
        "repo": "https://github.com/gridalpha/growthbook-railway"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "growthbook",
      "source": {
        "image": "growthbook/growthbook:5.0.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "growthbook-jobs",
      "source": {
        "image": "growthbook/growthbook:5.0.1"
      },
      "needs_volume": false,
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "growthbook-proxy",
      "description": "Proxy listening port",
      "secret": false,
      "strategy": "default",
      "default": "3300"
    },
    {
      "key": "NODE_ENV",
      "service": "growthbook-proxy",
      "description": "Hides debug logging",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "PRIVATE_URL",
      "service": "growthbook-proxy",
      "description": "Private address for peers",
      "secret": false,
      "strategy": "default",
      "default": "http://growthbook-proxy.railway.internal:3300"
    },
    {
      "key": "CACHE_ENGINE",
      "service": "growthbook-proxy",
      "description": "Shared cache backend",
      "secret": false,
      "strategy": "default",
      "default": "redis"
    },
    {
      "key": "SECRET_API_KEY",
      "service": "growthbook-proxy",
      "description": "Read-only key used to fetch payloads",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GROWTHBOOK_API_HOST",
      "service": "growthbook-proxy",
      "description": "Private GrowthBook API address",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CACHE_CONNECTION_URL",
      "service": "growthbook-proxy",
      "description": "Redis connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MONGOHOST",
      "service": "MongoDB",
      "description": "Data panel alias, not read by the server",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "MONGOPORT",
      "service": "MongoDB",
      "description": "Data panel alias, not read by the server",
      "secret": false,
      "strategy": "default",
      "default": "27017"
    },
    {
      "key": "MONGOUSER",
      "service": "MongoDB",
      "description": "Data panel alias, not read by the server",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MONGO_URL",
      "service": "MongoDB",
      "description": "Private connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "MONGOPASSWORD",
      "service": "MongoDB",
      "description": "Data panel alias, not read by the server",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MONGO_INITDB_ROOT_PASSWORD",
      "service": "MongoDB",
      "description": "Root password, read by the server",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "MONGO_INITDB_ROOT_USERNAME",
      "service": "MongoDB",
      "description": "Root user created on first boot",
      "secret": false,
      "strategy": "default",
      "default": "mongo"
    },
    {
      "key": "REDISHOST",
      "service": "Redis",
      "description": "Data panel alias, not read by the server",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDISPORT",
      "service": "Redis",
      "description": "Data panel alias, not read by the server",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "REDISUSER",
      "service": "Redis",
      "description": "Data panel alias, not read by the server",
      "secret": false,
      "strategy": "default",
      "default": "default"
    },
    {
      "key": "REDIS_URL",
      "service": "Redis",
      "description": "Private connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDISPASSWORD",
      "service": "Redis",
      "description": "Data panel alias, not read by the server",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Redis",
      "description": "Auth password, read by the server",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "gateway",
      "description": "Caddy listening port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "GROWTHBOOK_API_UPSTREAM",
      "service": "gateway",
      "description": "Express API upstream",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GROWTHBOOK_APP_UPSTREAM",
      "service": "gateway",
      "description": "Next.js front-end upstream",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PORT",
      "service": "growthbook",
      "description": "Next.js front-end port",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "API_HOST",
      "service": "growthbook",
      "description": "Public API base path",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "NODE_ENV",
      "service": "growthbook",
      "description": "Enables production checks and logging",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "S3_BUCKET",
      "service": "growthbook",
      "description": "Uploads bucket name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_DOMAIN",
      "service": "growthbook",
      "description": "Base URL for stored files",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_REGION",
      "service": "growthbook",
      "description": "Bucket region",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APP_ORIGIN",
      "service": "growthbook",
      "description": "Public front-end origin",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "JWT_SECRET",
      "service": "growthbook",
      "description": "Session signing key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "MONGODB_URI",
      "service": "growthbook",
      "description": "Application database",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "growthbook",
      "description": "S3-compatible endpoint, forces path style",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "BACKEND_PORT",
      "service": "growthbook",
      "description": "Express API port, must differ from PORT",
      "secret": false,
      "strategy": "default",
      "default": "3100"
    },
    {
      "key": "NODE_OPTIONS",
      "service": "growthbook",
      "description": "Cap the Node heap",
      "secret": false,
      "strategy": "default",
      "default": "--max-old-space-size=2048"
    },
    {
      "key": "CRON_DISABLED",
      "service": "growthbook",
      "description": "Scheduled jobs run on growthbook-jobs",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PROXY_ENABLED",
      "service": "growthbook",
      "description": "Enable GrowthBook Proxy integration",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "UPLOAD_METHOD",
      "service": "growthbook",
      "description": "Store uploads in object storage",
      "secret": false,
      "strategy": "default",
      "default": "s3"
    },
    {
      "key": "ENCRYPTION_KEY",
      "service": "growthbook",
      "description": "Data-source credential encryption",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "SECRET_API_KEY",
      "service": "growthbook",
      "description": "Read-only REST API key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "PM2_AUTORESTART",
      "service": "growthbook",
      "description": "Restart a crashed app process",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PRIVATE_API_URL",
      "service": "growthbook",
      "description": "Private API address for peers",
      "secret": false,
      "strategy": "default",
      "default": "http://growthbook.railway.internal:3100"
    },
    {
      "key": "PRIVATE_APP_URL",
      "service": "growthbook",
      "description": "Private front-end address for peers",
      "secret": false,
      "strategy": "default",
      "default": "http://growthbook.railway.internal:3000"
    },
    {
      "key": "AWS_ACCESS_KEY_ID",
      "service": "growthbook",
      "description": "Bucket access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PROXY_HOST_PUBLIC",
      "service": "growthbook",
      "description": "Proxy URL shown to SDKs",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PROXY_HOST_INTERNAL",
      "service": "growthbook",
      "description": "Private cache-invalidation URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AWS_SECRET_ACCESS_KEY",
      "service": "growthbook",
      "description": "Bucket secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "EXPRESS_TRUST_PROXY_OPTS",
      "service": "growthbook",
      "description": "Trust proxy headers for client IPs",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PYTHON_SERVER_AUTH_TOKEN",
      "service": "growthbook",
      "description": "Bearer token for the stats endpoint",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "EXTERNAL_PYTHON_SERVER_URL",
      "service": "growthbook",
      "description": "Remote stats engine",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GB_STATS_ENGINE_MIN_POOL_SIZE",
      "service": "growthbook",
      "description": "No local Python workers",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "PORT",
      "service": "growthbook-jobs",
      "description": "Next.js front-end port",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "API_HOST",
      "service": "growthbook-jobs",
      "description": "Public API base path",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "NODE_ENV",
      "service": "growthbook-jobs",
      "description": "Enables production checks and logging",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "S3_BUCKET",
      "service": "growthbook-jobs",
      "description": "Uploads bucket name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_DOMAIN",
      "service": "growthbook-jobs",
      "description": "Base URL for stored files",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_REGION",
      "service": "growthbook-jobs",
      "description": "Bucket region",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APP_ORIGIN",
      "service": "growthbook-jobs",
      "description": "Public front-end origin",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "JWT_SECRET",
      "service": "growthbook-jobs",
      "description": "Must match the app service",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MONGODB_URI",
      "service": "growthbook-jobs",
      "description": "Application database",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "growthbook-jobs",
      "description": "S3-compatible endpoint, forces path style",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "BACKEND_PORT",
      "service": "growthbook-jobs",
      "description": "Express API port, must differ from PORT",
      "secret": false,
      "strategy": "default",
      "default": "3100"
    },
    {
      "key": "NODE_OPTIONS",
      "service": "growthbook-jobs",
      "description": "Cap the Node heap",
      "secret": false,
      "strategy": "default",
      "default": "--max-old-space-size=2048"
    },
    {
      "key": "PROXY_ENABLED",
      "service": "growthbook-jobs",
      "description": "Enable GrowthBook Proxy integration",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "UPLOAD_METHOD",
      "service": "growthbook-jobs",
      "description": "Store uploads in object storage",
      "secret": false,
      "strategy": "default",
      "default": "s3"
    },
    {
      "key": "ENCRYPTION_KEY",
      "service": "growthbook-jobs",
      "description": "Must match the app service",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SECRET_API_KEY",
      "service": "growthbook-jobs",
      "description": "Must match the app service",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PM2_AUTORESTART",
      "service": "growthbook-jobs",
      "description": "Restart a crashed app process",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PRIVATE_API_URL",
      "service": "growthbook-jobs",
      "description": "Private stats address for peers",
      "secret": false,
      "strategy": "default",
      "default": "http://growthbook-jobs.railway.internal:3100"
    },
    {
      "key": "AWS_ACCESS_KEY_ID",
      "service": "growthbook-jobs",
      "description": "Bucket access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PROXY_HOST_PUBLIC",
      "service": "growthbook-jobs",
      "description": "Proxy URL shown to SDKs",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PYTHON_SERVER_MODE",
      "service": "growthbook-jobs",
      "description": "Exposes the /stats endpoint",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PROXY_HOST_INTERNAL",
      "service": "growthbook-jobs",
      "description": "Private cache-invalidation URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AWS_SECRET_ACCESS_KEY",
      "service": "growthbook-jobs",
      "description": "Bucket secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "EXPRESS_TRUST_PROXY_OPTS",
      "service": "growthbook-jobs",
      "description": "Trust proxy headers for client IPs",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PYTHON_SERVER_AUTH_TOKEN",
      "service": "growthbook-jobs",
      "description": "Must match the app service",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GB_STATS_ENGINE_POOL_SIZE",
      "service": "growthbook-jobs",
      "description": "Python worker pool size",
      "secret": false,
      "strategy": "default",
      "default": "8"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "growthbook-analytics"
      }
    },
    "cli": "railway deploy --template growthbook-analytics",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "0b25a327-cd30-4261-9f17-a47730a3107f",
            "serializedConfig": {
              "buckets": {
                "05a6dcbb-0baa-4ffa-8df1-7ab7a9fb7131": {
                  "name": "growthbook-uploads"
                }
              },
              "services": {
                "6acfa479-b014-4083-a849-71bc1885fbb7": {
                  "icon": "https://raw.githubusercontent.com/growthbook/growthbook/main/docs/static/img/growthbook-logomark-white.svg",
                  "name": "growthbook-proxy",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/healthcheck",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "growthbook/proxy:latest"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Proxy listening port",
                      "defaultValue": "3300"
                    },
                    "NODE_ENV": {
                      "isOptional": false,
                      "description": "Hides debug logging",
                      "defaultValue": "production"
                    },
                    "PRIVATE_URL": {
                      "isOptional": false,
                      "description": "Private address for peers",
                      "defaultValue": "http://growthbook-proxy.railway.internal:3300"
                    },
                    "CACHE_ENGINE": {
                      "isOptional": false,
                      "description": "Shared cache backend",
                      "defaultValue": "redis"
                    },
                    "SECRET_API_KEY": {
                      "isOptional": false,
                      "description": "Read-only key used to fetch payloads",
                      "defaultValue": "${{growthbook.SECRET_API_KEY}}"
                    },
                    "GROWTHBOOK_API_HOST": {
                      "isOptional": false,
                      "description": "Private GrowthBook API address",
                      "defaultValue": "${{growthbook.PRIVATE_API_URL}}"
                    },
                    "CACHE_CONNECTION_URL": {
                      "isOptional": false,
                      "description": "Redis connection string",
                      "defaultValue": "${{Redis.REDIS_URL}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:3300": {
                        "port": 3300
                      }
                    }
                  }
                },
                "8e388fe8-b301-4093-9e0b-33e27085bb88": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mongodb.svg",
                  "name": "MongoDB",
                  "deploy": {
                    "startCommand": "docker-entrypoint.sh mongod --ipv6 --bind_ip ::,0.0.0.0 --setParameter diagnosticDataCollectionEnabled=false",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "mongo:8.0"
                  },
                  "variables": {
                    "MONGOHOST": {
                      "isOptional": false,
                      "description": "Data panel alias, not read by the server",
                      "defaultValue": "${{ RAILWAY_PRIVATE_DOMAIN }}"
                    },
                    "MONGOPORT": {
                      "isOptional": false,
                      "description": "Data panel alias, not read by the server",
                      "defaultValue": "27017"
                    },
                    "MONGOUSER": {
                      "isOptional": false,
                      "description": "Data panel alias, not read by the server",
                      "defaultValue": "${{ MONGO_INITDB_ROOT_USERNAME }}"
                    },
                    "MONGO_URL": {
                      "isOptional": false,
                      "description": "Private connection string",
                      "defaultValue": "mongodb://${{MONGO_INITDB_ROOT_USERNAME}}:${{MONGO_INITDB_ROOT_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:27017"
                    },
                    "MONGOPASSWORD": {
                      "isOptional": false,
                      "description": "Data panel alias, not read by the server",
                      "defaultValue": "${{ MONGO_INITDB_ROOT_PASSWORD }}"
                    },
                    "MONGO_INITDB_ROOT_PASSWORD": {
                      "isOptional": false,
                      "description": "Root password, read by the server",
                      "defaultValue": "{{MONGO_INITDB_ROOT_PASSWORD}}"
                    },
                    "MONGO_INITDB_ROOT_USERNAME": {
                      "isOptional": false,
                      "description": "Root user created on first boot",
                      "defaultValue": "mongo"
                    }
                  },
                  "volumeMounts": {
                    "8e388fe8-b301-4093-9e0b-33e27085bb88": {
                      "mountPath": "/data/db"
                    }
                  }
                },
                "909ac3a2-229f-4501-943d-38e4c0e3c43e": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/redis.svg",
                  "name": "Redis",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"rm -rf $RAILWAY_VOLUME_MOUNT_PATH/lost+found/ && exec docker-entrypoint.sh redis-server --requirepass $REDIS_PASSWORD --save 60 1 --dir $RAILWAY_VOLUME_MOUNT_PATH\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "redis:8.2"
                  },
                  "variables": {
                    "REDISHOST": {
                      "isOptional": false,
                      "description": "Data panel alias, not read by the server",
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDISPORT": {
                      "isOptional": false,
                      "description": "Data panel alias, not read by the server",
                      "defaultValue": "6379"
                    },
                    "REDISUSER": {
                      "isOptional": false,
                      "description": "Data panel alias, not read by the server",
                      "defaultValue": "default"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "Private connection string",
                      "defaultValue": "redis://${{ REDISUSER }}:${{ REDIS_PASSWORD }}@${{ REDISHOST }}:${{ REDISPORT }}"
                    },
                    "REDISPASSWORD": {
                      "isOptional": false,
                      "description": "Data panel alias, not read by the server",
                      "defaultValue": "${{REDIS_PASSWORD}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Auth password, read by the server",
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "909ac3a2-229f-4501-943d-38e4c0e3c43e": {
                      "mountPath": "/data"
                    }
                  }
                },
                "9580cb07-0bd7-41c8-adf3-f701480c4c1e": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/caddy.svg",
                  "name": "gateway",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/healthz",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/gridalpha/growthbook-railway",
                    "rootDirectory": null
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Caddy listening port",
                      "defaultValue": "8080"
                    },
                    "GROWTHBOOK_API_UPSTREAM": {
                      "isOptional": false,
                      "description": "Express API upstream",
                      "defaultValue": "${{growthbook.PRIVATE_API_URL}}"
                    },
                    "GROWTHBOOK_APP_UPSTREAM": {
                      "isOptional": false,
                      "description": "Next.js front-end upstream",
                      "defaultValue": "${{growthbook.PRIVATE_APP_URL}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  }
                },
                "e51c0b01-bf94-45d0-95c4-128e2522b867": {
                  "icon": "https://raw.githubusercontent.com/growthbook/growthbook/main/docs/static/img/growthbook-logomark-white.svg",
                  "name": "growthbook",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/api/init",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "growthbook/growthbook:5.0.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Next.js front-end port",
                      "defaultValue": "3000"
                    },
                    "API_HOST": {
                      "isOptional": false,
                      "description": "Public API base path",
                      "defaultValue": "https://${{gateway.RAILWAY_PUBLIC_DOMAIN}}/gbapi"
                    },
                    "NODE_ENV": {
                      "isOptional": false,
                      "description": "Enables production checks and logging",
                      "defaultValue": "production"
                    },
                    "S3_BUCKET": {
                      "isOptional": false,
                      "description": "Uploads bucket name",
                      "defaultValue": "${{growthbook-uploads.BUCKET}}"
                    },
                    "S3_DOMAIN": {
                      "isOptional": false,
                      "description": "Base URL for stored files",
                      "defaultValue": "${{growthbook-uploads.ENDPOINT}}/${{growthbook-uploads.BUCKET}}/"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "description": "Bucket region",
                      "defaultValue": "${{growthbook-uploads.REGION}}"
                    },
                    "APP_ORIGIN": {
                      "isOptional": false,
                      "description": "Public front-end origin",
                      "defaultValue": "https://${{gateway.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "JWT_SECRET": {
                      "isOptional": false,
                      "description": "Session signing key",
                      "defaultValue": "{{JWT_SECRET}}"
                    },
                    "MONGODB_URI": {
                      "isOptional": false,
                      "description": "Application database",
                      "defaultValue": "${{MongoDB.MONGO_URL}}/growthbook?authSource=admin"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3-compatible endpoint, forces path style",
                      "defaultValue": "${{growthbook-uploads.ENDPOINT}}"
                    },
                    "BACKEND_PORT": {
                      "isOptional": false,
                      "description": "Express API port, must differ from PORT",
                      "defaultValue": "3100"
                    },
                    "NODE_OPTIONS": {
                      "isOptional": false,
                      "description": "Cap the Node heap",
                      "defaultValue": "--max-old-space-size=2048"
                    },
                    "CRON_DISABLED": {
                      "isOptional": false,
                      "description": "Scheduled jobs run on growthbook-jobs",
                      "defaultValue": "true"
                    },
                    "PROXY_ENABLED": {
                      "isOptional": false,
                      "description": "Enable GrowthBook Proxy integration",
                      "defaultValue": "1"
                    },
                    "UPLOAD_METHOD": {
                      "isOptional": false,
                      "description": "Store uploads in object storage",
                      "defaultValue": "s3"
                    },
                    "ENCRYPTION_KEY": {
                      "isOptional": false,
                      "description": "Data-source credential encryption",
                      "defaultValue": "{{ENCRYPTION_KEY}}"
                    },
                    "SECRET_API_KEY": {
                      "isOptional": false,
                      "description": "Read-only REST API key",
                      "defaultValue": "{{SECRET_API_KEY}}"
                    },
                    "PM2_AUTORESTART": {
                      "isOptional": false,
                      "description": "Restart a crashed app process",
                      "defaultValue": "true"
                    },
                    "PRIVATE_API_URL": {
                      "isOptional": false,
                      "description": "Private API address for peers",
                      "defaultValue": "http://growthbook.railway.internal:3100"
                    },
                    "PRIVATE_APP_URL": {
                      "isOptional": false,
                      "description": "Private front-end address for peers",
                      "defaultValue": "http://growthbook.railway.internal:3000"
                    },
                    "AWS_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "Bucket access key",
                      "defaultValue": "${{growthbook-uploads.ACCESS_KEY_ID}}"
                    },
                    "PROXY_HOST_PUBLIC": {
                      "isOptional": false,
                      "description": "Proxy URL shown to SDKs",
                      "defaultValue": "https://${{growthbook-proxy.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "PROXY_HOST_INTERNAL": {
                      "isOptional": false,
                      "description": "Private cache-invalidation URL",
                      "defaultValue": "${{growthbook-proxy.PRIVATE_URL}}"
                    },
                    "AWS_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Bucket secret key",
                      "defaultValue": "${{growthbook-uploads.SECRET_ACCESS_KEY}}"
                    },
                    "EXPRESS_TRUST_PROXY_OPTS": {
                      "isOptional": false,
                      "description": "Trust proxy headers for client IPs",
                      "defaultValue": "true"
                    },
                    "PYTHON_SERVER_AUTH_TOKEN": {
                      "isOptional": false,
                      "description": "Bearer token for the stats endpoint",
                      "defaultValue": "{{PYTHON_SERVER_AUTH_TOKEN}}"
                    },
                    "EXTERNAL_PYTHON_SERVER_URL": {
                      "isOptional": false,
                      "description": "Remote stats engine",
                      "defaultValue": "${{growthbook-jobs.PRIVATE_API_URL}}"
                    },
                    "GB_STATS_ENGINE_MIN_POOL_SIZE": {
                      "isOptional": false,
                      "description": "No local Python workers",
                      "defaultValue": "0"
                    }
                  }
                },
                "f366ba36-0b6a-4b1c-89bd-c7b87a8ccf65": {
                  "icon": "https://raw.githubusercontent.com/growthbook/growthbook/main/docs/static/img/growthbook-logomark-white.svg",
                  "name": "growthbook-jobs",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/api/init",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "growthbook/growthbook:5.0.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Next.js front-end port",
                      "defaultValue": "3000"
                    },
                    "API_HOST": {
                      "isOptional": false,
                      "description": "Public API base path",
                      "defaultValue": "https://${{gateway.RAILWAY_PUBLIC_DOMAIN}}/gbapi"
                    },
                    "NODE_ENV": {
                      "isOptional": false,
                      "description": "Enables production checks and logging",
                      "defaultValue": "production"
                    },
                    "S3_BUCKET": {
                      "isOptional": false,
                      "description": "Uploads bucket name",
                      "defaultValue": "${{growthbook-uploads.BUCKET}}"
                    },
                    "S3_DOMAIN": {
                      "isOptional": false,
                      "description": "Base URL for stored files",
                      "defaultValue": "${{growthbook-uploads.ENDPOINT}}/${{growthbook-uploads.BUCKET}}/"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "description": "Bucket region",
                      "defaultValue": "${{growthbook-uploads.REGION}}"
                    },
                    "APP_ORIGIN": {
                      "isOptional": false,
                      "description": "Public front-end origin",
                      "defaultValue": "https://${{gateway.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "JWT_SECRET": {
                      "isOptional": false,
                      "description": "Must match the app service",
                      "defaultValue": "${{growthbook.JWT_SECRET}}"
                    },
                    "MONGODB_URI": {
                      "isOptional": false,
                      "description": "Application database",
                      "defaultValue": "${{MongoDB.MONGO_URL}}/growthbook?authSource=admin"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3-compatible endpoint, forces path style",
                      "defaultValue": "${{growthbook-uploads.ENDPOINT}}"
                    },
                    "BACKEND_PORT": {
                      "isOptional": false,
                      "description": "Express API port, must differ from PORT",
                      "defaultValue": "3100"
                    },
                    "NODE_OPTIONS": {
                      "isOptional": false,
                      "description": "Cap the Node heap",
                      "defaultValue": "--max-old-space-size=2048"
                    },
                    "PROXY_ENABLED": {
                      "isOptional": false,
                      "description": "Enable GrowthBook Proxy integration",
                      "defaultValue": "1"
                    },
                    "UPLOAD_METHOD": {
                      "isOptional": false,
                      "description": "Store uploads in object storage",
                      "defaultValue": "s3"
                    },
                    "ENCRYPTION_KEY": {
                      "isOptional": false,
                      "description": "Must match the app service",
                      "defaultValue": "${{growthbook.ENCRYPTION_KEY}}"
                    },
                    "SECRET_API_KEY": {
                      "isOptional": false,
                      "description": "Must match the app service",
                      "defaultValue": "${{growthbook.SECRET_API_KEY}}"
                    },
                    "PM2_AUTORESTART": {
                      "isOptional": false,
                      "description": "Restart a crashed app process",
                      "defaultValue": "true"
                    },
                    "PRIVATE_API_URL": {
                      "isOptional": false,
                      "description": "Private stats address for peers",
                      "defaultValue": "http://growthbook-jobs.railway.internal:3100"
                    },
                    "AWS_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "Bucket access key",
                      "defaultValue": "${{growthbook-uploads.ACCESS_KEY_ID}}"
                    },
                    "PROXY_HOST_PUBLIC": {
                      "isOptional": false,
                      "description": "Proxy URL shown to SDKs",
                      "defaultValue": "https://${{growthbook-proxy.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "PYTHON_SERVER_MODE": {
                      "isOptional": false,
                      "description": "Exposes the /stats endpoint",
                      "defaultValue": "true"
                    },
                    "PROXY_HOST_INTERNAL": {
                      "isOptional": false,
                      "description": "Private cache-invalidation URL",
                      "defaultValue": "${{growthbook-proxy.PRIVATE_URL}}"
                    },
                    "AWS_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Bucket secret key",
                      "defaultValue": "${{growthbook-uploads.SECRET_ACCESS_KEY}}"
                    },
                    "EXPRESS_TRUST_PROXY_OPTS": {
                      "isOptional": false,
                      "description": "Trust proxy headers for client IPs",
                      "defaultValue": "true"
                    },
                    "PYTHON_SERVER_AUTH_TOKEN": {
                      "isOptional": false,
                      "description": "Must match the app service",
                      "defaultValue": "${{growthbook.PYTHON_SERVER_AUTH_TOKEN}}"
                    },
                    "GB_STATS_ENGINE_POOL_SIZE": {
                      "isOptional": false,
                      "description": "Python worker pool size",
                      "defaultValue": "8"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "growthbook-proxy",
      "method": "GET",
      "path": "/healthcheck",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 6,
    "needs_volume": true
  },
  "generated_at": "2026-09-21T22:14:44.200Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-21T20:00:54.005Z",
  "success_rate_30d": 0.1429,
  "validation": {
    "last_run_id": "run_17c8a8801ea64d9aa729",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": false,
        "detail": "Your workspace has been restricted. Please contact support to resolve this."
      }
    ],
    "typical_ready_seconds": 47
  }
}
