#!/bin/bash set -euo pipefail source /etc/container_environment.sh source /etc/overleaf/env.sh LOG_FILE=/var/lib/overleaf/data/history/doc-version-recovery.log export DOC_VERSION_RECOVERY_RESYNCS_NEEDED_FILE=/var/lib/overleaf/data/history/doc-version-recovery-resyncs.log echo "Checking for doc version recovery. This can take a while if needed. Logs are in $LOG_FILE" cd /overleaf/services/history-v1 LOG_LEVEL=info node storage/scripts/recover_doc_versions.js 2>&1 | tee -a "$LOG_FILE" function resyncAllProjectsInBackground() { waitForService docstore 3016 waitForService document-updater 3003 waitForService filestore 3009 waitForService history-v1 3100 waitForService project-history 3054 waitForService web-api 4000 # Resync files that had their versions updated while read -r project_id; do echo "Resyncing project $project_id..." curl -X POST --silent "http://127.0.0.1:3054/project/$project_id/resync?force=true" done < "$DOC_VERSION_RECOVERY_RESYNCS_NEEDED_FILE" # Resync files that have broken histories /overleaf/bin/force-history-resyncs echo "Finished resyncing history for all projects. Adding .done suffix to log file" mv "$DOC_VERSION_RECOVERY_RESYNCS_NEEDED_FILE" "$DOC_VERSION_RECOVERY_RESYNCS_NEEDED_FILE.done" } function waitForService() { local name=$1 local port=$2 while ! curl --fail --silent "http://127.0.0.1:$port/status"; do echo "Waiting for $name service to start up" sleep 10 done } if [ -f "$DOC_VERSION_RECOVERY_RESYNCS_NEEDED_FILE" ]; then echo "Finished recovery of doc versions. Resyncing history for all projects in the background." resyncAllProjectsInBackground & else echo "No recovery of doc versions needed." fi