Synology Photos Wo werden die Benutzerdatenbanken gespeichert?

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Status
Für weitere Antworten geschlossen.

tAntChen

Benutzer
Registriert
12. Sep. 2011
Beiträge
152
Reaktionspunkte
19
Punkte
18
Ich musste meine DS, nach einem Plattenausfall, neu aufsetzten. Nun möchte ich den alten Zustand (Alben,etc..) wieder herstellen jedoch finde ich den Ordner nicht in dem Synology Photos die Einstellungen/Datenbanken speichert.
 
Das wird schwierig: volume(x)/@appstore
Hast du kein Backup von Synology Photos mit den Einstellungen?
 
ich hab ein Backup von /volume1/@appstore
ich hoffe das reicht.
 
Puhh, schwierig weil nicht alles dort liegt, soweit ich weiß.
Aber versuche es doch einfach mal.
 
Leider nicht. Das hab ich schon fast befürchtet. Der kram ist ist bestimmt wieder überall im System verkrümelt.
Wäre ja auch noch schöner wenn sowas im @User/home speichern würde.
 
Ich hab mal ein wenig recherchiert. Die Datenbank "synofoto" scheint eine Postgres-Datenbank zu sein. Wo sie liegt, ist etwas schwer zu finden.
Code:
root@DS1522:/volume1# su - postgres
postgres@DS1522:~$ psql -c "select oid, datname from pg_database"
  oid  |   datname
-------+-------------
 12155 | postgres
     1 | template1
 12154 | template0
 16387 | autoupdate
 16385 | synoindex
 16815 | ong
 19312 | synofoto
 18863 | mediaserver
(8 rows)

postgres@DS1522:~$ ls -ld $PGDATA/base/19312
drwx------ 1 postgres postgres 8532 Apr  5 10:46 /var/services/pgsql/base/19312
postgres@DS1522:~$
/var/services/pgsql ist ein Link auf /volume1/@database/pgsql, also ist die Datenbank (bei mir) das Verzeichnis /volume1/@database/pgsql/base/19312 mit vielen Dateien drin.
 
Danke für den Hinweis die Datenbanken hab ich auch mit im Backup. Da muss ich mal schauen wie ich das wieder herstellen kann. Da sehe gerade nur 2 gängige Varianten:
  1. Postgres stoppen und die Dateien austauschen und dann wieder starten
  2. Die Postgres Datenbank aus dem Backup zum laufen bringen und einen Dump von der "synofoto" DB ziehen und in die DS-Postgres DB einspielen
Die erste Variante ist sicher die schnellere aber wohl auch die unsicherste. Fängt schon damit an wie sich die DS verhält wenn ich Postgres anhalte. Ich versuche es mal und Melde mich dann.
 
@Benares es hat geklappt. Wie zu erwartend war Variante 1 nicht möglich da ich auf Dateiebene nicht sehen konnte welcher Ordner die synofoto DB repräsentiert. Also hab ich mir das Postgres backup in einen Docker-Container gefummelt und dann einen Dump von synofoto gezogen. Diesen hab ich dann auf der DS eingespielt.
Jetzt hab ich alle meine Alben und Tag wieder zurück.

Fazit:
Diese Erfahrung hat mir gezeigt dass ich eine richtige Backup-Strategie für Synology Photo benötige. Denn wie in meinem Fall war ein Full-Restore keine Option. Also muss ich mir ein Backup-Script schreiben welches die verschieden Ordner und die Datenbank sichert. Bleibt nur zu hoffen dass Synology Photos eine weile Bestand haben wird. Mit dieser Evolution (Photo Station > Moments > Synology Photos) hat sich Synology wahrlich nicht mit Ruhm bekleckert.
 
@tAntChen Ich stehe vor dem gleichen Problem. Die aktuellen Sicherungsmöglichkeiten von Synology Photos sind unbefriedigend. Folgender Anwendungsfall:
1. Alle Bilder des freigegebenen Ordners "photo" werden in die Cloud synchronisiert, so dass man auch über die Cloud auf die Bilder zugreifen kann.
2. Alben (u.a. auch die Personenzuordnungen) bekomme ich nicht gesichert.

Die Sicherung über Hyperbackup lässt nur eine Sicherung der Daten (die schon in der Cloud liegen) und der Alben zu. Das wäre dann doppelt in der Cloud und ist bei einer großen Bildermenge nicht wirtschaftlich. Eine Sicherung der Datenbank von Synology Photos habe ich nicht hinbekommen.

Also: Ich habe Interesse an deinem Backup-Script oder anderen Lösungen. Danke vorab!
 
Sorry hat etwas gedauert aber heute hab ich es soweit erstmal fertig. Einen Dump zu ziehen war ja nicht schwer aber der nützt ja nix wenn man ihn nicht sauber einspielen kann. Beim Import wird der Dump erstmal unter einem anderen Namen in postgres gepumpt, dann wird erstmal die Datenbank-Version mit der aktuellen Installation verglichen. Wenn eine andere Version installiert ist bricht der Import erstmal ab. Dann sollte man SP deinstallieren und und den Import wiederholen.
Zudem hab ich da eine Tabelle (user_info) gefunden, die den username und die userId enthält, in dieser versuche ich die userId anzupassen, falls die DS neu aufgesetzt wurde und die Ids nicht mehr passen.
Ich hab ehrlich gesagt keine Ahnung ob das nötig ist oder ob SynologyPhotos das selbst pflegt. Eventuell weiss da jemand mehr.

Über Verbesserungsvorschläge und andere Anmerkungen würde ich mich freuen denn ich bin wahrlich kein Profi im bash-scripting.

Anpassungen
Oben im Script gibt es die Variablen backupDir und maxBackups diese kann man selbst noch anpassen. Die Variable backupDir kann man aber auch beim Aufruf mit -d setzten.

Install
Den kompletten Code in eine Datei (z.B. synology-photo-backup.sh) abspeichern und irgendwo hin schieben wo nicht gleich jeder ran kommt.
Ich hab solche Scripte immer in /user/local liegen.
Dann kann man über den Aufgaben-Planer das Script regelmäßig ausführen.

Usage
Backup: #./script -b [-d /path/to/backup-dir]
Restore: #./script -r /path/to/backup-dir/dump.sql


Bash:
#!/bin/bash

####################################################################################
# Set your backup directory or set it on run with -d
####################################################################################
backupDir=/volume1/backup/synology-photos

####################################################################################
# Set the number of latest backups you want to keep
####################################################################################
maxBackups=3



sourceDb=synofoto
restoreFile=

if [ ! -z "$(sudo -v)" ]; then
  echo "Permission denied: current user has no sudo permissions"
  exit 1
fi

helpMessage() {
  echo "create backup:  $0 -b [ -d /path/to/backup-dir ]"
  echo "restore backup: $0 -r /path/to/backup-dump.sql"
}

createBackup() {
  # create backup-directory if not exists
  if [ ! -d ${backupDir} ]; then
    mkdir -p "${backupDir}"
  fi
  # check directory exists and is writable
  if [ ! -d ${backupDir} ] || [ ! -w ${backupDir} ]; then
    echo "Backup-Directory (${backupDir}) does not exists or is not writeable"
    exit 1
  fi
  # check database exists
  if [ -z "${sourceDb}" ] || [ $(sudo -iu postgres psql -t -c "select datname from pg_database where datname = '${sourceDb}'") != ${sourceDb} ]; then
    echo "Database '${sourceDb}' does not exist or exist check failed"
    exit 1
  fi
  postgresHome=$(sudo -iu postgres pwd)
  backupFile="${sourceDb}-backup-$(date '+%Y.%m.%d_%H-%M').sql"
  sudo -iu postgres pg_dump ${sourceDb} >${postgresHome}/${backupFile}
  if [ ! $? -eq 0 ]; then
    echo "Creating dump failed"
    exit 1
  fi
  # move the backup to backupDir
  mv ${postgresHome}/${backupFile} ${backupDir}
  if [ ! -e ${backupDir}/${backupFile} ]; then
    echo "Move backup failed"
    exit 1
  fi

  echo "Create backup success: ${backupDir}/${backupFile}"
  count=$((${maxBackups} + 1))
  ls -1t ${backupDir}/${sourceDb}-backup-*.sql | tail -n +${count} | xargs rm > /dev/null 2>&1
  exit 0
}

terminateDbConnections() {
  dataBase=$1
  sudo -iu postgres psql -t -c "select pg_terminate_backend(pid) from pg_stat_activity where pid <> pg_backend_pid() AND datname = '${dataBase}'"
}

##############################################################
# if the current installation has another db version
# exit 1
##############################################################
restoreBackupDbVersionCheck() {
  tempDB=$1
  if [ ! -f /var/packages/SynologyPhotos/etc/data_version.last ]; then
    return 0
  fi
  installedDbVersion="$(cat /var/packages/SynologyPhotos/etc/data_version.last | sed -En "s/db_version=(.*)/\1/p")"
  restoreDbVersion=$(sudo -iu postgres psql -t -d "${tempDB}" -c "select value from config where key = 'version'")
  if [ -n "${installedDbVersion}" ] && [ "${installedDbVersion}" -ne "${restoreDbVersion}" ]; then
    WARN="\033[1;33m"
    NC="\033[0m"
    echo -e "${WARN}Your current database version of SynologyPhoto does not match the backup db version!${NC}"
    echo -e "${WARN}installedDbVersion: ${NC}${installedDbVersion}${NC}"
    echo -e "${WARN}restoreDbVersion: ${NC}${restoreDbVersion}${NC}"
    echo "Uninstall SynologyPhoto and try it again. Then reinstall SynologyPhoto to run into db migrations"
    exit 1
  fi
}

##############################################################
# may be the user ids in the dump does not match system user ids
# it will adjust them in the database by username
# i dont know if its necessary but many be ...
##############################################################
restoreBackupAdjustSystemUsers() {
  tempDB=$1
  dbUsers=$(sudo -iu postgres psql -t -d "${tempDB}" -c "select uid,name from user_info where name != ''")
  while IFS="" read -r line; do
    userName=$(expr "$line" : '^.*|\s*\([a-zA-Z0-9]*\)')
    userId=$(expr "$line" : '^\(.[0-9]*\)\s*|')
    if [ -z "${userName}" ]; then
      continue
    fi
    uId=$(id -u "${userName}")
    WARN="\033[1;33m"
    NC="\033[0m"
    if [ -z "${uId}" ]; then
      echo -e "${WARN}The db user \"${userName}\" is not present as system user${NC}"
      continue
    fi
    if [ "${userId}" -ne "${uId}" ]; then
      echo "Update '${userName}' uid from ${userId} to ${uId}"
      sudo -iu postgres psql -t -d "${tempDB}" -c "update user_info set uid = '${uId}' where name = '${userName}'"
    fi
  done \
    < <(echo -e "${dbUsers}")
}

restoreBackup() {
  backupFile=$1
  if [ -z "${backupFile}" ] || [ ! -f ${backupFile} ]; then
    echo "Backup file does not exists: $backupFile"
    exit 1
  fi
  if [ ! -r ${backupFile} ]; then
    echo "Backup file is not readable: $backupFile"
    exit 1
  fi
  echo "Stop SynologyPhotos"
  synopkg stop SynologyPhotos
  tempDB="${sourceDb}_restore_$(date +%s)"
  sudo -iu postgres psql -t -c "create database ${tempDB} WITH TEMPLATE = template1"
  if [ ! $? -eq 0 ]; then
    echo "Creating temporary database failed"
    exit 1
  fi
  echo "Import dump to temporary database: ${tempDB} < ${backupFile}"
  sudo -iu postgres psql ${tempDB} <${backupFile}
  if [ ! $? -eq 0 ]; then
    echo "Importing dump to temporary database failed"
    exit 1
  fi
  restoreBackupDbVersionCheck "${tempDB}"
  restoreBackupAdjustSystemUsers "${tempDB}"
  backupDb="${sourceDb}_backup_$(date +%s)"
  echo "Backup current database to ${backupDb}"
  terminateDbConnections ${sourceDb}
  sudo -iu postgres psql -t -c "ALTER DATABASE ${sourceDb} RENAME TO ${backupDb}"
  if [ ! $? -eq 0 ]; then
    echo "Backup of current database failed"
    exit 1
  fi
  echo "Switch temporary database to current"
  sudo -iu postgres psql -t -c "ALTER DATABASE ${tempDB} RENAME TO ${sourceDb}"
  if [ ! $? -eq 0 ]; then
      echo "Switch database failed"
      exit 1
    fi
  echo "Start SynologyPhotos"
  synopkg start SynologyPhotos

  echo "--------------------------------------------------------------------------"
  echo "Please check the SynologyPhotos application"
  echo "if it works as expected type 'yes' witch will delete the backup database"
  echo "if not type 'no' witch will replace the imported database with the backup database"
  echo ""
  while true; do

    read -p "SynologyPhotos works as expected? (yes/no) " yn

    case $yn in
    yes)
      echo "DROP DATABASE ${backupDb}"
      sudo -iu postgres psql -t -c "DROP DATABASE ${backupDb}"
      break
      ;;
    no)
      echo "RESTORE DATABASE ${backupDb} to ${sourceDb}"
      synopkg stop SynologyPhotos
      terminateDbConnections ${sourceDb}
      sudo -iu postgres psql -t -c "DROP DATABASE ${sourceDb}"
      sudo -iu postgres psql -t -c "ALTER DATABASE ${backupDb} RENAME TO ${sourceDb}"
      ;;
    *) echo "invalid response: type yes or no" ;;
    esac

  done

}

mode=
while getopts "br:d:" o; do
  case "${o}" in
  d)
    backupDir=${OPTARG}
    ;;
  b)
    mode="backup"
    ;;
  r)
    mode="restore"
    restoreFile=${OPTARG}
    ;;
  *)
    helpMessage
    exit 1
    ;;
  esac
done

if [ "${mode}" = "restore" ]; then
  restoreBackup "${restoreFile}"
elif [ "${mode}" = "backup" ]; then
  createBackup
else
  helpMessage
fi
 
Zuletzt bearbeitet:
Super Job (y). Vielleicht solltest du aber die Installation und Verwendung etwas besser erklären.
 
Danke für den Tip, ich hoffe das reicht so.
 
Na komm, schreib bitte noch ein paar Worte dazu, wie/wo man das Script installieren/ablegen und mit welchen Parametern per Aufgabenplaner aufrufen sollte 👏

Edit: Hab grad gesehen, du hast ja oben nochmal angepasst
 
Zuletzt bearbeitet:
[...] denn ich bin wahrlich kein Profi im bash-scripting.
Ja, von wegen! Das sieht doch ganz übersichtlich aus und die einzelnen Schritte sind auch nachvollziehbar dank der reichlichen Kommentare.
Top (y)
 
  • Like
Reaktionen: Homunkulee
Hab ich jetzt erst gesehen, dass nochmal editiert wurde (y) Denke, das reicht.
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat