Eigene Domain für den Object Storage
Standardmäßig sind Objekte unter https://Bucketname.s3.internet1.de/<key> erreichbar. Diese Anleitung zeigt drei Wege, stattdessen eine eigene Domain wie files.example.com zu verwenden.
| Variante | Aufwand | Eigenes TLS-Zertifikat für die Domain | Zusätzlicher Server nötig |
|---|---|---|---|
| A: CNAME | gering | nein¹ | nein |
| B: NGINX Reverse Proxy | mittel | ja (z. B. Let's Encrypt) | ja |
| C: s3-proxy | mittel | ja | ja |
¹ Bei reinem CNAME präsentiert der Storage das Zertifikat für *.s3.internet1.de – HTTPS unter der eigenen Domain führt dadurch zu Zertifikatswarnungen. CNAME eignet sich daher primär für HTTP-Weiterleitungen oder in Kombination mit einem CDN, das TLS terminiert.
Variante A: CNAME-Eintrag
Voraussetzung: Der Bucket-Name muss exakt der gewünschten Domain entsprechen (Bucket files.example.com), damit die Virtual-hosted-Zuordnung funktioniert.
- Bucket mit dem Namen
files.example.comanlegen; Objekte, die öffentlich erreichbar sein sollen, entsprechend freigeben. - Beim DNS-Anbieter einen CNAME setzen:
files.example.com. 300 IN CNAME files.example.com.s3.internet1.de.
- Test:
http://files.example.com/pfad/objekt.jpg
Für sauberes HTTPS unter eigener Domain Variante B oder C verwenden – oder ein CDN mit eigenem Zertifikat vorschalten.
Variante B: NGINX Reverse Proxy
Ein eigener Server (z. B. centron Cloud-Server) terminiert TLS und reicht Anfragen an den Bucket weiter.
- DNS:
A/AAAA-Record vonfiles.example.comauf den Proxy-Server zeigen lassen. - Zertifikat besorgen, z. B.
certbot --nginx -d files.example.com. - NGINX-Konfiguration
/etc/nginx/sites-available/files.example.com:
server {
listen 443 ssl http2;
server_name files.example.com;
ssl_certificate /etc/letsencrypt/live/files.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/files.example.com/privkey.pem;
# Optionaler Cache für ausgelieferte Objekte
# proxy_cache_path /var/cache/nginx keys_zone=s3cache:10m max_size=10g; (im http-Block)
location / {
proxy_pass https://mein-bucket.s3.internet1.de/;
proxy_set_header Host mein-bucket.s3.internet1.de;
proxy_ssl_server_name on;
# Interne S3-Header nicht an Clients durchreichen
proxy_hide_header x-amz-request-id;
proxy_hide_header x-amz-id-2;
# Größere Uploads erlauben, falls PUT durchgereicht wird
client_max_body_size 0;
}
}
server {
listen 80;
server_name files.example.com;
return 301 https://$host$request_uri;
}
- Aktivieren und neu laden:
ln -s /etc/nginx/sites-available/files.example.com /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
Hinweis: In dieser Grundkonfiguration werden nur öffentlich lesbare Objekte ausgeliefert. Sollen private Objekte bereitgestellt werden, muss der Proxy Anfragen signieren – dafür eignet sich Variante C.
Variante C: s3-proxy
s3-proxy ist ein leichtgewichtiger Proxy, der Anfragen selbst signiert und damit auch private Buckets unter eigener Domain zugänglich macht – inklusive optionaler Authentifizierung, Templates und Verzeichnislisten.
Beispiel per Docker Compose:
services:
s3-proxy:
image: oxynozeta/s3-proxy:latest
ports:
- "8080:8080"
volumes:
- ./config:/proxy/conf
./config/config.yaml:
targets:
files:
mount:
path:
- /
bucket:
name: mein-bucket
region:
s3Endpoint: https://s3.internet1.de
credentials:
accessKey:
env: S3_ACCESS_KEY
secretKey:
env: S3_SECRET_KEY
Zugangsdaten als Umgebungsvariablen übergeben und den Dienst hinter NGINX (Variante B, proxy_pass http://127.0.0.1:8080;) mit TLS veröffentlichen.
Empfehlung
- Öffentliche Assets, wenig Aufwand: Variante A (+ CDN für HTTPS)
- Volle Kontrolle über TLS, Caching, Header: Variante B
- Private Buckets unter eigener Domain: Variante C