First stack mirrored 1:1 from /opt/ai-apps/forgejo/ on the server. Includes docker-compose.yml (forgejo + postgres 16), .env.example template (NO real secrets), backup.sh (nightly pg_dump + tar), plus Agent.md and README.md. Known gotchas documented in Agent.md: - Volume mount on /data not /var/lib/gitea - SSH port 2222 in container (system sshd occupies 22) - OIDC config lives in DB table login_source, not app.ini Refs OP#1119
29 lines
848 B
Bash
Executable file
29 lines
848 B
Bash
Executable file
#!/bin/bash
|
|
# Forgejo Backup — nightly cron
|
|
# Runs pg_dump + tar of /data, retention 14 days.
|
|
# Schedule: 0 3 * * * /opt/ai-apps/forgejo/backup.sh >> /opt/ai-apps/forgejo/backup.log 2>&1
|
|
|
|
set -euo pipefail
|
|
|
|
TS=$(date +%Y%m%d-%H%M%S)
|
|
DEST=/opt/backups/forgejo
|
|
mkdir -p "$DEST"
|
|
|
|
echo "[$(date -Iseconds)] backup start"
|
|
|
|
# Postgres dump
|
|
docker exec forgejo-db pg_dump -U forgejo forgejo | gzip > "$DEST/forgejo-db-$TS.sql.gz"
|
|
echo " db dump: $(ls -lh $DEST/forgejo-db-$TS.sql.gz | awk '{print $5}')"
|
|
|
|
# Data volume tar
|
|
docker run --rm \
|
|
-v forgejo_forgejo-data:/data:ro \
|
|
-v "$DEST":/backup \
|
|
alpine \
|
|
tar -czf "/backup/forgejo-data-$TS.tar.gz" -C /data .
|
|
echo " data tar: $(ls -lh $DEST/forgejo-data-$TS.tar.gz | awk '{print $5}')"
|
|
|
|
# Retention: 14 days
|
|
find "$DEST" -type f -mtime +14 -delete
|
|
|
|
echo "[$(date -Iseconds)] backup complete"
|