Skip to content

Runbook: Docker volume backup

Přehled

Záloha Docker named volumes (Redis data, uploaded files atd.) z hub-alfa a prod-alfa.

Named volumes k zálohování

  • s60-redis-data — Redis AOF persistence (hub + prod)
  • Další volumes dle docker-compose.yml jednotlivých služeb

Ruční záloha

# Na cílovém serveru (hub/prod)
ssh root@<server_ip> bash -c '
  VOLUME="s60-redis-data"
  BACKUP_DIR="/root/backups/volumes"
  mkdir -p $BACKUP_DIR

  docker run --rm \
    -v ${VOLUME}:/data \
    -v ${BACKUP_DIR}:/backup \
    alpine tar czf /backup/${VOLUME}_$(date +%Y%m%d_%H%M%S).tar.gz -C /data .

  echo "Backup done: $(ls -lh ${BACKUP_DIR}/${VOLUME}_*.tar.gz | tail -1)"
'

Restore

ssh root@<server_ip> bash -c '
  VOLUME="s60-redis-data"
  BACKUP_FILE="/root/backups/volumes/<backup_file>.tar.gz"

  # Stop kontejnery které volume používají
  cd /opt/<projekt> && docker compose down

  # Restore
  docker run --rm \
    -v ${VOLUME}:/data \
    -v /root/backups/volumes:/backup \
    alpine sh -c "rm -rf /data/* && tar xzf /backup/$(basename $BACKUP_FILE) -C /data"

  # Start kontejnery
  docker compose up -d
'

Automatická záloha

Script: /root/projects/sentinel/deploy/docker-volume-backup.sh (TODO: vytvořit cron na Argusu)

Ověření

# Velikost zálohy (nesmí být 0)
ssh root@<server_ip> "ls -lh /root/backups/volumes/"

# Obsah archivu
ssh root@<server_ip> "tar tzf /root/backups/volumes/<file>.tar.gz | head -20"