PageSourceSearch

https://docs.redstone.finance/assets/js/69ae8935.79132263.js

js redstone.finance collected 2026-09-25 04:27:17 UTC 10,867 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkredstone_docs||=[]).push([[4207],{9759(e,n,t){t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>a});const r=JSON.parse('{"id":"technical-reference/data-providers/deploy","title":"Deploy","description":"In this section, you will see how to run a RedStone node using Docker Compose.","source":"@site/docs/technical-reference/data-providers/deploy.md","sourceDirName":"technical-reference/data-providers","slug":"/technical-reference/data-providers/deploy","permalink":"/docs/technical-reference/data-providers/deploy","draft":false,"unlisted":false,"editUrl":"https://github.com/redstone-finance/redstone-docs/tree/main/docs/technical-reference/data-providers/deploy.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"sidebar_label":"Deploy"},"sidebar":"tutorialSidebar","previous":{"title":"Introduction","permalink":"/docs/technical-reference/data-providers/introduction"},"next":{"title":"Best practices","permalink":"/docs/technical-reference/data-providers/best-practices"}}');var s=t(4848),i=t(8453);const o={sidebar_position:2,sidebar_label:"Deploy"},d="Deploy",c={},a=[{value:"Requirements",id:"requirements",level:3},{value:"Docker Compose Example",id:"docker-compose-example",level:3},{value:"Services",id:"services",level:3},{value:"RedsStone KMS (Key Management Service)",id:"redsstone-kms-key-management-service",level:4},{value:"RedStone Node",id:"redstone-node",level:4}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"deploy",children:"Deploy"})}),"\n",(0,s.jsx)(n.p,{children:"In this section, you will see how to run a RedStone node using Docker Compose."}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsx)(n.p,{children:"For production deployments consider using more sophisticated tools, e.g. Kubernetes."})}),"\n",(0,s.jsx)(n.h3,{id:"requirements",children:"Requirements"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Reliable Internet connection"}),"\n",(0,s.jsx)(n.li,{children:"2CPU, 2GB RAM"}),"\n",(0,s.jsx)(n.li,{children:"At least 30 GB of storage (mainly for logs)"}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"})," and ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"})]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"The hardware requirements for running a RedStone node are quite low, but you should reserve a healthy margin. The more resources you spare when provisioning your machine, the better it will perform and the less likely it will be to run into issues."})}),"\n",(0,s.jsx)(n.h3,{id:"docker-compose-example",children:"Docker Compose Example"}),"\n",(0,s.jsxs)(n.p,{children:["Here's a simple example of a ",(0,s.jsx)(n.code,{children:"docker-compose.yml"})," file that you can use to run the RedStone oracle node locally. Copy this configuration and adjust it to your needs."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'services:\n  redstone-oracle-node:\n    image: public.ecr.aws/y7v2w8b2/redstone-oracle-node@sha256:07eb1cc4aa3a4f0275c2ef5c2f9a95af06150e35211e20f66f9b24ab1c05cef7\n    restart: always\n    depends_on:\n      - redstone-kms\n    networks:\n      - public_network\n      - private_network\n    volumes:\n      - redstone-oracle-node:/oracle-node-level-db\n    environment:\n      OVERRIDE_DIRECT_CACHE_SERVICE_URLS: \'["https://httpbin.org/anything"]\'\n      OVERRIDE_MANIFEST_USING_FILE: ./manifests/dev/dev.json\n      PRICE_CACHE_LOCATION: /oracle-node-level-db\n      REMOTE_SIGNER_URL: http://redstone-kms:4499\n      ENABLE_REMOTE_SIGNER: true\n\n  redstone-kms:\n    restart: always\n    image: public.ecr.aws/y7v2w8b2/kms@sha256:d069bc9afcd1b4e6884e2d4e530d90c94db0aaf1a2265d7facb4f4e2d2fefb3d\n    networks:\n      - private_network\n    expose:\n      - "4499"\n    environment:\n      KMS_PRIVATE_KEY_FILE: /run/secrets/private_key\n    secrets:\n      - private_key\n\nsecrets:\n  private_key:\n    file: private_key.txt\n\nvolumes:\n  redstone-oracle-node:\n\nnetworks:\n  public_network:\n    driver: bridge\n  private_network:\n    internal: true # This ensures the network is private\n'})}),"\n",(0,s.jsx)(n.h3,{id:"services",children:"Services"}),"\n",(0,s.jsx)(n.h4,{id:"redsstone-kms-key-management-service",children:"RedsStone KMS (Key Management Service)"}),"\n",(0,s.jsxs)(n.p,{children:["RedStone KMS' sole purpose is to handle all operations on your private key. It signs the data fetched by the oracle node and returns the evm address. This should be the only service that has access to your private key. Use the ",(0,s.jsx)(n.a,{href:"https://gallery.ecr.aws/y7v2w8b2/kms",children:"RedStone KMS"})," Docker image."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Param"}),(0,s.jsx)(n.th,{children:"Description"}),(0,s.jsx)(n.th,{children:"Example value"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"KMS_PRIVATE_KEY_FILE"})}),(0,s.jsx)(n.td,{children:"Path to the file with your private key. The file should contain a single line with your private key."}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"KMS_PRIVATE_KEY_FILE=/run/secrets/private_key"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"KMS_PRIVATE_KEY"})}),(0,s.jsx)(n.td,{children:"Hex encoded key. Alternative way of passing the key"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"KMS_PRIVATE_KEY=0xYOUR_PRIVATE_KEY"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"KMS_ADDRESS"})}),(0,s.jsx)(n.td,{children:"Bind address"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"KMS_ADDRESS=0.0.0.0:4499"})})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"redstone-node",children:"RedStone Node"}),"\n",(0,s.jsx)(n.p,{children:"RedStone oracle node will fetch data from main public APIs, sign them with your private keys and broadcast to the RedStone Data Distribution Layer (DDL).\nIt should be configured using environment variables."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Param"}),(0,s.jsx)(n.th,{children:"Description"}),(0,s.jsx)(n.th,{children:"Example value"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"ENABLE_REMOTE_SIGNER"})}),(0,s.jsx)(n.td,{children:"Delegate signing to a remote signer. Only this image has access to your ECDSA private key"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ENABLE_REMOTE_SIGNER=true"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"REMOTE_SIGNER_URL"}),(0,s.jsxs)(n.td,{children:["This is where Redstone's signer is listening. We recommend using a colocation e.g. in Kubernetes oracle-node and signer should be run in the same POD. By default ",(0,s.jsx)(n.code,{children:"http://localhost:4499"}),".key"]}
1),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"REMOTE_SIGNER_URL=http://localhost:4499"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"OVERRIDE_DIRECT_CACHE_SERVICE_URLS"})}),(0,s.jsxs)(n.td,{children:["Your personal private URLs of gateways to the RedStone Data Distribution Layer (DDL). For running a local node you can simply put ",(0,s.jsx)(n.code,{children:'OVERRIDE_DIRECT_CACHE_SERVICE_URLS=["https://httpbin.org/anything"]'}),". But for production node running you should ",(0,s.jsx)(n.a,{href:"https://redstone.finance/discord",children:"request them"})," from the RedStone team."]}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:'OVERRIDE_DIRECT_CACHE_SERVICE_URLS=["https://xxx.yyy.secret-url-1.com","https://zzz.aaa.secret-url-2.com"]'})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"OVERRIDE_MANIFEST_USING_FILE"})}),(0,s.jsxs)(n.td,{children:["Path to your manifest file. Manifest is a public JSON file that defines the provider's obligation regarding the data that they provide. It sets fetching interval, tokens, sources and other public technical details for the provided data. You can check available manifests ",(0,s.jsx)(n.a,{href:"https://github.com/redstone-finance/redstone-oracles-monorepo/tree/main/packages/oracle-node/manifests",children:"here."})]}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"OVERRIDE_MANIFEST_USING_FILE=./manifests/dev/dev.json"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"PRICE_CACHE_LOCATION"})}),(0,s.jsxs)(n.td,{children:["Path to the local price cache. Each RedStone oracle node relies on a simple file-based prices cache. It is used to store recently fetched values from the last 15 minutes. These values are used for checking value deviations, filtering outliers and preventing price manipulation attacks. ",(0,s.jsx)("br",{}),(0,s.jsx)("br",{})," You don't need to create a Level DB instance manually, it will be created automatically at the specified path during the first node launch."]}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"PRICE_CACHE_LOCATION=/oracle-node-level-db"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"ENABLE_REMOTE_SIGNER"})}),(0,s.jsx)(n.td,{children:"Switch on signing with RedStone KMS"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ENABLE_REMOTE_SIGNER=true"})})]})]})]}),"\n",(0,s.jsx)(n.admonition,{title:"Custom local manifest",type:"tip",children:(0,s.jsxs)(n.p,{children:["If you want to run oracle-node from Docker with your custom manifest you should ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/storage/bind-mounts/",children:"mount the manifest file"})," from your local system to the docker container and update the ",(0,s.jsx)(n.code,{children:"OVERRIDE_MANIFEST_USING_FILE"})," env variable."]})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453(e,n,t){t.d(n,{R:()=>o,x:()=>d});var r=t(6540);const s={},i=r.createContext(s);function o(e){const n=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.