name: Backup semanal de la base de datos # Dump cifrado de los esquemas public + internal (sin auth) a Google Drive, # con rotación automática. Implementa Documentation/Backlog/Backups.md — ver # ese doc para el diseño completo (invariantes, esquema de retención, y por # qué la subida se hace con rclone autenticado como el dueño del Drive en # vez de un Service Account). # # Falla ruidoso a propósito (invariante 3 del backlog): si el dump, el # cifrado, la subida o la rotación fallan, este job queda en rojo y GitHub # le manda un mail al dueño del repo. Ningún paso sensible usa # continue-on-error. # # El remote de rclone dentro de RCLONE_CONFIG tiene que llamarse "gdrive" # (ver database/backup/dump.sh y rotate.sh, que asumen ese nombre). on: schedule: - cron: "0 5 * * 1" # lunes 05:00 UTC (~02:00 hora Argentina) workflow_dispatch: {} # para probar a mano desde la pestaña Actions jobs: backup: runs-on: ubuntu-latest env: RCLONE_REMOTE_NAME: gdrive steps: - uses: actions/checkout@v4 - name: Instalar postgresql-client 17 y rclone # El postgresql-client generico de Ubuntu puede venir en una version # mas vieja que el servidor (Postgres 17 en Supabase), y pg_dump con # un cliente mas viejo que el servidor puede fallar o dumpear # incompleto. Se instala la 17 explicita desde el repo oficial PGDG. run: | sudo apt-get update sudo apt-get install -y curl ca-certificates gnupg sudo install -d /usr/share/postgresql-common/pgdg sudo curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \ -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" \ | sudo tee /etc/apt/sources.list.d/pgdg.list sudo apt-get update sudo apt-get install -y postgresql-client-17 curl -fsSL https://rclone.org/install.sh | sudo bash # El runner ya trae un pg_dump mas viejo preinstalado que gana en # el PATH aunque se instale la 17 al lado. Se antepone la carpeta # de la 17 explicitamente para que no haya ambiguedad. echo "/usr/lib/postgresql/17/bin" >> "$GITHUB_PATH" - name: Configurar rclone env: RCLONE_CONFIG_CONTENT: ${{ secrets.RCLONE_CONFIG }} run: | mkdir -p ~/.config/rclone printf '%s' "$RCLONE_CONFIG_CONTENT" > ~/.config/rclone/rclone.conf chmod 600 ~/.config/rclone/rclone.conf - name: Dump + comprimir + cifrar + subir env: DATABASE_URL: ${{ secrets.DATABASE_URL }} BACKUP_PASSPHRASE: ${{ secrets.BACKUP_PASSPHRASE }} GDRIVE_FOLDER_ID: ${{ secrets.GDRIVE_FOLDER_ID }} run: bash database/backup/dump.sh - name: Rotar backups viejos env: GDRIVE_FOLDER_ID: ${{ secrets.GDRIVE_FOLDER_ID }} run: bash database/backup/rotate.sh