Synology Photos Wo werden die Benutzerdatenbanken gespeichert?

tAntChen

Benutzer
Mitglied seit
12. Sep 2011
Beiträge
151
Punkte für Reaktionen
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.
 

ctrlaltdelete

Benutzer
Contributor
Sehr erfahren
Maintainer
Mitglied seit
30. Dez 2012
Beiträge
14.084
Punkte für Reaktionen
6.091
Punkte
569
Das wird schwierig: volume(x)/@appstore
Hast du kein Backup von Synology Photos mit den Einstellungen?
 

tAntChen

Benutzer
Mitglied seit
12. Sep 2011
Beiträge
151
Punkte für Reaktionen
19
Punkte
18
ich hab ein Backup von /volume1/@appstore
ich hoffe das reicht.
 

ctrlaltdelete

Benutzer
Contributor
Sehr erfahren
Maintainer
Mitglied seit
30. Dez 2012
Beiträge
14.084
Punkte für Reaktionen
6.091
Punkte
569
Puhh, schwierig weil nicht alles dort liegt, soweit ich weiß.
Aber versuche es doch einfach mal.
 

tAntChen

Benutzer
Mitglied seit
12. Sep 2011
Beiträge
151
Punkte für Reaktionen
19
Punkte
18
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.
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
14.059
Punkte für Reaktionen
3.872
Punkte
488
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.
 

tAntChen

Benutzer
Mitglied seit
12. Sep 2011
Beiträge
151
Punkte für Reaktionen
19
Punkte
18
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.
 

tAntChen

Benutzer
Mitglied seit
12. Sep 2011
Beiträge
151
Punkte für Reaktionen
19
Punkte
18
@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.
 

daisassi

Benutzer
Mitglied seit
25. Feb 2023
Beiträge
13
Punkte für Reaktionen
1
Punkte
9
@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!
 

tAntChen

Benutzer
Mitglied seit
12. Sep 2011
Beiträge
151
Punkte für Reaktionen
19
Punkte
18
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:

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
14.059
Punkte für Reaktionen
3.872
Punkte
488
Super Job (y). Vielleicht solltest du aber die Installation und Verwendung etwas besser erklären.
 

tAntChen

Benutzer
Mitglied seit
12. Sep 2011
Beiträge
151
Punkte für Reaktionen
19
Punkte
18
Danke für den Tip, ich hoffe das reicht so.
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
14.059
Punkte für Reaktionen
3.872
Punkte
488
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:

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
[...] 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

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
14.059
Punkte für Reaktionen
3.872
Punkte
488
Hab ich jetzt erst gesehen, dass nochmal editiert wurde (y) Denke, das reicht.
 


 

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