-
Hi everyone,
after a few failed attempts with other S3 providers like iDrive and Backblaze,
I tried Hetzner Object Storage (S3) — where we also host our Cloudron servers.
Here’s my working setup and migration process — maybe it helps someone.
Everything works great: I’ve successfully moved ~240 GB of videos, all without issues.This guide shows how to move PeerTube video storage to Hetzner Object Storage (S3-compatible) on a Cloudron instance. Tested with PeerTube 7.3.0 and Cloudron v8.3.2 (Ubuntu 24.04.1 LTS)
1️⃣ Create your S3 bucket(s)
- Region: fsn1 (Falkenstein)
- Visibility: Public (read)
- Block Public Access: off
Example buckets: peertube-1
2️⃣ Set CORS configuration
Create a file called
example-cors.xml
:<CORSConfiguration> <CORSRule> <AllowedHeader>*</AllowedHeader> <AllowedMethod>GET</AllowedMethod> <AllowedMethod>HEAD</AllowedMethod> <AllowedOrigin>*</AllowedOrigin> </CORSRule> </CORSConfiguration>
Apply it to your bucket(s):
s3cmd --config=/dev/null --no-check-certificate \ --access_key=YOUR_ACCESS_KEY \ --secret_key=YOUR_SECRET_KEY \ --host=fsn1.your-objectstorage.com \ --host-bucket="%(bucket)s.fsn1.your-objectstorage.com" \ setcors example-cors.xml s3://peertube-1
Check it:
s3cmd --config=/dev/null --no-check-certificate \ --access_key=YOUR_ACCESS_KEY \ --secret_key=YOUR_SECRET_KEY \ --host=fsn1.your-objectstorage.com \ --host-bucket="%(bucket)s.fsn1.your-objectstorage.com" \ info s3://peertube-1 | grep CORS -A1
You should see:
CORS: <CORSConfiguration ...><AllowedOrigin>*</AllowedOrigin>...</CORSConfiguration>
3️⃣ Edit PeerTube configuration
Open
/app/data/production.yaml
(Cloudron path) and add or modify this block:object_storage: enabled: true endpoint: 'https://fsn1.your-objectstorage.com' region: 'eu-central' credentials: access_key_id: 'YOUR_ACCESS_KEY' secret_access_key: 'YOUR_SECRET_KEY' videos: bucket_name: 'peertube-1' prefix: 'videos/' base_url: 'https://peertube-1.fsn1.your-objectstorage.com' upload_acl: 'public-read' streaming_playlists: bucket_name: 'peertube-1' prefix: 'hls/' base_url: 'https://peertube-1.fsn1.your-objectstorage.com' upload_acl: 'public-read' previews: bucket_name: 'peertube-1' prefix: 'previews/' base_url: 'https://peertube-1.fsn1.your-objectstorage.com' upload_acl: 'public-read' thumbnails: bucket_name: 'peertube-1' prefix: 'thumbnails/' base_url: 'https://peertube-1.fsn1.your-objectstorage.com' upload_acl: 'public-read' captions: bucket_name: 'peertube-1' prefix: 'captions/' base_url: 'https://peertube-1.fsn1.your-objectstorage.com' upload_acl: 'public-read'
Save and restart PeerTube from the Cloudron dashboard.
4️⃣ Move videos to S3
From the Cloudron Web Terminal:
cd /app/code/server
gosu cloudron:cloudron npm run create-move-video-storage-job -- --to-object-storage
This creates jobs that migrate all videos to your S3 bucket. Progress can be monitored in Cloudron → App → Logs.
5️⃣ Verify
Check the directory size before/after:
du -sh /app/data/storage du -sh /app/data/storage/* | sort -h
When migration finishes, most data (videos, HLS, previews) should move to S3. Local disk usage should drop to a few GB.
Tested setup
- PeerTube 7.3.0
- Cloudron v8.3.2
- Hetzner Object Storage (fsn1)
-
-
When you find some time, we can also put this into the community guides - https://docs.cloudron.io/guides/community/
-
@archos you can send a MR here - https://git.cloudron.io/docs/docs . It can go in this directory - https://git.cloudron.io/docs/docs/-/tree/master/knowledgebase/docs/guides/community?ref_type=heads . Do you already have an account on gitlab ? Otherwise , @girish or @nebulon can send you an invite .