{
  "manifest_version": "1.0.0",
  "template": {
    "id": "6bb9acae-30a2-46d0-88d8-4cd40076068f",
    "slug": "marqo",
    "name": "Marqo",
    "description": "Deploy and Host Marqo + Navigator Ecommerce Search and Discovery on Railway",
    "url": "https://railway.com/deploy/marqo",
    "upstream": {
      "repo_url": "https://github.com/iliab1/caddy-password-auth"
    }
  },
  "services": [
    {
      "name": "Caddy-API",
      "source": {
        "repo": "https://github.com/iliab1/caddy-password-auth"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "Caddy-UI",
      "source": {
        "repo": "https://github.com/iliab1/caddy-password-auth"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "vespa-init",
      "source": {
        "repo": "https://github.com/nick0lay/railway-templates"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Navigator",
      "source": {
        "repo": "https://github.com/nick0lay/railway-templates"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "vespa-node",
      "source": {
        "repo": "https://github.com/nick0lay/railway-templates"
      },
      "needs_volume": true,
      "volume_mount_path": "/opt/vespa/var",
      "http": false
    },
    {
      "name": "Marqo",
      "source": {
        "repo": "https://github.com/nick0lay/railway-templates"
      },
      "needs_volume": true,
      "volume_mount_path": "/root/.cache/huggingface",
      "http": false
    },
    {
      "name": "vespa-admin",
      "source": {
        "repo": "https://github.com/nick0lay/railway-templates"
      },
      "needs_volume": true,
      "volume_mount_path": "/opt/vespa/var",
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "ORIGIN",
      "service": "Caddy-API",
      "description": "Provide a value for ORIGIN.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "BASIC_AUTH",
      "service": "Caddy-API",
      "description": "Provide a value for BASIC_AUTH.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "ORIGIN",
      "service": "Caddy-UI",
      "description": "Provide a value for ORIGIN.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "BASIC_AUTH",
      "service": "Caddy-UI",
      "description": "Provide a value for BASIC_AUTH.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "VESPA_NODE_HOST",
      "service": "vespa-init",
      "description": "Provide a value for VESPA_NODE_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "VESPA_QUERY_URL",
      "service": "vespa-init",
      "description": "Provide a value for VESPA_QUERY_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "VESPA_ADMIN_HOST",
      "service": "vespa-init",
      "description": "Provide a value for VESPA_ADMIN_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "VESPA_CONFIG_URL",
      "service": "vespa-init",
      "description": "Provide a value for VESPA_CONFIG_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PORT",
      "service": "Navigator",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "9882"
    },
    {
      "key": "MARQO_API_URL",
      "service": "Navigator",
      "description": "Provide a value for MARQO_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "NAVIGATOR_IMAGE_TAG",
      "service": "Navigator",
      "description": "Provide a value for NAVIGATOR_IMAGE_TAG.",
      "secret": false,
      "strategy": "default",
      "default": "latest"
    },
    {
      "key": "PORT",
      "service": "vespa-node",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "VESPA_ROLE",
      "service": "vespa-node",
      "description": "Provide a value for VESPA_ROLE.",
      "secret": false,
      "strategy": "default",
      "default": "services"
    },
    {
      "key": "VESPA_HOSTNAME",
      "service": "vespa-node",
      "description": "Provide a value for VESPA_HOSTNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "VESPA_IMAGE_TAG",
      "service": "vespa-node",
      "description": "Provide a value for VESPA_IMAGE_TAG.",
      "secret": false,
      "strategy": "default",
      "default": "8.431.32"
    },
    {
      "key": "VESPA_CONFIGSERVERS",
      "service": "vespa-node",
      "description": "Provide a value for VESPA_CONFIGSERVERS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PORT",
      "service": "Marqo",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8882"
    },
    {
      "key": "MARQO_IMAGE_TAG",
      "service": "Marqo",
      "description": "Provide a value for MARQO_IMAGE_TAG.",
      "secret": false,
      "strategy": "default",
      "default": "latest"
    },
    {
      "key": "VESPA_QUERY_URL",
      "service": "Marqo",
      "description": "Provide a value for VESPA_QUERY_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ZOOKEEPER_HOSTS",
      "service": "Marqo",
      "description": "Provide a value for ZOOKEEPER_HOSTS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "VESPA_CONFIG_URL",
      "service": "Marqo",
      "description": "Provide a value for VESPA_CONFIG_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "VESPA_DOCUMENT_URL",
      "service": "Marqo",
      "description": "Provide a value for VESPA_DOCUMENT_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "MARQO_ENABLE_THROTTLING",
      "service": "Marqo",
      "description": "Provide a value for MARQO_ENABLE_THROTTLING.",
      "secret": false,
      "strategy": "default",
      "default": "TRUE"
    },
    {
      "key": "MARQO_MODELS_TO_PRELOAD",
      "service": "Marqo",
      "description": "Provide a value for MARQO_MODELS_TO_PRELOAD.",
      "secret": false,
      "strategy": "default",
      "default": "[\"hf/e5-base-v2\"]"
    },
    {
      "key": "MARQO_MAX_CONCURRENT_INDEX",
      "service": "Marqo",
      "description": "Provide a value for MARQO_MAX_CONCURRENT_INDEX.",
      "secret": false,
      "strategy": "default",
      "default": "32"
    },
    {
      "key": "MARQO_MAX_CONCURRENT_SEARCH",
      "service": "Marqo",
      "description": "Provide a value for MARQO_MAX_CONCURRENT_SEARCH.",
      "secret": false,
      "strategy": "default",
      "default": "32"
    },
    {
      "key": "PORT",
      "service": "vespa-admin",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "19071"
    },
    {
      "key": "VESPA_ROLE",
      "service": "vespa-admin",
      "description": "Provide a value for VESPA_ROLE.",
      "secret": false,
      "strategy": "default",
      "default": "configserver,services"
    },
    {
      "key": "VESPA_HOSTNAME",
      "service": "vespa-admin",
      "description": "Provide a value for VESPA_HOSTNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "VESPA_IMAGE_TAG",
      "service": "vespa-admin",
      "description": "Provide a value for VESPA_IMAGE_TAG.",
      "secret": false,
      "strategy": "default",
      "default": "8.431.32"
    },
    {
      "key": "VESPA_CONFIGSERVERS",
      "service": "vespa-admin",
      "description": "Provide a value for VESPA_CONFIGSERVERS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "marqo"
      }
    },
    "cli": "railway deploy --template marqo",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "6bb9acae-30a2-46d0-88d8-4cd40076068f",
            "serializedConfig": {
              "services": {
                "1c81143c-681a-421f-b9ef-0180fc97baf6": {
                  "name": "Caddy-API",
                  "source": {
                    "repo": "iliab1/caddy-password-auth",
                    "branch": null,
                    "rootDirectory": null
                  },
                  "variables": {
                    "ORIGIN": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "http://${{Marqo.RAILWAY_PRIVATE_DOMAIN}}:${{Marqo.PORT}}"
                    },
                    "BASIC_AUTH": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "{{BASIC_AUTH}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  }
                },
                "334f1eed-1d48-4269-bb77-f465adc3e729": {
                  "name": "Caddy-UI",
                  "source": {
                    "repo": "iliab1/caddy-password-auth",
                    "branch": null,
                    "rootDirectory": null
                  },
                  "variables": {
                    "ORIGIN": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "http://${{Navigator.RAILWAY_PRIVATE_DOMAIN}}:${{Navigator.PORT}}"
                    },
                    "BASIC_AUTH": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "{{BASIC_AUTH}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  }
                },
                "39f1d414-3fe1-44d8-9c8c-a3e9fbc1ff4b": {
                  "name": "vespa-init",
                  "source": {
                    "repo": "nick0lay/railway-templates",
                    "branch": null,
                    "rootDirectory": "solutions/marqo-navigator/vespa-init"
                  },
                  "variables": {
                    "VESPA_NODE_HOST": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "${{vespa-node.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "VESPA_QUERY_URL": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "http://${{vespa-node.RAILWAY_PRIVATE_DOMAIN}}:${{vespa-node.PORT}}"
                    },
                    "VESPA_ADMIN_HOST": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "${{vespa-admin.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "VESPA_CONFIG_URL": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "http://${{vespa-admin.RAILWAY_PRIVATE_DOMAIN}}:${{vespa-admin.PORT}}"
                    }
                  }
                },
                "41a98f9a-2ca7-4763-b747-acd1714a2b7e": {
                  "name": "Navigator",
                  "source": {
                    "repo": "nick0lay/railway-templates",
                    "branch": null,
                    "rootDirectory": "solutions/marqo-navigator/navigator"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "9882"
                    },
                    "MARQO_API_URL": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "http://${{Marqo.RAILWAY_PRIVATE_DOMAIN}}:${{Marqo.PORT}}"
                    },
                    "NAVIGATOR_IMAGE_TAG": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "latest"
                    }
                  }
                },
                "4832935b-c0b3-4217-920c-f2b1e3706b58": {
                  "name": "vespa-node",
                  "deploy": {
                    "startCommand": ""
                  },
                  "source": {
                    "repo": "nick0lay/railway-templates",
                    "branch": null,
                    "rootDirectory": "solutions/marqo-navigator/vespa"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "8080"
                    },
                    "VESPA_ROLE": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "services"
                    },
                    "VESPA_HOSTNAME": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "${{vespa-node.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "VESPA_IMAGE_TAG": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "8.431.32"
                    },
                    "VESPA_CONFIGSERVERS": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "${{vespa-admin.RAILWAY_PRIVATE_DOMAIN}}"
                    }
                  },
                  "volumeMounts": {
                    "4832935b-c0b3-4217-920c-f2b1e3706b58": {
                      "mountPath": "/opt/vespa/var"
                    }
                  }
                },
                "4a6b5494-8e00-4190-8afa-e994c90ea90f": {
                  "name": "Marqo",
                  "source": {
                    "repo": "nick0lay/railway-templates",
                    "branch": null,
                    "rootDirectory": "solutions/marqo-navigator/marqo"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "8882"
                    },
                    "MARQO_IMAGE_TAG": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "latest"
                    },
                    "VESPA_QUERY_URL": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": " http://${{vespa-node.RAILWAY_PRIVATE_DOMAIN}}:${{vespa-node.PORT}}"
                    },
                    "ZOOKEEPER_HOSTS": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "${{vespa-admin.RAILWAY_PRIVATE_DOMAIN}}:2181"
                    },
                    "VESPA_CONFIG_URL": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "http://${{vespa-admin.RAILWAY_PRIVATE_DOMAIN}}:${{vespa-admin.PORT}}"
                    },
                    "VESPA_DOCUMENT_URL": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": " http://${{vespa-node.RAILWAY_PRIVATE_DOMAIN}}:${{vespa-node.PORT}}"
                    },
                    "MARQO_ENABLE_THROTTLING": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "TRUE"
                    },
                    "MARQO_MODELS_TO_PRELOAD": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "[\"hf/e5-base-v2\"]"
                    },
                    "MARQO_MAX_CONCURRENT_INDEX": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "32"
                    },
                    "MARQO_MAX_CONCURRENT_SEARCH": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "32"
                    }
                  },
                  "volumeMounts": {
                    "4a6b5494-8e00-4190-8afa-e994c90ea90f": {
                      "mountPath": "/root/.cache/huggingface"
                    }
                  }
                },
                "eef2deac-1686-4f65-a96d-85e943c55528": {
                  "name": "vespa-admin",
                  "deploy": {
                    "startCommand": "",
                    "healthcheckPath": ""
                  },
                  "source": {
                    "repo": "nick0lay/railway-templates",
                    "branch": null,
                    "rootDirectory": "solutions/marqo-navigator/vespa"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "19071"
                    },
                    "VESPA_ROLE": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "configserver,services"
                    },
                    "VESPA_HOSTNAME": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "${{vespa-admin.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "VESPA_IMAGE_TAG": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "8.431.32"
                    },
                    "VESPA_CONFIGSERVERS": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": "${{vespa-admin.RAILWAY_PRIVATE_DOMAIN}}"
                    }
                  },
                  "volumeMounts": {
                    "eef2deac-1686-4f65-a96d-85e943c55528": {
                      "mountPath": "/opt/vespa/var"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 7,
    "needs_volume": true
  },
  "generated_at": "2026-09-10T16:14:52.212Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-05T06:15:29.316Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_d714f1fe3f6246a3b11b",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 427,
    "typical_build_seconds": 10,
    "typical_start_seconds": 10,
    "slowest_service": "Caddy-API"
  }
}
