infra/roles/backup/templates/backup.sh.j2
jack 6ebd237894
Some checks failed
CI/CD / deploy (push) Has been cancelled
CI/CD / syntax-check (push) Successful in 1m7s
feat: major infrastructure improvements
Reliability:
- Add swap role (2GB, swappiness=10, idempotent via /etc/fstab)
- Add mem_limit to plane-worker (512m) and plane-beat (256m)
- Add health checks to all services (traefik, vaultwarden, forgejo,
  plane-*, syncthing, prometheus, grafana, loki)

Code quality:
- Remove Traefik Docker labels (file provider used, labels were dead code)
- Add comment explaining file provider architecture

Observability:
- Add AlertManager with Telegram notifications
- Add Prometheus alert rules: CPU, RAM, disk, swap, container health
- Add Loki + Promtail for centralized log aggregation
- Add Loki datasource to Grafana
- Enable Traefik /ping endpoint for health checks

Backups:
- Add backup role: pg_dump for forgejo + plane DBs, tar for
  vaultwarden and forgejo data
- 7-day retention, daily cron at 03:00
- Backup script at /usr/local/bin/backup-services

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 03:28:16 +07:00

51 lines
2.6 KiB
Django/Jinja

#!/usr/bin/env bash
# Generated by Ansible — do not edit manually
# Backs up PostgreSQL databases and Vaultwarden data.
# Runs daily at 03:00, keeps {{ backup_retention_days }} days of backups.
set -euo pipefail
BACKUP_DIR="{{ backup_dir }}"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
KEEP_DAYS="{{ backup_retention_days }}"
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"; }
log "=== Backup started ==="
# ── Forgejo PostgreSQL ──────────────────────────────────────────────────────
log "Backing up forgejo-db..."
docker exec forgejo-db pg_dump -U forgejo forgejo \
| gzip > "${BACKUP_DIR}/forgejo-db_${DATE}.sql.gz"
log " → ${BACKUP_DIR}/forgejo-db_${DATE}.sql.gz ($(du -sh "${BACKUP_DIR}/forgejo-db_${DATE}.sql.gz" | cut -f1))"
# ── Plane PostgreSQL ────────────────────────────────────────────────────────
log "Backing up plane-db..."
docker exec plane-db pg_dump -U plane plane \
| gzip > "${BACKUP_DIR}/plane-db_${DATE}.sql.gz"
log " → ${BACKUP_DIR}/plane-db_${DATE}.sql.gz ($(du -sh "${BACKUP_DIR}/plane-db_${DATE}.sql.gz" | cut -f1))"
# ── Vaultwarden data ────────────────────────────────────────────────────────
log "Backing up Vaultwarden..."
docker run --rm \
--volumes-from vaultwarden \
-v "${BACKUP_DIR}:/backup" \
alpine:3 \
tar czf "/backup/vaultwarden_${DATE}.tar.gz" /data
log " → ${BACKUP_DIR}/vaultwarden_${DATE}.tar.gz ($(du -sh "${BACKUP_DIR}/vaultwarden_${DATE}.tar.gz" | cut -f1))"
# ── Forgejo repositories ────────────────────────────────────────────────────
log "Backing up Forgejo data..."
docker run --rm \
--volumes-from forgejo \
-v "${BACKUP_DIR}:/backup" \
alpine:3 \
tar czf "/backup/forgejo-data_${DATE}.tar.gz" /data
log " → ${BACKUP_DIR}/forgejo-data_${DATE}.tar.gz ($(du -sh "${BACKUP_DIR}/forgejo-data_${DATE}.tar.gz" | cut -f1))"
# ── Cleanup old backups ─────────────────────────────────────────────────────
log "Removing backups older than ${KEEP_DAYS} days..."
find "${BACKUP_DIR}" -name "*.gz" -mtime +${KEEP_DAYS} -delete
log " → Done. Current backups:"
du -sh "${BACKUP_DIR}"/*.gz 2>/dev/null | sort -k2 || true
log "=== Backup completed ==="