# 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)