diff --git a/backup-complete.sh b/backup-complete.sh new file mode 100755 index 0000000..4fc4e97 --- /dev/null +++ b/backup-complete.sh @@ -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" diff --git a/backup-docker-image-only.sh b/backup-docker-image-only.sh new file mode 100755 index 0000000..f66cd04 --- /dev/null +++ b/backup-docker-image-only.sh @@ -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 diff --git a/list-backups.sh b/list-backups.sh new file mode 100755 index 0000000..4015fd9 --- /dev/null +++ b/list-backups.sh @@ -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" diff --git a/push-to-ghcr.sh b/push-to-ghcr.sh new file mode 100755 index 0000000..6e877a4 --- /dev/null +++ b/push-to-ghcr.sh @@ -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'" diff --git a/restore-complete.sh b/restore-complete.sh new file mode 100755 index 0000000..9487dcf --- /dev/null +++ b/restore-complete.sh @@ -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"