First Devnet Deployment

Run self-hosted SDP on devnet, log into the dashboard, initialize a local wallet, and verify API access.

This tutorial takes a fresh self-hosted install from healthy containers to the first useful devnet workflow: dashboard login, local wallet initialization, wallet-scoped API key creation, and an authenticated API call.

Use this after the Quickstart. The path here is devnet-only and uses the default local signer. Provider-specific signing setup belongs in a later hardening pass.

The public Solana devnet RPC endpoint is useful for smoke tests, but it can be rate-limited or incomplete for balance-heavy wallet views. Use a dedicated devnet RPC endpoint from your provider before treating this flow as reliable.

Confirm the stack is healthy

From the directory where the installer placed compose.yml and .env:

cd ~/sdp
docker compose up -d
docker compose ps
curl http://localhost:8787/health

The health call should return a JSON response with status: "ok". The dashboard is at http://localhost:3000, the API is at http://localhost:8787, and the self-hosted docs are at http://localhost:3001.

Configure Clerk for dashboard login

In your Clerk development app:

  • Copy the publishable key, secret key, and issuer into the configurator.
  • Create a JWT template named sdp-api.
  • Create a webhook endpoint that points at http://localhost:8787/webhooks/clerk/link-orgs for local testing.
  • Copy the webhook signing secret into CLERK_WEBHOOK_SECRET.

CLERK_WEBHOOK_SECRET is optional at raw env-validation level, but this tutorial requires it because the webhook is what creates the local SDP organization record after dashboard signup.

Generate the devnet .env

Open the configurator, keep the defaults for the first deployment, and fill in:

  • SOLANA_RPC_URL with a devnet RPC endpoint.
  • Clerk publishable key, secret key, issuer, JWT template, and webhook secret.
  • Local signing with native fee payment.

The signing step generates a local Solana signer in the browser and shows the public key to fund on devnet. Save the generated file as ~/sdp/.env, then restart the stack:

cd ~/sdp
docker compose up -d

In self-hosted mode, SDP entitles every provider that is configured in the environment. Providers that are not configured remain unavailable, so the default devnet path exposes only the local signer.

Log into the dashboard

Open http://localhost:3000 and sign in through Clerk. Create or join an organization when prompted. After the Clerk webhook lands, the dashboard should show the organization and project context instead of onboarding errors.

If the dashboard loads but organization state does not appear, check the API logs:

docker compose logs -f sdp-api

Look for Clerk webhook errors, JWT template mismatches, or missing CLERK_WEBHOOK_SECRET.

Initialize a local custody wallet

In the dashboard, open Wallets, choose the local provider, and create a wallet named Devnet local wallet.

If you prefer the API path, use an admin key from the dashboard:

curl -X POST http://localhost:8787/v1/wallets/initialize \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "local",
    "walletLabel": "Devnet local wallet"
  }'

Copy the returned walletId. You will bind the API key to this wallet in the next step.

Create a wallet-scoped API key

Open API keys in the dashboard, create a sandbox key, and choose Selected wallets. Select the local wallet you just created and make it the default signing wallet.

Save the full key when the dashboard shows it. SDP only displays it once.

Verify the key can read wallets

Use the new key against your self-hosted API:

export SDP_API_KEY="sk_test_..."

curl "http://localhost:8787/v1/wallets?view=summary" \
  -H "Authorization: Bearer $SDP_API_KEY"

The response should include the local wallet you created. At this point you have a self-hosted devnet stack with dashboard auth, local custody signing, and an API key bound to the wallet it is allowed to use.

Next steps

  • Use Environment reference to move from localhost defaults to real domains, external Postgres, or external Redis.
  • Use Upgrade & backup before keeping meaningful operator data in the stack.
  • Use External co-signers when a provider requires an additional signing process outside the default compose stack.
Is this page helpful?