Storj storage node: rents out disk space and is paid in STORJ/USDC; the only service that requires WAN reachability (port 28967). Jarvis watches it read-only (
/storj, see Jarvis; versions: Jarvis: version log). Rewritten 2026-10-14 after a full audit; the numbers are from that day.
The node holds about 3.4 TB (the satellites pay for about 2.6 TB of it) on a dedicated 18 TB disk. Earned so far $4.12, of which $2.36 is held back (50% now, 25% from December, none from March 2027); $1.73 has reached the wallet, and that matches the blockchain to the cent. Healthy, vetted on all four satellites, small and young (joined 2026-06-28).
Written 2026-10-14 after a full audit of the node (Cody: "I feel like I'm not being compensated properly or something isn't right"). Verdict: the node is healthy and the payouts are correct; it is simply small and young. Everything here was measured on that day; numbers move.
| Guest | LXC 114 "Storj" on M910q, 1 vCPU, 4 GB, root ceph-storage:vm-114-disk-0 25 GB (80% -> 8% used after the log fix), IP 192.168.86.211, in the weekly Sunday backup job (so /opt/storj/identity is saved with the root disk) |
| Software | storjlabs/storagenode:latest in Docker (compose file /opt/storj/compose.yaml, settings in /opt/storj/.env), v1.164.2 on 2026-10-14, self-updates through the image's built-in updater. Runs as root in the container (UID=0 in .env); the old wiki page said non-root, which was wrong |
| Joined | 2026-06-28; 4 satellites (saltlake, ap1, us1, eu1), all vetted (Jul 19 - Aug 11) |
| Address | storj.codycodez.com:28967 (tcp + udp). DNS name = the live public IP (checked 2026-10-14); QUIC OK |
| Data disk | a dedicated WDC Ultrastar 18 TB (/dev/sdc1, XFS label STORJ01, noatime) mounted at /mnt/disk1 on M910q, then a one-branch mergerfs pool at /srv/storage/storj, which is the container's /storage. SMART clean (0 reallocated / pending / uncorrectable, 27.9k hours, 40 C). systemd makes the pool wait for the disk (RequiresMountsFor=/mnt/disk1), so a missing disk cannot make the node start on an empty folder |
| Storage format | the new hashstore (/storage/storage/hashstore/<satellite>/s0,s1); the old blobs/ folder is empty (migration finished) |
| Allowance | 16 TB (STORAGE=16TB) |
| Dashboard / API | http://192.168.86.211:14002 on the LAN (read-only information, no controls). Jarvis reads it |
| Log | Docker json log limited to 3 x 50 MB since 2026-10-14 00:58 UTC (logging: block in the compose file; Cody ran ops/storj-log-rotation.sh). The old 18 GB log was the reason the root disk was full |
priceModel), so it ran about 24% low against the real September statements ($2.23 estimated vs $2.93 earned)./api/heldamount/paystubs/<from>/<to>, amounts in millionths of a dollar): comp* = earned, held, owed = earned - held, paid, distributed. Satellites create them around the 12th-18th of the next month.0x303EDCD8DbE1607fe512D45CC15d3E41fa4db44B: $1.728. To the cent. (The October payment came as USDC rather than STORJ; the reason is Storj's.) July's $0.034 was not paid out yet and rolls forward. The per-month split the satellites report does not line up with the arrival dates; the totals do.operator.wallet-features is empty). It carries address-poisoning litter (look-alike tokens and dust from 2026-06-28). Never copy an address out of that wallet's history.The node holds 3.37 TB (+0.24 TB trash, 0.44 TB "reclaimable" in hashstore logs); the satellites credit about 2.56 TB. The gap (~0.8 TB, 24%) is data customers deleted that the node has not been told to remove yet (bloom-filter garbage collection and hashstore compaction run on their own schedule). Payment follows the satellites' number. It shrinks by itself; compaction settings only free disk, not money, and the disk is nowhere near full, so nothing was changed.
Also: the hashstore log files are marked pre-allocated by XFS, so the disk uses about 1.48x the space of their contents (4.6 TiB of blocks for 3.1 TiB of data). Harmless today (12 TiB free), but the 18 TB drive will be full at roughly 12 TB of node data, not 16.
/storj forecast)Method: least-squares growth of the satellite-credited TB over the last ~13 days (45 GB/day); egress and repair egress as a share of what is stored (15.9% and 12.0% per month) giving about $2.06 gross per credited TB-month; the removal share (ingress minus net growth, divided by stored: 1.1% per day) gives a level-off estimate (ingress / removal share = 6.3 TB).
/storj (health), /storj money, /storj forecast, /storj payouts; the model tool get_storj_status; a Storj group in the Console menu. Plain questions ("how much has my storj node made") fetch the live numbers first./problems and the watch (/watch on) include the node: disqualified or suspended on any satellite, audit score under 99%, suspension under 95%, online score under 95%, software not up to date, QUIC not OK, no satellite contact for 2 hours, allowance 95% full, dashboard not answering. Mute with /mute storj.eth.blockscout.com) for token transfers INTO the node's own wallet. A transfer counts only if the token contract is STORJ or USDC (by contract address, never by name) and the sender is on the policy's list of Storj payout addresses, so address-poisoning dust and look-alike tokens are ignored. The first pass only learns what already arrived; after that, each new payment produces one ntfy message ("Storj paid you 0.79 USDC (about $0.79)...") titled "Storj payout". It runs on its own thread, so it reaches ntfy even while Cody is chatting on the web page. The only thing sent outside is the wallet address (public chain data). storj.payout_watch.chain: false switches that off: it then only watches the satellites' own "paid out" total./etc/jarvis/policy.json, key storj): enabled, url (private http address only), rates, alerts (thresholds), disk_tb / disk_overhead (for the "drive fills first" line), payout_watch (enabled, chain, every_s, senders). Tool get_storj_status is T0/auto. Nothing in the module can write: it only issues GET requests, checked by a test./storj).disk_overhead) should go back to 1.| Port | Purpose |
|---|---|
| 28967 tcp+udp | node traffic: must be port-forwarded from WAN (storj.codycodez.com = the live public IP) |
| 14002 | dashboard and API on the LAN (Jarvis reads it; also published as storj.codycodez.com via NPM per the earlier setup) |
LXC 114 is in the weekly Sunday job (backup-storage), so /opt/storj/identity (irreplaceable: the node's identity and its held money) is saved with the root disk. The 4.9 TiB of data is a bind mount and is deliberately not backed up: Storj tolerates the loss of a node badly, but the data is replaceable and Ceph replication would waste paid-per-TB space.
cd /opt/storj && docker compose pull && docker compose up -d && docker image prune -f
The image also updates the node itself through the network's rollout; keep the image fresh monthly. Recreating the container is safe for the node's standing as long as /opt/storj/identity and /storage stay mounted (the log-rotation script checked image, ports, mounts and environment before and after).
Kuma: Storj - Ping / Dashboard / Node Port / Domain (4 monitors). Jarvis: /problems and /watch include the node's own health (disqualified, suspended, scores, version, QUIC, silent satellites, nearly full), and a payout notice arrives when money reaches the wallet.