{
  "manifest_version": "1.0.0",
  "template": {
    "id": "5164680e-61ce-4419-88fb-dd080e271280",
    "slug": "risingwave-streaming-database",
    "name": "risingwave",
    "description": "Kafka, Postgres CDC, materialized views: real-time Apache Flink alternative",
    "url": "https://railway.com/deploy/risingwave-streaming-database",
    "upstream": {
      "image": "risingwavelabs/risingwave:v3.0.3"
    }
  },
  "services": [
    {
      "name": "RisingWave",
      "source": {
        "image": "risingwavelabs/risingwave:v3.0.3"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/risingwave",
      "tcp_ports": [
        4566
      ],
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "RisingWave",
      "description": "[Do not change] Port of the dashboard's authenticating proxy. Railway's public domain and healthcheck both point here.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "RW_PASSWORD",
      "service": "RisingWave",
      "description": "Password for the root, postgres and rwadmin database users, auto-generated and applied automatically on every deployment (To change passwords, change this value and redeploy).",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "DATABASE_URL",
      "service": "RisingWave",
      "description": "[Do not change] Connection string for other services in this project, over the private network.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "RW_LISTEN_ADDR",
      "service": "RisingWave",
      "description": "[Do not change] SQL port bind.",
      "secret": false,
      "strategy": "default",
      "default": "[::]:4566"
    },
    {
      "key": "RW_PARALLELISM",
      "service": "RisingWave",
      "description": "How many parallel actors each streaming job runs. 4 suits small and medium workloads;",
      "secret": false,
      "strategy": "default",
      "default": "4"
    },
    {
      "key": "ENABLE_TELEMETRY",
      "service": "RisingWave",
      "description": "Set to true to share anonymous usage statistics with RisingWave Labs.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "RW_DASHBOARD_USER",
      "service": "RisingWave",
      "description": "Username for the web dashboard login. Clearing it falls back to root.",
      "secret": false,
      "strategy": "default",
      "default": "root"
    },
    {
      "key": "DATABASE_PUBLIC_URL",
      "service": "RisingWave",
      "description": "[Do not change] Connection string from outside Railway (psql, BI tools etc). Credentials are included.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RW_DASHBOARD_PASSWORD",
      "service": "RisingWave",
      "description": "Password for the web dashboard at your public URL. Different from the database password; Changing it takes effect on the next redeploy.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "RW_TOTAL_MEMORY_BYTES",
      "service": "RisingWave",
      "description": "Memory budget in bytes (default 8 GiB, the documented minimum).",
      "secret": false,
      "strategy": "default",
      "default": "8589934592"
    },
    {
      "key": "RW_SINGLE_NODE_STORE_DIRECTORY",
      "service": "RisingWave",
      "description": "[Do not change] Where data gets stored on the Volume.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/risingwave"
    },
    {
      "key": "RW_SECRET_STORE_PRIVATE_KEY_HEX",
      "service": "RisingWave",
      "description": "Encrypts credentials you store with CREATE SECRET.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "risingwave-streaming-database"
      }
    },
    "cli": "railway deploy --template risingwave-streaming-database",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "5164680e-61ce-4419-88fb-dd080e271280",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "b10e6206-781e-47ea-94fe-c9b112bcf693": {
                  "icon": "https://github.com/risingwavelabs.png",
                  "name": "RisingWave",
                  "deploy": {
                    "startCommand": "sh -c 'printf \"%s\" \"frontend.hba_config.entries = [{ connection_type = \\\"Host\\\", databases = [\\\"all\\\"], users = [\\\"all\\\"], addresses = [\\\"all\\\"], auth_method = \\\"password\\\" }]\" > /tmp/risingwave.toml && echo \"aW1wb3J0IGphdmEubmlvLmZpbGUuKjsKaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLlBvc2l4RmlsZVBlcm1pc3Npb25zOwppbXBvcnQgamF2YS5zcWwuKjsKaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwoKLy8gT25lLXNob3QgcGFzc3dvcmQgYm9vdHN0cmFwIGZvciB0aGUgUmlzaW5nV2F2ZSBSYWlsd2F5IHRlbXBsYXRlLgovLyBSdW5zIGluIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBzdGFydCBjb21tYW5kIHVzaW5nIHRoZSBQb3N0Z3JlcyBKREJDIGRyaXZlcgovLyB0aGF0IHNoaXBzIGluc2lkZSB0aGUgaW1hZ2UgKGNvbm5lY3Rvci1ub2RlIGxpYnMpLiBBcHBsaWVzIFJXX1BBU1NXT1JEIHRvCi8vIHRoZSB0aHJlZSBwYXNzd29yZGxlc3Mgc3VwZXJ1c2VycyBvdmVyIGxvb3BiYWNrLCB0aGVuIGV4aXRzLgovLwovLyBSb3RhdGlvbiBzdXBwb3J0OiB0aGUgbGFzdCBzdWNjZXNzZnVsbHkgYXBwbGllZCBwYXNzd29yZCBpcyByZW1lbWJlcmVkIGF0Ci8vIFNUQVRFIChvbiB0aGUgZGF0YSB2b2x1bWUsIG5leHQgdG8gdGhlIFNRTGl0ZSBtZXRhIHN0b3JlIHRoYXQgaG9sZHMgdGhlCi8vIHNhbWUgY3JlZGVudGlhbCdzIGF1dGggaW5mbykuIE9uIGEgcm90YXRpb24gdGhlIGN1cnJlbnQgdmFyaWFibGUgbm8gbG9uZ2VyCi8vIGF1dGhlbnRpY2F0ZXMsIHNvIHRoZSByZW1lbWJlcmVkIHZhbHVlIGlzIHVzZWQgdG8gY29ubmVjdCBhbmQgYXBwbHkgdGhlIG5ldwovLyBvbmUuIElkZW1wb3RlbnQgb24gZXZlcnkgYm9vdC4KcHVibGljIGNsYXNzIEJvb3RzdHJhcCB7CiAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFID0gIi92YXIvbGliL3Jpc2luZ3dhdmUvLnJ3X3B3IjsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBTdHJpbmcgY3VyID0gU3lzdGVtLmdldGVudigiUldfUEFTU1dPUkQiKTsKICAgICAgICBpZiAoY3VyID09IG51bGwgfHwgY3VyLmlzRW1wdHkoKSkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltib290c3RyYXBdIFJXX1BBU1NXT1JEIHVuc2V0OyBsZWF2aW5nIHVzZXJzIHVuY2hhbmdlZCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIFN0cmluZyBwcmV2ID0gbnVsbDsKICAgICAgICB0cnkgeyBwcmV2ID0gRmlsZXMucmVhZFN0cmluZyhQYXRoLm9mKFNUQVRFKSkudHJpbSgpOyB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkge30KICAgICAgICBTdHJpbmcgZXNjID0gY3VyLnJlcGxhY2UoIiciLCAiJyciKTsKICAgICAgICBhcHBseSgicm9vdCIsIGN1ciwgcHJldiwgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgIkFMVEVSIFVTRVIgcm9vdCBXSVRIIFBBU1NXT1JEICciICsgZXNjICsgIiciLAogICAgICAgICAgICAiQUxURVIgVVNFUiBwb3N0Z3JlcyBXSVRIIFBBU1NXT1JEICciICsgZXNjICsgIiciCiAgICAgICAgfSk7CiAgICAgICAgLy8gT25seSByd2FkbWluIGNhbiBhbHRlciByd2FkbWluLgogICAgICAgIGFwcGx5KCJyd2FkbWluIiwgY3VyLCBwcmV2LCBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAiQUxURVIgVVNFUiByd2FkbWluIFdJVEggUEFTU1dPUkQgJyIgKyBlc2MgKyAiJyIKICAgICAgICB9KTsKICAgICAgICB0cnkgewogICAgICAgICAgICBGaWxlcy53cml0ZVN0cmluZyhQYXRoLm9mKFNUQVRFKSwgY3VyKTsKICAgICAgICAgICAgRmlsZXMuc2V0UG9zaXhGaWxlUGVybWlzc2lvbnMoUGF0aC5vZihTVEFURSksIFBvc2l4RmlsZVBlcm1pc3Npb25zLmZyb21TdHJpbmcoInJ3LS0tLS0tLSIpKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltib290c3RyYXBdIHdhcm46IGNvdWxkIG5vdCBwZXJzaXN0IHN0YXRlOiAiICsgZSk7CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW2Jvb3RzdHJhcF0gcGFzc3dvcmRzIGVuZm9yY2VkIGZvciByb290LCBwb3N0Z3JlcywgcndhZG1pbiIpOwogICAgfQoKICAgIHN0YXRpYyB2b2lkIGFwcGx5KFN0cmluZyB1c2VyLCBTdHJpbmcgY3VyLCBTdHJpbmcgcHJldiwgU3RyaW5nW10gc3RtdHMpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIFN0cmluZ1tdIGNhbmRpZGF0ZXMgPSAocHJldiA9PSBudWxsIHx8IHByZXYuZXF1YWxzKGN1cikpCiAgICAgICAgICAgID8gbmV3IFN0cmluZ1tdIHsgY3VyIH0gOiBuZXcgU3RyaW5nW10geyBjdXIsIHByZXYgfTsKICAgICAgICBTUUxFeGNlcHRpb24gbGFzdCA9IG51bGw7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2MDsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoU3RyaW5nIGNhbmQgOiBjYW5kaWRhdGVzKSB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICAgICAgICAgcC5zZXRQcm9wZXJ0eSgidXNlciIsIHVzZXIpOwogICAgICAgICAgICAgICAgcC5zZXRQcm9wZXJ0eSgicGFzc3dvcmQiLCBjYW5kKTsKICAgICAgICAgICAgICAgIHAuc2V0UHJvcGVydHkoImNvbm5lY3RUaW1lb3V0IiwgIjUiKTsKICAgICAgICAgICAgICAgIHAuc2V0UHJvcGVydHkoImxvZ2luVGltZW91dCIsICI1Iik7CiAgICAgICAgICAgICAgICBwLnNldFByb3BlcnR5KCJwcmVmZXJRdWVyeU1vZGUiLCAic2ltcGxlIik7CiAgICAgICAgICAgICAgICB0cnkgKENvbm5lY3Rpb24gYyA9IERyaXZlck1hbmFnZXIuZ2V0Q29ubmVjdGlvbigiamRiYzpwb3N0Z3Jlc3FsOi8vMTI3LjAuMC4xOjQ1NjYvZGV2IiwgcCk7CiAgICAgICAgICAgICAgICAgICAgIFN0YXRlbWVudCBzID0gYy5jcmVhdGVTdGF0ZW1lbnQoKSkgewogICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHEgOiBzdG10cykgcy5leGVjdXRlKHEpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOwogICAgICAgIH0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltib290c3RyYXBdIEZBSUxFRCBmb3IgIiArIHVzZXIgKyAiOiAiICsgbGFzdCk7CiAgICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICB9Cn0K\" | base64 -d > /tmp/Bootstrap.java && echo \"aW1wb3J0IGJhc2U2NAppbXBvcnQgaG1hYwppbXBvcnQgaHR0cC5jbGllbnQKaW1wb3J0IG9zCmltcG9ydCBzb2NrZXQKaW1wb3J0IHN5cwpmcm9tIGh0dHAuc2VydmVyIGltcG9ydCBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyLCBUaHJlYWRpbmdIVFRQU2VydmVyCgojIEJhc2ljLWF1dGggcmV2ZXJzZSBwcm94eSBmb3IgUmlzaW5nV2F2ZSdzIGRhc2hib2FyZCAoMTI3LjAuMC4xOjU2OTEpLCBwYXJ0CiMgb2YgdGhlIFJpc2luZ1dhdmUgUmFpbHdheSB0ZW1wbGF0ZS4gVGhlIGRhc2hib2FyZCBpdHNlbGYgaGFzIG5vIGF1dGggYW5kIHRoZQojIG1ldGEgbm9kZSBoYXJkY29kZXMgaXRzIGJpbmQgaW4gc2luZ2xlX25vZGUgbW9kZSwgc28gdGhpcyBzaXRzIGluIGZyb250OgojIHVzZXJuYW1lICRSV19EQVNIQk9BUkRfVVNFUiwgcGFzc3dvcmQgJFJXX0RBU0hCT0FSRF9QQVNTV09SRCAoaXRzIG93bgojIGdlbmVyYXRlZCBzZWNyZXQsIGRlbGliZXJhdGVseSBzZXBhcmF0ZSBmcm9tIHRoZSBTUUwgcGFzc3dvcmQpLiBGYWlsLWNsb3NlZDoKIyBhbiB1bnNldCBwYXNzd29yZCBkZW5pZXMgZXZlcnkgcmVxdWVzdCBleGNlcHQgL2FwaS92ZXJzaW9uLCB3aGljaCBzdGF5cyBvcGVuCiMgc28gUmFpbHdheSdzIGhlYWx0aGNoZWNrIHBhc3NlcyB3aXRob3V0IGNyZWRlbnRpYWxzOyBpdCByZXR1cm5zIG9ubHkgYQojIHZlcnNpb24gc3RyaW5nLgpVUFNUUkVBTSA9ICgiMTI3LjAuMC4xIiwgNTY5MSkKUE9SVCA9IGludChvcy5lbnZpcm9uLmdldCgiUE9SVCIsICI4MDgwIikpClVTRVIgPSBvcy5lbnZpcm9uLmdldCgiUldfREFTSEJPQVJEX1VTRVIiLCAiIikgb3IgInJvb3QiClBXID0gb3MuZW52aXJvbi5nZXQoIlJXX0RBU0hCT0FSRF9QQVNTV09SRCIsICIiKQpPUEVOX1BBVEhTID0geyIvYXBpL3ZlcnNpb24ifQpIT1AgPSB7ImNvbm5lY3Rpb24iLCAia2VlcC1hbGl2ZSIsICJwcm94eS1hdXRoZW50aWNhdGUiLCAicHJveHktYXV0aG9yaXphdGlvbiIsCiAgICAgICAidGUiLCAidHJhaWxlcnMiLCAidHJhbnNmZXItZW5jb2RpbmciLCAidXBncmFkZSIsICJob3N0IiwgImF1dGhvcml6YXRpb24ifQoKCmNsYXNzIEhhbmRsZXIoQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CiAgICBwcm90b2NvbF92ZXJzaW9uID0gIkhUVFAvMS4xIgoKICAgIGRlZiBfYXV0aGVkKHNlbGYpOgogICAgICAgIGlmIG5vdCBQVzoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgaCA9IHNlbGYuaGVhZGVycy5nZXQoIkF1dGhvcml6YXRpb24iLCAiIikKICAgICAgICBpZiBub3QgaC5zdGFydHN3aXRoKCJCYXNpYyAiKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjcmVkID0gYmFzZTY0LmI2NGRlY29kZShoWzY6XSwgdmFsaWRhdGU9VHJ1ZSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIENvbXBhcmUgYXMgQllURVMuIGNvbXBhcmVfZGlnZXN0IHJlZnVzZXMgbm9uLUFTQ0lJIHN0ciBhbmQgcmFpc2VzCiAgICAgICAgIyBUeXBlRXJyb3IsIHdoaWNoIHdvdWxkIGVzY2FwZSB0aGlzIGhhbmRsZXIgYW5kIGRyb3AgdGhlIGNvbm5lY3Rpb24KICAgICAgICAjIGluc3RlYWQgb2YgcmV0dXJuaW5nIDQwMSAtIHRyaWdnZXJhYmxlIGJ5IGFueSBjbGllbnQgc2VuZGluZyBhCiAgICAgICAgIyBub24tQVNDSUkgQXV0aG9yaXphdGlvbiBoZWFkZXIsIGFuZCBhIHNpbGVudCBsb2Nrb3V0IGZvciBhbnlvbmUgd2hvCiAgICAgICAgIyBzZXRzIGEgbm9uLUFTQ0lJIFJXX0RBU0hCT0FSRF9VU0VSLgogICAgICAgIHRyeToKICAgICAgICAgICAgZXhwZWN0ID0gKFVTRVIgKyAiOiIgKyBQVykuZW5jb2RlKCJ1dGYtOCIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIGhtYWMuY29tcGFyZV9kaWdlc3QoY3JlZCwgZXhwZWN0KQoKICAgIGRlZiBfcHJveHkoc2VsZik6CiAgICAgICAgcGF0aCA9IHNlbGYucGF0aC5zcGxpdCgiPyIsIDEpWzBdCiAgICAgICAgaWYgcGF0aCBub3QgaW4gT1BFTl9QQVRIUyBhbmQgbm90IHNlbGYuX2F1dGhlZCgpOgogICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoNDAxKQogICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwgJ0Jhc2ljIHJlYWxtPSJSaXNpbmdXYXZlIERhc2hib2FyZCInKQogICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LUxlbmd0aCIsICIwIikKICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIHRyeToKICAgICAgICAgICAgbiA9IGludChzZWxmLmhlYWRlcnMuZ2V0KCJDb250ZW50LUxlbmd0aCIpIG9yIDApCiAgICAgICAgICAgIGJvZHkgPSBzZWxmLnJmaWxlLnJlYWQobikgaWYgbiBlbHNlIE5vbmUKICAgICAgICAgICAgdXAgPSBodHRwLmNsaWVudC5IVFRQQ29ubmVjdGlvbigqVVBTVFJFQU0sIHRpbWVvdXQ9MzApCiAgICAgICAgICAgIGhkcnMgPSB7azogdiBmb3IgaywgdiBpbiBzZWxmLmhlYWRlcnMuaXRlbXMoKSBpZiBrLmxvd2VyKCkgbm90IGluIEhPUH0KICAgICAgICAgICAgdXAucmVxdWVzdChzZWxmLmNvbW1hbmQsIHNlbGYucGF0aCwgYm9keT1ib2R5LCBoZWFkZXJzPWhkcnMpCiAgICAgICAgICAgIHIgPSB1cC5nZXRyZXNwb25zZSgpCiAgICAgICAgICAgIGRhdGEgPSByLnJlYWQoKQogICAgICAgICAgICB1cC5jbG9zZSgpCiAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZShyLnN0YXR1cykKICAgICAgICAgICAgZm9yIGssIHYgaW4gci5nZXRoZWFkZXJzKCk6CiAgICAgICAgICAgICAgICBpZiBrLmxvd2VyKCkgaW4gSE9QIG9yIGsubG93ZXIoKSA9PSAiY29udGVudC1sZW5ndGgiOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKGssIHYpCiAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgc3RyKGxlbihkYXRhKSkpCiAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQogICAgICAgICAgICBpZiBzZWxmLmNvbW1hbmQgIT0gIkhFQUQiOgogICAgICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZShkYXRhKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIG1zZyA9IGIiZGFzaGJvYXJkIHVwc3RyZWFtIHVuYXZhaWxhYmxlIgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoNTAzKQogICAgICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBzdHIobGVuKG1zZykpKQogICAgICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCiAgICAgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKG1zZykKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICBkb19HRVQgPSBkb19QT1NUID0gZG9fUFVUID0gZG9fREVMRVRFID0gZG9fUEFUQ0ggPSBkb19IRUFEID0gX3Byb3h5CgogICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsIGZtdCwgKmFyZ3MpOgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIltkYXNocHJveHldICIgKyAoZm10ICUgYXJncykgKyAiXG4iKQoKCmNsYXNzIER1YWxTdGFja1NlcnZlcihUaHJlYWRpbmdIVFRQU2VydmVyKToKICAgIGFkZHJlc3NfZmFtaWx5ID0gc29ja2V0LkFGX0lORVQ2ICAjICI6OiIgYWNjZXB0cyBJUHY0LW1hcHBlZCB0b28gKExpbnV4IGRlZmF1bHQpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHNydiA9IER1YWxTdGFja1NlcnZlcigoIjo6IiwgUE9SVCksIEhhbmRsZXIpCiAgICBwcmludChmIltkYXNocHJveHldIGxpc3RlbmluZyBvbiBbOjpdOntQT1JUfSAtPiAxMjcuMC4wLjE6NTY5MSIsIGZsdXNoPVRydWUpCiAgICBzcnYuc2VydmVfZm9yZXZlcigpCg==\" | base64 -d > /tmp/dashproxy.py && (java -cp \"/risingwave/bin/connector-node/libs/*\" /tmp/Bootstrap.java &) ; (python3 /tmp/dashproxy.py &) ; exec /risingwave/bin/risingwave single_node --config-path /tmp/risingwave.toml --total-memory-bytes \"$RW_TOTAL_MEMORY_BYTES\" --parallelism \"$RW_PARALLELISM\"'",
                    "healthcheckPath": "/api/version",
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "risingwavelabs/risingwave:v3.0.3"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "[Do not change] Port of the dashboard's authenticating proxy. Railway's public domain and healthcheck both point here.",
                      "defaultValue": "8080"
                    },
                    "RW_PASSWORD": {
                      "description": "Password for the root, postgres and rwadmin database users, auto-generated and applied automatically on every deployment (To change passwords, change this value and redeploy).",
                      "defaultValue": "{{RW_PASSWORD}}"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "[Do not change] Connection string for other services in this project, over the private network.",
                      "defaultValue": "postgresql://root:${{RW_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:4566/dev"
                    },
                    "RW_LISTEN_ADDR": {
                      "isOptional": false,
                      "description": "[Do not change] SQL port bind.",
                      "defaultValue": "[::]:4566"
                    },
                    "RW_PARALLELISM": {
                      "isOptional": false,
                      "description": "How many parallel actors each streaming job runs. 4 suits small and medium workloads;",
                      "defaultValue": "4"
                    },
                    "ENABLE_TELEMETRY": {
                      "isOptional": true,
                      "description": "Set to true to share anonymous usage statistics with RisingWave Labs.",
                      "defaultValue": "false"
                    },
                    "RW_DASHBOARD_USER": {
                      "isOptional": true,
                      "description": "Username for the web dashboard login. Clearing it falls back to root.",
                      "defaultValue": "root"
                    },
                    "DATABASE_PUBLIC_URL": {
                      "isOptional": false,
                      "description": "[Do not change] Connection string from outside Railway (psql, BI tools etc). Credentials are included.",
                      "defaultValue": "postgresql://root:${{RW_PASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}/dev"
                    },
                    "RW_DASHBOARD_PASSWORD": {
                      "description": "Password for the web dashboard at your public URL. Different from the database password; Changing it takes effect on the next redeploy.",
                      "defaultValue": "{{RW_DASHBOARD_PASSWORD}}"
                    },
                    "RW_TOTAL_MEMORY_BYTES": {
                      "isOptional": false,
                      "description": "Memory budget in bytes (default 8 GiB, the documented minimum).",
                      "defaultValue": "8589934592"
                    },
                    "RW_SINGLE_NODE_STORE_DIRECTORY": {
                      "isOptional": false,
                      "description": "[Do not change] Where data gets stored on the Volume.",
                      "defaultValue": "/var/lib/risingwave"
                    },
                    "RW_SECRET_STORE_PRIVATE_KEY_HEX": {
                      "isOptional": false,
                      "description": "Encrypts credentials you store with CREATE SECRET.",
                      "defaultValue": "{{RW_SECRET_STORE_PRIVATE_KEY_HEX}}"
                    }
                  },
                  "networking": {
                    "tcpProxies": {
                      "4566": {}
                    },
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  },
                  "volumeMounts": {
                    "b10e6206-781e-47ea-94fe-c9b112bcf693": {
                      "mountPath": "/var/lib/risingwave"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "RisingWave",
      "method": "GET",
      "path": "/api/version",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 1,
    "needs_volume": true
  },
  "generated_at": "2026-09-20T16:14:49.616Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-19T17:56:03.876Z",
  "success_rate_30d": 0,
  "validation": {
    "last_run_id": "run_7fe42a7477804ab9a976",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": false,
        "detail": "FAILED"
      }
    ]
  }
}
