Move PeerTube video storage to Hetzner S3 (Cloudron setup, CORS fix)
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
peertube-2
(optional, for another instance)
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)