forgejo: Add backup handling scripts to ansible role

Signed-off-by: David Kirwan <davidkirwanirl@gmail.com>
This commit is contained in:
David Kirwan
2026-01-29 15:06:17 +00:00
parent 10c25c08f4
commit 0f1dbc8094
6 changed files with 163 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
#!/bin/sh
POD=`oc get pods -n forgejo --selector app.kubernetes.io/name=forgejo | awk '{print $1}' | grep forgejo`
echo $POD
oc -n forgejo rsync /root/ocp4/openshift-apps/forgejo/backups/script/ $POD:/tmp/
DUMP=`oc -n forgejo exec $POD sh /tmp/run_forgejo_dump.sh 2>&1 | tail -1`
echo $DUMP
oc -n forgejo rsync $POD:$DUMP /root/ocp4/openshift-apps/forgejo/backups/dump/
oc -n forgejo exec $POD sh /tmp/run_forgejo_cleanup.sh

View File

@@ -0,0 +1,91 @@
#!/bin/bash
# Backup management script configuration
BACKUP_DIR="/root/ocp4/openshift-apps/forgejo/backups/dump/" # Where backups are stored
DAILY_RETENTION=7 # Keep 7 daily backups
LOG_FILE="/root/ocp4/openshift-apps/forgejo/backups/log/forgejo_backup_prune.log"
# Logging function
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# Ensure backup directory exists
mkdir -p "$BACKUP_DIR"
# Check if script is run as root
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
# Start pruning process
log "Starting backup pruning process"
# Step 1: Keep the last 7 daily backups
find "$BACKUP_DIR" -name "forgejo-dump-*.zip" -mtime +"$DAILY_RETENTION" -not -name "weekly*" -not -name "monthly*" -not -name "yearly*" -delete
if [[ $? -eq 0 ]]; then
log "Pruned daily backups older than ${DAILY_RETENTION} days"
else
log "Error pruning daily backups"
fi
# Step 2: Weekly backup (run on Sundays)
if [[ $(date +%u) -eq 7 ]]; then
# Find the latest daily backup from this week
LATEST_DAILY=$(find "$BACKUP_DIR" -name "forgejo-dump-*.zip" -not -name "weekly*" -not -name "monthly*" -not -name "yearly*" -printf "%T@ %p\n" | sort -nr | head -n 1 | cut -d' ' -f2)
if [[ -n "$LATEST_DAILY" ]]; then
EPOCH=$(basename "$LATEST_DAILY" | grep -o '[0-9]\{10,\}')
WEEK_NUM=$(date +%U)
NEW_NAME="weekly${WEEK_NUM}-forgejo-dump-${EPOCH}.zip"
cp "$LATEST_DAILY" "${BACKUP_DIR}/${NEW_NAME}"
log "Created weekly backup: ${NEW_NAME}"
# Prune other daily backups from this week
WEEK_START=$(date -d "last Sunday" +%s)
find "$BACKUP_DIR" -name "forgejo-dump-*.zip" -not -name "weekly*" -not -name "monthly*" -not -name "yearly*" -exec sh -c '[[ $(echo $(basename "{}") | grep -o "[0-9]\{10,\}") -ge '"$WEEK_START"' ]]' \; -delete
log "Pruned other daily backups for week ${WEEK_NUM}"
else
log "No daily backup found for weekly processing"
fi
fi
# Step 3: Monthly backup (run on last day of the month)
if [[ $(date -d tomorrow +%d) -eq 1 ]]; then
# Find the latest weekly backup
LATEST_WEEKLY=$(find "$BACKUP_DIR" -name "weekly*-forgejo-dump-*.zip" -not -name "monthly*" -not -name "yearly*" -printf "%T@ %p\n" | sort -nr | head -n 1 | cut -d' ' -f2)
if [[ -n "$LATEST_WEEKLY" ]]; then
EPOCH=$(basename "$LATEST_WEEKLY" | grep -o '[0-9]\{10,\}')
MONTH_NUM=$(date +%m)
NEW_NAME="monthly${MONTH_NUM}-forgejo-dump-${EPOCH}.zip"
cp "$LATEST_WEEKLY" "${BACKUP_DIR}/${NEW_NAME}"
log "Created monthly backup: ${NEW_NAME}"
# Prune other weekly backups
find "$BACKUP_DIR" -name "weekly*-forgejo-dump-*.zip" -not -name "monthly*" -not -name "yearly*" -delete
log "Pruned other weekly backups"
else
log "No weekly backup found for monthly processing"
fi
fi
# Step 4: Yearly backup (run on last day of the year)
if [[ $(date -d tomorrow +%j) -eq 1 ]]; then
# Find the latest monthly backup
LATEST_MONTHLY=$(find "$BACKUP_DIR" -name "monthly*-forgejo-dump-*.zip" -not -name "yearly*" -printf "%T@ %p\n" | sort -nr | head -n 1 | cut -d' ' -f2)
if [[ -n "$LATEST_MONTHLY" ]]; then
EPOCH=$(basename "$LATEST_MONTHLY" | grep -o '[0-9]\{10,\}')
YEAR=$(date +%Y)
NEW_NAME="yearly${YEAR}-forgejo-dump-${EPOCH}.zip"
cp "$LATEST_MONTHLY" "${BACKUP_DIR}/${NEW_NAME}"
log "Created yearly backup: ${NEW_NAME}"
# Prune other monthly backups
find "$BACKUP_DIR" -name "monthly*-forgejo-dump-*.zip" -not -name "yearly*" -delete
log "Pruned other monthly backups"
else
log "No monthly backup found for yearly processing"
fi
fi
log "Backup pruning process completed"

View File

@@ -0,0 +1,18 @@
#!/bin/bash
# sudo dnf install postgresql
# psql $(oc -n forgejo get secrets forgejo-pguser -o go-template='{{.data.uri | base64decode}}')
# psql --username=<db_user_name> databasename < data_base_dump
PG_CLUSTER_PRIMARY_POD=$(oc get pod \
-n forgejo \
-o name \
-l postgres-operator.crunchydata.com/cluster=forgejo-ha,postgres-operator.crunchydata.com/role=master)
oc -n forgejo port-forward "${PG_CLUSTER_PRIMARY_POD}" 5432:5432
PGPASSWORD=$(oc get secrets -n forgejo "forgejo-pguser" -o go-template='{{.data.password | base64decode}}')
PGUSER=$(oc get secrets -n forgejo "forgejo-pguser" -o go-template='{{.data.user | base64decode}}')
PGDATABASE=$(oc get secrets -n forgejo "forgejo-pguser" -o go-template='{{.data.dbname | base64decode}}')
psql -h localhost

View File

@@ -0,0 +1,3 @@
#!/bin/sh
rm /tmp/forgejo-dump*.zip

View File

@@ -0,0 +1,8 @@
#!/bin/sh
mkdir -p /tmp/forgejo_dump
cd /tmp/
/usr/local/bin/forgejo dump --tempdir /tmp/forgejo_dump
DUMP=`ls -t forgejo-dump*.zip | head -n1 | grep forgejo`
echo `realpath $DUMP`

View File

@@ -4,6 +4,37 @@
path: "/root/ocp4/openshift-apps/forgejo/"
state: directory
- name: Ensures forgejo backup directories exist
ansible.builtin.file:
path: "{{ item }}"
state: directory
loop:
- /root/ocp4/openshift-apps/forgejo/backups/
- /root/ocp4/openshift-apps/forgejo/backups/script/
- /root/ocp4/openshift-apps/forgejo/backups/dump/
- /root/ocp4/openshift-apps/forgejo/backups/log/
- name: Copy forgejo backup scripts
ansible.builtin.copy:
src: "{{ item }}"
dest: /root/ocp4/openshift-apps/forgejo/backups/
owner: root
group: root
mode: '0755'
with_fileglob:
- run_forgejo_backup.sh
- run_forgejo_pruning.sh
- name: Copy forgejo helper scripts
ansible.builtin.copy:
src: "{{ item }}"
dest: /root/ocp4/openshift-apps/forgejo/backups/script/
owner: root
group: root
mode: '0755'
with_fileglob:
- script/*.sh
- include_tasks: create-forgejo-namespace.yaml
- include_tasks: create-forgejo-pvc.yaml
- include_tasks: create-postgres-operator-config.yaml