> For the complete documentation index, see [llms.txt](https://docs.filecoin.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.filecoin.io/provide-storage/pdp/install-and-run-pdp.md).

# Install & Run PDP

## 🚀 Prerequisites

{% hint style="warning" %}
**Note:** This guide is written specifically for **Ubuntu 22.04**. If you are using a different Linux distribution, refer to the relevant documentation for package installation and compatibility.
{% endhint %}

Before starting, make sure you have a user with **sudo privileges**. This section prepares your system for the PDP stack.

***

### ⚙️ Hardware requirements <a href="#hardware-requirements" id="hardware-requirements"></a>

* **RAM**: 32 GiB+
* **CPU**: 8 Core+
* **Storage**:
  * 1 TiB Fast storage (NVMe/SSD)
  * 10 TiB Long-term storage (HDD)
* **GPU**: Not required
* **Connectivity**: Public HTTPS endpoint (domain)

***

### 🧰 System Package Installation

```sh
sudo apt update && sudo apt upgrade -y && sudo apt install -y \
  mesa-opencl-icd ocl-icd-opencl-dev gcc git jq pkg-config curl clang \
  build-essential hwloc libhwloc-dev libarchive-dev wget ntp python-is-python3 aria2
```

***

### :hammer: Install Go (v1.24.0)

```sh
sudo rm -rf /usr/local/go
wget https://go.dev/dl/go1.24.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.24.0.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
go version
```

{% hint style="success" %}
You should see something like: `go version go1.24.0 linux/amd64`
{% endhint %}

***

### :wrench: Install Rust

```sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```

{% hint style="info" %}
When prompted, choose the option 1) Proceed with standard installation (default — just press Enter).
{% endhint %}

```sh
source $HOME/.cargo/env
rustc --version
```

{% hint style="success" %}
You should see something like: `rustc 1.86.0 (05f9846f8 2025-03-31)`
{% endhint %}

***

## ⛓️ Installing and Running Lotus

🧠 Lotus is your gateway to the Filecoin network. It syncs the chain, manages wallets, and is required for Curio to interact with your node.

<table data-view="cards"><thead><tr><th></th><th data-hidden></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>Lotus Documentation</td><td><a href="https://lotus.filecoin.io/lotus/get-started/what-is-lotus/">https://lotus.filecoin.io/lotus/get-started/what-is-lotus/</a></td><td><a href="/files/X78mdGmKfst6rtXWwFIR">/files/X78mdGmKfst6rtXWwFIR</a></td><td><a href="https://lotus.filecoin.io/lotus/get-started/what-is-lotus/">https://lotus.filecoin.io/lotus/get-started/what-is-lotus/</a></td></tr><tr><td>Lotus Support Channels</td><td><a href="https://filecoinproject.slack.com/archives/CPFTWMY7N">Filecoin Slack - #fil-lotus-help</a></td><td><a href="/files/qnJBFzoo6CKBf9uBTqK2">/files/qnJBFzoo6CKBf9uBTqK2</a></td><td><a href="https://filecoinproject.slack.com/archives/CPFTWMY7N">https://filecoinproject.slack.com/archives/CPFTWMY7N</a></td></tr></tbody></table>

### 🔧 Build Lotus Daemon

Clone and check out Lotus:

```sh
git clone https://github.com/filecoin-project/lotus.git
cd lotus
git checkout $(curl -s https://api.github.com/repos/filecoin-project/lotus/releases/latest | jq -r .tag_name)
```

**Build and Install for Mainnet**

```sh
make clean && make lotus
sudo make install-daemon
lotus --version
```

**Build and Install for Calibration**

```sh
make clean && make GOFLAGS="-tags=calibnet" lotus
sudo make install-daemon
lotus --version
```

{% hint style="success" %}
You should see something like: `lotus version 1.36.0+calibnet+git.154c0c3a4`
{% endhint %}

***

### 📦 Import a Snapshot and Start the Daemon

Download the Snapshot

**Mainnet:**

```sh
aria2c -x5 -o snapshot.car.zst https://forest-archive.chainsafe.dev/latest/mainnet/
```

**Calibration:**

```sh
aria2c -x5 -o snapshot.car.zst https://forest-archive.chainsafe.dev/latest/calibnet/
```

**Import and Start the Daemon**

```sh
lotus daemon --import-snapshot snapshot.car.zst --remove-existing-chain --halt-after-import
nohup lotus daemon > ~/lotus.log 2>&1 &
```

{% hint style="info" %}
If you encounter errors related to `EnableEthRPC` or `EnableIndexer`, run the following command and restart Lotus
{% endhint %}

```sh
sed -i 's/^\( *\)#*EnableEthRPC = .*/\1EnableEthRPC = true/; s/^\( *\)#*EnableIndexer = .*/\1EnableIndexer = true/' ~/.lotus/config.toml
```

**Monitor Sync Progress**

```sh
lotus sync wait
```

To monitor continuously:

```sh
lotus sync wait --watch
```

**Monitor Logs**

```sh
tail -f ~/lotus.log
```

***

## 🐘 Running YugabyteDB

🧠 Curio uses YugabyteDB to store metadata about deals, sealing operations, and PDP submissions.

<table data-view="cards"><thead><tr><th></th><th data-hidden></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>Yugabyte Documentation</td><td><a href="https://docs.yugabyte.com/preview/tutorials/quick-start/linux/">https://docs.yugabyte.com/preview/tutorials/quick-start/linux/</a></td><td><a href="/files/yqRbN2Fb9FGiq1jVIDAB">/files/yqRbN2Fb9FGiq1jVIDAB</a></td><td><a href="https://docs.yugabyte.com/preview/tutorials/quick-start/linux/">https://docs.yugabyte.com/preview/tutorials/quick-start/linux/</a></td></tr><tr><td>Yugabyte Support Channels</td><td><a href="https://filecoinproject.slack.com/archives/C06LF5YP8S3">Filecoin Slack - #fil-curio-help</a> - <a href="https://inviter.co/yugabytedb">Yugabyte Slack</a></td><td><a href="/files/Vpqt0UYfztl7nf8cLqeD">/files/Vpqt0UYfztl7nf8cLqeD</a></td><td><a href="https://filecoinproject.slack.com/archives/C06LF5YP8S3">https://filecoinproject.slack.com/archives/C06LF5YP8S3</a></td></tr></tbody></table>

### 🛠 Set ulimit configuration

{% hint style="warning" %}
Before starting Yugabyte, you must increase the default `ulimit` values to ensure system limits do not interfere with the database.
{% endhint %}

To do this:

#### 🔁 **Persist new limits across reboots**

Add these lines to `/etc/security/limits.conf`:

```sh
echo "$(whoami) soft nofile 1048576" | sudo tee -a /etc/security/limits.conf
echo "$(whoami) hard nofile 1048576" | sudo tee -a /etc/security/limits.conf
```

This ensures the increased limits are automatically applied to future sessions.

#### ⚡ **Apply limit immediately (for current shell only)**

```sh
ulimit -n 1048576
```

Verify:

```sh
ulimit -n
```

{% hint style="success" %}
This should output `1048576`.
{% endhint %}

### ⚙️ Install Yugabyte

```sh
wget https://software.yugabyte.com/releases/2.25.1.0/yugabyte-2.25.1.0-b381-linux-x86_64.tar.gz
tar xvfz yugabyte-2.25.1.0-b381-linux-x86_64.tar.gz
cd yugabyte-2.25.1.0
./bin/post_install.sh
```

### 🚀 Start the DB

```sh
./bin/yugabyted start \
  --advertise_address 127.0.0.1 \
  --master_flags rpc_bind_addresses=127.0.0.1 \
  --tserver_flags rpc_bind_addresses=127.0.0.1
```

{% hint style="warning" %}
If you encounter locale-related errors when starting Yugabyte for the first time, run:
{% endhint %}

```sh
sudo locale-gen en_US.UTF-8
```

{% hint style="success" %}
Visit `http://127.0.0.1:15433` to confirm successful installation. This is the YugabyteDB web UI — it should display the dashboard if the service is running correctly and all nodes are healthy.
{% endhint %}

{% hint style="info" %}
You can also check your Yugabyte cluster details directly in the CLI with:
{% endhint %}

```sh
./bin/yugabyted status
```

***

## 🧱 Installing and Configuring Curio

🧠 Curio is the core PDP client that coordinates sealing, interacts with Lotus and submits PDP proofs.

<table data-view="cards"><thead><tr><th></th><th data-hidden></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>Curio Documentation</td><td><a href="https://docs.curiostorage.org/">https://docs.curiostorage.org/</a></td><td><a href="/files/Vpqt0UYfztl7nf8cLqeD">/files/Vpqt0UYfztl7nf8cLqeD</a></td><td><a href="https://docs.curiostorage.org/">https://docs.curiostorage.org/</a></td></tr><tr><td>Curio Support Channels</td><td><a href="https://filecoinproject.slack.com/archives/C06LF5YP8S3">Filecoin Slack - #fil-curio-help</a></td><td><a href="/files/qnJBFzoo6CKBf9uBTqK2">/files/qnJBFzoo6CKBf9uBTqK2</a></td><td><a href="https://filecoinproject.slack.com/archives/C06LF5YP8S3">https://filecoinproject.slack.com/archives/C06LF5YP8S3</a></td></tr></tbody></table>

### ⚙️ System Configuration

Before you proceed with the installation, you should increase the UDP buffer size:

```sh
sudo sysctl -w net.core.rmem_max=2097152
sudo sysctl -w net.core.rmem_default=2097152
```

To make this change persistent across reboots:

```sh
echo 'net.core.rmem_max=2097152' | sudo tee -a /etc/sysctl.conf
echo 'net.core.rmem_default=2097152' | sudo tee -a /etc/sysctl.conf
```

### 🔬 Build Curio

Clone the repository and switch to the latest branch:

```sh
git clone https://github.com/filecoin-project/curio.git
cd curio
git checkout $(curl -s https://api.github.com/repos/filecoin-project/curio/releases/latest | jq -r .tag_name)
```

{% hint style="info" %}
Curio is compiled for a specific Filecoin network at build time. Choose the appropriate build command below.
{% endhint %}

Mainnet

```sh
make clean build
```

Calibration

```sh
make clean calibnet
```

{% hint style="info" %}
This step will take a few minutes to complete.
{% endhint %}

### ✅ Install and Verify Curio

Run the following to install the compiled binary:

```sh
sudo make install
```

This will place curio in `/usr/local/bin`

Verify the installation:

```sh
curio --version
```

Expected example output:

```sh
curio version 1.24.4+calibnet+git_f954c0a_2025-04-06T15:46:32-04:00
```

***

### 🔧 Guided Setup

Curio provides a utility to help you set up a new miner interactively. Run the following command:

```sh
curio guided-setup
```

#### 1️⃣ Select Curio Installation Type

Use the arrow keys to navigate the guided setup menu and select "**Setup non-Storage Provider cluster**".

#### 2️⃣ Enter Your YugabyteDB Connection Details

If you used the default installation steps from this guide, the following values should work:

* Host: `127.0.0.1`
* Port: `5433`
* Username: `yugabyte`
* Password: `yugabyte`
* Database: `yugabyte`

You can verify these settings by running the following command from the Yugabyte directory:

```sh
./bin/yugabyted status
```

After selecting "**Continue to connect and update schema**", Curio will automatically create the required tables and schema in the database.

#### 3️⃣ Telemetry (Optional)

You'll be asked whether to share anonymised or signed telemetry with the Curio team to help improve the software.

Select your preference and continue.

#### 4️⃣ Save Database Configuration

At the final step of the guided setup, you'll be prompted to choose where to save your database configuration file.

Use the arrow keys to select a location. A common default is:

```sh
/home/your-username/curio.env
```

Once selected, setup will complete, and the miner configuration will be stored.

#### 5️⃣ Launch the Curio Web GUI

To explore the Curio interface visually, start the GUI layer:

```sh
curio run --layers=gui
```

Then, open your browser and go to:

```sh
http://127.0.0.1:4701
```

This will launch the Curio web GUI locally.

***

## 🧪 Enabling PDP

🧠 This section enables **Proof of Data Possession (PDP)** on your storage provider node using Curio. PDP is the verification layer used by the [Filecoin Warm Storage Service (FWSS)](https://docs.filecoin.cloud/core-concepts/fwss-overview) within [Filecoin Onchain Cloud](/build-on-filecoin/filecoin-onchain-cloud.md). These steps guide you through running a standalone PDP service using Curio and pdptool.

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>PDP Support Channels</td><td><a href="/files/qnJBFzoo6CKBf9uBTqK2">/files/qnJBFzoo6CKBf9uBTqK2</a></td><td><a href="https://filecoinproject.slack.com/archives/C0717TGU7V2">https://filecoinproject.slack.com/archives/C0717TGU7V2</a></td></tr></tbody></table>

### 📦 Attach Storage Locations

With Curio running with the GUI layer:

```sh
curio run --layers=gui
```

Run the following commands in your Curio CLI to attach storage paths:

```sh
curio cli storage attach --init --seal /fast-storage/path
curio cli storage attach --init --store /long-term-storage/path
```

{% hint style="info" %}
Your fast-storage path should point to high-performance storage media such as NVMe or SSD
{% endhint %}

***

### 🔧 Add a PDP Configuration Layer

Browse to the **Configurations** page of the Curio GUI.

Create a new layer named **pdp** and enable the following under Subsystems:

{% hint style="info" %}
You may find it helpful to search for the setting names in your browser.
{% endhint %}

* ✅ `EnableParkPiece`
* ✅ `EnablePDP`
* ✅ `EnableCommP`
* ✅ `EnableMoveStorage`
* ✅ `NoUnsealedDecode`

In the **HTTP** section:

* ✅ Enable: `true`
* 🌐 DomainName: `your domain (e.g., pdp.mydomain.com)`
* 📡 ListenAddress: `0.0.0.0:443`

{% hint style="info" %}
**Tip:** You must point your domain's A record to your server's public IP address for Let's Encrypt to issue a certificate.
{% endhint %}

***

### 💰 Import your Filecoin Wallet Private Key:

{% hint style="warning" %}
There are several ways to obtain private keys for Ethereum addresses. In this guide, we will use a new delegated FIL wallet address.
{% endhint %}

Create a new delegated wallet:

```sh
lotus wallet new delegated
```

```sh
# Example output:
t410fuo4dghaeiqzokiqnxruzdr6e3cjktnxprrc56bi
```

{% hint style="info" %}
You can display your Lotus wallets at any time by running:
{% endhint %}

```sh
lotus wallet list
```

Export & convert your new delegated wallet address private key:

```sh
lotus wallet export <your-delegated-wallet-address> | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32
```

```sh
# Example output:
d4c2e3f9a716bb0e47fa91b2cf4a29870be3c5982fd6eafed71e8ac3f9c0b127
```

Browse to the **PDP** page of the Curio GUI and in the **Owner Address** section:

* Select **Import Key**
* Copy the previously generated private wallet key into the **Private Key (Hex)** field.
* Select **Import Key**

{% hint style="success" %}
Your 0x wallet address - the delegated Ethereum address derived from your Filecoin delegated wallet private key - will be added to the **Owner Address** section of the Curio PDP page.
{% endhint %}

Make sure to send a small amount of FIL or tFIL (testnet FIL) to your 0x wallet - we recommend 8 FIL for Mainnet & 5 tFIL for Calibration to ensure uninterrupted PDP operation during initial setup and testing. [Calibration test FIL faucet information](/build-on-filecoin/developing-contracts/get-test-tokens.md).

{% hint style="warning" %}
**Important:** Secure your private key material. Don't expose or store it in plain text without protection.
{% endhint %}

***

### 🚀 Restart and Verify

Restart Curio with both layers:

```sh
curio run --layers=gui,pdp
```

{% hint style="info" %}
If you encounter errors related to `EnableEthRPC` or `EnableIndexer`, run the following command and restart Lotus
{% endhint %}

```sh
sed -i 's/^\( *\)#*EnableEthRPC = .*/\1EnableEthRPC = true/; s/^\( *\)#*EnableIndexer = .*/\1EnableIndexer = true/' ~/.lotus/config.toml
```

{% hint style="info" %}
If you encounter errors binding to port 443 when starting Curio with the pdp configuration layer, run:
{% endhint %}

```sh
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/curio
```

***

### 🔗 Test Connectivity

Browse to your PDP node's domain name in your browser. You should see the following message in your browser window:

```
Hello, World!
 -Curio
```

***

### 🗳️ Register Your PDP Calibration Node With The Filecoin Warm Storage Service

Browse to the **PDP** page of the Curio GUI and locate the **Filecoin Service Registry** section.

#### STEP 1 — Update Details

Select **Update Details** and fill in:

| Field       | Notes       |
| ----------- | ----------- |
| Name        | ≤ 128 chars |
| Description | ≤ 256 chars |

Select **Update** to submit your node details to the on-chain FWSS contract.

{% hint style="info" %}
You can review the names and descriptions of other FWSS providers at <https://filecoin.cloud/service-providers>.
{% endhint %}

#### STEP 2 — Update PDP Offering

Select **Update PDP Offering** and set:

| Field                                 | Recommended value                                                 |
| ------------------------------------- | ----------------------------------------------------------------- |
| Minimum Piece Size (Bytes)            | `1048576`                                                         |
| Maximum Piece Size (Bytes)            | `1073741824`                                                      |
| Storage Price (USDFC per TiB per day) | `0.833`                                                           |
| Minimum Proving Period (Epochs)       | `30`                                                              |
| Location                              | e.g. `C=US;ST=California;L=San Francisco` (only `C=` is required) |

Then use **Add Capability** to add the following key/value pairs:

| Key             | Value                                  |
| --------------- | -------------------------------------- |
| `serviceStatus` | `prod`                                 |
| `capacityTib`   | your available storage capacity in TiB |

Select **Update PDP** to submit your offering to the on-chain FWSS contract.

You can revisit **Update PDP Offering** at any time to change the Service URL, piece size range, IPNI toggles, price, proving period, location, or custom capabilities.

***

## 🎉 You're Done!

You've successfully launched a **PDP-enabled Filecoin Storage Provider** stack. Your system is now:

* ✅ Syncing with the Filecoin network via Lotus
* ✅ Recording deal and piece metadata in YugabyteDB
* ✅ Operating Curio to manage sealing and coordination
* ✅ Enabled Proof of Data Possession (PDP)
* ✅ Connected to your PDP-enabled storage provider
* ✅ Registered with the Filecoin Warm Storage Service onchain contract

***

## 🔜 Next Steps

* :link: Explore FWSS & PDP tools & resources at [https://www.filecoin.services](https://www.filecoin.services/)
* 💬 Join the community - Filecoin Slack - [#fil-pdp](https://filecoinproject.slack.com/archives/C0717TGU7V2)
