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.
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.
| Requirement | Minimum | Comfortable |
|---|---|---|
| Free disk | 550GB | 2–8TB |
| RAM | 1GB | 2GB+ |
| Uptime | High (24/7) | 24/7 + UPS |
| Connection | Stable IP | Static 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.idstoragenode.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: 300sdocker compose up -d storagenode
docker compose logs -f storagenode | grep -iE "started|error"./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 -306. The long game: months 1–6
| Phase | What happens | Your job |
|---|---|---|
| Weeks 1–4 | Vetting: small test data, audit checks | Nothing. Don't restart unnecessarily. |
| Months 2–4 | Data accumulates slowly | Glance at logs weekly |
| Month 3+ | Held data grows toward capacity | First meaningful payouts arrive |
| Month 6+ | Steady state | Monthly 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
- Storj — ★★★★☆ 4.0/5