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 git fetch
90
91 check_files_for_update $2
92
93 git pull
94
95 if [ ! -z "$COMPOSE_FILENAME" ]; then
96 cp $COMPOSE_FILENAME docker-compose.yml
97 fi
98
99 docker compose pull
100 docker compose build
101
102 rm -f packages/backend/cache/ && mkdir packages/backend/cache/
103
104 docker compose up --build -d
105 docker compose logs -t -n 50 -f
106 popd
107 ;;
108 backup)
109 echo "Cleaning up backup directory"
110 mkdir -p "$BACKUP_ROOT_DIR"
111 find "$BACKUP_ROOT_DIR" -mtime +$BACKUP_KEEP_DAYS -type f -delete
112 BACKUP_DIR=$BACKUP_ROOT_DIR/$(date +"%Y%m%dT%H%M%S")
113 mkdir -p "$BACKUP_DIR"
114 pushd "$BACKUP_DIR"
115 echo "Backing up database"
116 docker start wafrn-db-1
117 docker exec wafrn-db-1 pg_dumpall -c | zstd -9 > db.sql.zst
118 echo "Backing up uploads folder"
119 tar --zstd -cf uploads.tar.zst -C "$SCRIPT_DIR/../packages/backend/uploads" .
120 if [ "$ENABLE_BSKY" == "true" ]; then
121 echo "Backing up bluesky data"
122 docker run --rm -v "wafrn_pds:/pds" -v "$(pwd):/backup" -w /pds node:20-alpine tar c -f - . | zstd > pds.tar.zst
123 fi
124 echo "Done"
125 popd
126 if [ -f "$BACKUP_POST_BACKUP_TOOL" ]; then
127 $BACKUP_POST_BACKUP_TOOL "$BACKUP_DIR"
128 fi
129 ;;
130 restore)
131 RESTORE_DIR=$2
132 if [ -d "${RESTORE_DIR}" ] ; then
133 pushd "$SCRIPT_DIR/.."
134 echo "Stopping instance"
135 docker compose stop
136 popd
137 pushd "$RESTORE_DIR"
138 echo "Restoring database"
139 docker start wafrn-db-1
140 zstdcat db.sql.zst | docker exec -i wafrn-db-1 psql -X -f - -d postgres
141 echo "Restoring uploads directory"
142 rm -rf "$SCRIPT_DIR/../packages/backend/uploads/*"
143 tar --zstd -xf uploads.tar.zst -C "$SCRIPT_DIR/../packages/backend/uploads"
144 if [ "$ENABLE_BSKY" == "true" ]; then
145 echo "Restoring pds data"
146 zstdcat pds.tar.zst | docker run --rm -i -v "wafrn_pds:/pds" -w /pds node:20-alpine sh -c 'rm -rf * && tar x -f -'
147 fi
148 popd
149 pushd "$SCRIPT_DIR/.."
150 echo "Restarting intance"
151 docker compose up --build -d
152 popd
153 else
154 echo "Please provide a backup directory to restore"
155 fi
156 ;;
157 clean)
158 pushd "$SCRIPT_DIR/.."
159 rm -f packages/backend/cache/*
160 popd
161 ;;
162 logs)
163 pushd "${SCRIPT_DIR}/.."
164 docker compose logs -t -n 50 -f
165 popd
166 ;;
167 *)
168 echo "Valid options:"
169 echo " update: Download latest wafrn from repository, update and restart"
170 echo " backup: Create backup of the current wafrn files"
171 echo " restore: Restore a specific backup"
172 echo " clean: Cleans the cache"
173 echo " logs: Starts tailing docker logs"
174 exit 1
175 ;;
176esac