Deploying a Static Site
to Quilibrium QStorage
A practical guide using Python / boto3
What You'll Need
Quilibrium Account
Active account with QStorage enabled in QConsole
API Credentials
Access Key ID + Secret Access Key generated from QConsole
Python 3 + boto3
Python 3.8+ with the boto3 library installedpip install boto3
Static Site Files
Your HTML, CSS, JS, and assets ready to upload
Gotcha: AWS CLI v2 Doesn't Work
The Problem
AWS CLI v2 uses aws-chunked transfer encoding by default
It sends CRC64NVME checksums that QStorage rejects
Result: uploads fail silently or with cryptic errors
The Fix
Use Python boto3 — it sends standard requests without chunked encoding
boto3 is the officially recommended approach for QStorage
If you must use CLI, try aws-cli v1 with --no-verify-ssl
Get Credentials & Configure
How to get credentials
Log in to QConsole
Navigate to Services → QStorage
Click Generate API Keys
Copy Access Key ID + Secret Access Key
💡 Note: API key approval may require contacting support channels. Check your QConsole dashboard for status.
Create Bucket & Upload Files
CRITICAL: Apply Public-Read ACL Separately
❌ Wrong — ACL is silently stripped
QStorage silently ignores the ACL key inside ExtraArgs during upload.
✅ Correct — Separate ACL call
Website Hosting & Bucket Policy
Access Your Site
Path-style URLs require authentication headers. Browsers can't send these — visitors will get Access Denied.
Virtual-hosted–style URLs route through the website endpoint. The bucket policy + ACL grant public access — works in any browser.
💡 Tip: Add a custom domain via DNS CNAME pointing to your virtual-hosted URL for a branded experience.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Access Denied on website URL | Missing bucket policy or ACL | Apply put_bucket_policy + put_object_acl per object |
| Upload fails with encoding error | AWS CLI v2 chunked encoding | Switch to boto3; avoid AWS CLI v2 with QStorage |
| 404 on index.html | Website hosting not enabled | Call put_bucket_website with correct index suffix |
| CSS/JS not loading | Wrong Content-Type on upload | Set ContentType in ExtraArgs: text/css, application/javascript |
| Credentials not found | Wrong profile or missing config | Verify ~/.aws/credentials and ~/.aws/config paths |
Minimal deploy.py in 6 Steps
Create S3 client with QStorage endpoint
create_bucket()
Upload files with ContentType
put_object_acl() per file
put_bucket_website()
put_bucket_policy()
For the full walkthrough with explanations, see
qstorage-deploy-guide.md