Das Genealogieprogramm Gramps

Das Genealogieprogramm namens Gramps hat viele Funktionen, aber eine Funktion, die es nicht hat, ist kollaboratives Arbeiten. Dafür gibt es aber inzwischen das Projekt Gramps Web. hier läuft das Programm nicht auf einem Computer und man muss mit USB-Sticks oder sonst was manuell die Datensätze synchron halten. Das ist zumindest das Versprechen von Gramps Web und ich habe mir gedacht, dass ich mir das einmal anschaue, insbesondere da das Schlossmuseum Freistadt eine solche Lösung gut gebrauchen könnte.

Gramps Web in DNS Eintragen

Als ersten Schritt muss man auf der Seite des jeweiligen Domain-Anbieters eine (Sub-)Domain für das Projekt anlegen. In diesem Fall ist es einfach eine Subdomain, denn dann braucht es nicht noch eine extra Adresse für dieses Projekt.

Die Einstellung sieht üblicherweise so aus, hängt aber vom jeweiligen Anbieter ab (die “x.x.x.x” sollen durch die richtige IP-Adresse des Servers, wo Gramps Web installiert wird, ersetzt werden):

Auf VPS installieren

Anleitung für die Dockerinstallation

Zuerst erstelle ich einen Ordner unter /opt mit mkdir /opt/gramps-web. Dort hinein kommt die docker-compose.yml Datei und die dazugehörigen Ordner.

Das ist die originale docker-compose.yml Datei:

version: "3.7"
 
services:
  grampsweb: &grampsweb
    image: ghcr.io/gramps-project/grampsweb:latest
    restart: always
    ports:
      - "80:5000"  # host:docker
    environment:
      GRAMPSWEB_TREE: "Gramps Web"  # will create a new tree if not exists
      GRAMPSWEB_CELERY_CONFIG__broker_url: "redis://grampsweb_redis:6379/0"
      GRAMPSWEB_CELERY_CONFIG__result_backend: "redis://grampsweb_redis:6379/0"
      GRAMPSWEB_RATELIMIT_STORAGE_URI: redis://grampsweb_redis:6379/1
    depends_on:
      - grampsweb_redis
    volumes:
      - gramps_users:/app/users  # persist user database
      - gramps_index:/app/indexdir  # persist search index
      - gramps_thumb_cache:/app/thumbnail_cache  # persist thumbnails
      - gramps_cache:/app/cache  # persist export and report caches
      - gramps_secret:/app/secret  # persist flask secret
      - gramps_db:/root/.gramps/grampsdb  # persist Gramps database
      - gramps_media:/app/media  # persist media files
      - gramps_tmp:/tmp
 
  grampsweb_celery:
    <<: *grampsweb  # YAML merge key copying the entire grampsweb service config
    ports: []
    container_name: grampsweb_celery
    depends_on:
      - grampsweb_redis
    command: celery -A gramps_webapi.celery worker --loglevel=INFO
 
  grampsweb_redis:
    image: redis:alpine
    container_name: grampsweb_redis
    restart: always
 
volumes:
  gramps_users:
  gramps_index:
  gramps_thumb_cache:
  gramps_cache:
  gramps_secret:
  gramps_db:
  gramps_media:
  gramps_tmp:

Für diesen Zweck möchte ich jedoch ein paar Änderungen. Ich habe die gramps-Daten lieber direkt unter /opt , und ich möchte auch gleich einen Reverse Proxy mit Caddy verwenden. Daher schaut die finale docker-compose.yml so aus:

version: "3.7"
 
services:
  grampsweb:
    image: ghcr.io/gramps-project/grampsweb:latest
    restart: always
    environment:
      GRAMPSWEB_TREE: "Stammbaum"
      GRAMPSWEB_CELERY_CONFIG__broker_url: "redis://grampsweb_redis:6379/0"
      GRAMPSWEB_CELERY_CONFIG__result_backend: "redis://grampsweb_redis:6379/0"
      GRAMPSWEB_RATELIMIT_STORAGE_URI: "redis://grampsweb_redis:6379/1"
    depends_on:
      - grampsweb_redis
    volumes:
      - ./gramps_users:/app/users
      - ./gramps_index:/app/indexdir
      - ./gramps_thumb_cache:/app/thumbnail_cache
      - ./gramps_cache:/app/cache
      - ./gramps_secret:/app/secret
      - ./gramps_db:/root/.gramps/grampsdb
      - ./gramps_media:/app/media
      - ./gramps_tmp:/tmp
      - ./app/config/config.cfg:/app/config/config.cfg
 
  grampsweb_celery:
    image: ghcr.io/gramps-project/grampsweb:latest
    restart: always
    environment:
      GRAMPSWEB_CELERY_CONFIG__broker_url: "redis://grampsweb_redis:6379/0"
      GRAMPSWEB_CELERY_CONFIG__result_backend: "redis://grampsweb_redis:6379/0"
    depends_on:
      - grampsweb_redis
    volumes:
      - ./gramps_users:/app/users
      - ./gramps_index:/app/indexdir
      - ./gramps_thumb_cache:/app/thumbnail_cache
      - ./gramps_cache:/app/cache
      - ./gramps_secret:/app/secret
      - ./gramps_db:/root/.gramps/grampsdb
      - ./gramps_media:/app/media
      - ./gramps_tmp:/tmp
      - ./app/config/config.cfg:/app/config/config.cfg
    command: celery -A gramps_webapi.celery worker --loglevel=INFO
    container_name: grampsweb_celery
 
  grampsweb_redis:
    image: redis:alpine
    container_name: grampsweb_redis
    restart: always
 
  caddy:
    image: caddy:2-alpine
    restart: always
    ports:
      - "80:80"  # HTTP
      - "443:443"  # HTTPS
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      - grampsweb
 
volumes:
  caddy_data:
  caddy_config:

Vor dem Starten des Containers noch zur Sicherheit alle Ordner hinzufügen, das geht mit diesem Befehl:

mkdir -p ./gramps_users
mkdir -p ./gramps_index
mkdir -p ./gramps_thumb_cache
mkdir -p ./gramps_cache
mkdir -p ./gramps_secret
mkdir -p ./gramps_db
mkdir -p ./gramps_media
mkdir -p ./gramps_tmp
mkdir -p ./app/config
touch ./app/config/config.cfg

Die config.cfg braucht dann noch ein paar Einträge die hier angeschnitten werden, denn bei mir hat es sonst nicht funktioniert. Ich habe die folgenden Einträge zur Konfigdatei hinzugefügt:

TREE="*"
BASE_URL="https://gramps.mywebsite.com"
SECRET_KEY="xxx"  # your secret key

Den Secret-Key kann man mit diesem Befehl im Terminal erzeugen…

python3 -c "import secrets;print(secrets.token_urlsafe(32))"

… und dann gut aufheben (in einem Passwortmanager zum Beispiel).

Anschließend muss man noch das sog. Caddyfile erstellen mit folgenden Inhalt:

gramps.mywebsite.com {
  reverse_proxy grampsweb:5000
}

Jetzt kann man mit docker compose up -d alles starten, und gegebenenfalls mit docker ps nachsehen, ob alles läuft. Das kann je nach Internetanbindung und Hardware etwas dauern.

Als nächstes muss man einen Administratoraccount erstellen und schon wird man von der Weboberfläche begrüßt:

Datenbank für’s Hochladen vorbereiten Nr. 1: Datenbank reparieren und überprüfen

Die Anleitung für den Datenimport findet man hier. Zuerst soll man die bestehende Datenbank auf Inkonsistenzen überprüfen unter “Tools” “Family Tree Repair” “Check and Repair Database…“. Das kann eine gewisse Zeit dauern.

Nr. 2: Absolute Pfade in Relative umwandeln

Der zweite Streich, das Umwandeln der absoluten in relative Pfade geht so (“Tools” “Utilities” “Media Manager”):

Hier klickt man auf “Next” und wählt anschließend “Convert paths from absolute to relative” aus:

Und “Apply” klicken:

Auch wenn bei dieser Datenbank eh keine Pfade zu konvertieren sind.

Nr. 3: Backup im Format .gramps erstellen

Nun kann die Datenbank sicher exportiert werden. Dazu klickt man auf “Family Trees” “Make Backup…” wählt den Namen und Speicherort aus und…

… klickt auf OK.

Datenbank auf Gramps Web hochladen

Jetzt kann man auf die Website mit Gramps Web gehen und dort zuerst auf “Einstellungen” klicken…

… dann auf “Verwaltung”:

Dort kann man bei “Stammbaum importieren” die exportierte Datei auswählen…

… und auf “Importieren” klicken:

Das kann wiederum eine Zeit dauern. Sobald der Importvorgang vollendet wurde, ist Gramps Web bevölkert:

Ersteinrichtung fertig

Damit ist die Gramps Web Datenbank hochgeladen und es kann direkt im Browser, ähnlich wie in der Desktop-Variante, gearbeitet werden. Wenn man jedoch lieber mit dem Programm arbeitet, gibt es noch ein weitere Möglichkeit Browserversion mit dem des eigenen Rechners zu verknüpfen.

Gramps Web Sync auf dem Rechner installieren

Um das Addon “Gramps Web Sync” zu installieren klickt man auf das grüne Puzzle-Symbol namens “Addon Manager”:

… und tippt ins Suchfeld “gramps web” und schon wird das Addon angezeigt:

Auf “Install” klicken und ist das Addon wird installiert.

Gramps Desktop mit der Gramps Web verbinden

klickt man auf “Tools” “Family Tree Processing” und dann auf “Gramps Web Sync…“. Dann klickt man auf “Proceed with the tool”…

… und klickt auf “next”…

… im nächsten Fenster füllt man die Websiten-Infos ein:

Dann beginnt der Vergleich der lokalen Daten mit denen auf dem Server (der zu diesem Zeitpunkt komplett leer ist):

Das wiederum kann recht lange dauern, wenn der Vorgang aber abgeschlossen ist, dann sieht man die jeweiligen Unterschiede zwischen den Datensätzen:

Etwas eigenartig ist nur, dass der hochgeladene Datensatz ja direkt aus dem lokalen heraus exportiert und hochgeladen wurde und keine Änderungen vorgenommen wurden.

Offene Punkte

Ich habe es auf Anhieb nicht geschafft, dass ich andere Benutzer mit Zugriffsrechten auf den Stammbaum einrichten konnte. Möglicherweise muss ich einen Benutzer neu anlegen, oder sonst noch etwas probieren. Aber das ist leider noch ein offener Punkt, den ich noch beheben werde.