#!/usr/bin/env bash # Backup do B2BCall: dump completo do Postgres (schemas "public" + "asterisk" # — cobre domínio da aplicação E objetos PJSIP realtime, já que ambos vivem # no mesmo banco) e cópia do .env. Os arquivos gerados por Telefonia -> # Dialplan / Call Center -> Filas NÃO precisam de backup separado: são # derivados de dialplan_versions/queues (Postgres) e recriados na próxima # publicação (agente.md seção 97: "Asterisk não é banco de negócio"). set -euo pipefail cd "$(dirname "$0")/.." if [ ! -f .env ]; then echo "Erro: .env não encontrado em $(pwd)." >&2 exit 1 fi set -a; source .env; set +a TIMESTAMP=$(date +%Y%m%d-%H%M%S) BACKUP_DIR="${BACKUP_DIR:-backups}" RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-30}" mkdir -p "$BACKUP_DIR" echo "==> Backup do Postgres (schemas public + asterisk)..." DUMP_FILE="$BACKUP_DIR/postgres-${TIMESTAMP}.dump" docker compose exec -T postgres pg_dump -U "$POSTGRES_USER" -Fc "$POSTGRES_DB" > "$DUMP_FILE" chmod 600 "$DUMP_FILE" echo " -> $DUMP_FILE ($(du -h "$DUMP_FILE" | cut -f1))" echo "==> Backup do .env (contém segredos — mantido fora do git, chmod 600)..." ENV_BACKUP="$BACKUP_DIR/env-${TIMESTAMP}.bak" cp .env "$ENV_BACKUP" chmod 600 "$ENV_BACKUP" echo " -> $ENV_BACKUP" if [ -f FIRST_LOGIN.txt ]; then echo "==> FIRST_LOGIN.txt ainda existe no servidor — copiando para o backup e recomendando remoção do original após o primeiro acesso." cp FIRST_LOGIN.txt "$BACKUP_DIR/FIRST_LOGIN-${TIMESTAMP}.txt" chmod 600 "$BACKUP_DIR/FIRST_LOGIN-${TIMESTAMP}.txt" fi echo "==> Removendo backups com mais de ${RETENTION_DAYS} dias..." find "$BACKUP_DIR" -maxdepth 1 -type f -mtime "+${RETENTION_DAYS}" -print -delete || true echo "==> Backup concluído." ls -lh "$BACKUP_DIR" | tail -n +1