#!/usr/bin/env bash # # ARGUS backup — dumps the database and application data (certificates, # uploaded config) into a single, timestamped archive. # # cd ~/argus && ./backup.sh [output-directory] # set -euo pipefail INSTALL_DIR="${ARGUS_INSTALL_DIR:-$HOME/argus}" OUT_DIR="${1:-$PWD}" STAMP="$(date +%Y%m%d-%H%M%S)" ARCHIVE="${OUT_DIR}/argus-backup-${STAMP}.tar.gz" bold() { printf '\033[1m%s\033[0m\n' "$1"; } ok() { printf ' \033[32m✓\033[0m %s\n' "$1"; } fail() { printf ' \033[31m✗\033[0m %s\n' "$1" >&2; exit 1; } [ -f "$INSTALL_DIR/docker-compose.yml" ] || fail "No ARGUS installation found at $INSTALL_DIR (set ARGUS_INSTALL_DIR if you installed elsewhere)." cd "$INSTALL_DIR" bold "Backing up ARGUS..." WORKDIR="$(mktemp -d)" trap 'rm -rf "$WORKDIR"' EXIT docker compose exec -T db pg_dump -U "${DB_USER:-postgres}" "${DB_NAME:-argus}" | gzip > "$WORKDIR/db.sql.gz" ok "Database dumped" docker run --rm -v argus_api_data:/data -v "$WORKDIR":/backup alpine \ tar czf /backup/api-data.tar.gz -C /data . >/dev/null 2>&1 ok "Application data archived" mkdir -p "$OUT_DIR" tar czf "$ARCHIVE" -C "$WORKDIR" db.sql.gz api-data.tar.gz ok "Backup written to ${ARCHIVE}" echo printf ' %s\n' "Restore with: ./restore.sh ${ARCHIVE}"