#!/usr/bin/env bash # Author : Allan Christensen # First Created : 14-02-2026 (DD-MM-YYYY) # Description : Updates Gitea Single And Multi Instances On Ubuntu 24.04 # License : MIT License # # Are we root # if [[ $(id -u) -ne 0 ]]; then echo "" && echo "Must be root or use sudo" && echo "" ; exit ; fi # # Variables # giteabin="/usr/local/bin/gitea" logdir="/var/log/gitea" logfile="$logdir/giteaupdate.log" backupdir="/var/log/gitea" log_date_format="+%Y-%m-%d-%H%M%S" # # Prepare logging # mkdir -p "$logdir" touch "$logfile" chmod 640 "$logfile" # # Detect interactive mode # if [[ -t 1 ]]; then interactive=true else interactive=false fi # # Redirect all output to logfile # exec >>"$logfile" 2>&1 echo "" echo "============================================================" echo "Gitea update run : $(date)" echo "============================================================" # # Logging helper # log() { echo "$1" if [[ "$interactive" == true ]]; then echo "$1" > /dev/tty fi } # # Check Gitea binary exists # if [[ ! -x "$giteabin" ]]; then log "" log "Gitea binary not found at $giteabin — aborting." log "" exit 1 fi # # Get installed version # installed_version=$("$giteabin" -v 2>/dev/null | awk '{print $3}') if [[ -z "$installed_version" ]]; then log "" log "Could not determine installed Gitea version — aborting." log "" exit 1 fi # # Get latest version # latest_version=$(curl -fsSL https://dl.gitea.com/gitea/version.json | grep -oP '"version"\s*:\s*"\K[^"]+') if [[ -z "$latest_version" ]]; then log "" log "Could not determine latest Gitea version — aborting." log "" exit 1 fi # # Compare versions # log "" log "Installed version : $installed_version" log "Latest version : $latest_version" if [[ "$installed_version" == "$latest_version" ]]; then log "" log "Already up to date. Nothing to do." log "" exit 0 fi log "" log "Updating Gitea to version $latest_version" # # Detect running Gitea services # mapfile -t running_services < <( systemctl list-units --type=service --state=running --no-legend | awk '{print $1}' | grep '^gitea' ) # # Download new binary # tmpbin="${giteabin}.new" log "" log "Downloading new Gitea binary..." curl -fL "https://dl.gitea.com/gitea/${latest_version}/gitea-${latest_version}-linux-amd64" -o "$tmpbin" \ || { log "Download failed — aborting." ; exit 1 ; } chmod 755 "$tmpbin" # # Validate downloaded binary # log "Validating downloaded binary..." if ! "$tmpbin" -v >/dev/null 2>&1; then log "Downloaded binary failed validation — aborting." rm -f "$tmpbin" exit 1 fi log "Binary validation successful." # # Stop running services # if [[ ${#running_services[@]} -gt 0 ]]; then log "" log "Stopping running Gitea services..." for svc in "${running_services[@]}"; do log "Stopping $svc" systemctl stop "$svc" done else log "" log "No running Gitea services detected." fi # # Backup current binary # mkdir -p "$backupdir" backupfile="$backupdir/giteaupdate-binary.log.$(date "$log_date_format")" cp -p "$giteabin" "$backupfile" log "" log "Backup saved to: $backupfile" # # Replace binary # mv "$tmpbin" "$giteabin" chmod 755 "$giteabin" # # Start services that were previously running # if [[ ${#running_services[@]} -gt 0 ]]; then log "" log "Starting Gitea services..." for svc in "${running_services[@]}"; do log "Starting $svc" systemctl start "$svc" done log "" log "Restarted services: ${running_services[*]}" fi log "" log "Update complete." log "" # # All done # printf "\nAll Done...\n" # # End of script #