diff --git a/roles/openshift-apps/forgejo/files/run_forgejo_backup.sh b/roles/openshift-apps/forgejo/files/run_forgejo_backup.sh new file mode 100755 index 0000000000..eb00d33df8 --- /dev/null +++ b/roles/openshift-apps/forgejo/files/run_forgejo_backup.sh @@ -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 + diff --git a/roles/openshift-apps/forgejo/files/run_forgejo_pruning.sh b/roles/openshift-apps/forgejo/files/run_forgejo_pruning.sh new file mode 100755 index 0000000000..7ab29a2f81 --- /dev/null +++ b/roles/openshift-apps/forgejo/files/run_forgejo_pruning.sh @@ -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" diff --git a/roles/openshift-apps/forgejo/files/script/import_sql_dump.sh b/roles/openshift-apps/forgejo/files/script/import_sql_dump.sh new file mode 100755 index 0000000000..0535cc0bce --- /dev/null +++ b/roles/openshift-apps/forgejo/files/script/import_sql_dump.sh @@ -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= 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 diff --git a/roles/openshift-apps/forgejo/files/script/run_forgejo_cleanup.sh b/roles/openshift-apps/forgejo/files/script/run_forgejo_cleanup.sh new file mode 100755 index 0000000000..b6dff63f56 --- /dev/null +++ b/roles/openshift-apps/forgejo/files/script/run_forgejo_cleanup.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +rm /tmp/forgejo-dump*.zip diff --git a/roles/openshift-apps/forgejo/files/script/run_forgejo_dump.sh b/roles/openshift-apps/forgejo/files/script/run_forgejo_dump.sh new file mode 100755 index 0000000000..ff42a59ea3 --- /dev/null +++ b/roles/openshift-apps/forgejo/files/script/run_forgejo_dump.sh @@ -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` diff --git a/roles/openshift-apps/forgejo/tasks/main.yaml b/roles/openshift-apps/forgejo/tasks/main.yaml index b79f5431e0..95733fd357 100644 --- a/roles/openshift-apps/forgejo/tasks/main.yaml +++ b/roles/openshift-apps/forgejo/tasks/main.yaml @@ -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