# Move PeerTube video storage to Hetzner S3 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 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. ## 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`: ```json * GET HEAD * ``` Apply it to your bucket(s): ```json 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: ```json 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: ```json CORS: *... ``` ## 3️⃣ Edit PeerTube configuration Open `/app/data/production.yaml` and add or modify this block: ```yaml 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. ## 4️⃣ Move videos to S3 From the Cloudron Web Terminal: ```bash 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: ```bash 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)