diff --git a/Dockerfile b/Dockerfile index b0edbc2..73da23d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,17 @@ FROM python:3.12-slim + WORKDIR /app + COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt + COPY app.py . -COPY static/ static/ + +# Scripts de backup (mountados do host via docker-compose volumes) +# Os scripts săo executados com subprocess de qualquer forma, +# entăo năo importa se săo do host ou do container +COPY scripts/ /root/ + EXPOSE 8766 -CMD ["gunicorn", "--bind", "0.0.0.0:8766", "--workers", "2", "--timeout", "120", "app:app"] + +CMD ["gunicorn", "--bind", "0.0.0.0:8766", "--workers", "1", "app:app"] diff --git a/docker-compose.yml b/docker-compose.yml index 60bac20..d486aba 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,10 +9,6 @@ services: - "8766" volumes: - .:/app - - /root/backup-apps.sh:/root/backup-apps.sh:ro - - /root/backup-bd.sh:/root/backup-bd.sh:ro - - /root/backup-git.sh:/root/backup-git.sh:ro - - /root/backup-git-repos.sh:/root/backup-git-repos.sh:ro - /root/backup.log:/root/backup.log:rw - /tmp/restore-temp:/tmp/restore-temp:rw env_file: diff --git a/scripts/backup-apps.sh b/scripts/backup-apps.sh new file mode 100755 index 0000000..04a9913 --- /dev/null +++ b/scripts/backup-apps.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# Backup /root/Apps → Google Drive (Apps) +set -e + +DATE=$(date +%Y%m%d_%H%M%S) +BACKUP_DIR="/tmp/backup-apps" +DEST="gdrive:Apps" + +echo "[$(date)] Backup Apps started" + +# Cleanup old temp +rm -rf "$BACKUP_DIR" +mkdir -p "$BACKUP_DIR" + +# Backup important apps configs +tar -czf "$BACKUP_DIR/apps-configs-$DATE.tar.gz" \ + /root/Apps/Camila \ + /root/Apps/RAG \ + /root/Apps/VOXDO \ + 2>/dev/null || true + +# Sync to Google Drive +rclone copy "$BACKUP_DIR" "$DEST" --progress + +# Keep only last 7 days in GDrive +rclone delete "$DEST" --min-age 7d + +# Cleanup local +rm -rf "$BACKUP_DIR" + +echo "[$(date)] Backup Apps finished" diff --git a/scripts/backup-bd.sh b/scripts/backup-bd.sh new file mode 100755 index 0000000..d0df1d2 --- /dev/null +++ b/scripts/backup-bd.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# Backup PostgreSQL databases → Google Drive (BD) +set -e + +DATE=$(date +%Y%m%d_%H%M%S) +BACKUP_DIR="/tmp/backup-bd" +DEST="gdrive:BD" + +echo "[$(date)] Backup BD started" + +# Cleanup old temp +rm -rf "$BACKUP_DIR" +mkdir -p "$BACKUP_DIR" + +# Supabase DB backup +docker exec supabase-db pg_dump -U postgres postgres > "$BACKUP_DIR/supabase-db-$DATE.sql" 2>/dev/null || \ + docker exec supabase-db-h0oggskgs0ws0sco8kc4s8ws pg_dump -U postgres postgres > "$BACKUP_DIR/supabase-db-$DATE.sql" 2>/dev/null || \ + echo "Supabase DB not found, skipping" + +# Gitea DB backup +docker exec coolify-db pg_dump -U postgres postgres > "$BACKUP_DIR/gitea-db-$DATE.sql" 2>/dev/null || \ + docker exec gitea-yccsckck4g004gosccwc4kg4 pg_dump -U postgres -U postgres gitea > "$BACKUP_DIR/gitea-db-$DATE.sql" 2>/dev/null || \ + echo "Gitea DB not found, skipping" + +# Compress +tar -czf "$BACKUP_DIR/bd-backup-$DATE.tar.gz" -C "$BACKUP_DIR" . 2>/dev/null || true + +# Sync to Google Drive +rclone copy "$BACKUP_DIR" "$DEST" --progress + +# Keep only last 7 days in GDrive +rclone delete "$DEST" --min-age 7d + +# Cleanup local +rm -rf "$BACKUP_DIR" + +echo "[$(date)] Backup BD finished" diff --git a/scripts/backup-git-repos.sh b/scripts/backup-git-repos.sh new file mode 100755 index 0000000..9c292a7 --- /dev/null +++ b/scripts/backup-git-repos.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# Backup individual de cada repo Gitea via mirror clone +set -e + +git config --global --add safe.directory '*' 2>/dev/null + +DATE=$(date +%Y%m%d_%H%M%S) +BACKUP_DIR="/tmp/backup-git-repos" +DEST="gdrive:Git/repos" +GITEA_DATA="/var/lib/docker/volumes/yccsckck4g004gosccwc4kg4_gitea-data/_data/git/repositories" + +echo "[$(date)] Backup repos Git started" + +rm -rf "$BACKUP_DIR" +mkdir -p "$BACKUP_DIR" + +# Find all bare repos (*.git directories) +REPOS=$(find "$GITEA_DATA" -maxdepth 2 -name "*.git" -type d 2>/dev/null) + +COUNT=0 +SKIPPED=0 +for REPO_PATH in $REPOS; do + # Extract owner and repo name from path + REL_PATH="${REPO_PATH#$GITEA_DATA/}" + OWNER=$(dirname "$REL_PATH") + REPO_NAME=$(basename "$REPO_PATH" .git) + + # Skip non-repo directories (keys, lfs, etc) + if [[ "$OWNER" == "." ]] || [[ "$OWNER" == "keys" ]] || [[ "$OWNER" == "lfs" ]]; then + continue + fi + + # Check if repo has any commits (non-empty) + COMMITS=$(git -C "$REPO_PATH" rev-list --count HEAD 2>/dev/null || echo "0") + if [[ "$COMMITS" == "0" ]]; then + echo "Skipping empty: $OWNER/$REPO_NAME" + SKIPPED=$((SKIPPED + 1)) + continue + fi + + # Create directory structure + mkdir -p "$BACKUP_DIR/$OWNER" + + # Mirror clone to a .git file + echo "Backing up: $OWNER/$REPO_NAME ($COMMITS commits)" + git clone --mirror "$REPO_PATH" "$BACKUP_DIR/$OWNER/${REPO_NAME}.git" 2>/dev/null + + # Compress + tar -czf "$BACKUP_DIR/$OWNER/${REPO_NAME}.git.tar.gz" -C "$BACKUP_DIR/$OWNER" "${REPO_NAME}.git" 2>/dev/null + rm -rf "$BACKUP_DIR/$OWNER/${REPO_NAME}.git" + + COUNT=$((COUNT + 1)) +done + +echo "Backed up $COUNT repos ($SKIPPED empty skipped)" + +# Sync to Google Drive +rclone copy "$BACKUP_DIR" "$DEST" --progress + +# Keep only last 7 days in GDrive +rclone delete "$DEST" --min-age 7d + +# Cleanup local +rm -rf "$BACKUP_DIR" + +echo "[$(date)] Backup repos Git finished" diff --git a/scripts/backup-git.sh b/scripts/backup-git.sh new file mode 100755 index 0000000..d3a619e --- /dev/null +++ b/scripts/backup-git.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# Backup Gitea + repos → Google Drive (Git) +set -e + +DATE=$(date +%Y%m%d_%H%M%S) +BACKUP_DIR="/tmp/backup-git" +DEST="gdrive:Git" + +echo "[$(date)] Backup Git started" + +# Cleanup old temp +rm -rf "$BACKUP_DIR" +mkdir -p "$BACKUP_DIR" + +# Find Gitea data directory +GITEA_DATA=$(docker inspect gitea-yccsckck4g004gosccwc4kg4 --format '{{range .Mounts}}{{if eq .Destination "/data"}}{{.Source}}{{end}}{{end}}' 2>/dev/null || echo "") + +if [ -n "$GITEA_DATA" ]; then + echo "Found Gitea data at $GITEA_DATA" + tar -czf "$BACKUP_DIR/gitea-data-$DATE.tar.gz" "$GITEA_DATA" 2>/dev/null || true +else + # Try common paths + for path in /var/lib/gitea /root/gitea /data/gitea; do + if [ -d "$path" ]; then + tar -czf "$BACKUP_DIR/gitea-data-$DATE.tar.gz" "$path" 2>/dev/null || true + break + fi + done +fi + +# Also backup docker volumes related to git +for vol in $(docker volume ls -q 2>/dev/null | grep -iE "gitea|git" | head -5); do + docker run --rm -v "${vol}:/src" -v "${BACKUP_DIR}:/dest" alpine tar -czf "/dest/${vol}-${DATE}.tar.gz" -C /src . 2>/dev/null || true +done + +# Sync to Google Drive (folder ID already in path, no extra flag needed) +rclone copy "$BACKUP_DIR" "$DEST" --progress + +# Keep only last 7 days in GDrive +rclone delete "$DEST" --min-age 7d + +# Cleanup local +rm -rf "$BACKUP_DIR" + +echo "[$(date)] Backup Git finished"