unoffical wafrn mirror
wafrn.net
atproto
social-network
activitypub
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