Merge pull request 'complement sauvegarde/restauration' (#152) from jmplace/ScoDoc-Lille:sauv-restore into master

Reviewed-on: viennet/ScoDoc#152
This commit is contained in:
Emmanuel Viennet 2021-10-07 22:30:13 +02:00
commit 47f1497e5e
3 changed files with 86 additions and 27 deletions

View File

@ -274,6 +274,23 @@ def list_depts(depts=""): # list-dept
print(f"{dept.id}\t{dept.acronym}") print(f"{dept.id}\t{dept.acronym}")
@app.cli.command()
@click.option(
"-n",
"--name",
is_flag=True,
help="show database name instead of connexion string (required for "
"dropdb/createddb commands)",
)
def scodoc_database(name): # list-dept
"""print the database connexion string"""
uri = app.config["SQLALCHEMY_DATABASE_URI"]
if name:
print(uri.split("/")[-1])
else:
print(uri)
@app.cli.command() @app.cli.command()
@with_appcontext @with_appcontext
def import_scodoc7_users(): # import-scodoc7-users def import_scodoc7_users(): # import-scodoc7-users

View File

@ -15,29 +15,47 @@ source "$SCRIPT_DIR/utils.sh"
# Ce script doit tourner comme "root" # Ce script doit tourner comme "root"
check_uid_root "$0" check_uid_root "$0"
# Usage # Usage
if [ ! $# -eq 2 ] usage() {
then echo "Usage: $0 [ --keep-env ] archive"
echo "Usage: $0 archive dbname" echo "Exemple: $0 /tmp/mon-scodoc.tgz"
echo "Exemple: $0 /tmp/mon-scodoc.tgz SCODOC" echo "OPTION"
echo "--keep_env garde la configuration courante"
exit 1 exit 1
}
if (($# < 1 || $# > 2))
then
usage
elif [ $# -eq 2 -a $1 != '--keep-env' -a $2 != '--keep-env' ] ; then
usage
elif [ $# -eq 1 ] ; then
echo "restauration des données et de la configuration originale (production)"
SRC=$1
DB_DEST="SCODOC"
else
echo "restauration des données dans la configuration actuelle"
DB_CURRENT=$(su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask scodoc-database -n)")
DB_DEST="$DB_CURRENT"
KEEP=1
if [ $1 = '--keep-env' ]; then
SRC=$2
else
SRC=$1
fi
fi fi
DB_DUMP="${SCODOC_VAR_DIR}"/SCODOC.dump
SRC=$1
DBNAME=$2
# Safety check # Safety check
echo "Ce script va remplacer les donnees de votre installation ScoDoc par celles" echo "Ce script va remplacer les donnees de votre installation ScoDoc par celles"
echo "enregistrees dans le fichier fourni." echo "enregistrées dans le fichier fourni."
echo "Ce fichier doit avoir ete cree par le script save_scodoc9_data.sh." echo "Ce fichier doit avoir ete cree par le script save_scodoc9_data.sh."
echo echo
echo "Attention: TOUTES LES DONNEES DE CE SCODOC SERONT REMPLACEES !" echo "Attention: TOUTES LES DONNEES DE CE SCODOC SERONT REMPLACEES !"
echo "Notamment, tous les utilisateurs et departements existants seront effaces !" echo "Notamment, tous les utilisateurs et departements existants seront effaces !"
echo echo
echo "La base SQL $DBNAME sera effacée et remplacée !!!" echo "La base SQL $DB_CURRENT sera effacée et remplacée !!!"
echo echo
echo -n "Voulez vous poursuivre cette operation ? (y/n) [n]" echo -n "Voulez vous poursuivre cette operation ? (y/n) [n]"
read -r ans read -r ans
if [ ! "$(norm_ans "$ans")" = 'Y' ] if [ ! "$(norm_ans "$ans")" = 'Y' ]
@ -47,8 +65,13 @@ then
fi fi
# -- Stop ScoDoc # -- Stop ScoDoc
echo "Arrêt de scodoc9..." if [ $KEEP -ne 1 ]; then
systemctl stop scodoc9 echo "Arrêt de scodoc9..."
systemctl stop scodoc9
else
echo -n "Assurez-vous d'avoir arrété le serveur scodoc (validez pour continuer)"
read ans
fi
# Clear caches # Clear caches
echo "Purge des caches..." echo "Purge des caches..."
@ -70,22 +93,31 @@ echo "Vérification du propriétaire..."
chown -R "${SCODOC_USER}:${SCODOC_GROUP}" "${SCODOC_VAR_DIR}" || die "Error chowning ${SCODOC_VAR_DIR}" chown -R "${SCODOC_USER}:${SCODOC_GROUP}" "${SCODOC_VAR_DIR}" || die "Error chowning ${SCODOC_VAR_DIR}"
# --- La base SQL: nommée $(db_name).dump # --- La base SQL: nommée $(db_name).dump
nb=$(su -c "psql -l" "$SCODOC_USER" | awk '{print $1}' | grep -c -e '^'"$DBNAME"'$') nb=$(su -c "psql -l" "$SCODOC_USER" | awk '{print $1}' | grep -c -x "$DB_DEST")
if [ "$nb" -gt 0 ] if [ "$nb" -gt 0 ]
then then
echo "Suppression de la base $DBNAME..." echo "Suppression de la base $DB_DEST..."
su -c "dropdb $DBNAME" "$SCODOC_USER" || die "Erreur destruction db" su -c "dropdb $DB_DEST" "$SCODOC_USER" || die "Erreur destruction db"
fi fi
su -c "createdb $DBNAME" "$SCODOC_USER" || die "Erreur création db" su -c "createdb $DB_DEST" "$SCODOC_USER" || die "Erreur création db"
echo "Chargement de la base SQL..." if [ ! -z $KEEP_ENV ] ; then
su -c "pg_restore -d $DBNAME ${SCODOC_VAR_DIR}/SCODOC.dump" "$SCODOC_USER" || die "Erreur chargement de la base SQL" echo "conservation de la configuration actuelle"
cp "$SCODOC_VAR_DIR".old/.env "$SCODOC_VAR_DIR"/.env
echo "récupération des données..."
su -c "pg_restore -f - $DB_DUMP | psql -q $DB_DEST" "$SCODOC_USER" >/dev/null || die "Erreur chargement/renommage de la base SQL"
su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask db upgrade)" "$SCODOC_USER"
echo "redémarrez scodoc selon votre configuration"
else
# -- Apply migrations if needed (only on "production" database, = SCODOC sauf config particulière)
echo "restauration environnement de production"
echo "Chargement de la base SQL..."
su -c "pg_restore -d $DB_DEST $DB_DUMP" "$SCODOC_USER" || die "Erreur chargement de la base SQL"
export FLASK_ENV="production" # peut-être pas utile? : .env a été recopié
su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask db upgrade)" "$SCODOC_USER"
# -- Start ScoDoc
systemctl start scodoc9
fi
# -- Apply migrations if needed (only on "production" databse, = SCODOC sauf config particulière)
export FLASK_ENV="production"
su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask db upgrade)" "$SCODOC_USER"
# -- Start ScoDoc
systemctl start scodoc9
echo "Terminé." echo "Terminé."

View File

@ -20,6 +20,14 @@ then
exit 1 exit 1
fi fi
echo "vérification de la configuration..."
DB_CURRENT=$(cd $SCODOC_DIR && source venv/bin/activate && flask scodoc-database -n)
if [ $DB_CURRENT != 'SCODOC' ]; then
echo "Ce script ne peut transférer les données que depuis une base nommée SCODOC (c'est normalement le cas pour un serveur en production)"
echo "Annulation"
exit 1
fi
echo "Ce script est utile pour transférer toutes les données d'un serveur ScoDoc 9" echo "Ce script est utile pour transférer toutes les données d'un serveur ScoDoc 9"
echo "à un autre ScoDoc 9." echo "à un autre ScoDoc 9."
echo "Il est vivement recommandé de mettre à jour votre ScoDoc avant." echo "Il est vivement recommandé de mettre à jour votre ScoDoc avant."
@ -44,8 +52,10 @@ DEST=$1
db_name="$SCODOC_DB_PROD" # SCODOC db_name="$SCODOC_DB_PROD" # SCODOC
# dump dans /opt/scodoc-data/SCODOC.dump # dump dans /opt/scodoc-data/SCODOC.dump
echo "sauvegarde de la base de données"
pg_dump --format=custom --file="$SCODOC_VAR_DIR/$db_name.dump" "$db_name" || die "Error dumping database" pg_dump --format=custom --file="$SCODOC_VAR_DIR/$db_name.dump" "$db_name" || die "Error dumping database"
echo "création du fichier d'archivage..."
# tar scodoc-data vers le fichier indiqué ou stdout # tar scodoc-data vers le fichier indiqué ou stdout
(cd $(dirname "$SCODOC_VAR_DIR"); tar cfz "$DEST" $(basename "$SCODOC_VAR_DIR")) || die "Error archiving data" (cd $(dirname "$SCODOC_VAR_DIR"); tar cfz "$DEST" $(basename "$SCODOC_VAR_DIR")) || die "Error archiving data"