In the Alfresco wiki is described the backup and restore strategy but is not so clear how is defined a script and how to do it more exactly. To be more precise the backup strategy could be a “cold backup” or a “hot backup”. In this post is shared a practical way to perform a “cold backup” in the way I like: a list of commands and tasks to execute… simpler to understand, to do and to test.
In this example is supposed that Alfresco is installed in ‘/opt/alfresco’ folder and the DBMS used is PostgreSQL. The script is developed to have a 10 days backup history. If in your case is requested more or less than 10 days you can simply modify the ‘NUM_DUMP’ variable.
Let’s start…
cd /opt/alfresco nano alfrescoBackup.sh
.
# # Cold backup of Alfresco. # # Configuration. ALF_HOME="/opt/alfresco" NUM_DUMP=10 ALF_DATA_SUBDIR="alf_data" DB_HOME="/opt/postgresql" DB_TYPE="postgresql" # Check if [ -d "$1" ]; then TARGET_FOLDER="$1" CURRENT_FOLDER="$(pwd)" TIMESTAMP="$(date +%F_%H-%M)" CHECK=1 # 1) Alfresco stop. service alfresco stop # 2) Backup of the database of Alfresco with vendor service. DB_DUMP=${TIMESTAMP}_alfresco_${DB_TYPE}.tar if [ "$DB_TYPE" = "postgresql" ]; then cd $TARGET_FOLDER $DB_HOME/bin/pg_dump -Ft -b alfresco > $TARGET_FOLDER/$DB_DUMP cd $CURRENT_FOLDER if [ ! -f "$TARGET_FOLDER/$DB_DUMP" ]; then CHECK=0 fi else echo "Unknown database type '${DB_TYPE}'" CHECK=0 fi # 3) Backup of the Alfresco's data folder. if [ "$CHECK" = 1 ]; then ALF_DUMP=${TIMESTAMP}_alfresco_data.tgz cd $ALF_HOME tar zcf $TARGET_FOLDER/$ALF_DUMP $ALF_DATA_SUBDIR cd $CURRENT_FOLDER if [ ! -f "$TARGET_FOLDER/$ALF_DUMP" ]; then CHECK=0 fi fi # 4) Merge the two backups. if [ "$CHECK" = 1 ]; then BACKUP_FILE="${TIMESTAMP}_alfresco_dump.tgz" cd $TARGET_FOLDER tar zcf $BACKUP_FILE $ALF_DUMP $DB_DUMP if [ ! -f "$BACKUP_FILE" ]; then CHECK=0 else rm $ALF_DUMP rm $DB_DUMP fi cd $CURRENT_FOLDER fi # 5) Alfresco start. service alfresco start # 6) Delete dump older than a certains number of days. if [ "$CHECK" = 1 ]; then find $TARGET_FOLDER/*.tgz -type f -mtime +${NUM_DUMP} -exec rm {} \; fi else echo "usage: $0 [targetPath]" fi
Exit with CTRL+X and confirm saving. Let’s go ahead defining permits and preparing the repository folder. Talking about the repository folder here is presented an example but in practical cases is suggested to mount an external file system used specifically for backup purpose.
chmod uga+x /opt/alfresco/alfrescoBackup.sh mkdir /opt/alfresco/backup
Now everything is set and it’s time to activate the crontab to perform automatic backup, probably during the night time. Please, observe that the user used to run Alfresco is named ‘alfresco’ (do not run it as root) and the crontab is performed as ‘alfresco’ user with ‘-u alfresco’.
sudo crontab -u alfresco -e
.
00 01 * * * /opt/alfresco/alfrescoBackup.sh /opt/alfresco/backup
In this example the cold backup of Alfresco is performed at 01:00 am. To read more about crontab see here.
Ottimo articolo, complimenti. Se può interessare a qualcuno, aggiungo che per adattare lo script all’installazione in bundle ho verificato che è sufficiente aggiungere tra i punti 1 e 2 questa parte di codice:
# 1.1)
/opt/alfresco/postgresql/scripts/ctl.sh start
e poi creare creare nella directory home dell’utente che esegue lo script il file “.pgpass” con permessi 0600 e con il seguente contenuto:
*:*:*:postgres:Password_db_Alfresco
A me funziona alla grande.
Ciao!
Thank you C.U.,
Grazie C.U.,
For the non-italian people, C.U. suggest to add this command between the steps 1 and 2:
# 1.1)
/opt/alfresco/postgresql/scripts/ctl.sh start
and even create a “.pgpass” file with 0600 permits and this content: *:*:*:postgres:Password_db_Alfresco
very useful!then how to restore the backup?!?!
i’ve seen you made another article for this!sorry!
just a question:does this procedure maintain the aspects associated to the file in the repository?
Thank you for the feedback Nox,
Yes, definetely. Of course all the custom models and configurations should be restored in target environment.
hi i dont have lucene index but i have onlt solr folder under alf_data do i need to back up it saperately or not
thanks
Hi Amit,
Solr runs on a different application server and separated environment. For that reason uses an indipendent strategy to backup/restore indexes.
So the answer is: yes, you have to backup the indexes separately.
Greetings.
Hi Francesco
I had to change the file alfrescoBackup.sh according this:
DB_HOME=”/opt/postgresql/9.0.4″ instead of
DB_HOME=”/opt/postgresql”
I am not sure this applies to other people..
With this, the cript works well.
many thanks, best regards.
Jean-Pierre Buttet
Hi Jean-Pierre,
Thank you for the contribution.
Hello, I’m Brazilian. I have sought unsuccessfully in Portuguese, a way to make backup copy of the alfresco. I do not speak English, but I’m asking for your help. how do I backup alfresco on windows seven?
I’ve tried to lead me by the model in linux, but it never worked.
Thank you.
Hi Paulo,
Nice to have a brazilian contribution.
I’ll try to suggest you all the best even if your english is basic (google helps from this point of view).
I can tell you that I used this script also in WIndows environment with success. Of course the first thing to change are the paths and the “commands styles” from “/…/…” to “C:\…\…bat”.
I hope this help your goal!
-F
Hi,
First of all, Thanks for the crisp blog on Backup. I have a question, I’m using Mysql db. Can you please suggest on what to modify in script to backup Mysql databases.
Thanks for your time.!
Hi Sankar,
Thank you for your feedback.
You should:
– change the ‘DB_TYPE=”postgresql”‘ command to ‘DB_TYPE=”mysql”‘.
– Add a new if option to
# 2) Backup of the database of Alfresco with vendor service.
if [ “$DB_TYPE” = “postgresql” ]; then
…
if [ “$DB_TYPE” = “mysql” ]; then
cd $TARGET_FOLDER
// TODO: New command to dump the db in $TARGET_FOLDER/$DB_DUMP
cd $CURRENT_FOLDER
if [ ! -f “$TARGET_FOLDER/$DB_DUMP” ]; then
CHECK=0
fi
else
echo “Unknown database type ‘${DB_TYPE}'”
CHECK=0
fi
Let me know how it goes and I can add you contribution to the post.
Thank you in advance for sharing the solution.
Hi Franchesco,
I would like to give this a try but before I do I have a question about our particular case at my office. Our consultant for Alfresco whom made our customizations installed our Alfresco system wit two instances of Tomcat. One for share and one for alfresco. How should I go about running a backup script in this type of environment? One more thing how would restore work? Hopefully you see this because I am looking forward to your response.
Hi Khrissy,
The two tomcat don’t have influence on the backup strategy except for the stop/start of the services (in your case you probably need to stop/start both).
Backup/restore strategy affects the database and the ‘alf_data’ folder.
Hi, I want to know how to backup lucene indexes? Did you write restore script? 🙂 Thanks anyway..
Hi Dusan,
The lucene indexes are stored in alf_data directory.
For the restore, take a look here http://fcorti.com/2013/02/12/alfresco-restore/ 😉
Hi Francesco.
Great tutorial,I have to work Alfresco Community 4.2.e ,And postgreSQL Database,now i need to backup the database, And I’m using Windows 7 OS. I run this script my C:\Alfresco\alfrescoBackup.sh it’s not working?How can i run this .sh not supported while now i install cygwin to run this script But i got same error. Please Help Me How to run this script On Windows 7.
thanks & Regards
Stalin louis
Hi,
Thank you for your feedback.
In this thread there is a similar question from Paulo Roberto.
I confirm what I wrote him:
I can tell you that I used this script also in WIndows environment with success. Of course the first thing to change are the paths and the “commands styles” from “/…/…” to “C:\…\…bat”.
I hope this help your goal!
Hi Francesco,
Is it possible to insert a function for alert users online for the imminent backup procedure starting (e.g. 10 minute later)? It would be really usefull and professional. And then to add, while backup running, an info page that inform about backup, and… to trying later.
Is it very complicated?
Thank you
Mmm.. good question but I don’t have a relevant good answer.
Someone of you can suggest a possibile solution?
I have added a line to my script that uses SSMTP to email me whenever the backup is complete.
I am sure you could set up SSMTP to email a group of people at the beginning of the script. Then use the sleep function to pause the script for a few minutes, before it starts with the backup.
interesting… better than nothing. Not simple for me, but I will try.
Thank’s
Sorry, another question…
I have my “alf_data” folder located in an other partition of HDD, so I have changed costant ALF_HOME like this:
ALF_HOME=”/media/hdDati/alfresco”
…
ALF_DATA_SUBDIR=”alf_data”
That’s correct ?
Hi Elvis,
You can evaluate ALF_DATA_SUBDIR with an absolute path and everything should work.
Hi there. This is great, except I get the following errors:
line 4: $’\r’: command not found
line 11: $’\r’: command not found
line 82: syntax error: unexpected end of file
Hi,
Seems to be that you are in Windows platform.
Please, try to read here: http://stackoverflow.com/questions/18608380/r-command-not-found
Hi it’s an Ubuntu Server.
The text file was edited on a Windows phone though, and moved to the Ubuntu server. Could this have caused the error?
Probably yes! 😉
Moving to and from Windows, from Linux could cause these problems.
Thanks, that is good to know for the future.
Your blog has really helped me with Alfresco. Thanks.
Thanks.
Hi, for some reasons I put in stand-by this implementation and now I have a new error. 😮
If I run /opt/alfresco/alfrescoBackup.sh from promt to test it, prompt tell me:
usage: /opt/alfresco/alfrescoBackup.sh [targetPath]
What does this message?
The script worked properly when I have created it!
thank you in advance
Hi elvis,
The answer is in the code:
…
else
echo “usage: $0 [targetPath]”
fi
…
You missed the targetPath when you invoke the command. 😉
sorry for my ignorance…
Now it is clear by re-reading crontab changes 😐
Can I put path directly in the code between brackets?
And I would like copy backup .tgz in an other destination by default every time. Is it possible to insert new instructions in alfrescoBackup.sh?
when I start alfrescoBackup, system respons is:
/opt/alfresco/alfrescoBackup.sh: line 27: /opt/postgresql/9.3.4/bin/pg_dump: Permission denied
why permission denied?
thank you
sorry…
all code is working well if it run from crontab.
Manually I have an error about permission at line 27…
Hi… the backup regarding postgres have size =0. Is this connected to the error above mentioned?
Directories permissions are the same as the installation :-o.
Any ideas?
Thank you very much
Hi Elvis,
Yes, the problem is related to permits.
I suggest you to pay attention because the user executing the cron process could not be the same of the one you use from the command line.
I hope this help you.
I have used command line to try out the script, but from 6 days now backup was generated automatically from crontab.
And inside there postgres backup size is 0!
I followed your steps literally
looks like your database backup is just failing. Do you have a ~/.pgpass file?
To backup the postgres database you need a ~/.pgpass file that will send the postgres info, when the script tries to log into the postgres user:
a. Create the .pgpass file
i. sudo nano ~/.pgpass
b. Add the file contents.
i. *:*:database_name:username:password
c. Set the file’s access rights
i. sudo chmod 0600 ~/.pgpass
https://wiki.postgresql.org/wiki/Pgpass
no, in the /opt/postgresql/9.3.4/bin I don’t have this file.
Thank’s for now. I will try out with your suggestions
You have to create the file, and it doesn’t get stored in your /bin folder. It is stored in the ~/ folder.
You mean in the system root (main root)?
no that’s the user home folder. I wasn’t sure if it was the home folder of root, or your own user account, so I put a copy in both homes.
Hi,
I have created .pgpass file in /home/postgres/ but don’t work.
I obtain postgres backup size = 0.
If I run this command I get:
…
/opt/alfresco/alfrescoBackup.sh: line 27: /opt/postgresql/9.3.4/bin/pg_dump: Permission denied.
I do not know how to get out of it…
Hi elvis,
It’s a problem of permits.
Probably the alfresco user does not have the rights to execute the pg_dump.
Thank you Francesco,
I too think so, but I have set pg_dump as 2777 (all rights for all), ownership=alfresco, group=root.
pg_dump is located in: /opt/postgresql/9.3.4/bin/
alfresco id was added to root group during installation.
In the .tar backup file I have:
4,xxGB for ..alfresco_data
0kB for …alfresco_postgresql
Boh!
Hi Elvis,
Alfresco added to root group is a strange thing.
For sure this is not correct and could cause problems.
I suggest you to repeat the installation checking the right settings.
I hope this will help you.
Sorry my info wasn’t correct… I was referring to sudo group…
Hi Francesco,
The script is all good and beautiful. However, when i tried to back-up content store (on NFS) that as 700K records it took approximately 4Hrs. And shutting down Alfresco for 4+ Hrs i snot feasible for us as there are daily batch jobs that run every 2Hrs. Is there any quicker alternative for Alfresco community version alf_data back-up.
Thanks,
Praveen
Hi Praveen,
I think there is something to understand better because the duration you are sharing is too long. The duration often depends on the alf_data folder dimension. Please, check the MB/GB of this repository because probably the creation of the zip file is the reason. Please, check if you are performing the zip on a network space or something unusual.
I hope this will help you.