Compare commits

..

4 Commits

7 changed files with 486 additions and 0 deletions

View File

@ -3,3 +3,23 @@
This Git Repository intends to represent environments in Docker Compose. All environments are effectively a derivative of other environments. The original environment is the environment represented by the `base` branch. All derivative environments are represented by other branches. Those branches are named in the format `{core}.{parent}`. This Git Repository intends to represent environments in Docker Compose. All environments are effectively a derivative of other environments. The original environment is the environment represented by the `base` branch. All derivative environments are represented by other branches. Those branches are named in the format `{core}.{parent}`.
## Backup & Restore
### Backup
A previously run Docker Compose environment is required in order to perform a backup. The Docker Compose resultant containers may or may not use volumes for persistence. It is assumed that the Docker Compose environment is stopped at the time of the backup.
```sh
docker-compose stop
scripts/backup-data.sh
```
This will result in the creation or replacement of the `data` directory. This will hold all the resources required for a subsequent *Restore* execution.
### Restore
A clean Docker Compose environment is **not** required in order to perform a restore. The script will destory any existing data that may exist at the time of execution. It will also stop and remove any existing Docker containers. The Docker Compose resultant containers may or may not use volumes for persistence.
```sh
scripts/restore-data.sh
```

73
scripts/backup-data.bat Normal file
View File

@ -0,0 +1,73 @@
@echo off
REM This script performs a backup of key data in the Docker Compose Alfresco
REM environment that is started using the companion `docker-compose.yml`
REM file. It backs up the binary data and database. It ignores the search
REM engine and MQ server. This is not proper for a production environment.
REM Notice that we are not compressing any of this backup. We are counting on
REM Git's ability to only deal with differences to get far better effective
REM compression over of the data as it is verioned. Git also compresses these
REM files in transit and in storage anyway. By not putting them in ZIP files, we
REM use just as little disk space with one commit and probably 90% smaller over
REM 10 commits and 99% smaller over 100 commits.
call :prepare
call :backup
exit /B 0
:prepare
echo Preparing for the backup ...
set THISDIR_REL=%~dp0
set THISDIR=%THISDIR_REL:~0,-1%
set DOCKER_COMPOSE_DIR=%THISDIR%
set DATA_DIR=%DOCKER_COMPOSE_DIR%\data
echo Clearing previous backup (if one exists) ...
rd /s /q "%DATA_DIR%"
md "%DATA_DIR%"
exit /B
:backup
echo Performing a backup ...
exit /B
:backup_database
set CONTAINER_ID=%1
set SQL_SCHEMA_FILENAME=%2
set SQL_DATA_FILENAME=%3
set DB_NAME=%4
set DB_USERNAME=%5
set DB_DISPLAY=%6
echo Backing up the %DB_DISPLAY% database ...
echo Dumping %DB_DISPLAY% database schema ...
docker container exec %CONTAINER_ID% pg_dump -U %DB_USERNAME% -s -f /tmp/%SQL_SCHEMA_FILENAME% %DB_NAME%
echo Dumping %DB_DISPLAY% database data ...
docker container exec %CONTAINER_ID% pg_dump -U %DB_USERNAME% -a -f /tmp/%SQL_DATA_FILENAME% %DB_NAME%
echo Copying %DB_DISPLAY% database schema from Docker container ...
docker cp %CONTAINER_ID%:/tmp/%SQL_SCHEMA_FILENAME% "%DOCKER_COMPOSE_DIR%\data"
echo Copying %DB_DISPLAY% database data from Docker container ...
docker cp %CONTAINER_ID%:/tmp/%SQL_DATA_FILENAME% "%DOCKER_COMPOSE_DIR%\data"
exit /B
:backup_binaryData
set CONTAINER_ID=%1
set DATA_DIRECTORY=%2
set CONTAINER_PATH=%3
set DISPLAY=%4
echo Backing up the %DISPLAY% binary data ...
echo Copying %DISPLAY% binary data ...
docker cp "%CONTAINER_ID%:%CONTAINER_PATH%\%DATA_DIRECTORY%" "%DOCKER_COMPOSE_DIR%\data"
exit /B

69
scripts/backup-data.sh Normal file
View File

@ -0,0 +1,69 @@
#!/bin/bash
# This script performs a backup of key data in the Docker Compose Alfresco
# environment that is started using the companion `docker-compose.yml`
# file. It backs up the binary data and database. It ignores the search
# engine and MQ server. This is not proper for a production environment.
# Notice that we are not compressing any of this backup. We are counting on
# Git's ability to only deal with differences to get far better effective
# compression over of the data as it is verioned. Git also compresses these
# files in transit and in storage anyway. By not putting them in ZIP files, we
# use just as little disk space with one commit and probably 90% smaller over
# 10 commits and 99% smaller over 100 commits.
prepare() {
echo "Preparing for the backup ..."
export THISDIR=`dirname "$(readlink -f "$0")"`
export DOCKER_COMPOSE_DIR=$THISDIR
export DATA_DIR=$DOCKER_COMPOSE_DIR/data
source "$THISDIR/common.sh"
echo "Clearing previous backup (if one exists) ..."
sudo rm -rf "$DATA_DIR"
mkdir -p "$DATA_DIR"
}
backup() {
echo "Performing a backup ..."
}
backup_database() {
CONTAINER_ID=$1
SQL_SCHEMA_FILENAME=$2
SQL_DATA_FILENAME=$3
DB_NAME=$4
DB_USERNAME=$5
DB_DISPLAY=$6
echo "Backing up the $DB_DISPLAY database ..."
echo "Dumping $DB_DISPLAY database schema ..."
docker container exec $CONTAINER_ID pg_dump -U $DB_USERNAME -s -f /tmp/$SQL_SCHEMA_FILENAME $DB_NAME
echo "Dumping $DB_DISPLAY database data ..."
docker container exec $CONTAINER_ID pg_dump -U $DB_USERNAME -a -f /tmp/$SQL_DATA_FILENAME $DB_NAME
echo "Copying $DB_DISPLAY database schema from Docker container ..."
docker cp $CONTAINER_ID:/tmp/$SQL_SCHEMA_FILENAME "${DOCKER_COMPOSE_DIR}/data"
echo "Copying $DB_DISPLAY database data from Docker container ..."
docker cp $CONTAINER_ID:/tmp/$SQL_DATA_FILENAME "${DOCKER_COMPOSE_DIR}/data"
}
backup_binaryData() {
CONTAINER_ID=$1
DATA_DIRECTORY=$2
CONTAINER_PATH=$3
DISPLAY=$4
echo "Backing up the $DISPLAY binary data ..."
echo "Copying $DISPLAY binary data ..."
docker cp -a "$CONTAINER_ID:$CONTAINER_PATH/$DATA_DIRECTORY" "${DOCKER_COMPOSE_DIR}/data"
}
prepare
backup

93
scripts/common.bat Normal file
View File

@ -0,0 +1,93 @@
@echo off
call :%*
exit /B 0
:prepare_container
set SERVICE_NAME=%1
set SERVICE_DISPLAY=%2
echo Preparing the %SERVICE_DISPLAY% service or Docker container ...
echo Checking to see if %SERVICE_DISPLAY% service exists ...
set CONTAINER_ID=
for /f %%i in ('docker-compose --project-directory "%DOCKER_COMPOSE_DIR%" ps -q %SERVICE_NAME%') do set CONTAINER_ID=%%i
set CONTAINER_CREATED=
set CONTAINER_STARTED=
if "%CONTAINER_ID%" == "" (
call :create_container %*
) else (
call :check_container %*
)
exit /B
:create_container
set SERVICE_NAME=%1
set SERVICE_DISPLAY=%2
set CONTAINER_CREATED=1
echo %SERVICE_DISPLAY% service does not exist; creating and starting it ...
docker-compose --project-directory "%DOCKER_COMPOSE_DIR%" up --detach --no-deps %SERVICE_NAME%
echo Getting new %SERVICE_DISPLAY% service container ID ...
for /f %%i in ('docker-compose --project-directory "%DOCKER_COMPOSE_DIR%" ps -q %SERVICE_NAME%') do set CONTAINER_ID=%%i
echo Found %SERVICE_DISPLAY% Docker container: %CONTAINER_ID%
exit /B
:check_container
set SERVICE_NAME=%1
set SERVICE_DISPLAY=%2
echo Found %SERVICE_DISPLAY% Docker container: %CONTAINER_ID%
echo Checking to see if %SERVICE_DISPLAY% service is running ...
set CONTAINER_TOP=
for /f %%i in ('docker-compose --project-directory "%DOCKER_COMPOSE_DIR%" ps -q %SERVICE_NAME%') do set CONTAINER_TOP=%%i
if "%CONTAINER_TOP%" == "" (
call :start_container %*
) else (
echo %SERVICE_DISPLAY% service is running; will perform a hot backup ...
)
exit /B
:start_container
set SERVICE_NAME=%1
set SERVICE_DISPLAY=%2
set CONTAINER_STARTED=1
echo %SERVICE_DISPLAY% service is not running; starting it ...
docker-compose --project-directory "%DOCKER_COMPOSE_DIR%" start %SERVICE_NAME%
exit /B
:unwind_container
set SERVICE_NAME=%1
set SERVICE_DISPLAY=%2
set CONTAINER_CREATED=%3
set CONTAINER_STARTED=%4
echo Unwinding the %SERVICE_DISPLAY% service or Docker container ...
if "%CONTAINER_CREATED%" == "1" (
echo %SERVICE_DISPLAY% service did not exist; stopping and destorying it ...
docker-compose --project-directory "%DOCKER_COMPOSE_DIR%" rm --stop --force %SERVICE_NAME%
)
if "%CONTAINER_STARTED%" == "1" (
echo %SERVICE_DISPLAY% service was not running; stopping it ...
docker-compose --project-directory "%DOCKER_COMPOSE_DIR%" stop %SERVICE_NAME%
)
exit /B
:wait_container_postgres
set CONTAINER_ID=%1
echo Waiting for PostgreSQL database to become available ...
docker container exec %CONTAINER_ID% sh -c "until [ -f /var/run/postgresql/.s.PGSQL.5432.lock ]; do sleep 1; done"
exit /B

81
scripts/common.sh Normal file
View File

@ -0,0 +1,81 @@
#!/bin/bash
prepare_container() {
SERVICE_NAME=$1
SERVICE_DISPLAY=$2
echo "Preparing the $SERVICE_DISPLAY service or Docker container ..."
echo "Checking to see if $SERVICE_DISPLAY service exists ..."
export CONTAINER_ID=`docker-compose --project-directory "${DOCKER_COMPOSE_DIR}" ps -q $SERVICE_NAME`
unset CONTAINER_CREATED
unset CONTAINER_STARTED
if [[ -z $CONTAINER_ID ]]; then
create_container $*
else
check_container $*
fi
}
create_container() {
SERVICE_NAME=$1
SERVICE_DISPLAY=$2
export CONTAINER_CREATED=1
echo "$SERVICE_DISPLAY service does not exist; creating and starting it ..."
docker-compose --project-directory "${DOCKER_COMPOSE_DIR}" up --detach --no-deps $SERVICE_NAME
echo "Getting new $SERVICE_DISPLAY service container ID ..."
export CONTAINER_ID=`docker-compose --project-directory "${DOCKER_COMPOSE_DIR}" ps -q $SERVICE_NAME`
echo "Found $SERVICE_DISPLAY Docker container: $CONTAINER_ID"
}
check_container() {
SERVICE_NAME=$1
SERVICE_DISPLAY=$2
echo "Found $SERVICE_DISPLAY Docker container: $CONTAINER_ID"
echo "Checking to see if $SERVICE_DISPLAY service is running ..."
CONTAINER_TOP=`docker-compose --project-directory "${DOCKER_COMPOSE_DIR}" top $SERVICE_NAME`
if [[ -z $CONTAINER_TOP ]]; then
start_container $*
else
echo "$SERVICE_DISPLAY service is running; will perform while running ..."
fi
}
start_container() {
SERVICE_NAME=$1
SERVICE_DISPLAY=$2
export CONTAINER_STARTED=1
echo "$SERVICE_DISPLAY service is not running; starting it ..."
docker-compose --project-directory "${DOCKER_COMPOSE_DIR}" start $SERVICE_NAME
}
unwind_container() {
SERVICE_NAME=$1
SERVICE_DISPLAY=$2
CONTAINER_CREATED=$3
CONTAINER_STARTED=$4
echo "Unwinding the $SERVICE_DISPLAY service or Docker container ..."
if [[ $CONTAINER_CREATED ]]; then
echo "$SERVICE_DISPLAY service did not exist; stopping and destorying it ..."
docker-compose --project-directory "${DOCKER_COMPOSE_DIR}" rm --stop --force $SERVICE_NAME
elif [[ $CONTAINER_STARTED ]]; then
echo "$SERVICE_DISPLAY service was not running; stopping it ..."
docker-compose --project-directory "${DOCKER_COMPOSE_DIR}" stop $SERVICE_NAME
fi
}
wait_container_postgres() {
CONTAINER_ID=$1
echo "Waiting for PostgreSQL database to become available ..."
docker container exec $CONTAINER_ID sh -c "until [ -f /var/run/postgresql/.s.PGSQL.5432.lock ]; do sleep 1; done"
}

81
scripts/restore-data.bat Normal file
View File

@ -0,0 +1,81 @@
@echo off
call :prepare
call :restore
exit /B 0
:prepare
echo Preparing to restore ...
set THISDIR_REL=%~dp0
set THISDIR=%THISDIR_REL:~0,-1%
set DOCKER_COMPOSE_DIR=%THISDIR%
set DATA_DIR=%DOCKER_COMPOSE_DIR%/data
exit /B
:restore
if exist "%DATA_DIR%" (
echo Restore data directory found
echo Removing existing data ...
docker-compose --project-directory "%DOCKER_COMPOSE_DIR%" down --volumes
setlocal ENABLEDELAYEDEXPANSION
echo Performing a restore ...
endlocal
) else (
echo Restore data directory not found; doing nothing ...
)
exit /B
:restore_database
set CONTAINER_ID=%1
set SQL_SCHEMA_FILENAME=%2
set SQL_DATA_FILENAME=%3
set DB_NAME=%4
set DB_USERNAME=%5
set DISPLAY_NAME=%6
if exist "%DATA_DIR%\%SQL_SCHEMA_FILENAME%" (
echo Restoring the %DISPLAY_NAME% database ...
wait_pgdb %CONTAINER_ID%
echo SET session_replication_role = 'replica'; > c:\Windows\Temp\db-data.sql
type "%DATA_DIR%\%SQL_DATA_FILENAME%" >> c:\Windows\Temp\db-data.sql
echo Uploading %DISPLAY_NAME% database schema to Docker container ...
docker cp "%DATA_DIR%\%SQL_SCHEMA_FILENAME%" %CONTAINER_ID%:/tmp
echo Uploading %DISPLAY_NAME% database data to Docker container ...
docker cp c:\Windows\Temp\db-data.sql %CONTAINER_ID%:/tmp
del c:\Windows\Temp\db-data.sql
echo Restoring %DISPLAY_NAME% database schema ...
docker container exec %CONTAINER_ID% psql -U %DB_USERNAME% -f /tmp/%SQL_SCHEMA_FILENAME% %DB_NAME%
echo Restoring %DISPLAY_NAME% database data ...
docker container exec %CONTAINER_ID% psql -U %DB_USERNAME% -f /tmp/db-data.sql %DB_NAME%
)
exit /B
:restore_binaryData
set CONTAINER_ID=%1
set DATA_DIRECTORY=%2
set CONTAINER_PATH=%3
set DISPLAY_NAME=%4
if exist "%DATA_DIR%\%DATA_DIRECTORY%" (
echo Restoring the %DISPLAY_NAME% binary data ...
echo Copying %DISPLAY_NAME% binary data ...
docker cp "%DATA_DIR%\%DATA_DIRECTORY%" "%CONTAINER_ID%:%CONTAINER_PATH%"
)
exit /B

69
scripts/restore-data.sh Normal file
View File

@ -0,0 +1,69 @@
#!/bin/bash
prepare() {
echo "Preparing to restore ..."
export THISDIR=`dirname "$(readlink -f "$0")"`
export DOCKER_COMPOSE_DIR=$THISDIR
export DATA_DIR=$DOCKER_COMPOSE_DIR/data
source "$THISDIR/common.sh"
}
restore() {
if [ -d "${DATA_DIR}" ]; then
echo "Restore data directory found"
echo "Removing existing data ..."
docker-compose --project-directory "${DOCKER_COMPOSE_DIR}" down --volumes
echo "Performing a restore ..."
else
echo "Restore data directory not found; doing nothing ..."
fi
}
restore_database() {
CONTAINER_ID=$1
SQL_SCHEMA_FILENAME=$2
SQL_DATA_FILENAME=$3
DB_NAME=$4
DB_USERNAME=$5
DISPLAY_NAME=$6
if [ -f "${DATA_DIR}/$SQL_SCHEMA_FILENAME" ]; then
echo "Restoring the $DISPLAY_NAME database ..."
echo "SET session_replication_role = 'replica';" | cat - "${DATA_DIR}/$SQL_DATA_FILENAME" > /tmp/db-data.sql
echo "Uploading $DISPLAY_NAME database schema to Docker container ..."
docker cp "${DATA_DIR}/$SQL_SCHEMA_FILENAME" $CONTAINER_ID:/tmp
echo "Uploading $DISPLAY_NAME database data to Docker container ..."
docker cp /tmp/db-data.sql $CONTAINER_ID:/tmp
rm /tmp/db-data.sql
echo "Restoring $DISPLAY_NAME database schema ..."
docker container exec $CONTAINER_ID psql -U $DB_USERNAME -f /tmp/$SQL_SCHEMA_FILENAME $DB_NAME
echo "Restoring $DISPLAY_NAME database data ..."
docker container exec $CONTAINER_ID psql -U $DB_USERNAME -f /tmp/db-data.sql $DB_NAME
fi
}
restore_binaryData() {
CONTAINER_ID=$1
DATA_DIRECTORY=$2
CONTAINER_PATH=$3
DISPLAY_NAME=$4
if [ -d "${DATA_DIR}/$DATA_DIRECTORY" ]; then
echo "Restoring the $DISPLAY_NAME binary data ..."
echo "Copying $DISPLAY_NAME binary data ..."
sudo docker cp "${DATA_DIR}/$DATA_DIRECTORY" "$CONTAINER_ID:$CONTAINER_PATH"
fi
}
prepare
restore