Embed backup scripts in Docker image
This commit is contained in:
+11
-2
@@ -1,8 +1,17 @@
|
|||||||
FROM python:3.12-slim
|
FROM python:3.12-slim
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY requirements.txt .
|
COPY requirements.txt .
|
||||||
RUN pip install --no-cache-dir -r requirements.txt
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
COPY app.py .
|
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
|
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"]
|
||||||
|
|||||||
@@ -9,10 +9,6 @@ services:
|
|||||||
- "8766"
|
- "8766"
|
||||||
volumes:
|
volumes:
|
||||||
- .:/app
|
- .:/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
|
- /root/backup.log:/root/backup.log:rw
|
||||||
- /tmp/restore-temp:/tmp/restore-temp:rw
|
- /tmp/restore-temp:/tmp/restore-temp:rw
|
||||||
env_file:
|
env_file:
|
||||||
|
|||||||
Executable
+31
@@ -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"
|
||||||
Executable
+37
@@ -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"
|
||||||
Executable
+66
@@ -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"
|
||||||
Executable
+45
@@ -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"
|
||||||
Reference in New Issue
Block a user