πΎ Backup your data
Making sure your data is safe is important.
This will help you making sure your data is backed up.
Backupβ
Get the container IDβ
On the machine Retrospected is running, do:
docker ps
This should return a list of containers running, looking like this:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6556474a1b19 retrospected/frontend:latest "/frontend-entrypoinβ¦" 2 days ago Up 2 days 0.0.0.0:3000->80/tcp, :::3000->80/tcp prod_frontend_1
beb4fa7d3bd3 retrospected/backend:latest "docker-entrypoint.sβ¦" 2 days ago Up 2 days prod_backend_1
223f6cd73aaf redis:latest "docker-entrypoint.sβ¦" 6 days ago Up 6 days 6379/tcp beta_redis_1
6aa8d4e70ed0 dpage/pgadmin4:latest "/entrypoint.sh" 2 weeks ago Up 2 weeks 80/tcp, 443/tcp, 0.0.0.0:3001->3001/tcp, :::3001->3001/tcp prod_pgadmin_1
dc629da8fb41 postgres:16 "docker-entrypoint.sβ¦" 7 months ago Up 4 weeks 5432/tcp prod_postgres_1
Look for the "postgres" image, and note its container ID (dc629da8fb41
in our case, but yours will be different).
Execute the backupβ
Now that you have the container ID (see above), run the following:
docker exec -t <docker_container_id> pg_dumpall -c -U postgres > dump.sql
This will have created a dump.sql
file in your current directory. This is your backup file. Keep it safe!
Restoreβ
Get the container IDβ
Follow the same instructions as above (in the Backup section).
Restore the dataβ
Assuming your backup file is named dump.sql
, run the following command to restore your data:
cat dump.sql | docker exec -i <docker_container_id> psql -U postgres
Automate (Optional)β
Backing your data up is good, but making it automatic is essential.
You will want to create a cron job to run a backup daily.
Create a Cron taskβ
First, we need to create a file that will be executed by cron on a daily basis.
cd /etc/cron.daily
sudo vim backup
Vim is a Linux command-line text editor. Feel free to use another one (nano, vi). The point is that we want to create and edit a file named backup
in the cron.daily
directory.
Add the contentβ
Now that you have your backup file opened, copy/paste the following into the file, and modify it to suit your needs.
#!/bin/sh
CURRENT_DATE=`date +%Y-%m-%d"_"%H_%M_%S`
BACKUP_DIR="/home/username/backup-staging"
SYNC_DIR="/home/username/backups"
docker exec -t retrospected_postgres_1 pg_dumpall -c -U postgres | gzip > $BACKUP_DIR/database.sql.zip
cp /home/username/retrospected/docker-compose.yml $BACKUP_DIR/docker-compose.yml
cp /etc/cron.daily/backup $BACKUP_DIR/backup-script
tar -zcvf $SYNC_DIR/backup.$CURRENT_DATE.tar.gz $BACKUP_DIR/
setopt rm_star_silent
rm -rf $BACKUP_DIR/*
unsetopt rm_star_silent
Some things to look out for:
- Modify
BACKUP_DIR
to a directory that actually exists ("username" must be replaced by your username). This is where the backup is being put together (a temporary directory) - Modify
SYNC_DIR
in the same way. This is where the backup file (a unique tar.gz file) will land, with a timestamp in the filename. This is this directory that must be synchronised with another machine or the cloud somehow to keep your backups outside of this machine in case of hardware failure. You can use rsync or Resilio (which I use). - Modify
retrospected_postgres_1
: this name will change depending on your circumstances. Rundocker ps
to get the actual name (in theNAMES
column).