{
  "manifest_version": "1.0.0",
  "template": {
    "id": "65a19d72-af87-405b-8f78-bf7dae15749c",
    "slug": "kubo",
    "name": "Kubo",
    "description": "Deploy and Host IPFS Kubo with Railway",
    "url": "https://railway.com/deploy/kubo",
    "upstream": {
      "repo_url": "https://github.com/FournyP/kubo-railway-template"
    }
  },
  "services": [
    {
      "name": "Kubo",
      "source": {
        "repo": "https://github.com/FournyP/kubo-railway-template"
      },
      "needs_volume": true,
      "volume_mount_path": "/data/ipfs",
      "tcp_ports": [
        4001
      ],
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "IPFS_PATH",
      "service": "Kubo",
      "description": "Kubo's repo directory. Must be the volume's mount path.",
      "secret": false,
      "strategy": "default",
      "default": "/data/ipfs"
    },
    {
      "key": "KUBO_ANNOUNCE",
      "service": "Kubo",
      "description": "Multiaddr announced to peers. Set it from the TCP proxy on port 4001 so peers outside Railway can reach the node.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "KUBO_API_ADDRESSES",
      "service": "Kubo",
      "description": "JSON array of RPC API listen addresses. Keep both IPv4 and IPv6 on Railway.",
      "secret": false,
      "strategy": "default",
      "default": "[\"/ip4/0.0.0.0/tcp/5001\", \"/ip6/::/tcp/5001\"]"
    },
    {
      "key": "KUBO_API_AUTH_SECRET",
      "service": "Kubo",
      "description": "Bearer token for the RPC API (port 5001). Callers send Authorization: Bearer [secret]. Ignored when KUBO_API_AUTHORIZATIONS is set.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "KUBO_API_ALLOWED_PATHS",
      "service": "Kubo",
      "description": "JSON array of API paths the bearer token may call.",
      "secret": false,
      "strategy": "default",
      "default": "[\"/api/v0\"]"
    },
    {
      "key": "KUBO_SWARM_TCP_ADDRESS_IPV4",
      "service": "Kubo",
      "description": "IPv4 TCP swarm listen address (libp2p connections)",
      "secret": false,
      "strategy": "default",
      "default": "/ip4/0.0.0.0/tcp/4001"
    },
    {
      "key": "KUBO_SWARM_TCP_ADDRESS_IPV6",
      "service": "Kubo",
      "description": "IPv6 TCP swarm listen address (libp2p connections)",
      "secret": false,
      "strategy": "default",
      "default": "/ip6/::/tcp/4001"
    },
    {
      "key": "KUBO_SWARM_UDP_ADDRESS_IPV4",
      "service": "Kubo",
      "description": "IPv4 UDP/QUIC swarm listen address",
      "secret": false,
      "strategy": "default",
      "default": "/ip4/0.0.0.0/udp/4001/quic"
    },
    {
      "key": "KUBO_SWARM_UDP_ADDRESS_IPV6",
      "service": "Kubo",
      "description": "IPv6 UDP/QUIC swarm listen address",
      "secret": false,
      "strategy": "default",
      "default": "/ip6/::/udp/4001/quic"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "kubo"
      }
    },
    "cli": "railway deploy --template kubo",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "65a19d72-af87-405b-8f78-bf7dae15749c",
            "serializedConfig": {
              "services": {
                "feddae26-b4ea-48ca-a830-a8f0e24ac338": {
                  "icon": "https://raw.githubusercontent.com/selfhosters/unRAID-CA-templates/master/templates/img/ipfs-kubo.png",
                  "name": "Kubo",
                  "source": {
                    "repo": "FournyP/kubo-railway-template",
                    "branch": null,
                    "rootDirectory": null
                  },
                  "variables": {
                    "IPFS_PATH": {
                      "isOptional": true,
                      "description": "Kubo's repo directory. Must be the volume's mount path.",
                      "defaultValue": "/data/ipfs"
                    },
                    "KUBO_ANNOUNCE": {
                      "isOptional": true,
                      "description": "Multiaddr announced to peers. Set it from the TCP proxy on port 4001 so peers outside Railway can reach the node.",
                      "defaultValue": "/dns/${{RAILWAY_TCP_PROXY_DOMAIN}}/tcp/${{RAILWAY_TCP_PROXY_PORT}}"
                    },
                    "KUBO_API_ADDRESSES": {
                      "isOptional": true,
                      "description": "JSON array of RPC API listen addresses. Keep both IPv4 and IPv6 on Railway.",
                      "defaultValue": "[\"/ip4/0.0.0.0/tcp/5001\", \"/ip6/::/tcp/5001\"]"
                    },
                    "KUBO_API_AUTH_SECRET": {
                      "isOptional": true,
                      "description": "Bearer token for the RPC API (port 5001). Callers send Authorization: Bearer [secret]. Ignored when KUBO_API_AUTHORIZATIONS is set.",
                      "defaultValue": "{{KUBO_API_AUTH_SECRET}}"
                    },
                    "KUBO_API_ALLOWED_PATHS": {
                      "isOptional": true,
                      "description": "JSON array of API paths the bearer token may call.",
                      "defaultValue": "[\"/api/v0\"]"
                    },
                    "KUBO_API_AUTHORIZATIONS": {
                      "isOptional": true,
                      "description": "Full API.Authorizations JSON object for multiple users and per-user paths. When set it replaces KUBO_API_AUTH_SECRET and KUBO_API_ALLOWED_PATHS.",
                      "defaultValue": ""
                    },
                    "KUBO_SWARM_TCP_ADDRESS_IPV4": {
                      "isOptional": true,
                      "description": "IPv4 TCP swarm listen address (libp2p connections)",
                      "defaultValue": "/ip4/0.0.0.0/tcp/4001"
                    },
                    "KUBO_SWARM_TCP_ADDRESS_IPV6": {
                      "isOptional": true,
                      "description": "IPv6 TCP swarm listen address (libp2p connections)",
                      "defaultValue": "/ip6/::/tcp/4001"
                    },
                    "KUBO_SWARM_UDP_ADDRESS_IPV4": {
                      "isOptional": true,
                      "description": "IPv4 UDP/QUIC swarm listen address",
                      "defaultValue": "/ip4/0.0.0.0/udp/4001/quic"
                    },
                    "KUBO_SWARM_UDP_ADDRESS_IPV6": {
                      "isOptional": true,
                      "description": "IPv6 UDP/QUIC swarm listen address",
                      "defaultValue": "/ip6/::/udp/4001/quic"
                    }
                  },
                  "networking": {
                    "tcpProxies": {
                      "4001": {}
                    }
                  },
                  "volumeMounts": {
                    "feddae26-b4ea-48ca-a830-a8f0e24ac338": {
                      "mountPath": "/data/ipfs"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 1,
    "needs_volume": true
  },
  "generated_at": "2026-09-20T16:14:49.616Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-18T12:35:04.239Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_d09c933a9d6344cdb24b",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 71,
    "typical_build_seconds": 20,
    "typical_start_seconds": 10,
    "slowest_service": "Kubo"
  }
}
