Install & Run a PDP Node
This guide deploys a full Filecoin Warm Storage Service (FWSS) stack and registers a Proof of Data Possession (PDP) node. By the end you will have:
- Lotus syncing with the Filecoin chain and managing wallets
- YugabyteDB storing deal and piece metadata
- Curio coordinating sealing, PDP proofs, and HTTP serving
- A PDP node registered with the Warm Storage contract and serving clients
The steps are identical for both networks. Where a command or value differs, use the Calibration / Mainnet switch. Selecting a network once applies your choice to every switch on the page.
Prerequisites
Section titled “Prerequisites”| Resource | Minimum |
|---|---|
| RAM | 32 GiB |
| CPU | 8 cores |
| Fast storage (NVMe/SSD) | 1 TiB |
| Long-term storage (HDD) | 10 TiB |
| GPU | Not required |
| Connectivity | Public HTTPS endpoint (domain) with HTTP/2 |
Install System Packages
Section titled “Install System Packages”Prepare the system with the build dependencies for the stack.
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 aria2Install Go 1.23.7
Section titled “Install Go 1.23.7”sudo rm -rf /usr/local/gowget https://go.dev/dl/go1.23.7.linux-amd64.tar.gzsudo tar -C /usr/local -xzf go1.23.7.linux-amd64.tar.gzecho 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrcsource ~/.bashrcgo versionYou should see go version go1.23.7 linux/amd64.
Install Rust
Section titled “Install Rust”curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shWhen prompted, choose option 1) Proceed with standard installation (the default, just press Enter). Then load Rust into your shell:
source $HOME/.cargo/envrustc --versionYou should see a version such as rustc 1.86.0 (05f9846f8 2025-03-31).
Add Go and Rust to the Secure Sudo Path
Section titled “Add Go and Rust to the Secure Sudo Path”sudo tee /etc/sudoers.d/dev-paths <<EOFDefaults secure_path="/usr/local/go/bin:$HOME/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"EOFInstall and Run Lotus
Section titled “Install and Run Lotus”Lotus is your gateway to the Filecoin network. It syncs the chain, manages wallets, and lets Curio interact with the node. See the Lotus documentation for background.
-
Build the Lotus daemon. Clone the repository and check out the latest release:
Terminal window git clone https://github.com/filecoin-project/lotus.gitcd lotusgit checkout $(curl -s https://api.github.com/repos/filecoin-project/lotus/releases/latest | jq -r .tag_name)Build and install for your network:
Terminal window make clean && make GOFLAGS="-tags=calibnet" lotussudo make install-daemonlotus --versionYou should see a version such as
lotus version 1.34.1+calibnet.Terminal window make clean lotussudo make install-daemonlotus --versionYou should see a version such as
lotus version 1.34.1+mainnet+git.710b4ac66. -
Import a snapshot and start the daemon. Download a recent chain snapshot:
Terminal window aria2c -x5 -o snapshot.car.zst https://forest-archive.chainsafe.dev/latest/calibnet/Terminal window aria2c -x5 -o snapshot.car.zst https://forest-archive.chainsafe.dev/latest/mainnet/Mainnet snapshots are larger than Calibration and take longer to import.
Import it and start the daemon in the background:
Terminal window lotus daemon --import-snapshot snapshot.car.zst --remove-existing-chain --halt-after-importnohup lotus daemon > ~/lotus.log 2>&1 & -
Monitor sync progress. Wait for the node to sync, then watch the logs:
Terminal window lotus sync waitlotus sync wait --watchtail -f ~/lotus.log
Run YugabyteDB
Section titled “Run YugabyteDB”Curio uses YugabyteDB to store metadata about deals, sealing operations, and PDP submissions. See the YugabyteDB quick start for reference.
-
Raise the open-file limit. YugabyteDB needs a high
ulimit. Persist the new limits across reboots:Terminal window echo "$(whoami) soft nofile 1048576" | sudo tee -a /etc/security/limits.confecho "$(whoami) hard nofile 1048576" | sudo tee -a /etc/security/limits.confApply the limit to the current shell and verify it:
Terminal window ulimit -n 1048576ulimit -nThis should output
1048576. -
Install YugabyteDB.
Terminal window wget https://software.yugabyte.com/releases/2.25.1.0/yugabyte-2.25.1.0-b381-linux-x86_64.tar.gztar xvfz yugabyte-2.25.1.0-b381-linux-x86_64.tar.gzcd yugabyte-2.25.1.0./bin/post_install.sh -
Start the database.
Terminal window ./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.1Visit
http://127.0.0.1:15433to confirm the install. The YugabyteDB web UI displays the dashboard when the service is healthy. You can also check the cluster from the CLI:Terminal window ./bin/yugabyted status
Install and Configure Curio
Section titled “Install and Configure Curio”Curio is the core PDP client. It coordinates sealing, talks to Lotus, and submits PDP proofs. See the Curio documentation for reference.
-
Increase the UDP buffer size. Curio needs a larger UDP buffer. Set it now and persist it:
Terminal window sudo sysctl -w net.core.rmem_max=2097152sudo sysctl -w net.core.rmem_default=2097152echo 'net.core.rmem_max=2097152' | sudo tee -a /etc/sysctl.confecho 'net.core.rmem_default=2097152' | sudo tee -a /etc/sysctl.conf -
Build Curio. Clone the repository and switch to the PDP branch:
Terminal window git clone https://github.com/filecoin-project/curio.gitcd curiogit checkout pdpv0Build for your network. This step takes a few minutes.
Terminal window make clean calibnetTerminal window make clean buildInstall the compiled binary into
/usr/local/binand verify it:Terminal window sudo make installcurio --versionThe version string includes your network, for example
curio version 1.27.0+calibnet+git_...on Calibration or+mainneton Mainnet. -
Run the guided setup. Curio ships an interactive setup utility:
Terminal window curio guided-setupWork through the prompts:
- Installation type. Select Setup non-Storage Provider cluster. This is the correct choice for a PDP node: it provisions a Curio cluster without the sealing pipeline of a traditional Filecoin storage provider.
- YugabyteDB connection. With the defaults from this guide, use host
127.0.0.1, port5433, usernameyugabyte, passwordyugabyte, databaseyugabyte. Confirm these with./bin/yugabyted statusfrom the YugabyteDB directory. Choose Continue to connect and update schema to let Curio create its tables. - Telemetry. Choose whether to share telemetry with the Curio team, then continue.
- Save configuration. Pick a location for the database configuration file. A common default is
/home/your-username/curio.env.
-
Launch the Curio web GUI.
Terminal window curio run --layers=guiOpen
http://127.0.0.1:4701to reach the interface.
Enable Proof of Data Possession
Section titled “Enable Proof of Data Possession”This section turns on Proof of Data Possession (PDP) for your node and prepares it to serve clients. Keep Curio running with the GUI layer (curio run --layers=gui) while you work through the GUI steps.
-
Attach storage locations. Point Curio at your fast (sealing) and long-term (store) paths:
Terminal window curio cli storage attach --init --seal /fast-storage/pathcurio cli storage attach --init --store /long-term-storage/pathYour fast-storage path should be high-performance media such as NVMe or SSD.
-
Add a PDP configuration layer. In the Curio GUI, open the Configurations page and create a new layer named
pdp. Under Subsystems, enable:EnableParkPieceEnablePDPEnableCommPEnableMoveStorageNoUnsealedDecode
In the HTTP section, set:
Enable:trueDomainName: your domain, for examplepdp.mydomain.comListenAddress:0.0.0.0:443
-
Import your wallet. Create a new delegated FIL wallet, which Curio uses as the PDP owner address:
Terminal window lotus wallet new delegatedTerminal window # Example output:t410fuo4dghaeiqzokiqnxruzdr6e3cjktnxprrc56biTerminal window # Example output:f410fgleqyjv4u3wtsro6tmu3utqz2obrjvqyf7gtffqList your wallets at any time with
lotus wallet list. Export and convert the private key to hex:Terminal window lotus wallet export <your-delegated-wallet-address> | xxd -r -p | jq -r '.PrivateKey' | base64 -d | xxd -p -c 32In the Curio GUI, open the PDP page. In the Owner Address section select Import Key, paste the hex key into the Private Key (Hex) field, and select Import Key again. Your
0xaddress, the delegated Ethereum address derived from the wallet, is added to the Owner Address section.Fund the
0xwallet so PDP operations are not interrupted:Send 5 tFIL to your
0xwallet. Get testnet FIL from the Calibration faucet.Send 10 FIL to your
0xwallet. This covers the 5 FIL storage provider creation fee plus headroom for initial operation. -
Restart and verify. Restart Curio with both layers:
Terminal window curio run --layers=gui,pdpBrowse to your PDP node’s domain. You should see
Hello, World! -Curioin the browser.
Register with Warm Storage
Section titled “Register with Warm Storage”Register your node with the Filecoin Warm Storage Service so clients can discover and use it. In the Curio GUI, open the PDP page and find the Filecoin Service Registry section.
-
Update details. Select Update Details, enter a Name and a short Description for your provider node, then select Update to submit them to the FWSS contract. You can review other providers’ names and descriptions at filecoin.services/warmstorage.
-
Update the PDP offering. Select Update PDP Offering and set:
-
Minimum Piece Size (Bytes):
1048576 -
Maximum Piece Size (Bytes):
1073741824 -
Minimum Proving Period (Epochs):
30 -
Location: your node location in the format
C=US;ST=California;L=San Francisco -
Storage Price (per TiB per day in USDFC):
0.8330.0833
Then add two capabilities:
-
capacityTib: your available capacity in TiB -
serviceStatus: advertises whether the node is in production or testing.SetserviceStatustoprod.SetserviceStatustotesting.
Select Update PDP to submit your offering to the FWSS contract.
-
You Are Done
Section titled “You Are Done”Your PDP-enabled storage provider stack is now:
- Syncing with the Filecoin network via Lotus
- Recording deal and piece metadata in YugabyteDB
- Running Curio for sealing and coordination
- Proving data possession through PDP
- Registered with the Warm Storage contract
Next Steps
Section titled “Next Steps”- Withdraw funds from Filecoin Pay once clients start paying for storage
- Nginx Reverse Proxy Setup to terminate TLS in front of Curio
- LXD Container Setup to isolate nodes on one host
- Explore tools and resources at filecoin.services, and join #fil-pdp on Filecoin Slack