{
  "manifest_version": "1.0.0",
  "template": {
    "id": "c037ceb7-52ef-4d72-b1a8-cc8068155e91",
    "slug": "0OtXZl",
    "name": "drosera-operator (testnet)",
    "description": "Drosera operator and delegation client for testnet. Checkout dev.drosera.io",
    "url": "https://railway.com/deploy/0OtXZl"
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "drosera-delegation-client",
      "source": {
        "image": "ghcr.io/drosera-network/drosera-delegation-client:latest"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "drosera-operator",
      "source": {
        "image": "ghcr.io/drosera-network/drosera-operator:latest"
      },
      "needs_volume": true,
      "volume_mount_path": "/app/.data/drosera.db",
      "tcp_ports": [
        31313
      ],
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "DRO__ETH__RPC_URL",
      "service": "drosera-delegation-client",
      "description": "The node used for querying and sending transactions",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "DRO__ETH__PRIVATE_KEY",
      "service": "drosera-delegation-client",
      "description": "The private key used to sign transactions",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "DRO__DELEGATION_SERVER_URL",
      "service": "drosera-delegation-client",
      "description": "The URL of the delegation server to connect to",
      "secret": false,
      "strategy": "default",
      "default": "https://delegation-server.testnet.drosera.io"
    },
    {
      "key": "DRO__BLOCK_POLLING_INTERVAL_MS",
      "service": "drosera-delegation-client",
      "description": "The number of milliseconds to wait between polling for new blocks",
      "secret": false,
      "strategy": "default",
      "default": "1000"
    },
    {
      "key": "DRO__DB_FILE_PATH",
      "service": "drosera-operator",
      "description": "The path to the database file to use for persistence when not in dev mode",
      "secret": false,
      "strategy": "default",
      "default": "/app/.data/drosera.db"
    },
    {
      "key": "DRO__ETH__RPC_URL",
      "service": "drosera-operator",
      "description": "The node used for querying and sending transactions",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "DRO__SERVER__PORT",
      "service": "drosera-operator",
      "description": "The TCP port to bind the HTTP server to",
      "secret": false,
      "strategy": "default",
      "default": "31314"
    },
    {
      "key": "DRO__LISTEN_ADDRESS",
      "service": "drosera-operator",
      "description": "The network interface to bind the Operators HTTP and P2P server to",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "DRO__ETH__PRIVATE_KEY",
      "service": "drosera-operator",
      "description": "The private key used to sign transactions",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "DRO__NETWORK__P2P_PORT",
      "service": "drosera-operator",
      "description": "The TCP port to bind the P2P server to",
      "secret": false,
      "strategy": "default",
      "default": "31313"
    },
    {
      "key": "DRO__DISABLE_DNR_CONFIRMATION",
      "service": "drosera-operator",
      "description": "Disables the DNR confirmation. Only set this if you are running this node behind a NAT, and you are receiving a 'Failed to confirm DNR' error message. Verify the public address setting is correct and any firewall walls are opened for the configured ports before turning this setting on.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "DRO__BLOCK_POLLING_INTERVAL_MS",
      "service": "drosera-operator",
      "description": "The number of milliseconds to wait between polling for new blocks",
      "secret": false,
      "strategy": "default",
      "default": "1000"
    },
    {
      "key": "DRO__NETWORK__EXTERNAL_P2P_ADDRESS",
      "service": "drosera-operator",
      "description": "The external address to reach the Operator node at for p2p communications",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DRO__NETWORK__EXTERNAL_RPC_ADDRESS",
      "service": "drosera-operator",
      "description": "The external address to reach the Operator node's rpc server. Useful for proxies. Default is the network external p2p address. If provided and starts with either http or https, the value will be used as is by the seed node to retrieve liveness data. Otherwise, if a dns or ip is provided without a protocol, http is assumed and the server port will be appended.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "0OtXZl"
      }
    },
    "cli": "railway deploy --template 0OtXZl",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "c037ceb7-52ef-4d72-b1a8-cc8068155e91",
            "serializedConfig": {
              "services": {
                "167b7e69-bf3b-4cc9-bf6c-207b12f16b08": {
                  "name": "drosera-delegation-client",
                  "source": {
                    "image": "ghcr.io/drosera-network/drosera-delegation-client:latest"
                  },
                  "variables": {
                    "DRO__ETH__RPC_URL": {
                      "isOptional": false,
                      "description": "The node used for querying and sending transactions",
                      "defaultValue": "{{DRO__ETH__RPC_URL}}"
                    },
                    "DRO__ETH__PRIVATE_KEY": {
                      "isOptional": false,
                      "description": "The private key used to sign transactions",
                      "defaultValue": "{{DRO__ETH__PRIVATE_KEY}}"
                    },
                    "DRO__DELEGATION_SERVER_URL": {
                      "isOptional": false,
                      "description": "The URL of the delegation server to connect to",
                      "defaultValue": "https://delegation-server.testnet.drosera.io"
                    },
                    "DRO__BLOCK_POLLING_INTERVAL_MS": {
                      "isOptional": false,
                      "description": "The number of milliseconds to wait between polling for new blocks",
                      "defaultValue": "1000"
                    }
                  }
                },
                "5b5bb264-8b77-4f0c-a631-f0d818a9fdea": {
                  "icon": null,
                  "name": "drosera-operator",
                  "deploy": {
                    "startCommand": "./drosera-operator node",
                    "healthcheckPath": null
                  },
                  "source": {
                    "image": "ghcr.io/drosera-network/drosera-operator:latest"
                  },
                  "variables": {
                    "DRO__DB_FILE_PATH": {
                      "isOptional": false,
                      "description": "The path to the database file to use for persistence when not in dev mode",
                      "defaultValue": "/app/.data/drosera.db"
                    },
                    "DRO__ETH__RPC_URL": {
                      "isOptional": false,
                      "description": "The node used for querying and sending transactions",
                      "defaultValue": "{{DRO__ETH__RPC_URL}}"
                    },
                    "DRO__SERVER__PORT": {
                      "isOptional": false,
                      "description": "The TCP port to bind the HTTP server to",
                      "defaultValue": "31314"
                    },
                    "DRO__LISTEN_ADDRESS": {
                      "isOptional": false,
                      "description": "The network interface to bind the Operators HTTP and P2P server to",
                      "defaultValue": "0.0.0.0"
                    },
                    "DRO__ETH__PRIVATE_KEY": {
                      "isOptional": false,
                      "description": "The private key used to sign transactions",
                      "defaultValue": "{{DRO__ETH__PRIVATE_KEY}}"
                    },
                    "DRO__NETWORK__P2P_PORT": {
                      "isOptional": false,
                      "description": "The TCP port to bind the P2P server to",
                      "defaultValue": "31313"
                    },
                    "DRO__DISABLE_DNR_CONFIRMATION": {
                      "isOptional": false,
                      "description": "Disables the DNR confirmation. Only set this if you are running this node behind a NAT, and you are receiving a 'Failed to confirm DNR' error message. Verify the public address setting is correct and any firewall walls are opened for the configured ports before turning this setting on.",
                      "defaultValue": "true"
                    },
                    "DRO__BLOCK_POLLING_INTERVAL_MS": {
                      "isOptional": false,
                      "description": "The number of milliseconds to wait between polling for new blocks",
                      "defaultValue": "1000"
                    },
                    "DRO__NETWORK__EXTERNAL_P2P_ADDRESS": {
                      "isOptional": false,
                      "description": "The external address to reach the Operator node at for p2p communications",
                      "defaultValue": "${{RAILWAY_TCP_PROXY_DOMAIN}}"
                    },
                    "DRO__NETWORK__EXTERNAL_RPC_ADDRESS": {
                      "isOptional": false,
                      "description": "The external address to reach the Operator node's rpc server. Useful for proxies. Default is the network external p2p address. If provided and starts with either http or https, the value will be used as is by the seed node to retrieve liveness data. Otherwise, if a dns or ip is provided without a protocol, http is assumed and the server port will be appended.",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}\n\n\n"
                    }
                  },
                  "networking": {
                    "tcpProxies": {
                      "31313": {}
                    }
                  },
                  "volumeMounts": {
                    "5b5bb264-8b77-4f0c-a631-f0d818a9fdea": {
                      "mountPath": "/app/.data/drosera.db"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 2,
    "needs_volume": true
  },
  "generated_at": "2026-09-13T04:14:39.446Z",
  "generator_version": "0.1.0"
}
