Standardmäßig verwendet BookWyrm lokalen Speicher für statische Assets (Favicon, Standard-Avatar, etc.) und Medien (Benutzer-Avatare, Buchtitelbilder usw.), aber Sie können einen externen Speicherdienst verwenden, um diese Dateien zu bereitzustellen. BookWyrm verwendet django-storages, um externen Speicher wie S3-kompatible Dienste, Apache Libcloud oder SFTP anzubinden.
Erstelle einen Bucket in deinem S3-kompatiblen Dienst der Wahl, zusammen mit einer Zugangsschlüssel-ID und einem geheimen Zugriffsschlüssel. Diese können selbst gehostet sein, wie Ceph (LGPL 2.1/3.0) oder MinIO (GNU AGPL v3.0) oder kommerziell (Scaleway, Digital Ocean…).
Diese Anleitung wurde mit Scaleway Object Storage getestet. Wenn du einen anderen Dienst verwendest, teile bitte deine Erfahrungen (insbesondere wenn du andere Schritte unternehmen musstest), indem du einen Problembericht im BookWyrm-Dokumentations-Repository einreichst.
Wenn du eine neue BookWyrm-Instanz startest, wird der Prozess sein:
Wenn du deine Instanz bereits gestartet hast und Bilder auf den lokalen Speicher hochgeladen wurden, wird der Prozess sein:
Bearbeite die .env-Datei, indem du die folgenden Zeilen auskommentierst:
AWS_ACCESS_KEY_ID: Deine Zugangsschlüssel-IDAWS_SECRET_ACCESS_KEY: Dein geheimer ZugangsschlüsselAWS_STORAGE_BUCKET_NAME: Dein Bucket-NameAWS_S3_REGION_NAME: z.B. "eu-west-1" für AWS, "fr-par" für Scaleway, "nyc3" für Digital Ocean oder "cluster-id" für LinodeWenn dein S3-kompatibler Dienst Amazon AWS ist, solltest du startklar sein. Wenn nicht, musst du folgende Zeilen wieder einkommentieren:
AWS_S3_CUSTOM_DOMAIN: die Domain, auf der die Assets ausgeliefert werden:"example-bucket-name.s3.fr-par.scw.cloud""${AWS_STORAGE_BUCKET_NAME}.${AWS_S3_REGION_NAME}.digitaloceanspaces.com""eu-central-1.linodeobjects.com"AWS_S3_ENDPOINT_URL: der S3-API-Endpunkt:"https://s3.fr-par.scw.cloud""https://${AWS_S3_REGION_NAME}.digitaloceanspaces.com""eu-central-1.linodeobjects.com"Bei vielen S3-kompatiblen Diensten ist die ACL standardmäßig "public-read", und das ist auch der Standard in BookWyrm. Wenn du Backblaze (B2) verwendest, musst du die Standard-ACL in deiner .env-Datei leer lassen:
AWS_DEFAULT_ACL=""
Wenn die BookWyrm-Instanz bereits läuft und Medien hochgeladen wurden (Benutzer-Avatare, Buchtitelbilder…), musst du hochgeladene Medien in deinen Bucket migrieren.
Diese Aufgabe wird mit dem Befehl erledigt:
./bw-dev copy_media_to_s3
Um den S3-kompatiblen externen Speicher zu aktivieren, musst du deine .env-Datei bearbeiten, indem der Eigenschaftswert für USE_S3 von false zu true geändert wird:
USE_S3=true
Beachte dass nach v0.7.5 angenommen wird, dass aller Datenverkehr über HTTPS läuft. Du musst also sicherstellen, dass dein externer Speicher ebenfalls über HTTPS ausgeliefert wird.
Danach musst du folgende Befehle ausführen, um die Themes zu kompilieren und alle statischen Assets in deinen S3-Bucket zu kopieren:
./bw-dev compile_themes
./bw-dev collectstatic
Sobald die statischen Assets gesammelt sind, musst du CORS für deinen Bucket einrichten.
Einige Dienste wie Digital Ocean bieten eine Schnittstelle, um es einzurichten, siehe Digital Ocean doc: Wie man CORS konfiguriert.
Wenn dein Dienst keine Schnittstelle zur Verfügung stellt, kannst du CORS trotzdem mit der Befehlszeile einrichten.
Erstelle eine Datei namens cors.json mit folgendem Inhalt:
{
"CORSRules": [
{
"AllowedOrigins": ["https://MY_DOMAIN_NAME", "https://www.MY_DOMAIN_NAME"],
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET", "HEAD", "POST", "PUT", "DELETE"],
"MaxAgeSeconds": 3000,
"ExposeHeaders": ["Etag"]
}
]
}
Ersetze MY_DOMAIN_NAME durch den/die Domainname(n) deiner Instanz.
Führe dann den folgenden Befehl aus:
./bw-dev set_cors_to_s3 cors.json
Keine Ausgabe bedeutet, dass alles glatt lief.
Für Linode musst du eine Änderung an der .env-Datei vornehmen, um sicherzustellen, dass die generierten Links zu deinen Storage-Objekten korrekt sind. Wenn du diesen Schritt auslässt, werden alle Links zu Bildern und statischen Dateien (wie CSS) kaputt sein. Um dies zu beheben, musst du den Bucket-Name zur AWS_S3_CUSTOM_DOMAIN hinzufügen. Wenn dein AWS_STORAGE_BUCKET_NAME "my-bookwyrm-bucket" lautet, ändere die Domain zu:
AWS_S3_CUSTOM_DOMAIN=my-bookwyrm-bucket.cluster-id.linodeobjects.com
Beachte: Ab diesem Zeitpunkt werden bw-dev copy oder sync Objekte an einem falschen Ort deines Objekt-Storage ablegen. Wenn du sie also nutzen musst, kehre die letzte Änderung um, führe den Befehl aus und nimm die Änderung danach erneut vor.
Nach v0.7.5 werden Dateien für den Export und Import von Accounts im lokalen Speicher abgelegt, auch wenn USE_S3 auf true gesetzt wurde. Allgemein ist es sicherer, für diese Dateien den lokalen Speicher zu verwenden und den Speicherbedarf unter Kontrolle zu behalten, indem ein Task eingerichtet wird, der periodisch alte Export- und Importdateien löscht.
Wenn du eine große Instanz betreibst, kann es sein, dass du die Nutzung von S3 für diese Dateien bevorzugst. In diesem Fall musst du die Umgebungsvariable USE_S3_FOR_EXPORTS auf true setzen.
Wenn du eine neue BookWyrm-Instanz aufsetzt, kannst du jetzt zur Einrichtungsanleitung zurückkehren: [Docker] [Dockerless]. Wenn nicht, lese weiter.
Sobald die Medienmigration abgeschlossen und die statischen Assets gesammelt wurden, kannst du die neue .env-Konfiguration laden und die Instanz neustarten mit:
./bw-dev up -d
Wenn alles gut geht, wurde dein Speicher ohne Serverausfall geändert. Wenn einige Schriftarten fehlen (und die Browser-JS-Konsole mit Warnung über CORS aufwartet), schlug etwas hier fehl. In diesem Fall kann es gut sein, die Header einer HTTP-Anfrage auf eine Datei in deinem Bucket zu überprüfen:
curl -X OPTIONS -H 'Origin: http://MY_DOMAIN_NAME' http://BUCKET_URL/static/images/logo-small.png -H "Access-Control-Request-Method: GET"
Ersetze MY_DOMAIN_NAME durch deinen Domain-Namen, BUCKET_URL mit der URL für deinen Bucket, du kannst den Dateipfad durch jeden anderen gültigen Pfad in deinem Bucket ersetzen.
Wenn du eine Nachricht siehst, insbesondere eine Nachricht, die mit <Error><Code>CORSForbidden</Code> beginnt, funktionierte sie nicht. Wenn du keine Nachricht siehst, funktioniert es.
Für eine aktive Instanz kann es eine Handvoll Dateien geben, die während der Zeit zwischen der Migration der Dateien auf den externen Speicher lokal erstellt wurden und ein Neustarten der App nutzt den externen Speicher. Um sicherzustellen, dass alle noch verbleibenden Dateien nach dem Umschalten auf den externen Speicher hochgeladen werden, kannst du folgenden Befehl verwenden, der nur Dateien hochlädt, die nicht bereits im externen Speicher vorhanden sind:
./bw-dev sync_media_to_s3
Hinweis: Du kannst diesen Schritt überspringen, wenn du eine aktualisierte Version von BookWyrm verwendest; im September 2021 wurde der "Selbst-Steckverbinder" in PR #1413 entfernt
Damit die richtige URL für die Anzeige lokaler Buchsuchergebnisse verwendet wird, müssen wir den Wert für die URL-Basis der Titelbilder ändern.
Konnektor-Daten können über die Django-Admin-Schnittstelle unter der URL http://MY_DOMAIN_NAME/admin aufgerufen werden. Der Konnektor für deine eigene Instanz ist der erste Datensatz in der Datenbank, damit du auf den Konnektor mit dieser URL zugreifen kannst: https://MY_DOMAIN_NAME/admin/bookwyrm/connector/1/change/.
Das Feld Covers url ist standardmäßig als https://MY_DOMAIN_NAME/imagesdefiniert, Sie müssen es auf https://S3_STORAGE_URL/images ändern. Klicke auf Speichern und voilà!
Du musst den Wert für die Covers Url jedes Mal aktualisieren, wenn du die URL für deinen Speicher änderst.