Add comprehensive backup system and Docker registry push script
This commit is contained in:
parent
5490229922
commit
ee84c18e90
5 changed files with 297 additions and 0 deletions
96
backup-complete.sh
Executable file
96
backup-complete.sh
Executable file
|
|
@ -0,0 +1,96 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
|
||||||
|
BACKUP_DIR="backups/backup-$TIMESTAMP"
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "MASINA-DOCK COMPLETE BACKUP SYSTEM"
|
||||||
|
echo "=========================================="
|
||||||
|
echo "Timestamp: $TIMESTAMP"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
mkdir -p "$BACKUP_DIR"
|
||||||
|
|
||||||
|
echo "STEP 1: Backing up database..."
|
||||||
|
docker-compose exec -T masina-dock cp /app/backend/vehicles.db /app/backend/vehicles_backup.db 2>/dev/null || true
|
||||||
|
docker cp masina-dock:/app/backend/vehicles.db "$BACKUP_DIR/vehicles.db" 2>/dev/null || true
|
||||||
|
cp backend/vehicles.db "$BACKUP_DIR/vehicles.db" 2>/dev/null || true
|
||||||
|
echo " Database backed up"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 2: Backing up uploads folder..."
|
||||||
|
cp -r uploads "$BACKUP_DIR/" 2>/dev/null || true
|
||||||
|
UPLOAD_COUNT=$(find uploads -type f 2>/dev/null | wc -l)
|
||||||
|
echo " $UPLOAD_COUNT files backed up"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 3: Backing up configuration files..."
|
||||||
|
cp docker-compose.yml "$BACKUP_DIR/"
|
||||||
|
cp Dockerfile "$BACKUP_DIR/"
|
||||||
|
cp .env "$BACKUP_DIR/" 2>/dev/null || true
|
||||||
|
cp README.md "$BACKUP_DIR/" 2>/dev/null || true
|
||||||
|
echo " Configuration files backed up"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 4: Backing up application files..."
|
||||||
|
cp -r backend "$BACKUP_DIR/"
|
||||||
|
cp -r frontend "$BACKUP_DIR/"
|
||||||
|
echo " Application files backed up"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 5: Backing up Docker image..."
|
||||||
|
IMAGE_NAME="masina-dock_masina-dock"
|
||||||
|
IMAGE_FILE="$BACKUP_DIR/docker-image-masina-dock.tar"
|
||||||
|
echo " Saving Docker image: $IMAGE_NAME"
|
||||||
|
docker save -o "$IMAGE_FILE" "$IMAGE_NAME" 2>/dev/null || docker save -o "$IMAGE_FILE" masina-dock:latest 2>/dev/null || echo " Warning: Could not save Docker image"
|
||||||
|
if [ -f "$IMAGE_FILE" ]; then
|
||||||
|
IMAGE_SIZE=$(du -h "$IMAGE_FILE" | cut -f1)
|
||||||
|
echo " Docker image saved: $IMAGE_SIZE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 6: Backing up Docker volumes..."
|
||||||
|
docker run --rm -v masina-dock_masina-data:/data -v "$PWD/$BACKUP_DIR":/backup alpine tar czf /backup/docker-volumes.tar.gz -C /data . 2>/dev/null || echo " No volumes to backup"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 7: Creating compressed archive..."
|
||||||
|
cd backups
|
||||||
|
tar -czf "masina-dock-complete-$TIMESTAMP.tar.gz" "backup-$TIMESTAMP" --exclude='*.tar'
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 8: Creating Docker image compressed backup..."
|
||||||
|
if [ -f "$IMAGE_FILE" ]; then
|
||||||
|
gzip "$IMAGE_FILE"
|
||||||
|
echo " Docker image compressed"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ARCHIVE_SIZE=$(du -h "backups/masina-dock-complete-$TIMESTAMP.tar.gz" | cut -f1)
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo "BACKUP COMPLETED SUCCESSFULLY!"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
echo "Backup details:"
|
||||||
|
echo " Directory: $BACKUP_DIR"
|
||||||
|
echo " Archive: backups/masina-dock-complete-$TIMESTAMP.tar.gz"
|
||||||
|
echo " Archive size: $ARCHIVE_SIZE"
|
||||||
|
if [ -f "$BACKUP_DIR/docker-image-masina-dock.tar.gz" ]; then
|
||||||
|
IMAGE_BACKUP_SIZE=$(du -h "$BACKUP_DIR/docker-image-masina-dock.tar.gz" | cut -f1)
|
||||||
|
echo " Docker image: $IMAGE_BACKUP_SIZE"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
echo "What was backed up:"
|
||||||
|
echo " - Database (vehicles.db)"
|
||||||
|
echo " - Uploaded files (uploads/)"
|
||||||
|
echo " - Configuration files"
|
||||||
|
echo " - Application source code"
|
||||||
|
echo " - Docker image"
|
||||||
|
echo " - Docker volumes"
|
||||||
|
echo ""
|
||||||
|
echo "To restore from this backup:"
|
||||||
|
echo " ./restore-complete.sh $TIMESTAMP"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
ls -lh "backups/masina-dock-complete-$TIMESTAMP.tar.gz"
|
||||||
32
backup-docker-image-only.sh
Executable file
32
backup-docker-image-only.sh
Executable file
|
|
@ -0,0 +1,32 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
|
||||||
|
BACKUP_DIR="backups/docker-images"
|
||||||
|
|
||||||
|
mkdir -p "$BACKUP_DIR"
|
||||||
|
|
||||||
|
echo "Backing up Docker image..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
IMAGE_NAME="masina-dock_masina-dock"
|
||||||
|
IMAGE_FILE="$BACKUP_DIR/masina-dock-image-$TIMESTAMP.tar"
|
||||||
|
|
||||||
|
docker save -o "$IMAGE_FILE" "$IMAGE_NAME" 2>/dev/null || docker save -o "$IMAGE_FILE" masina-dock:latest
|
||||||
|
|
||||||
|
if [ -f "$IMAGE_FILE" ]; then
|
||||||
|
echo "Compressing image..."
|
||||||
|
gzip "$IMAGE_FILE"
|
||||||
|
IMAGE_FILE="$IMAGE_FILE.gz"
|
||||||
|
|
||||||
|
SIZE=$(du -h "$IMAGE_FILE" | cut -f1)
|
||||||
|
echo ""
|
||||||
|
echo "Docker image backup completed!"
|
||||||
|
echo "File: $IMAGE_FILE"
|
||||||
|
echo "Size: $SIZE"
|
||||||
|
echo ""
|
||||||
|
echo "To restore this image:"
|
||||||
|
echo " gunzip -c $IMAGE_FILE | docker load"
|
||||||
|
else
|
||||||
|
echo "Error: Could not save Docker image"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
21
list-backups.sh
Executable file
21
list-backups.sh
Executable file
|
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "MASINA-DOCK BACKUP LIST"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "Complete backups:"
|
||||||
|
ls -lh backups/masina-dock-complete-*.tar.gz 2>/dev/null | awk '{print " " $9 " (" $5 ")"}'
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "Docker image backups:"
|
||||||
|
ls -lh backups/docker-images/*.tar.gz 2>/dev/null | awk '{print " " $9 " (" $5 ")"}'
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "Backup directories:"
|
||||||
|
ls -d backups/backup-* 2>/dev/null | awk '{print " " $1}'
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
TOTAL_SIZE=$(du -sh backups 2>/dev/null | cut -f1)
|
||||||
|
echo "Total backup storage used: $TOTAL_SIZE"
|
||||||
49
push-to-ghcr.sh
Executable file
49
push-to-ghcr.sh
Executable file
|
|
@ -0,0 +1,49 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "PUSH DOCKER IMAGE TO GITHUB REGISTRY"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
GITHUB_USERNAME="aiulian25"
|
||||||
|
IMAGE_NAME="masina-dock"
|
||||||
|
VERSION="latest"
|
||||||
|
|
||||||
|
echo "Step 1: Login to GitHub Container Registry"
|
||||||
|
echo "You need a Personal Access Token with 'write:packages' scope"
|
||||||
|
echo ""
|
||||||
|
read -p "Enter your GitHub Personal Access Token: " GITHUB_TOKEN
|
||||||
|
|
||||||
|
echo "$GITHUB_TOKEN" | docker login ghcr.io -u "$GITHUB_USERNAME" --password-stdin
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Login failed. Please check your token."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Step 2: Tag the Docker image"
|
||||||
|
docker tag masina-dock_masina-dock "ghcr.io/$GITHUB_USERNAME/$IMAGE_NAME:$VERSION"
|
||||||
|
docker tag masina-dock_masina-dock "ghcr.io/$GITHUB_USERNAME/$IMAGE_NAME:$(date +%Y%m%d)"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Step 3: Push to GitHub Container Registry"
|
||||||
|
docker push "ghcr.io/$GITHUB_USERNAME/$IMAGE_NAME:$VERSION"
|
||||||
|
docker push "ghcr.io/$GITHUB_USERNAME/$IMAGE_NAME:$(date +%Y%m%d)"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo "DOCKER IMAGE PUBLISHED!"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
echo "Your Docker image is now available at:"
|
||||||
|
echo " ghcr.io/$GITHUB_USERNAME/$IMAGE_NAME:$VERSION"
|
||||||
|
echo ""
|
||||||
|
echo "To use this image on another machine:"
|
||||||
|
echo " docker pull ghcr.io/$GITHUB_USERNAME/$IMAGE_NAME:$VERSION"
|
||||||
|
echo " docker run -p 5000:5000 ghcr.io/$GITHUB_USERNAME/$IMAGE_NAME:$VERSION"
|
||||||
|
echo ""
|
||||||
|
echo "Make the package public:"
|
||||||
|
echo "1. Go to https://github.com/users/$GITHUB_USERNAME/packages/container/$IMAGE_NAME/settings"
|
||||||
|
echo "2. Scroll to 'Danger Zone'"
|
||||||
|
echo "3. Click 'Change visibility' and select 'Public'"
|
||||||
99
restore-complete.sh
Executable file
99
restore-complete.sh
Executable file
|
|
@ -0,0 +1,99 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo "Usage: ./restore-complete.sh TIMESTAMP"
|
||||||
|
echo ""
|
||||||
|
echo "Available backups:"
|
||||||
|
ls -1 backups/masina-dock-complete-*.tar.gz 2>/dev/null | sed 's/backups\/masina-dock-complete-/ /' | sed 's/.tar.gz//'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
TIMESTAMP=$1
|
||||||
|
BACKUP_ARCHIVE="backups/masina-dock-complete-$TIMESTAMP.tar.gz"
|
||||||
|
BACKUP_DIR="backups/backup-$TIMESTAMP"
|
||||||
|
|
||||||
|
if [ ! -f "$BACKUP_ARCHIVE" ]; then
|
||||||
|
echo "Error: Backup file not found: $BACKUP_ARCHIVE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "MASINA-DOCK COMPLETE RESTORE"
|
||||||
|
echo "=========================================="
|
||||||
|
echo "Restoring from backup: $TIMESTAMP"
|
||||||
|
echo ""
|
||||||
|
echo "WARNING: This will overwrite all current data!"
|
||||||
|
echo ""
|
||||||
|
read -p "Type 'RESTORE' to continue: " confirm
|
||||||
|
if [ "$confirm" != "RESTORE" ]; then
|
||||||
|
echo "Restore cancelled."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 1: Stopping Docker containers..."
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 2: Extracting backup archive..."
|
||||||
|
tar -xzf "$BACKUP_ARCHIVE" -C backups/
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 3: Restoring database..."
|
||||||
|
cp "$BACKUP_DIR/vehicles.db" backend/vehicles.db
|
||||||
|
echo " Database restored"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 4: Restoring uploads..."
|
||||||
|
rm -rf uploads
|
||||||
|
cp -r "$BACKUP_DIR/uploads" .
|
||||||
|
echo " Uploads restored"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 5: Restoring configuration files..."
|
||||||
|
cp "$BACKUP_DIR/docker-compose.yml" .
|
||||||
|
cp "$BACKUP_DIR/Dockerfile" .
|
||||||
|
cp "$BACKUP_DIR/.env" . 2>/dev/null || true
|
||||||
|
echo " Configuration restored"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 6: Restoring application files..."
|
||||||
|
rm -rf backend frontend
|
||||||
|
cp -r "$BACKUP_DIR/backend" .
|
||||||
|
cp -r "$BACKUP_DIR/frontend" .
|
||||||
|
echo " Application files restored"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 7: Restoring Docker image..."
|
||||||
|
if [ -f "$BACKUP_DIR/docker-image-masina-dock.tar.gz" ]; then
|
||||||
|
echo " Loading Docker image..."
|
||||||
|
gunzip -c "$BACKUP_DIR/docker-image-masina-dock.tar.gz" | docker load
|
||||||
|
echo " Docker image restored"
|
||||||
|
else
|
||||||
|
echo " No Docker image found, will rebuild..."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 8: Restoring Docker volumes..."
|
||||||
|
if [ -f "$BACKUP_DIR/docker-volumes.tar.gz" ]; then
|
||||||
|
docker volume create masina-dock_masina-data 2>/dev/null || true
|
||||||
|
docker run --rm -v masina-dock_masina-data:/data -v "$PWD/$BACKUP_DIR":/backup alpine tar xzf /backup/docker-volumes.tar.gz -C /data
|
||||||
|
echo " Volumes restored"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "STEP 9: Starting application..."
|
||||||
|
docker-compose up -d --build
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Waiting for application to start..."
|
||||||
|
sleep 10
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo "RESTORE COMPLETED SUCCESSFULLY!"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
docker-compose ps
|
||||||
|
echo ""
|
||||||
|
echo "Application should be available at: http://localhost:5000"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue