diff --git a/roles/forgejo/tasks/backup.yml b/roles/forgejo/tasks/backup.yml index 0a5253a..91be5ec 100644 --- a/roles/forgejo/tasks/backup.yml +++ b/roles/forgejo/tasks/backup.yml @@ -6,7 +6,7 @@ dest: /usr/local/bin/forgejo_backup.sh owner: git group: git - mode: 0775 + mode: 0700 - name: Create forgejo-dumps directory become: true diff --git a/roles/forgejo/templates/forgejo_backup.sh.j2 b/roles/forgejo/templates/forgejo_backup.sh.j2 index 28ce679..a6418fe 100644 --- a/roles/forgejo/templates/forgejo_backup.sh.j2 +++ b/roles/forgejo/templates/forgejo_backup.sh.j2 @@ -49,28 +49,37 @@ _EOF do_backup() { echo "Backing up Forgejo..." stop_service - output_dump_file="$DUMP_DIR/forgejo-dump-$(date +'%Y%m%d').zip" + output_dump_file="$DUMP_DIR/forgejo-dump-$(date +'%Y%m%d').tar" + mysql_dump_file="$DUMP_DIR/forgejo-db.sql" cd "$INSTALL_DIR" || exit 1 - ./forgejo dump -V -f "$output_dump_file" -c "$CONFIG_FILE" -t "$TMP_DIR" --skip-attachment-data --skip-lfs-data -w "$WORK_DIR" + ./forgejo dump -V -f "$output_dump_file" -c "$CONFIG_FILE" -t "$TMP_DIR" --skip-attachment-data --skip-lfs-data -w "$WORK_DIR" --type tar + mysqldump -u"$MYSQL_USER" -p"$MYSQL_PW" "$MYSQL_DB" > "$mysql_dump_file" + cd "$DUMP_DIR" || exit 1 + tar --delete -f "$output_dump_file" gitea-db.sql + tar --append -f "$output_dump_file" "$(basename $mysql_dump_file)" + rm "$mysql_dump_file" chmod 640 "$output_dump_file" # Make the file readable by group for scp to different host by different user + gzip "$output_dump_file" restart_service echo "Done." } do_restore() { echo "Restoring Forgejo backup..." - zip_file="$1" - zip_dir="${zip_file%.*}" # Remove file extension - chmod 600 "$zip_file" # Backup has changed permissions, restore them here - echo "Unzipping $zip_file..." && unzip "$zip_file" -d "$zip_dir" && echo " OK." - cd "$zip_dir" || exit 1 + start_dir="$PWD" + tar_file="$1" + tar_dir="${tar_file%.tar.gz}" # Remove file extension + chmod 600 "$tar_file" # Backup has changed permissions, restore them here + echo "Extracting $tar_file..." && mkdir "$tar_dir" && tar xvzf "$tar_file" -C "$tar_dir" && echo " OK." + cd "$tar_dir" || exit 1 echo -n "Restoring $CONFIG_FILE..." && mv -f app.ini "$CONFIG_FILE" && echo " OK." echo -n "Restoring $DATA_DIR..." && rsync -avz --delete data/ "$DATA_DIR" && rm -rf data && echo " OK." echo -n "Restoring $LOG_DIR..." && rsync -avz log/ "$LOG_DIR" && rm -rf log && echo " OK." echo -n "Restoring $REPO_DIR..." && mkdir -p "$REPO_DIR" && rsync -avz --delete repos/ "$REPO_DIR" && rm -rf repos && echo " OK." echo -n "Changing ownership..." && chown -R git:git "$CONFIG_FILE" "$WORK_DIR" && echo " OK." - echo -n "Restoring MySQL database..." && mysql --default-character-set=utf8mb4 -u"$MYSQL_USER" -p"$MYSQL_PW" "$MYSQL_DB" < gitea-db.sql && rm gitea-db.sql && echo " OK." - rmdir "$zip_dir" + echo -n "Restoring MySQL database..." && mysql --default-character-set=utf8mb4 -u"$MYSQL_USER" -p"$MYSQL_PW" "$MYSQL_DB" < forgejo-db.sql && rm forgejo-db.sql && echo " OK." + cd "$start_dir" || exit 1 + rmdir "$tar_dir" restart_service regenerate_hooks echo "Done." @@ -78,7 +87,7 @@ do_restore() { do_prune() { echo "Pruning Forgejo backups and keeping $1 of them..." - dumps=("$DUMP_DIR"/forgejo-dump-*.zip) + dumps=("$DUMP_DIR"/forgejo-dump-*.tar.gz) nb_of_dumps="${#dumps[@]}" nb_to_keep="$1" nb_to_prune=$((nb_of_dumps - nb_to_keep))