Ente ist eine „private Cloud für deine Erinnerungen“ und als Alternative zu iCloud Fotos oder Google Fotos/Drive. Es auf einem TrueNAS Community (vormals TrueNAS SCALE) zu installieren, kann jedoch etwas verwirrend sein. Das kommt vor allem zu der teils veralteten und widersprüchlichen Dokumentation.
Prinzipien
Ente ist ein Set an sogenannten Apps, die unabhängig voneinander agieren. Verfügbar sind Apps für die API, Alben, öffentliche Alben, Accounts, Authentifizierung, Familie und Casting. Es verwendet S3-Speicher, um die hochgeladenen Fotos Ende-zu-Ende verschlüsselt zu speichern, und ein (optionales) Machine Learning, um seine Suche zu verbessern.
Abdeckung
In diesem Artikel erstelle ich ein Setup, um die Apps für API, Alben und und Accounts auszuführen. Die API ist die Verbindung zwischen allen Apps, Die Alben-Apps erlaubt es, hochgeladene Fotos anzusehen und die Accounts-App verwaltet Accounts, wie der Name bereits verrät. Da ich die anderen Apps nicht benötige, werde ich diese nicht konfigurieren.
Dieser Artikel ist außerdem nicht für Einsteiger in TrueNAS geeignet, sondern setzt grundlegende Kenntnisse über das Apps-System von TrueNAS voraus. Daher werden diese Teile auch nicht im Detail erklärt (wie beispielsweise Apps-Konfiguration, Logging etc.).
Was hat es mit der Dokumentation auf sich?
Zuerst einmal bietet die Dokumentation ein Quickstart-Skript, das auf TrueNAS Community nicht verwendet werden kann, da die Docker-Container hier als Apps funktionieren. Sie lässt zudem alles innerhalb eines einzelnen Containers laufen: die Apps, die Datenbank und den S3-Speicher.
Da ich den S3-Speicher vielleicht auch anderweitig nutzen möchte, habe ich mich dazu entschieden, es als separate App zu installieren. Da der Katalog von TrueNAS bereits MinIO als S3-Speicher anbietet, verwende ich diese.
MinIO
Die Installation von MinIO ist recht übersichtlich. Gehe in deine TrueNAS Web UI, wähle „Apps“ und dann „Discover Apps“, suche nach MinIO und installiere es wie jede andere App. Rufe danach die Konsole auf, indem du die Web UI der App öffnest, erstelle einen neuen Benutzer mit Lese- und Schreibberechtigung, der später verwendet wird, um Ente den Zugriff auf den S3-Speicher zu erlauben, und erstelle einen Bucket mit einem Namen, wie du möchtest. In meinem Fall lautet er ente.
Ente
Da Ente nicht als App direkt in TrueNAS verfügbar ist, muss sie manuell erstellt werden.
Stelle zuerst sicher, dass alle notwendigen Verzeichnisse und Dateien existieren. In meinem Fall laufen alle Apps unter /mnt/SSData/apps, weshalb innerhalb dieses Artikels dieser Pfad häufiger auftauchen wird, beispielsweise in der Docker-Datei. Stelle sicher, dass du ihn gemäß deines Setups anpasst.
Konfiguration
Es müssen die Verzeichnisse data sowie postgres-data und die Dateien credentials.yaml und museum.yaml erstellt werden. Alle innerhalb des Verzeichnisses der App. In meinem Fall habe ich folgende Befehle verwendet:
mkdir -p /mnt/SSData/apps/ente/data
mkdir -p /mnt/SSData/apps/ente/postgres-data
touch /mnt/SSData/apps/ente/credentials.yaml
touch /mnt/SSData/apps/ente/museum.yaml
Öffne die credentials.yaml und füge den folgenden Inhalt ein:
key:
encryption: *snip*
hash: *snip*
jwt:
secret: *snip*
db:
host: postgres
port: 5432
name: ente_db
user: pguser
password: *snip*
s3:
are_local_buckets: true
b2-eu-cen:
key: ente-user
secret: *snip*
endpoint: https://minio.domain.tld
region: eu-central-2
bucket: ente
Code-Sprache: YAML (yaml)
Für key.encryption, generiere einen Schlüssel mit diesem Befehl:head -c 32 /dev/urandom | base64 | tr -d '\n'
Für key.hash, generiere einen Hash mit diesem Befehl:head -c 64 /dev/urandom | base64 | tr -d '\n'
Für jwt.secret, generiere ein Secret mit diesem Befehl:head -c 32 /dev/urandom | base64 | tr -d '\n' | tr '+/' '-_'
Für db.password, kannst du ein Passwort mit diesem Befehl generieren:head -c 21 /dev/urandom | base64 | tr -d '\n'
Für s3.key und s3.secret, verwende deine entsprechende Kombination aus Benutzername und Passwort, die du in MinIO erstellt hast, wobei s3.key der Benutzername und s3.secret das Passwort ist.
Stelle außerdem sicher, dass du s3.endpoint zu deiner MinIO-Instanz änderst, passe die Region an deine Vorlieben an (sie ist nicht relevant) und verwende den Bucket-Namen, den du gewählt hast, für s3.bucket. Belasse s3.b2-eu-cen bestehen, da dieser Wert fest in Ente einprogrammiert ist, aber in dieser lokalen Umgebung nichts mit B2 zu tun hat.
Öffne die museum.yaml und füge den folgenden Inhalt ein:
apps:
accounts: https://ente-accounts.domain.tld
webauthn:
rpid: ente-accounts.domain.tld
rporigins:
- "https://ente-accounts.domain.tld"
Code-Sprache: YAML (yaml)
Ersetze die Domains, wie benötigt.
App installieren
Nun ist es Zeit, die eigentliche App zu erstellen. Gehe zu Apps > Discover Apps, klicke auf die drei vertikalen Punkte in der oberen rechten Ecke und wähle „Install via YAML“ im Drop-down-Menü aus. Ein neues Fenster öffnet sich, um eine individuelle App zu erstellen. Gib ihr einen Namen, in meinem Fall wieder ente, und füge die folgende Konfiguration ein:
services:
museum:
depends_on:
postgres:
condition: service_healthy
environment:
ENTE_CREDENTIALS_FILE: /credentials.yaml
image: ghcr.io/ente-io/server
ports:
- '8080:8080'
volumes:
- /mnt/SSData/apps/ente/credentials.yaml:/credentials.yaml:ro
- /mnt/SSData/apps/ente/museum.yaml:/museum.yaml:ro
- /mnt/SSData/apps/ente/data:/data:ro
postgres:
environment:
POSTGRES_DB: ente_db
POSTGRES_PASSWORD: *snip*
POSTGRES_USER: pguser
healthcheck:
start_interval: 1s
start_period: 40s
test: pg_isready -q -d ente_db -U pguser
image: postgres:15
volumes:
- /mnt/SSData/apps/ente/postgres-data:/var/lib/postgresql/data
web:
image: ghcr.io/ente-io/web
ports:
- '3000:3000'
- '3001:3001'
Code-Sprache: YAML (yaml)
Stelle sicher, dass du die POSTGRES_PASSWORD-Umgebungsvariable mit demselben Passwort ausfüllst, die du auch in der credentials.yaml hinterlegt hast.
(Sub-)Domains konfigurieren
Standardmäßig ist die Ente-API nun über die Host-IP und Port 8080 erreichbar, die Alben (bzw. Fotos) über Port 3000 und die Accounts über Port 3001.
In meinem Fall verwende ich ente.domain.tld für die API, ente-albums.domain.tld für die Fotos und ente-accounts.domain.tld für die Accounts, alle erstellt via Nginx Proxy Manager. Stelle sicher, dass du Domains über einen Proxy erstellst, da andernfalls die API immer versucht, sich zu localhost:8080 zu verbinden, wobei dann dein Browser versucht, sich zu deinem eigenen Rechner zu verbinden und nicht zum TrueNAS-System.
Erste Anmeldung
Bei der ersten Anmeldung musst du ein neues Benutzerkonto erstellen. Standardmäßig versucht Ente, ein Konto bei ente.io zu erstellen, auch wenn du es auf deiner eigenen Maschine hostest. Um sicherzustellen, dass du deine eigene Instanz verwendest, musst du dich zu ihr verbinden. Siehe dazu die Dokumentation, wie du zu ihr wechselst:
Dann kannst du mit der Kontoerstellung fortfahren. Nachdem du deine gewünschten Zugangsdaten eingegeben hast, ist ein OTP-Code erforderlich. Du findest ihn in den Logs des museum-Docker-Dienstes in deiner TrueNAS-App.
Beschränkung bei der Upload-Größe entfernen
Standardmäßig können neue Konten nur 10 GiB an Daten hochladen, auch wenn du sie selbst hostest. Um das zu ändern, benötigst du die CLI-Binärdatei.
Lade sie von hier herunter: https://github.com/ente-io/ente/releases?q=tag%3Acli-v0
Die Binärdatei muss sich zu der richtigen API verbinden können, daher musst du im selben Verzeichnis wie die Binärdatei eine config.yaml erstellen und sie mit folgendem Inhalt füllen:
endpoint:
api: "https://ente.domain.tld"Code-Sprache: YAML (yaml)
Auch hier musst du die Domain wieder entsprechend anpassen.
Jetzt musst du drei Befehle ausführen. Zuerst um das Konto zur CLI hinzuzufügen, dann das Abonnement aktualisieren, um die Beschränkung für die Upload-Größe zu entfernen und zuletzt die Benutzer-ID abrufen, die du dann in deine museum.yaml hinzufügen kannst, um die Sicherheit zu verbessern.
Der erste Befehl, um das Konto zur CLI hinzuzufügen:
$ ./ente account addCode-Sprache: Bash (bash)
Du musst den App-Typ angeben (photos), ein Exportverzeichnis (das wir nicht benötigen, aber es muss dennoch ein existierendes, gültiges Verzeichnis sein) und deine Zugangsdaten. Das kann dann so aussehen:
$ ./ente account add
Enter app type (default: photos): photos
Enter export directory: ~/
Enter email address: my-email@domain.tld
Enter password:
Please wait authenticating...
Enter TOTP: 979927
Account added successfully
run `ente export` to initiate export of your account data
Code-Sprache: Bash (bash)
Der Befehl zur Aktualisierung des Abonnements sieht dann so aus:
$ ./ente admin update-subscription --no-limit true -u my-email@domain.tldCode-Sprache: Bash (bash)
Stelle sicher, dass du my-email@domain.tld mit deiner eigenen E-Mail-Adresse ersetzt. Das --no-limit true sagt Ente, dass du keine Upload-Beschränkung hast. Trotz des Namens ist die tatsächliche Beschränkung danach 100 TiB. Die Ausgabe sieht dann etwa so aus:
$ ./ente admin update-subscription --no-limit true -u my-email@domain.tld
Assuming my-email@domain.tld as the Admin
------------
Successfully updated storage and expiry date for user
Code-Sprache: Bash (bash)
Liste nun deine Konten mit dem folgenden Befehl auf, um ihre ID zu bekommen:
$ ./ente account listCode-Sprache: Bash (bash)
Das sieht dann etwa so aus:
$ ./ente account list
Configured accounts: 1
====================================
Email: my-email@domain.tld
ID: 1540553952286438
App: photos
ExportDir: /Users/matze/
====================================
Code-Sprache: Bash (bash)
Zuletzt, öffne die museum.yaml und füge deine ID zur Admin-Liste hinzu. Standardmäßig ist der erste Benutzer immer der Admin, aber das explizite Setzen dieser Einstellung erhöht die Sicherheit:
internal:
admins:
- 1540553952286438Code-Sprache: YAML (yaml)
Vergiss nicht, danach die App neu zu starten und du bist fertig. 🙂
Hinweis zu Passkeys
Aktuell habe ich Passkeys nicht zum laufen gebracht, da die Passkeys-Seite immer versucht, sich zum falschen API-Endpunkt zu verbinden. Ich habe dafür ein Issue erstellt und werde diesen Artikel aktualisieren, sobald dafür eine Lösung gefunden werden konnte.