Files
flynn/scripts/backup-to-minio.sh

61 lines
1.8 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
# Required env vars:
# FLYNN_DATA_DIR (default: ~/.local/share/flynn)
# FLYNN_BACKUP_DIR (default: ~/.local/share/flynn/backups)
# MINIO_ENDPOINT
# MINIO_ACCESS_KEY
# MINIO_SECRET_KEY
# MINIO_BUCKET
#
# Optional:
# MINIO_PREFIX (default: flynn)
# MINIO_SECURE (default: true)
DATA_DIR="${FLYNN_DATA_DIR:-$HOME/.local/share/flynn}"
BACKUP_DIR="${FLYNN_BACKUP_DIR:-$HOME/.local/share/flynn/backups}"
MINIO_PREFIX="${MINIO_PREFIX:-flynn}"
MINIO_SECURE="${MINIO_SECURE:-true}"
if [[ -z "${MINIO_ENDPOINT:-}" || -z "${MINIO_ACCESS_KEY:-}" || -z "${MINIO_SECRET_KEY:-}" || -z "${MINIO_BUCKET:-}" ]]; then
echo "Missing MinIO config. Set MINIO_ENDPOINT, MINIO_ACCESS_KEY, MINIO_SECRET_KEY, MINIO_BUCKET." >&2
exit 1
fi
if ! command -v mc >/dev/null 2>&1; then
echo "MinIO client (mc) not found in PATH." >&2
exit 1
fi
mkdir -p "${BACKUP_DIR}"
STAMP="$(date -u +%Y%m%d_%H%M%S)"
ARCHIVE="flynn_${STAMP}.tar.gz"
ARCHIVE_PATH="${BACKUP_DIR}/${ARCHIVE}"
ENTRIES=()
[[ -f "${DATA_DIR}/sessions.db" ]] && ENTRIES+=("sessions.db")
[[ -f "${DATA_DIR}/vectors.db" ]] && ENTRIES+=("vectors.db")
[[ -d "${DATA_DIR}/memory" ]] && ENTRIES+=("memory")
if [[ ${#ENTRIES[@]} -eq 0 ]]; then
echo "No backup inputs found under ${DATA_DIR}" >&2
exit 1
fi
tar -czf "${ARCHIVE_PATH}" -C "${DATA_DIR}" "${ENTRIES[@]}"
if [[ "${MINIO_SECURE}" == "true" ]]; then
PROTO="https"
else
PROTO="http"
fi
export MC_HOST_flynnbackup="${PROTO}://${MINIO_ACCESS_KEY}:${MINIO_SECRET_KEY}@${MINIO_ENDPOINT}"
mc mb --ignore-existing "flynnbackup/${MINIO_BUCKET}" >/dev/null
mc cp "${ARCHIVE_PATH}" "flynnbackup/${MINIO_BUCKET}/${MINIO_PREFIX}/${ARCHIVE}" >/dev/null
echo "Backup created: ${ARCHIVE_PATH}"
echo "Uploaded to: flynnbackup/${MINIO_BUCKET}/${MINIO_PREFIX}/${ARCHIVE}"