BACKUP_BASE ?= /srv/backup BACKUP_KEEP_DAYS ?= 7 DATABASE_BACKUP_BASE ?= $(BACKUP_BASE)/database REPOSITORY_BACKUP_BASE ?= $(BACKUP_BASE)/repositories REDMINE_STACK ?= /srv/stacks/redmine WIKI_STACK ?= /srv/stacks/wiki CATALOG_STACK ?= /srv/stacks/teletype-games GITEA_SERVER ?= https://git.teletype.hu GITEA_API ?= $(GITEA_SERVER)/api/v1/repos/search?limit=10000&private=true RSYNC_USER ?= tasi RSYNC_HOST ?= rastasi.ddns.net RSYNC_PORT ?= 8722 RSYNC_PATH ?= /volume1/Archives/vps RSYNC_PATH_BIN ?= /usr/bin/rsync db_redmine: echo "==> Dump Redmine database" cd $(REDMINE_STACK) && docker compose exec database sh /db_backup/mariadb_backup.sh db_wiki: echo "==> Dump Wiki database" cd $(WIKI_STACK) && docker compose exec wiki_db sh /db_backup/pg_backup.sh db_catalog: echo "==> Dump Catalog database" cd $(CATALOG_STACK) && docker compose exec mysql sh /db_backup/mysql_backup.sh db_cleanup: echo "==> Cleanup database dumps older than $(BACKUP_KEEP_DAYS) days" @prefixes=$$(find $(DATABASE_BACKUP_BASE) -maxdepth 1 -type f -name "*.sql" \ | xargs -I{} basename {} \ | sed 's/-[0-9].*$$//' \ | sort -u); \ for prefix in $$prefixes; do \ total=$$(find $(DATABASE_BACKUP_BASE) -maxdepth 1 -type f -name "$$prefix-*.sql" | wc -l); \ old=$$(find $(DATABASE_BACKUP_BASE) -maxdepth 1 -type f -name "$$prefix-*.sql" -mtime +$(BACKUP_KEEP_DAYS) | wc -l); \ keep=$$((total - old)); \ if [ "$$keep" -ge 1 ]; then \ echo "===> Cleaning $$prefix dumps ($$old old, $$keep remaining)"; \ find $(DATABASE_BACKUP_BASE) -maxdepth 1 -type f -name "$$prefix-*.sql" -mtime +$(BACKUP_KEEP_DAYS) -delete; \ else \ echo "===> Skipping $$prefix (would leave no backups)"; \ fi; \ done repos: echo "==> Get GIT repositories" @mkdir -p "$(REPOSITORY_BACKUP_BASE)"; \ curl -s -H "Authorization: token $(GITEA_TOKEN)" "$(GITEA_API)" \ | jq -r '.data[] | "\(.clone_url) \(.full_name)"' \ | while read repo fullname; do \ repo=$$(echo $$repo | sed 's|^http://|https://|'); \ name=$$(basename $$fullname); \ dir="$(REPOSITORY_BACKUP_BASE)/$$name"; \ echo "===> Get $$repo name=$$name"; \ if [ -d "$$dir/.git" ]; then \ git -C "$$dir" fetch --all --prune; \ git -C "$$dir" pull; \ else \ git clone "$$repo" "$$dir"; \ fi; \ done sync: echo "==> Sync backups to $(RSYNC_USER)@$(RSYNC_HOST):$(RSYNC_PATH)" rsync -avz --delete -e "ssh -p $(RSYNC_PORT)" --rsync-path=$(RSYNC_PATH_BIN) $(DATABASE_BACKUP_BASE) $(RSYNC_USER)@$(RSYNC_HOST):$(RSYNC_PATH)/ rsync -avz --delete -e "ssh -p $(RSYNC_PORT)" --rsync-path=$(RSYNC_PATH_BIN) $(REPOSITORY_BACKUP_BASE) $(RSYNC_USER)@$(RSYNC_HOST):$(RSYNC_PATH)/ backup: db_redmine db_wiki db_catalog repos db_cleanup sync