#!/usr/bin/env bash set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" set -a eval "$(grep -v '^#' "$REPO_ROOT/.env" | grep -v '^$' | grep '^[A-Za-z_][A-Za-z_0-9]*=' )" set +a set -a eval "$(grep -v '^#' "$REPO_ROOT/nextcloud/.env" | grep -v '^$' | grep '^[A-Za-z_][A-Za-z_0-9]*=' )" set +a DATA_ROOT="${DATA_ROOT:-/opt/docker-data}" BACKUP_DIR="/opt/backups" # ------------------------------------------------------------------ # Usage # ------------------------------------------------------------------ if [ $# -lt 1 ]; then echo "Usage: $0 " echo " e.g.: $0 2026-03-22" echo "" echo "Expects these files in $BACKUP_DIR:" echo " nextcloud-db-.sql" echo " nextcloud-data-.tar.gz" echo " gitea-.tar.gz" exit 1 fi DATE="$1" DB_DUMP="$BACKUP_DIR/nextcloud-db-$DATE.sql" NC_ARCHIVE="$BACKUP_DIR/nextcloud-data-$DATE.tar.gz" GITEA_ARCHIVE="$BACKUP_DIR/gitea-$DATE.tar.gz" for f in "$DB_DUMP" "$NC_ARCHIVE" "$GITEA_ARCHIVE"; do if [ ! -f "$f" ]; then echo "ERROR: $f not found." exit 1 fi done echo "==> Restoring from backup date: $DATE" echo " This will overwrite current data. Press Ctrl+C within 5s to abort." sleep 5 # ------------------------------------------------------------------ # Stop services # ------------------------------------------------------------------ echo "==> Stopping services..." docker compose -f "$REPO_ROOT/nextcloud/docker-compose.yml" --env-file "$REPO_ROOT/.env" down docker compose -f "$REPO_ROOT/gitea/docker-compose.yml" --env-file "$REPO_ROOT/.env" down # ------------------------------------------------------------------ # Restore Nextcloud data # ------------------------------------------------------------------ echo "==> Restoring Nextcloud data..." tar -xzf "$NC_ARCHIVE" -C "$DATA_ROOT" # ------------------------------------------------------------------ # Restore Gitea data # ------------------------------------------------------------------ echo "==> Restoring Gitea data..." tar -xzf "$GITEA_ARCHIVE" -C "$DATA_ROOT" # ------------------------------------------------------------------ # Start Postgres and restore DB # ------------------------------------------------------------------ echo "==> Starting Postgres for DB restore..." docker compose -f "$REPO_ROOT/nextcloud/docker-compose.yml" --env-file "$REPO_ROOT/.env" up -d postgres echo " -> Waiting for Postgres to be ready..." until docker exec nextcloud-postgres pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB" &>/dev/null; do sleep 1 done echo "==> Restoring Nextcloud database..." docker exec -i nextcloud-postgres psql -U "$POSTGRES_USER" -d postgres < "$DB_DUMP" # ------------------------------------------------------------------ # Start all services # ------------------------------------------------------------------ echo "==> Starting all services..." docker compose -f "$REPO_ROOT/nextcloud/docker-compose.yml" --env-file "$REPO_ROOT/.env" up -d docker compose -f "$REPO_ROOT/gitea/docker-compose.yml" --env-file "$REPO_ROOT/.env" up -d echo "==> Restore complete."