Statische Dateien auf einem CDN mit Casdoor hosten: S3, MinIO, Azure Blob und andere Storage-Provider
Um statische Dateien auf einem CDN zu hosten, speichern Sie diese im Objektspeicher (Amazon S3, MinIO, Azure Blob Storage, Google Cloud Storage, Alibaba Cloud OSS oder Tencent Cloud COS), konfigurieren Sie das CDN so, dass es Daten vom Bucket als Origin abruft, und geben Sie URLs auf der Domain des CDNs aus. In Casdoor ist dies eine einzige Einstellung: Erstellen Sie einen Storage-Provider für das Bucket und tragen Sie die CDN-Adresse im Feld Domain ein. Casdoor lädt Avatare und andere Dateien über die API des Providers hoch und speichert URLs, die mit dieser Domain beginnen. Auch das Frontend von Casdoor kann über ein CDN bereitgestellt werden, indem frontendCdnUrl und staticBaseUrl in app.conf konfiguriert werden.
Storage-Provider im Überblick
Ein Storage-Provider bestimmt, wohin Casdoor hochgeladene Dateien schreibt: Benutzer-Avatare, Bilder von Ausweisdokumenten, Nutzungsbedingungen-Seiten und alles, was auf der Seite Resources hochgeladen wird. Sie fügen den Provider einer Anwendung hinzu, und Uploads, die in dieser Anwendung getätigt werden, gehen an diesen Provider. Die Übersicht der Storage-Provider listet alle Typen auf. Diese Tabelle deckt die häufigsten Fragen ab:
| Speicher | Casdoor Provider-Typ | Nutzt Casdoor die S3-API? | Selbst hostbar | Wie die öffentliche URL gesetzt wird |
|---|---|---|---|---|
| Lokales Dateisystem | Local File System | Nein, einfache Dateien auf der Disk | Ja, es ist der Casdoor-Server | Wird von Casdoor unter /files/ bereitgestellt. Domain ist schreibgeschützt |
| Amazon S3 | AWS S3 | Ja | Nein | Domain: Die Bucket-URL oder eine CloudFront-Domain. Endpoint (Intranet): Ein VPC-Endpoint |
| MinIO | MinIO | Ja, mit Path-Style-Anfragen | Ja | Domain: Die MinIO-URL gefolgt vom Bucket-Namen oder eine CDN-Domain |
| Alibaba Cloud OSS | Aliyun OSS | Nein, das OSS SDK | Nein | Domain: Eine CDN-Domain. Wenn leer gelassen, wird daraus bucket.endpoint. Endpoint (Intranet): Der interne Endpoint |
| Tencent Cloud COS | Tencent Cloud COS | Nein, die COS-API | Nein | Domain: Eine CDN-Domain |
| Azure Blob Storage | Azure Blob | Nein, die Blob-API | Nein | Domain: Eine benutzerdefinierte oder Front Door-Domain. Casdoor fügt den Containernamen zum Pfad hinzu |
| Google Cloud Storage | Google Cloud Storage | Nein, Go-Client von Google | Nein | Domain: Wenn leer gelassen, wird daraus https://storage.googleapis.com. Casdoor fügt den Bucket-Namen zum Pfad hinzu |
| Synology NAS | Synology | Nein, die DSM File Station API | Ja | Kein Domain-Feld. Die URL basiert auf Endpoint |
Casdoor unterstützt auch Qiniu Cloud Kodo, CUCloud OSS und Casdoor, wobei letzteres Dateien in einer anderen Casdoor-Instanz speichert. Die provider-spezifischen Anleitungen für Amazon S3, MinIO, Azure Blob, Google Cloud Storage, Alibaba Cloud OSS, Tencent Cloud COS, Synology NAS und das lokale Dateisystem zeigen, welcher Wert in welches Feld gehört.
Endpoint vs. Domain
Diese beiden Felder erfüllen unterschiedliche Aufgaben, und die meisten CDN-Probleme entstehen durch deren Verwechslung.
- Endpoint ist die Adresse, die Casdoor verwendet, um mit der Storage-API zu kommunizieren: Hochladen, Löschen, Auflisten. Das CDN ist hier nicht involviert.
- Endpoint (Intranet) ersetzt Endpoint, wenn
isCloudIntranet = trueinapp.confgesetzt ist. Dies hält den Upload-Traffic im internen Netzwerk des Providers, wenn Casdoor in derselben Cloud läuft. Das Feld wird für AWS S3, Aliyun OSS, Azure Blob und CUCloud OSS angezeigt. - Domain ist die Basis der URL, die Casdoor speichert und die von Browsern angefordert wird. Wenn Sie ein CDN haben, gehört dessen Domain hierher.
- Path prefix wird vor jeden Objektschlüssel gesetzt. Mit einem Präfix von
casdoorlandet ein Avatar untercasdoor/avatar/....
Casdoor erstellt die Datei-URL aus dem Schema und Host der Domain, dann dem Pfad der Domain, dann dem Pfadpräfix, dann dem Dateipfad. Eine Domain ohne Schema erhält https://. Der Pfadteil der Domain wird auch Teil des Objektschlüssels, sodass https://cdn.example.com/casdoor/ Dateien unter casdoor/ im Bucket speichert. Für Azure Blob und Google Cloud Storage fügt Casdoor den Container- oder Bucket-Namen als erstes Pfadsegment nach dem Host hinzu. Ihr CDN muss diesen Pfad bereitstellen.
Wenn Domain leer ist, füllt Casdoor sie beim ersten Gebrauch des Providers aus dem Endpoint des Providers auf und speichert sie. Manchmal funktioniert das Ergebnis, wie bei OSS und GCS. Manchmal nicht: Bei einem S3-Endpoint ohne Bucket-Namen oder bei MinIO, wo path-style-Anfragen den Bucket-Namen im Pfad enthalten, fehlt der Bucket in der generierten URL. Legen Sie die Domain selbst fest, laden Sie einen Test-Avatar hoch und öffnen Sie die von Casdoor zurückgegebene URL, bevor andere sie verwenden.
Der Provider, den Casdoor für Avatare verwendet, die es von Social Logins kopiert, kommt aus defaultStorageProvider in app.conf. Es ist der Name eines Providers, der admin gehört (siehe Konfigurationsreferenz):
defaultStorageProvider = provider_storage_s3
isCloudIntranet = false
Öffentliche Buckets, private Buckets und signierte URLs
Casdoor speichert eine einfache, permanente URL im avatar-Feld des Benutzers und im Ressourcen-Datensatz. Es erstellt keine signierten oder ablaufenden URLs für diese Dateien. Daher muss alles, was sich an der Domain befindet, anonyme GET-Anfragen beantworten. Dafür gibt es zwei Möglichkeiten.
Machen Sie die Objekte öffentlich. Bei AWS S3 und MinIO lädt Casdoor jedes Objekt mit der public-read Canned ACL hoch. Bei Aliyun OSS macht die Client-Bibliothek dies standardmäßig genauso. Auf S3 kollidiert dies mit den Standardeinstellungen für neue Buckets: Laut AWS verwenden neue Buckets die Einstellung Bucket owner enforced, die ACLs deaktiviert, und ein Upload, der eine ACL wie public-read setzt, schlägt mit AccessControlListNotSupported fehl. Deshalb schalten Sie im Amazon S3 Guide ACLs ein und Block all public access aus. Bei OSS hat eine Objekt-ACL Vorrang vor der Bucket-ACL, sodass ein public-read-Objekt auch in einem privaten Bucket gelesen werden kann. MinIO verwendet die ACL nicht für anonyme Lesezugriffe. Es verwendet eine Bucket-Richtlinie:
mc anonymous set download myminio/casdoor
Azure benötigt erlaubten anonymen Zugriff auf das Speicherkonto und die Einstellung des Containers auf die Zugriffsstufe Blob. Google Cloud Storage benötigt die Rolle Storage Object Viewer (roles/storage.objectViewer), die allUsers auf dem Bucket gewährt wurde.
Halten Sie den Bucket privat und lassen Sie nur das CDN ihn lesen. Das CDN signiert seine Anfragen an den Origin, und Betrachter gehen über das CDN ohne Signatur. Jeder Anbieter hat seine eigene Version:
- CloudFront hat Origin Access Control (OAC). AWS verlangt Bucket owner enforced für OAC oder Bucket owner preferred, wenn Sie ACLs benötigen.
- Alibaba Cloud CDN kann von einem privaten OSS-Bucket abrufen, nachdem Sie es autorisiert haben.
- Tencent Cloud CDN hat Origin-Pull-Authentifizierung für private COS-Buckets.
- Azure Front Door Premium kann ein Speicherkonto über Private Link erreichen.
- Die Google Cloud CDN Anleitung behandelt auch den Zugriff auf private Buckets, wobei die Rolle Storage Object Viewer einem Service Account statt
allUserszugewiesen wird.
Dies verbirgt die URL des Buckets selbst, aber die Dateien sind weiterhin über das CDN öffentlich zugänglich. Bei den Typen AWS S3 und Aliyun OSS bleiben die Objekte auch über ihre Bucket-URLs lesbar, aufgrund der public-read ACL, die Casdoor setzt.
Wenn Avatare überhaupt nicht öffentlich sein dürfen, ist ein CDN vor dem Objektspeicher das falsche Werkzeug. Halten Sie diese Dateien auf einem Speichertyp, den Sie kontrollieren, und beschränken Sie, wer diesen Host erreichen kann.
Cache-Header und die Avatar-Falle
Auf S3 und MinIO setzt Casdoor Content-Type basierend auf der Dateiendung beim Hochladen. Es setzt Cache-Control auf keinem Provider. Das bedeutet, dass die Standard-TTL des CDNs gilt. Bei CloudFront werden Objekte ohne Cache-Control für die Standard-TTL zwischengespeichert, die 24 Stunden beträgt, wenn kein Cache-Policy verwendet wird. Um dies pro Objekt zu steuern, fügen Sie Cache-Control-Metadaten im Bucket hinzu. Für einen gesamten Pfad verwenden Sie eine Cache-Regel im CDN.
Avatare benötigen eine kurze TTL. Wenn ein Benutzer sein Bild ändert, schreibt Casdoor die neue Datei auf denselben Schlüssel, avatar/<organization>/<username>.<extension>, und speichert dieselbe URL. Eine lange TTL bedeutet, dass Leute das alte Bild sehen, bis es abläuft oder bis Sie diesen Pfad löschen oder invalidieren. Andere Uploads erhalten einen nummerierten Suffix (-1, -2, ...), wenn der Name bereits vergeben ist, sodass ein neuer Upload eine neue URL erhält und lange zwischengespeichert werden kann.
Ein funktionierendes Layout:
| Pfad | Empfohlenes Caching |
|---|---|
avatar/* | Kurze TTL (Minuten), oder Löschen bei Änderung |
resource/* und andere Uploads | Lange TTL |
Gehashte Frontend-Assets (assets/*) | Sehr lange TTL. Der Dateiname ändert sich bei jedem Build |
Casdoors eigenes Frontend auf einem CDN
Getrennt von Benutzer-Uploads gibt es drei Möglichkeiten, Casdoors eigene statische Dateien vom Casdoor-Server zu verlagern.
frontendCdnUrl. Verwenden Sie dies, wenn Sie das Frontend aus dem npm-Paket casdoor-web installieren. Zeigen Sie es auf ein npm-CDN, zum Beispiel:
frontendCdnUrl = "https://cdn.jsdelivr.net/npm/{name}@{version}"
Casdoor liest den Paketnamen und die Version aus der package.json im Build-Ordner. Es schreibt die Skript- und Stylesheet-Links in index.html auf dieses CDN um und behält die lokalen Pfade als Fallback bei. Wenn eine Datei nicht geladen werden kann, lädt der Browser sie von Casdoor, und ein Cookie hält diesen Browser für den Rest der Sitzung auf lokalen Dateien. Ein selbst erstelltes Frontend hat keine solche package.json, daher hat die Einstellung darauf keine Wirkung.
Das Deployment-Skript. Für ein Frontend, das aus dem Quellcode erstellt wird, erläutert Host the frontend files on a CDN deployment/deploy_test.go. Es lädt web/build/assets/ über einen Ihrer Speicheranbieter hoch und zeigt index.html auf die Domain des Anbieters, die mit / enden muss. Vite hasht diese Dateinamen, daher eignen sie sich für den langen TTL in der obigen Tabelle.
staticBaseUrl. Hiermit wird festgelegt, woher Standardbilder wie Logos, Anbieter-Symbole und der Standard-Avatar stammen. Der Standardwert ist https://cdn.casbin.org, der das Repository casbin/static bedient. In einem Netzwerk ohne Internetzugriff sollten Sie eine Kopie dieses Repositories selbst bereitstellen und staticBaseUrl darauf verweisen lassen, wie unter Host static files on an intranet beschrieben.
Auswahl treffen
- Ein Server, kleine Nutzerbasis:
Local File System. Hängen Sie das Verzeichnisfilesin ein Volume ein, wenn Casdoor in einem Container läuft. Casdoor sendet bei diesen DateienX-Content-Type-Options: nosniffund eine sandboxing-fähigeContent-Security-Policy, sodass eine hochgeladene HTML- oder SVG-Datei kein Skript auf Ihrer Casdoor-Domain ausführen kann. - Selbst gehostet und S3-kompatibel:
MinIO. Dies ist auch der Typ, den die Dokumentation für andere S3-kompatible Speicher empfiehlt. - Bereits in einer Cloud vorhanden: Nutzen Sie den Objektspeicher und das CDN dieser Cloud, setzen Sie Endpoint (Intranet) dort, wo Casdoor in derselben Cloud läuft, und legen Sie die Domain auf das CDN fest.
Referenzen
- Casdoor storage providers und der Quellcode:
object/storage.go,storage/,routers/frontend_cdn.go - AWS: Controlling ownership of objects and disabling ACLs, Restrict access to an Amazon S3 origin, Manage how long content stays in the cache
- MinIO:
mc anonymous set - Microsoft: Configure anonymous read access for containers and blobs, Integrate an Azure Storage account with Azure Front Door
- Google Cloud: Making data public, Set up Cloud CDN with a backend bucket
- Alibaba Cloud: Object ACL, Origin fetch from private OSS buckets
- Tencent Cloud: Setting CDN Acceleration for COS