Skip to main content
Liquidity providers run a provision node — a small always-on server that Liquidramp calls to execute fiat payouts (via your BaaS/PSP) and crypto transfers (via your EVM wallet). This guide is the low-cost Docker path on a single VM. You do not need this page if you only consume the Partner API (onramp, offramp, swap).

What you need first

  1. KYB-approved provider account in the partner portal
  2. API keys (pk_*, sk_*, enc_*) and your partner reference (liquidramp-client-id) — see Authentication
  3. Provision node source (the Docker-ready liquidramp-node project)
  4. At least one fulfilment rail:
    • Fiat: PalmPay, BellBank, Korapay, or Nomba credentials
    • Crypto: an EVM wallet private key plus the currencies/networks you will serve
  5. A domain (for example node.yourcompany.com) pointed at the VM
Keep it small. The node is an HTTP process plus outbound API calls. Open only 22 (SSH), 80, and 443. Do not publish the node’s app port (3100) to the internet — terminate TLS on the host and proxy locally.
Production endpoint_url must be HTTPS. Saving the URL in the portal fails unless GET /health on that host returns 200.

1. Create a cheap VM

Pick one of the following. Both are single-server setups — no load balancer, Kubernetes, or managed container service required.

DigitalOcean Droplet

  1. Create a Droplet: Ubuntu 24.04, Regular SSD, 1 vCPU / 2 GB RAM (Basic, ~US$12/mo). The 1 GB plan works for sandbox only.
  2. Add your SSH key. Enable a Reserved IP if you want a stable address across rebuilds.
  3. In your DNS provider, create an A record: node.yourcompany.com → the Droplet (or reserved) IPv4.
  4. SSH in as root (or the user you created).

AWS Lightsail (lightweight AWS)

Lightsail is the low-cost AWS option. A t-family EC2 instance plus ALB is unnecessary for a single node.
  1. In Lightsail, create an instance: OS Only → Ubuntu 24.04, plan 10/mo(2GB)or10/mo** (2 GB) or **5/mo (1 GB, sandbox).
  2. Create a static IP and attach it to the instance.
  3. Networking firewall: allow SSH (22), HTTP (80), HTTPS (443).
  4. Point node.yourcompany.com at the static IP.
  5. SSH in with the Lightsail key pair.

2. Harden and install Docker

Run on the VM:
Confirm:

3. Place the node and environment file

Copy the provision node project onto the host (git clone of the repo you were given, or scp -r). Example layout:
Create /opt/liquidramp-node/docker-compose.yml:
Binding 127.0.0.1:3100 keeps the app off the public interface. Caddy (next step) is the only public entrypoint. Create /opt/liquidramp-node/.env from the project’s .env.example. Required for every node:
Use https://vibe-api.liquidramp.com with *_test_* keys on test, and https://api.liquidramp.com with *_live_* keys in production. LIQUIDRAMP_API_BASE_URL is the root host (no /v1). The node calls /v1/node-info and /v1/lp/orders/... itself.

Fiat provision (optional)

Set FIAT_CURRENCIES and only the BaaS you actually hold. Providers that are missing credentials are skipped at startup.
BaaS payment webhooks are registered against the Liquidramp API (/v1/webhooks/baas/...), not against your VM. You do not need extra inbound webhook ports on the node.

Crypto provision (optional)

Optional RPC keys improve reliability: ALCHEMY_API_KEY, INFURA_PROJECT_ID, ANKR_API_KEY, DRPC_API_KEY.
EVM_WALLET_PRIVATE_KEY and BaaS secrets must never be committed or pasted into chat logs. Creating a new Liquidramp key set in the portal revokes the previous set — update .env and recreate the container.
If you use an IP whitelist on the partner profile, add this VM’s egress IPv4 so heartbeat and fulfilment callbacks to the Liquidramp API are not blocked.

4. HTTPS with Caddy

Caddy obtains Let’s Encrypt certificates automatically.
/etc/caddy/Caddyfile:
Wait until DNS has propagated. Then:
Expected: HTTP 200 with "message": "Healthy" (no HMAC required on /health).

5. Register the URL in the portal

Liquidramp does not discover your node. You must save the public URL.
  1. Open Settings → Node Server in the partner portal.
  2. Enter the URL, for example https://node.yourcompany.com.
    • Include https://
    • No trailing slash
    • Do not append /health or /v1
  3. Save. The platform immediately calls GET {endpoint_url}/health. If that fails, the URL is rejected.
  4. After a successful save, the Node Server page shows status, version, environment, and client ID. Use Refresh to re-fetch GET /node-info.
You cannot create liquidity provisions until endpoint_url is set and the node is reachable.

6. Confirm it is live

Heartbeat payload includes node info, wallet address (if configured), BaaS accounts, and balances. The platform uses that to route orders to you.

Operations

  • docker compose logs -f for live logs; docker compose restart after .env changes (--force-recreate if env did not pick up).
  • restart: unless-stopped brings the node back after a reboot.
  • Keep Ubuntu patched. Prefer SSH keys only.
  • Rotate Liquidramp and BaaS credentials on a schedule; rotate enc_* together with sk_*.
  • Alert if /health fails or heartbeat errors persist — an offline node stops receiving assignments.

Troubleshooting