From 112c26bccf308de8a12914018618f894be1844db Mon Sep 17 00:00:00 2001 From: Mihai Badea Date: Fri, 16 Jun 2023 13:55:15 +0000 Subject: [PATCH] GITBOOK-526: change request with no subject merged in GitBook --- .gitbook/assets/Raw-URL.png | Bin 0 -> 41105 bytes infrastructure/deploying-provider.md | 349 ++++++++++++++++++++++----- user-guides/asset-hosting/github.md | 2 + 3 files changed, 295 insertions(+), 56 deletions(-) create mode 100644 .gitbook/assets/Raw-URL.png diff --git a/.gitbook/assets/Raw-URL.png b/.gitbook/assets/Raw-URL.png new file mode 100644 index 0000000000000000000000000000000000000000..f271309065f1f497335c364e0d0941911354bde1 GIT binary patch literal 41105 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 F{Rb+3`kMd% literal 0 HcmV?d00001 diff --git a/infrastructure/deploying-provider.md b/infrastructure/deploying-provider.md index 77764b9e..14cb8d58 100644 --- a/infrastructure/deploying-provider.md +++ b/infrastructure/deploying-provider.md @@ -2,88 +2,325 @@ ### About Provider -Provider encrypts the URL and metadata during publish and decrypts the URL when the dataset is downloaded or a compute job is started. -It enables the access to data assets by streaming data (and never the URL). -It performs checks on chain for buyer permissions and payments. It also Provides compute services (connects to C2D environment). -It is a multichain component, meaning that with the proper configurations it can handle these tasks on multiple chains. -The source code of Provider can be access from [here](https://github.com/oceanprotocol/provider). +Provider encrypts the URL and metadata during publishing and decrypts the URL when the dataset is downloaded or a compute job is started. It enables access to the data assets by streaming data (and never the URL). It performs checks on-chain for buyer permissions and payments. It also provides compute services (connects to a C2D environment). + +Provider is a multichain component, meaning that it can handle these tasks on multiple chains with the proper configurations. The source code of Provider can be accessed from [here](https://github.com/oceanprotocol/provider). + +As mentioned in the Setup a Server document, all Ocean components can be deployed in two types of configurations: simple, based on Docker Engine and Docker Compose, and complex, based on Kubernetes with Docker Engine. In this document, we will present how to deploy Provider in each of these configurations. + + + +## Deploying Provider using Docker Engine and Docker Compose + +In this guide, we will deploy Provider for two chains: Goerli (Ethereum test network) and Mumbai (Polygon test network). Therefore, please note that in the following configuration files, "5" and "80001" are the chain IDs for Goerli and Mumbai respectively. + + ### Prerequisites -* Docker and Docker compose are installed. Click [here](https://docs.docker.com/engine/install/) to view guide on installing docker. -* [Obtain an API key](../ocean-libraries/configuration.md#obtaining-api-key-for-ethereum-node-provider) +* A server for hosting Ocean Marketplace. See [this guide](setup-server.md) for how to create a server; +* Docker Compose and Docker Engine are installed and configured on the server. See [this guide](setup-server.md#install-docker-engine-and-docker-compose) for how to install these products. +* The RPC URLs and API keys for each of the networks to which the Provider will be connected. See this guide for how to obtain the URL and the API key. +* The private key which will be used by Provider to encrypt/decrypt URLs. -### Create a working directory +### Steps -``` -mkdir Provider -cd Provider -``` +The steps to deploy the Provider using Docker Engine and Docker Compose are: -### Create a \`.env\` file +1. [Create the /etc/docker/compose/provider/docker-compose.yml file](deploying-provider.md#1.-create-the-etc-docker-compose-provider-docker-compose.yml-file) +2. [Create the /etc/systemd/system/docker-compose@provider.service file](deploying-provider.md#2.-create-the-etc-systemd-system-docker-compose-provider.service-file) +3. [Reload the systemd manager configuration](deploying-provider.md#3.-reload-the-systemd-manager-configuration) +4. [Start the Provider service](deploying-provider.md#4.-start-the-provider-service) +5. [Check the service's status](deploying-provider.md#5.-check-the-services-status) +6. [Confirm the Provider is accessible](deploying-provider.md#6.-confirm-the-provider-is-accessible) +7. [Check Provider service logs](deploying-provider.md#7.-check-provider-service-logs) -Copy the below content into the \`.env\` file and edit the values as needed. -{% code title=".env" %} -``` -# Mandatory variables -# Update the value to the appropriate tag from here: https://hub.docker.com/r/oceanprotocol/provider-py/tags -PROVIDER_VERSION=latest -PROVIDER_PRIVATE_KEY= -NETWORK_URL= -AQUARIUS_URL= -``` -{% endcode %} +#### 1. Create the /etc/docker/compose/provider/docker-compose.yml file -### Create docker-compose file +From a terminal console, create /etc/docker/compose/provider/docker-compose.yml file, the copy and paste the following content to it. Check the comments in the file and replace the fields with the specific values of your implementation. -{% hint style="info" %} -Set the value of OCEAN\_PROVIDER\_WORKERS to 2 or more to avoid a race condition when provider checks whether it should call a remote provider or not. -{% endhint %} - -{% code title="docker-compose.provider.yml" %} ```yaml version: '3' services: provider: - image: oceanprotocol/provider-py:v1.0.20 + image: oceanprotocol/provider-py:latest =>(check on https://hub.docker.com/r/oceanprotocol/provider-py for specific tag) container_name: provider + restart: on-failure ports: - 8030:8030 networks: - - ocean_backend + backend: environment: - # the NETWORK_URL and PROVIDER_PRIVATE_KEY settings can be defined for multiple chains - # as the JSON encoding e.g. {"chain_id1": "network_url_1", "chain_id2": "network_url_2"} - NETWORK_URL: '{"8996": "${NETWORK_URL}"}' - PROVIDER_PRIVATE_KEY: '{"8996": "${PROVIDER_PRIVATE_KEY}"}' - # defines the key to use where no chain id is applicable (e.g. for auth tokens) - UNIVERSAL_PRIVATE_KEY: ${PROVIDER_PRIVATE_KEY} + ARTIFACTS_PATH: "/ocean-contracts/artifacts" + NETWORK_URL: '{"5":"https://goerli.infura.io/v3/","80001":"https://polygon-mumbai.infura.io/v3/"}' + PROVIDER_PRIVATE_KEY: '{"5":"","80001":"" OCEAN_PROVIDER_TIMEOUT: "9000" - # Defining OPERATOR_SERVICE_URL is optional. Set the value only if Provider should support Compute-to-data. - OPERATOR_SERVICE_URL: "" - # Defining IPFS_GATEWAY is optional. Set the value if Provider should support resolving IPFS urls. - IPFS_GATEWAY: "" - AQUARIUS_URL: ${AQUARIUS_URL} -volumes: - data: - driver: local + OPERATOR_SERVICE_URL: "https://stagev4.c2d.oceanprotocol.com" => (use custom value for Operator Service URL) + AQUARIUS_URL: "http//localhost:5000" => (use custom value Aquarius URL) + REQUEST_TIMEOUT: "10" networks: - ocean_backend: + backend: driver: bridge ``` -{% endcode %} -### Start Provider + + +#### 2. Create the _/etc/systemd/system/docker-compose@provider.service_ file + +Create the _/etc/systemd/system/docker-compose@provider.service_ file then copy and paste the following content to it. This example file could be customized if needed. ``` -docker-compose \ --f docker-compose.provider.yml ---env-file .env \ --d \ -up +[Unit] +Description=%i service with docker compose +Requires=docker.service +After=docker.service + +[Service] +Type=oneshot +RemainAfterExit=true +Environment="PROJECT=ocean" +WorkingDirectory=/etc/docker/compose/%i +ExecStartPre=/usr/bin/env docker-compose -p $PROJECT pull +ExecStart=/usr/bin/env docker-compose -p $PROJECT up -d +ExecStop=/usr/bin/env docker-compose -p $PROJECT stop + + +[Install] +WantedBy=multi-user.target ``` + + + +#### 3. Reload the systemd manager configuration + +Run the following command to reload the systemd manager configuration + +```bash +sudo systemctl daemon-reload +``` + +Optionally, you can enable the services to start at boot, using the following command: + +```bash +sudo systemctl enable docker-compose@provider.service +``` + + + +#### 4. Start the Provider service + +```bash +sudo systemctl start docker-compose@provider.service +``` + + + +#### 5. Check the service's status + +Check the status of the service by running the following command. The output of the command should be similar to the one presented here. + +```bash +$ sudo systemctl status docker-compose@provider.service +● docker-compose@provider.service - provider service with docker compose + Loaded: loaded (/etc/systemd/system/docker-compose@provider.service; disabled; vendor preset: enabled) + Active: active (exited) since Wed 2023-06-14 09:41:53 UTC; 20s ago + Process: 4118 ExecStartPre=/usr/bin/env docker-compose -p $PROJECT pull (code=exited, status=0/SUCCESS) + Process: 4126 ExecStart=/usr/bin/env docker-compose -p $PROJECT up -d (code=exited, status=0/SUCCESS) + Main PID: 4126 (code=exited, status=0/SUCCESS) + CPU: 93ms + +Jun 14 09:41:52 testvm systemd[1]: Starting provider service with docker compose... +Jun 14 09:41:52 testvm env[4118]: provider Pulling +Jun 14 09:41:53 testvm env[4118]: provider Pulled +Jun 14 09:41:53 testvm env[4126]: Container provider Created +Jun 14 09:41:53 testvm env[4126]: Container provider Starting +Jun 14 09:41:53 testvm env[4126]: Container provider Started +Jun 14 09:41:53 testvm systemd[1]: Finished provider service with docker compose. +``` + + + +#### 6. Confirm the Provider is accessible + +Once started, the Provider service is accessible on `localhost` port 8030/tcp. Run the following command to access the Provider. The output should be similar to the one displayed here. + +```bash +$ curl localhost:8030 +{"chainIds":[5,80001],"providerAddresses":{"5":"0x00c6A0BC5cD0078d6Cd0b659E8061B404cfa5704","80001":"0x4256Df50c94D9a7e04610976cde01aED91eB531E"},"serviceEndpoints":{"computeDelete":["DELETE","/api/services/compute"],"computeEnvironments":["GET","/api/services/computeEnvironments"],"computeResult":["GET","/api/services/computeResult"],"computeStart":["POST","/api/services/compute"],"computeStatus":["GET","/api/services/compute"],"computeStop":["PUT","/api/services/compute"],"create_auth_token":["GET","/api/services/createAuthToken"],"decrypt":["POST","/api/services/decrypt"],"delete_auth_token":["DELETE","/api/services/deleteAuthToken"],"download":["GET","/api/services/download"],"encrypt":["POST","/api/services/encrypt"],"fileinfo":["POST","/api/services/fileinfo"],"initialize":["GET","/api/services/initialize"],"initializeCompute":["POST","/api/services/initializeCompute"],"nonce":["GET","/api/services/nonce"],"validateContainer":["POST","/api/services/validateContainer"]},"software":"Provider","version":"2.0.2"} +``` + + + +#### 7. Check Provider service logs + +If needed, use docker CLI to check provider service logs. + +First, identify the container id: + +```bash +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +594415b13f8c oceanprotocol/provider-py:v2.0.2 "/ocean-provider/doc…" 12 minutes ago Up About a minute 0.0.0.0:8030->8030/tcp, :::8030->8030/tcp provider + +``` + +Then, check the logs from the Provider's docker container + +```bash +$ docker logs --follow provider +[2023-06-14 09:31:02 +0000] [8] [INFO] Starting gunicorn 20.0.4 +[2023-06-14 09:31:02 +0000] [8] [INFO] Listening at: http://0.0.0.0:8030 (8) +[2023-06-14 09:31:02 +0000] [8] [INFO] Using worker: sync +[2023-06-14 09:31:02 +0000] [10] [INFO] Booting worker with pid: 10 +2023-06-14 09:31:02 594415b13f8c rlp.codec[10] DEBUG Consider installing rusty-rlp to improve pyrlp performance with a rust based backend +2023-06-14 09:31:12 594415b13f8c ocean_provider.run[10] INFO incoming request = http, GET, 172.18.0.1, /? +2023-06-14 09:31:12 594415b13f8c ocean_provider.run[10] INFO root endpoint called +2023-06-14 09:31:12 594415b13f8c ocean_provider.run[10] INFO root endpoint response = +[2023-06-14 09:41:53 +0000] [8] [INFO] Starting gunicorn 20.0.4 +[2023-06-14 09:41:53 +0000] [8] [INFO] Listening at: http://0.0.0.0:8030 (8) +[2023-06-14 09:41:53 +0000] [8] [INFO] Using worker: sync +[2023-06-14 09:41:53 +0000] [10] [INFO] Booting worker with pid: 10 +2023-06-14 09:41:54 594415b13f8c rlp.codec[10] DEBUG Consider installing rusty-rlp to improve pyrlp performance with a rust based backend +2023-06-14 09:42:40 594415b13f8c ocean_provider.run[10] INFO incoming request = http, GET, 172.18.0.1, /? +2023-06-14 09:42:40 594415b13f8c ocean_provider.run[10] INFO root endpoint called +2023-06-14 09:42:40 594415b13f8c ocean_provider.run[10] INFO root endpoint response = + +``` + + + +## Deploying Provider using Kubernetes with Docker Engine + + + +In this example, we will run Provider as a Kubernetes deployment resource. We will deploy Provider for two chains: Goerli (Ethereum test network) and Mumbai (Polygon test network). Therefore, please note that in the following configuration files, "5" and "80001" are the chain IDs for Goerli and Mumbai respectively. + +### Prerequisites + +* A server for hosting Ocean Marketplace. See [this guide](setup-server.md) for how to create a server; +* Kubernetes with Docker Engine is installed and configured on the server. See [this chapter](setup-server.md#install-kubernetes-with-docker-engine) for information on installing Kubernetes. +* The RPC URLs and API keys for each of the networks to which the Provider will be connected. See this guide for how to obtain the URL and the API key. +* The private key which will be used by Provider to encrypt/decrypt URLs. +* Aquarius is up and running + +### Steps + +The steps to deploy the Provider in Kubernetes are: + +1\. + +2\. + + + + + + + +1. Create an YAML file for Provider configuration. + +From a terminal window, create a YAML file (in our example the file is named provider-deploy.yaml) then copy and paste the following content. Check the comments in the file and replace the fields with the specific values of your implementation (RPC URLs, the private key etc.). + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: provider + name: provider +spec: + progressDeadlineSeconds: 2147483647 + replicas: 1 + revisionHistoryLimit: 2147483647 + selector: + matchLabels: + app: provider + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + labels: + app: provider + spec: + containers: + - env: + - name: ARTIFACTS_PATH + value: /ocean-provider/artifacts + - name: NETWORK_URL + value: | + {"5":"https://goerli.infura.io/v3/","80001":"https://polygon-mumbai.infura.io/v3/"} + - name: PROVIDER_PRIVATE_KEY + value: | + {"5":"","80001":""} + - name: LOG_LEVEL + value: DEBUG + - name: OCEAN_PROVIDER_URL + value: http://0.0.0.0:8030 + - name: OCEAN_PROVIDER_WORKERS + value: "4" + - name: IPFS_GATEWAY + value: < your IPFS gateway > + - name: OCEAN_PROVIDER_TIMEOUT + value: "9000" + - name: OPERATOR_SERVICE_URL + value: < Operator service URL> + - name: AQUARIUS_URL + value: < Aquarius URL > + - name: UNIVERSAL_PRIVATE_KEY + value: + - name: REQUEST_TIMEOUT + value: "10" + image: oceanprotocol/provider-py:latest => (check on https://hub.docker.com/r/oceanprotocol/provider-py for specific tag) + imagePullPolicy: Always + name: provider + ports: + - containerPort: 8030 + protocol: TCP + resources: + limits: + cpu: 500m + memory: 700Mi + requests: + cpu: 500m + memory: 700Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + terminationGracePeriodSeconds: 30 +``` + +Tip: before deployment you can [validate](https://github.com/instrumenta/kubeval) the yaml file. + + + +2. Deploy the configuration + +Deploy the configuration in Kubernetes using the following commands. + +```bash +kubectl config set-context --current --namespace ocean +kubectl apply -f provider-deploy.yaml +deployment.apps/provider created + +kubectl get pod -l app=provider +NAME READY STATUS RESTARTS AGE +provider-865cb8cf9d-r9xm4 1/1 Running 0 67s +``` + + + +3. Create a Kubernetes service + +The next step is to create a Kubernetes service (eg. ClusterIP, NodePort, Loadbalancer, ExternalName) for this deployment, depending on environment specifications. Follow [this link](https://kubernetes.io/docs/concepts/services-networking/service/) for details on how to create a Kubernetes service. + diff --git a/user-guides/asset-hosting/github.md b/user-guides/asset-hosting/github.md index f1cb47c9..b961187b 100644 --- a/user-guides/asset-hosting/github.md +++ b/user-guides/asset-hosting/github.md @@ -52,6 +52,8 @@ Open the File and click on the "Raw" button on the right side of the page. Copy the link in your browser's URL - it should begin with "https://raw.githubusercontent.com/...." like in the image below. +

Grab the RAW github URL from your browser's URL bar

+
**Step 4 - Publish the asset using the Raw link**