Hello everyone
I've been trying to use Storj as an S3 backend for PBS 4.1.6 and I'm running into multiple issues that in combination make it effectively unusable for me right now. I'd like to share the full picture in one place in case others see the same and to get some feedback from the team.
Setup
- PBS 4.1.6 with S3 datastore backend (other s3 backends work like Hetzner or Backblaze, but they aren't super reliable for PBS)
- Tried with the hosted Storj gateway (gateway.eu1.storjshare.io, path-style, region eu1, quirk skip-if-none-match-header)
- Also tried with a local self-hosted Storj gateway (gateway-st) behind nginx as TLS terminator, since PBS requires HTTPS and the gateway only speaks HTTP
- All other S3 clients I tested against the same endpoints (mc, aws cli, rclone, curl with SigV4) work without issues
Problem 1 — hosted Storj gateway: delete snapshot always fails with 502
Writing backups and verifying them works fine. But deleting a snapshot through the web UI or via proxmox-backup-manager snapshot forget fails every single time with:
Code:
failed to delete snapshot - "unexpected status code 502 Bad Gateway" (400)
The proxy log shows the raw upstream HTML:
Code:
proxmox-backup-proxy[xxxxx]: <html><body><h1>502 Bad Gateway</h1>
The server returned an invalid or incomplete response.
</body></html>
This is not intermittent — it happens on every delete attempt I've made. Retrying does not help.
Problem 2 — hosted Storj gateway: verify occasionally fails with missing etag
During verify jobs I sometimes see:
Code:
can't verify chunk, load failed - missing header 'etag'
TASK ERROR: verification failed - please check the log for details
It doesn't affect every chunk but it does cause verify jobs to fail.
Problem 3 — local gateway-st behind nginx: verify fails massively
To work around the hosted gateway issues I set up a local Storj gateway and put nginx in front of it for TLS. Writing backups works and verify used to succeed when the backup was freshly written and read back through the local gateway during the initial verify. A subsequent verify run however fails on thousands of chunks:
Code:
verified 24.72/116.00 MiB in 29.15 seconds, speed 0.85/3.98 MiB/s (2531 errors)
verify ... failed: chunks could not be verified
The gateway itself logs for each failed GET:
Code:
Error: Unable to write all the data to client uplink:
eestream: unexpected error: eestream: read completed buffer
I spent quite a bit of time narrowing this down:
- Pulling the same chunks directly via mc against the gateway (127.0.0.1:7777) works every time, including recursive parallel downloads
- The same via mc through nginx also works, single and parallel
- Single curl range request with SigV4 through nginx works (206, correct Content-Range)
- Only the PBS verify reliably triggers the eestream error in the gateway
So the gateway does clearly react differently to PBS's access pattern than to any other S3 client I tested, but the behavior is only visible in combination with PBS.
Current state
- Backups are written successfully to Storj using the hosted gateway
- Verify partially works on the hosted gateway, almost entirely fails on the local one
- Delete does not work at all on the hosted gateway
- Prune and GC I haven't even gotten to in any meaningful way because of the above
For me this means Storj as S3 backend is currently not usable — I can put data in, but I can't reliably check it, and I can't remove it.
Questions
- Is anyone running PBS against Storj successfully with full delete/prune/GC working?
- Would it be reasonable for the S3 client in PBS to retry on transient 5xx from the endpoint? A single 502 currently aborts the whole snapshot delete.
- Is the missing-etag case something PBS could be more lenient about, or should that strictly be enforced?
- Any suggestions from the team where to dig further, or is this something that would warrant a proper bug report since other tools like mc or aws work fine with both gateways?
Happy to provide more logs, packet captures, or run targeted tests. I know S3 backend is still tech preview, so this is meant as constructive feedback, not a complaint.
Thanks and Best Regards from
Switzerland