There are 2 possible ways to do a synchronization: in the first one, a server pushes changes to another server or servers; in the second one, one or more servers pull data from another server.

Push from devops (primary) to devops (secondary)

We will push the data in the primary server to the secondary server.

Note: It is better if the secondary server pulls from the primary. Do this if the other option is not possible.

1) Make a backup:

(root@devops-primary)_$: cp -r /srv/git /srv/git.bak

2) Configure the secondary server

(root@devops-secondary)_$: cp -r /srv/git /srv/git.bak
(root@devops-secondary)_$: mkdir /srv/backup/git
(root@devops-secondary)_$: chmod 0775 /srv/backup/git
(root@devops-secondary)_$: chown root:develgroup /srv/backup/git

3) Push the data to the secondary server

(root@devops-primary)_$: su - daemonuser
(daemonuser@devops-primary)_$: ssh-keygen -b 4096    # If not already generated
(daemonuser@devops-primary)_$: ssh-copy-id -i .ssh/id_rsa.pub daemonuser@devops-secondary
(daemonuser@devops-primary)_$: vi synchronize-devops.sh
/home/daemonuser/synchronize-devops.sh:
---------------------------------------
REMOTE="devops-secondary"
for repository in repo1 repo2 repo3
do
	echo " -- Synchronizing $repository..."
	rsync -av -r /srv/git/$repository.git/ daemonuser@$REMOTE:/srv/backup/git/$repository.git/
	echo ; echo
done
(daemonuser@devops-primary)_$: chmod +x synchronize-devops.sh
(daemonuser@devops-primary)_$: ./synchronize-devops.sh
(daemonuser@devops-primary)_$: crontab -e

# m h  dom mon dow   command
MAILTO="user@example.com"
10  9  *   *   *     /home/daemonuser/synchronize-devops.sh

Pull from devops (secondary) of devops (primary)

We will pull the data in the primary server from the secondary server.

1) Make a backup just in case:

(root@devops-primary)_$: cp -r /srv/git /srv/git.bak

2) Configure the secondary server

(root@devops-secondary)_$: cp -r /srv/git /srv/git.bak
(root@devops-secondary)_$: mkdir /srv/backup/git
(root@devops-secondary)_$: chmod 0775 /srv/backup/git
(root@devops-secondary)_$: chown root:develgroup /srv/backup/git

3) Pull the data from the primary server

(root@devops-secondary)_$: ssh-keygen -b 4096   # If not already generated
(root@devops-secondary)_$: ssh-copy-id -i .ssh/id_rsa.pub daemonuser@devops-primary
(root@devops-secondary)_$: vi synchronize-devops.sh
/root/synchronize-devops.sh:
----------------------------
USER="daemonuser"
HOST="devops-primary"

# Synchronization function
synchronize() {
	# Arguments: user, host, source and destination
	rsync -av -e "ssh" --rsync-path="sudo rsync" $1@$2:$3 $4
}


# Git
printf "Synchronizing git repositories ...\n"
SRC="/srv/git/"
DST="/srv/backup/git"
synchronize $USER $HOST $SRC $DST

# Databases
printf "\n\n"
printf "Synchronizing databases ...\n"
SRC="/srv/backup/databases/"
DST="/srv/backup/databases"
synchronize $USER $HOST $SRC $DST

# Logs
printf "\n\n"
printf "Synchronizing logs ...\n"
SRC="/srv/backup/logs/"
DST="/srv/backup/logs"
synchronize $USER $HOST $SRC $DST

# Software
printf "\n\n"
printf "Synchronizing Software ...\n"
SRC="/srv/backup/software/"
DST="/srv/backup/software"
synchronize $USER $HOST $SRC $DST


# Finished
printf "\n\n"
printf "... DONE\n"