unoffical wafrn mirror wafrn.net
atproto social-network activitypub
at angular21 179 lines 5.6 kB view raw
1#!/usr/bin/env bash 2set -eo pipefail 3 4SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) 5 6source "${SCRIPT_DIR}/../.env" 7 8BACKUP_ROOT_DIR=${BACKUP_ROOT_DIR:-$HOME/backup} 9BACKUP_KEEP_DAYS=${BACKUP_KEEP_DAYS:-10} 10BACKUP_POST_BACKUP_TOOL=${BACKUP_POST_BACKUP_TOOL:-$HOME/post_backup.sh} 11 12declare -a docker_compose_files=("docker-compose.simple.yml" "docker-compose.simple.metrics.yml" "docker-compose.advanced.yml" "docker-compose.advanced.metrics.yml") 13 14COMPOSE_FILENAME= 15 16check_files_for_update () { 17 PARAMS=$1 18 19 COMPOSE_FILENAME="docker-compose." 20 SHOULD_EXIT=0 21 22 # figure out which docker compose file we were using 23 for compose_filename in "${docker_compose_files[@]}" 24 do 25 if diff -q docker-compose.yml $compose_filename &>/dev/null; then 26 COMPOSE_FILENAME=$compose_filename 27 fi 28 done 29 30 # check if that docker compose file will change 31 if git diff --name-only '@' '@{u}' | grep -q $COMPOSE_FILENAME; then 32 echo "-------------------------------------------" 33 echo " WARNING" 34 echo 35 echo " Docker compose files have changed!" 36 echo "-------------------------------------------" 37 echo 38 39 # if we're using a nonstandard compose file we'll just throw an error 40 if [ $COMPOSE_FILENAME == "docker-compose." ]; then 41 echo "Please check the release notes, and review the changes," 42 echo "making sure to update your local config accordingly" 43 echo 44 echo "If you're happy with the changes please re-run the script with" 45 echo " ./install/manage.sh update -f" 46 SHOULD_EXIT=1 47 else 48 echo "The following updates will be applied automatically after pulling:" 49 echo 50 git diff '@' '@{u}' -- $COMPOSE_FILENAME 51 echo 52 fi 53 else 54 COMPOSE_FILENAME= 55 fi 56 57 # check if the environment config will change 58 if git diff --name-only '@' '@{u}' | grep -q '.env.example'; then 59 echo "-------------------------------------------" 60 echo " WARNING" 61 echo 62 echo " Environment example config has changed!" 63 echo "-------------------------------------------" 64 echo 65 echo "Please check the release notes, and review the changes below" 66 echo "making sure to update your local config accordingly:" 67 echo 68 git diff '@' '@{u}' -- .env.example 69 echo 70 echo "If you're happy with the changes please re-run the script with" 71 echo " ./install/manage.sh update -f" 72 SHOULD_EXIT=1 73 fi 74 75 if [ "$PARAMS" != "-f" ]; then 76 if [ "$SHOULD_EXIT" -eq 1 ]; then 77 exit 1 78 fi 79 else 80 echo 81 echo "WARNING: Force flag found, continuing update" 82 echo 83 fi 84} 85 86case $1 in 87 update) 88 pushd "${SCRIPT_DIR}/.." 89 OLD_SHA=$(git rev-parse HEAD) 90 91 git fetch 92 93 check_files_for_update $2 94 95 git pull 96 97 if [ ! -z "$COMPOSE_FILENAME" ]; then 98 cp $COMPOSE_FILENAME docker-compose.yml 99 fi 100 $SCRIPT_DIR/_auto_updater.sh $OLD_SHA 101 102 #docker compose down 103 rm -rf packages/backend/cache/ && mkdir packages/backend/cache/ && touch packages/backend/cache/.gitkeep 104 docker system prune -f 105 docker compose pull 106 docker compose up --build -d 107 docker compose logs -t -n 50 -f 108 popd 109 ;; 110 backup) 111 echo "Cleaning up backup directory" 112 mkdir -p "$BACKUP_ROOT_DIR" 113 find "$BACKUP_ROOT_DIR" -mtime +$BACKUP_KEEP_DAYS -type f -delete 114 BACKUP_DIR=$BACKUP_ROOT_DIR/$(date +"%Y%m%dT%H%M%S") 115 mkdir -p "$BACKUP_DIR" 116 pushd "$BACKUP_DIR" 117 echo "Backing up database" 118 docker start wafrn-db-1 119 docker exec wafrn-db-1 pg_dumpall -c | zstd -9 > db.sql.zst 120 echo "Backing up uploads folder" 121 tar --zstd -cf uploads.tar.zst -C "$SCRIPT_DIR/../packages/backend/uploads" . 122 if [ "$ENABLE_BSKY" == "true" ]; then 123 echo "Backing up bluesky data" 124 docker run --rm -v "wafrn_pds:/pds" -v "$(pwd):/backup" -w /pds node:20-alpine tar c -f - . | zstd > pds.tar.zst 125 fi 126 cp ../../wafrn/.env environment 127 echo "Done" 128 popd 129 if [ -f "$BACKUP_POST_BACKUP_TOOL" ]; then 130 $BACKUP_POST_BACKUP_TOOL "$BACKUP_DIR" 131 fi 132 ;; 133 restore) 134 RESTORE_DIR=$2 135 if [ -d "${RESTORE_DIR}" ] ; then 136 pushd "$SCRIPT_DIR/.." 137 echo "Stopping instance" 138 docker compose stop 139 popd 140 pushd "$RESTORE_DIR" 141 echo "Restoring database" 142 docker start wafrn-db-1 143 zstdcat db.sql.zst | docker exec -i wafrn-db-1 psql -X -f - -d postgres 144 echo "Restoring uploads directory" 145 rm -rf "$SCRIPT_DIR/../packages/backend/uploads/*" 146 tar --zstd -xf uploads.tar.zst -C "$SCRIPT_DIR/../packages/backend/uploads" 147 if [ "$ENABLE_BSKY" == "true" ]; then 148 echo "Restoring pds data" 149 zstdcat pds.tar.zst | docker run --rm -i -v "wafrn_pds:/pds" -w /pds node:20-alpine sh -c 'rm -rf * && tar x -f -' 150 fi 151 popd 152 pushd "$SCRIPT_DIR/.." 153 echo "Restarting intance" 154 docker compose up --build -d 155 popd 156 else 157 echo "Please provide a backup directory to restore" 158 fi 159 ;; 160 clean) 161 pushd "$SCRIPT_DIR/.." 162 rm -rf packages/backend/cache/ && mkdir packages/backend/cache/ 163 popd 164 ;; 165 logs) 166 pushd "${SCRIPT_DIR}/.." 167 docker compose logs -t -n 50 -f 168 popd 169 ;; 170 *) 171 echo "Valid options:" 172 echo " update: Download latest wafrn from repository, update and restart" 173 echo " backup: Create backup of the current wafrn files" 174 echo " restore: Restore a specific backup" 175 echo " clean: Cleans the cache" 176 echo " logs: Starts tailing docker logs" 177 exit 1 178 ;; 179esac