Home / Playbooks / Storj storage node

Run a Storj Storage Node in Docker (Earn From Idle Disks)

Identity creation, vetting survival, and the exact compose file — how to turn spare terabytes into monthly STORJ payouts.

Intermediate⏱ ~45 minutes + weeks of ramp·Free (needs 550GB+ idle disk)·Updated 2026-08-24
Contents
  1. Reality check before you start
  2. Create your identity (one-time, back this up!)
  3. Sign up & get your API key
  4. Deploy the storage node
  5. Port forward 28967
  6. The long game: months 1–6

1. Reality check before you start

Storj pays for data actually held ($1.50/TB/mo) and served ($2/TB egress). New nodes spend weeks in vetting and months filling with data. This playbook plants an orchard, not a money tap — set calendar reminders for month 3 and month 6, not day 3.

RequirementMinimumComfortable
Free disk550GB2–8TB
RAM1GB2GB+
UptimeHigh (24/7)24/7 + UPS
ConnectionStable IPStatic IP or DDNS

One node per /24 subnet. Running two identities behind one household IP violates terms and gains nothing.

2. Create your identity (one-time, back this up!)

The identity authorizes your node. Generation is CPU-bound (hours on weak hardware) and the resulting files are irreplaceable — lose them, lose your reputation.

# run identity tool anywhere (laptop fine):
docker run --rm -it -v $(pwd)/identity:/identity \
  storjlabs/identity auth create /identity/storagenode.id 2>&1 | tail

# then authorize it against Storj's CA:
docker run --rm -it -v $(pwd)/identity:/identity \
  storjlabs/identity auth sign /identity/storagenode.id
Back up storagenode.id + .key somewhere off this machine before proceeding. Regenerating means starting reputation from zero.

3. Sign up & get your API key

1. Create an account at storj.io → Node Operators section

2. Generate a storage node API key from the dashboard

3. Note your external IP (or set up DDNS if dynamic)

4. Deploy the storage node

services:
  storagenode:
    image: storjlabs/storagenode:latest
    container_name: storj
    restart: unless-stopped
    ports:
      - "28967:28967/tcp"
      - "28967:28967/udp"
    environment:
      - WALLET=0xYOUR_ERC20_WALLET
      - ADDRESS=your.ip.or.ddns:28967
      - EMAIL=you@example.com
      - STORAGE=2TB            # honest value only!
      - API_KEY=***
    volumes:
      - ./storj-config:/app/config
      - ./storj-identity:/app/identity
      - ./storj-data:/app/data
    mem_limit: 1g
    stop_grace_period: 300s
docker compose up -d storagenode
docker compose logs -f storagenode | grep -iE "started|error"
Set STORAGE honestly. Overstating capacity causes failed audits and suspension. Also copy your identity files into ./storj-identity/ before first start.

5. Port forward 28967

Forward TCP+UDP 28967 from your router to the node host. Storj requires reachability for audits — unreachable nodes accumulate suspensions.

Verify: https://your-ip:28967 from external network should return a JSON-ish response (not timeout). Then watch the dashboard:

# node stats via CLI:
docker exec storagenode storagenode setup 2>/dev/null
curl -s localhost:14002/api/sno/ | python3 -m json.tool | head -30

6. The long game: months 1–6

PhaseWhat happensYour job
Weeks 1–4Vetting: small test data, audit checksNothing. Don't restart unnecessarily.
Months 2–4Data accumulates slowlyGlance at logs weekly
Month 3+Held data grows toward capacityFirst meaningful payouts arrive
Month 6+Steady stateMonthly STORJ settlements, convert at leisure

Maintenance is nearly zero: keep the box on, let Watchtower update the image, never delete the identity, and don't chase every restart warning. Check docker compose logs storagenode | grep -i fail monthly — occasional audit failures are normal noise, rising trends are not.

Tools used in this playbook

This guide contains referral links to some of the services mentioned. They cost you nothing and fund more testing. See disclosure.