Files
mtc-project-sync-script/sync-project.sh

197 lines
5.1 KiB
Bash
Raw Normal View History

2025-10-22 10:46:36 +03:00
#!/bin/bash
# This script is used to sync a project from
# a remote server to a local machine.
# Colors for output
GREEN='\033[0;32m'
RED='\033[0;31m'
BLUE='\033[0;34m'
2025-12-04 13:39:57 +02:00
YELLOW='\033[0;33m'
2025-10-22 10:46:36 +03:00
NC='\033[0m' # No Color
# Get current script real directory (follow symlinks)
SCRIPT_PATH="$(realpath "$0")"
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"
2025-12-07 23:12:28 +02:00
ARCHIVE_NAME="sync.tar.gz"
# Parse command line arguments
SFTP_ONLY=false
for arg in "$@"; do
if [ "$arg" = "--sftp-only" ]; then
2025-12-15 09:26:27 +02:00
SFTP_ONLY=true
echo -e "${YELLOW}Sftp only mode enabled${NC}"
2025-12-07 23:12:28 +02:00
fi
done
2025-12-04 13:39:57 +02:00
# Function to add entry to .gitignore if not already present
add_to_gitignore() {
local entry="$1"
cat .gitignore | grep "$entry" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "$entry" >> .gitignore
echo -e "${BLUE}Added $entry to .gitignore${NC}"
else
echo -e "${YELLOW}$entry already is inside of .gitignore file${NC}"
fi
}
2025-10-22 10:46:36 +03:00
echo -e "${BLUE}=== Project Sync Configuration ===${NC}"
echo ""
# Check if config is predefined (for testing usually)
if [ -f ".sync-credentials" ]; then
source ".sync-credentials"
else
# Prompt for configuration
read -p "Server user@host (e.g., leo@server.com): " SERVER_HOST
read -p "Server project path (e.g., /home/leo/public_leo): " SERVER_PROJECT_PATH
read -p "Local folder path (e.g., Delta Pharmacy): " LOCAL_FOLDER
read -sp "SSH Password: " SSH_PASSWORD
echo ""
echo ""
fi
2025-10-22 10:46:36 +03:00
# Validate required variables (all except password)
if [ -z "$SERVER_HOST" ]; then
echo -e "${RED}Error: SERVER_HOST is not set${NC}"
exit 1
fi
if [ -z "$SERVER_PROJECT_PATH" ]; then
echo -e "${RED}Error: SERVER_PROJECT_PATH is not set${NC}"
exit 1
fi
if [ -z "$LOCAL_FOLDER" ]; then
echo -e "${RED}Error: LOCAL_FOLDER is not set${NC}"
exit 1
fi
2025-10-22 10:46:36 +03:00
# Start sync process
2025-10-22 10:46:36 +03:00
echo "Starting project sync..."
# Step 1: SSH into server and create tar archive
echo "Creating archive on server..."
sshpass -p "${SSH_PASSWORD}" ssh ${SERVER_HOST} "cd ${SERVER_PROJECT_PATH} && tar -czf ../${ARCHIVE_NAME} ."
if [ $? -ne 0 ]; then
echo -e "${RED}Failed to create archive on server${NC}"
exit 1
fi
echo -e "${GREEN}Archive created successfully${NC}"
# Step 2: Create local folder if it doesn't exist
mkdir -p "${LOCAL_FOLDER}"
# Step 3: Copy archive from server to local
echo "Copying archive to local machine..."
sshpass -p "${SSH_PASSWORD}" scp ${SERVER_HOST}:~/${ARCHIVE_NAME} "${LOCAL_FOLDER}/"
if [ $? -ne 0 ]; then
echo -e "${RED}Failed to copy archive${NC}"
exit 1
fi
echo -e "${GREEN}Archive copied successfully${NC}"
# Step 4: Extract archive locally
echo "Extracting archive..."
cd "${LOCAL_FOLDER}"
tar -xzf ${ARCHIVE_NAME}
if [ $? -ne 0 ]; then
echo -e "${RED}Failed to extract archive${NC}"
exit 1
fi
echo -e "${GREEN}Archive extracted successfully${NC}"
# Step 5: Clean up - delete local archive
echo "Cleaning up local archive..."
rm ${ARCHIVE_NAME}
# Step 6: Clean up - delete server archive
echo "Cleaning up server archive..."
sshpass -p "${SSH_PASSWORD}" ssh ${SERVER_HOST} "rm ~/${ARCHIVE_NAME}"
echo -e "${GREEN}File sync complete!${NC}"
2025-10-22 10:46:36 +03:00
# Create .vscode sftp.json file
mkdir -p .vscode
# Extract username and host from SERVER_HOST
USERNAME="${SERVER_HOST%@*}"
HOST="${SERVER_HOST#*@}"
echo "{
\"name\": \"${LOCAL_FOLDER}\",
\"host\": \"${HOST}\",
\"protocol\": \"sftp\",
\"port\": 22,
\"username\": \"${USERNAME}\",
\"password\": \"${SSH_PASSWORD}\",
\"remotePath\": \"${SERVER_PROJECT_PATH}\",
\"uploadOnSave\": true,
\"useTempFile\": false,
\"openSsh\": false,
\"ignore\": [
\".vscode\",
\".DS_Store\",
\"node_modules\",
\"vendor\",
\"storage\",
\"uploads\",
\"temp\",
\"cache\",
\"sitepress-multilingual-cms\"
]
}" >.vscode/sftp.json
echo -e "${GREEN}.vscode/sftp.json created successfully${NC}"
# Go through scripts, add variables and add them to project folder
2025-12-07 23:12:28 +02:00
if [ "$SFTP_ONLY" = true ]; then
2025-12-16 16:06:09 +02:00
# Sftp only scripts
2025-12-07 23:12:28 +02:00
scripts=("local-remote.sh" "remote-local.sh" "sftp-watch.sh" "ssh.sh")
else
2025-12-16 16:06:09 +02:00
# All scripts
scripts=("watch-build.sh" "local-remote.sh" "remote-local.sh" "sftp-watch.sh" "ssh.sh" "split-conflicts.sh")
2025-12-07 23:12:28 +02:00
fi
for script in "${scripts[@]}"; do
# Add variables to script
echo "
2025-11-19 09:53:54 +02:00
#!/bin/bash
set -e
# Configuration
SERVER_USER=\"${USERNAME}\"
SERVER_HOST=\"${HOST}\"
SERVER_PASSWORD=\"${SSH_PASSWORD}\"
SERVER_PATH=\"${SERVER_PROJECT_PATH}/\"
2025-12-16 16:06:09 +02:00
REMOTE_PROGRESS=\".remote-in-progress\"
" > "${script}"
# Append the rest of the upload core build script
cat "${SCRIPT_DIR}/scripts/${script}" >> "${script}"
echo "${script} created successfully"
2025-12-07 23:12:28 +02:00
# Skip .gitignore updates when --sftp-only flag is present
if [ "$SFTP_ONLY" = false ]; then
add_to_gitignore "${script}"
fi
done
2025-11-10 15:15:44 +02:00
2025-12-07 23:12:28 +02:00
# Upload lazygit to server (skip when --sftp-only flag is present)
if [ "$SFTP_ONLY" = false ]; then
echo "Uploading lazygit to server..."
2025-11-10 15:15:44 +02:00
2025-12-07 23:12:28 +02:00
sshpass -p "${SSH_PASSWORD}" scp "${SCRIPT_DIR}/lazygit" ${SERVER_HOST}:${SERVER_PROJECT_PATH}
echo -e "${GREEN}lazygit uploaded successfully${NC}"
2025-11-10 15:15:44 +02:00
2025-12-07 23:12:28 +02:00
# Add lazygit to .gitignore
add_to_gitignore "lazygit"
fi