#!/bin/bash # Nextcloud Maintenance Script. # This script performs maintenance tasks for Nextcloud. set -e # Colors for output. RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color. CONTAINER_NAME="nextcloud" # Function to print colored messages. printMessage() { local color=$1 local message=$2 echo -e "${color}${message}${NC}" } # Function to run occ command. runOcc() { docker exec -u www-data "$CONTAINER_NAME" php occ "$@" } # Load environment variables. loadEnv() { if [ -f "./nextcloud/.env" ]; then source ./nextcloud/.env printMessage "$GREEN" "Loaded Nextcloud environment variables." else printMessage "$RED" "Nextcloud .env file not found!" exit 1 fi if [ -f "./core/.env" ]; then source ./core/.env printMessage "$GREEN" "Loaded core environment variables." else printMessage "$RED" "Core .env file not found!" exit 1 fi } # Function to check if container is running. checkContainer() { if ! docker ps | grep -q "$CONTAINER_NAME"; then printMessage "$RED" "Error: Container $CONTAINER_NAME is not running!" exit 1 fi } # Function to fix database collation version mismatch. fix_database_collation() { printMessage "$YELLOW" "Checking and fixing database collation version..." if docker exec postgres psql -U "${POSTGRES_USER}" -d "${NEXTCLOUD_DB_NAME}" -c "ALTER DATABASE ${NEXTCLOUD_DB_NAME} REFRESH COLLATION VERSION;" 2>&1 | grep -q "ALTER DATABASE"; then printMessage "$GREEN" "Database collation version updated successfully." return 0 else printMessage "$YELLOW" "Database collation check completed (may already be up to date)." return 0 fi } # Function to check Nextcloud status. check_status() { printMessage "$YELLOW" "Checking Nextcloud status..." runOcc status return 0 } # Function to scan files. scan_files() { if [ -z "$1" ]; then printMessage "$YELLOW" "Scanning all files..." runOcc files:scan --all else printMessage "$YELLOW" "Scanning files for user: $1..." runOcc files:scan "$1" fi return 0 } # Function to update Nextcloud. update_nextcloud() { printMessage "$YELLOW" "Running database upgrade..." runOcc upgrade return 0 } # Function to optimize database. optimize_database() { printMessage "$YELLOW" "Optimizing database..." runOcc db:add-missing-indices runOcc db:add-missing-columns runOcc db:add-missing-primary-keys return 0 } # Function to run maintenance repair. run_repair() { printMessage "$YELLOW" "Running maintenance repair..." runOcc maintenance:repair return 0 } # Function to run comprehensive post-update maintenance. post_update_maintenance() { checkContainer printMessage "$GREEN" "=========================================" printMessage "$GREEN" "Nextcloud Post-Update Maintenance" printMessage "$GREEN" "=========================================" echo "" printMessage "$YELLOW" "[1/10] Enabling maintenance mode..." runOcc maintenance:mode --on printMessage "$YELLOW" "[2/10] Running database upgrade..." runOcc upgrade printMessage "$YELLOW" "[3/10] Adding missing database indices..." runOcc db:add-missing-indices printMessage "$YELLOW" "[4/10] Adding missing database columns..." runOcc db:add-missing-columns printMessage "$YELLOW" "[5/10] Adding missing primary keys..." runOcc db:add-missing-primary-keys printMessage "$YELLOW" "[6/10] Converting filecache to big int (if needed)..." runOcc db:convert-filecache-bigint --no-interaction || printMessage "$YELLOW" "Already converted or not needed." printMessage "$YELLOW" "[7/10] Updating .htaccess and configuration files..." runOcc maintenance:update:htaccess printMessage "$YELLOW" "[8/10] Updating theme..." runOcc maintenance:theme:update printMessage "$YELLOW" "[9/10] Running repair steps..." runOcc maintenance:repair printMessage "$YELLOW" "[10/10] Disabling maintenance mode..." runOcc maintenance:mode --off echo "" printMessage "$GREEN" "=========================================" printMessage "$GREEN" "Maintenance completed successfully!" printMessage "$GREEN" "=========================================" echo "" printMessage "$YELLOW" "System Status:" runOcc status echo "" printMessage "$GREEN" "You may want to run background jobs manually:" printMessage "$YELLOW" " docker exec -u www-data $CONTAINER_NAME php occ background:job:execute" } # Main execution. printMessage "$YELLOW" "Running Nextcloud maintenance tasks..." case "${1:-all}" in collation) loadEnv checkContainer fix_database_collation ;; status) checkContainer check_status ;; scan) checkContainer scan_files "$2" ;; update) checkContainer update_nextcloud ;; optimize) checkContainer optimize_database ;; repair) checkContainer run_repair ;; post-update) loadEnv post_update_maintenance ;; all) loadEnv checkContainer fix_database_collation echo "" check_status echo "" optimize_database echo "" run_repair echo "" printMessage "$YELLOW" "Disabling maintenance mode..." runOcc maintenance:mode --off echo "" printMessage "$GREEN" "All maintenance tasks completed." ;; *) echo "Usage: $0 [collation|status|scan|update|optimize|repair|post-update|all]" echo "" echo "Commands:" echo " collation - Fix database collation version mismatch" echo " status - Check Nextcloud status" echo " scan - Scan files (optionally specify username)" echo " update - Update Nextcloud database" echo " optimize - Optimize database indices and columns" echo " repair - Run maintenance repair" echo " post-update - Run comprehensive post-update maintenance workflow" echo " all - Run all basic maintenance tasks (default)" exit 1 ;; esac