Created backup script
This commit is contained in:
@@ -21,7 +21,7 @@ type Config struct {
|
|||||||
ReadHeaderTimeout time.Duration // Timeout for reading request headers in seconds
|
ReadHeaderTimeout time.Duration // Timeout for reading request headers in seconds
|
||||||
WriteTimeout time.Duration // Timeout for writing requests in seconds
|
WriteTimeout time.Duration // Timeout for writing requests in seconds
|
||||||
IdleTimeout time.Duration // Timeout for idle connections in seconds
|
IdleTimeout time.Duration // Timeout for idle connections in seconds
|
||||||
DBName string // Filename of the db (doesnt include file extension)
|
DBName string // Filename of the db - hardcoded and doubles as DB version
|
||||||
DBLockTimeout time.Duration // Timeout for acquiring database lock
|
DBLockTimeout time.Duration // Timeout for acquiring database lock
|
||||||
SecretKey string // Secret key for signing tokens
|
SecretKey string // Secret key for signing tokens
|
||||||
AccessTokenExpiry int64 // Access token expiry in minutes
|
AccessTokenExpiry int64 // Access token expiry in minutes
|
||||||
@@ -87,7 +87,7 @@ func GetConfig(args map[string]string) (*Config, error) {
|
|||||||
ReadHeaderTimeout: GetEnvDur("READ_HEADER_TIMEOUT", 2),
|
ReadHeaderTimeout: GetEnvDur("READ_HEADER_TIMEOUT", 2),
|
||||||
WriteTimeout: GetEnvDur("WRITE_TIMEOUT", 10),
|
WriteTimeout: GetEnvDur("WRITE_TIMEOUT", 10),
|
||||||
IdleTimeout: GetEnvDur("IDLE_TIMEOUT", 120),
|
IdleTimeout: GetEnvDur("IDLE_TIMEOUT", 120),
|
||||||
DBName: GetEnvDefault("DB_NAME", "projectreshoot"),
|
DBName: "0.1.0",
|
||||||
DBLockTimeout: GetEnvDur("DB_LOCK_TIMEOUT", 60),
|
DBLockTimeout: GetEnvDur("DB_LOCK_TIMEOUT", 60),
|
||||||
SecretKey: os.Getenv("SECRET_KEY"),
|
SecretKey: os.Getenv("SECRET_KEY"),
|
||||||
AccessTokenExpiry: GetEnvInt64("ACCESS_TOKEN_EXPIRY", 5),
|
AccessTokenExpiry: GetEnvInt64("ACCESS_TOKEN_EXPIRY", 5),
|
||||||
|
|||||||
108
deploy/backup.sh
Executable file
108
deploy/backup.sh
Executable file
@@ -0,0 +1,108 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Exit on error
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [[ -z "$1" ]]; then
|
||||||
|
echo "Usage: $0 <environment>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
ENVR="$1"
|
||||||
|
if [[ "$ENVR" != "production" && "$ENVR" != "staging" ]]; then
|
||||||
|
echo "Error: environment must be 'production' or 'staging'."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
ACTIVE_DIR="/home/deploy/$ENVR"
|
||||||
|
DATA_DIR="/home/deploy/data/$ENVR"
|
||||||
|
BACKUP_DIR="/home/deploy/data/backups/$ENVR"
|
||||||
|
if [[ "$ENVR" == "production" ]]; then
|
||||||
|
SERVICE_NAME="projectreshoot"
|
||||||
|
declare -a PORTS=("3000" "3001" "3002")
|
||||||
|
else
|
||||||
|
SERVICE_NAME="$ENVR.projectreshoot"
|
||||||
|
declare -a PORTS=("3005" "3006" "3007")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Send SIGUSR2 to release maintenance mode
|
||||||
|
release_maintenance() {
|
||||||
|
echo "Releasing maintenance mode..."
|
||||||
|
for PORT in "${PORTS[@]}"; do
|
||||||
|
sudo systemctl kill -s SIGUSR2 "$SERVICE_NAME@$PORT.service"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
shopt -s nullglob
|
||||||
|
DB_FILES=("$ACTIVE_DIR"/*.db)
|
||||||
|
DB_COUNT=${#DB_FILES[@]}
|
||||||
|
|
||||||
|
if [[ $DB_COUNT -gt 1 ]]; then
|
||||||
|
echo "Error: More than one .db file found in $ACTIVE_DIR. Manual intervention required."
|
||||||
|
exit 1
|
||||||
|
elif [[ $DB_COUNT -eq 0 ]]; then
|
||||||
|
echo "Error: No .db file found in $ACTIVE_DIR."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract the filename without extension
|
||||||
|
DB_FILE="${DB_FILES[0]}"
|
||||||
|
DB_VER=$(basename "$DB_FILE" .db)
|
||||||
|
|
||||||
|
# Send SIGUSR1 to trigger maintenance mode
|
||||||
|
for PORT in "${PORTS[@]}"; do
|
||||||
|
sudo systemctl kill -s SIGUSR1 "$SERVICE_NAME@$PORT.service"
|
||||||
|
done
|
||||||
|
trap release_maintenance EXIT
|
||||||
|
|
||||||
|
# Function to check logs for success or failure
|
||||||
|
check_logs() {
|
||||||
|
local port="$1"
|
||||||
|
local service="$SERVICE_NAME@$port.service"
|
||||||
|
|
||||||
|
echo "Waiting for $service to enter maintenance mode..."
|
||||||
|
|
||||||
|
# Check the last few lines first in case the message already appeared
|
||||||
|
if sudo journalctl -u "$service" -n 20 --no-pager | grep -q "Global database lock acquired"; then
|
||||||
|
echo "$service successfully entered maintenance mode."
|
||||||
|
return 0
|
||||||
|
elif sudo journalctl -u "$service" -n 20 --no-pager | grep -q "Timeout: Global database lock abandoned"; then
|
||||||
|
echo "Error: $service failed to enter maintenance mode."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If not found, continuously watch logs until we get a success or failure message
|
||||||
|
sudo journalctl -u "$service" -f --no-pager | while read -r line; do
|
||||||
|
if echo "$line" | grep -q "Global database lock acquired"; then
|
||||||
|
echo "$service successfully entered maintenance mode."
|
||||||
|
pkill -P $$ journalctl # Kill journalctl process once we have success
|
||||||
|
return 0
|
||||||
|
elif echo "$line" | grep -q "Timeout: Global database lock abandoned"; then
|
||||||
|
echo "Error: $service failed to enter maintenance mode."
|
||||||
|
pkill -P $$ journalctl # Kill journalctl process on failure
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check logs for each service
|
||||||
|
for PORT in "${PORTS[@]}"; do
|
||||||
|
check_logs "$PORT"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Get current datetime in YYYY-MM-DD-HHMM format
|
||||||
|
TIMESTAMP=$(date +"%Y-%m-%d-%H%M")
|
||||||
|
|
||||||
|
# Define source and destination paths
|
||||||
|
SOURCE_DB="$DATA_DIR/$DB_VER.db"
|
||||||
|
BACKUP_DB="$BACKUP_DIR/${DB_VER}-${TIMESTAMP}.db"
|
||||||
|
|
||||||
|
# Copy the database file
|
||||||
|
if [[ -f "$SOURCE_DB" ]]; then
|
||||||
|
cp "$SOURCE_DB" "$BACKUP_DB"
|
||||||
|
echo "Backup created: $BACKUP_DB"
|
||||||
|
else
|
||||||
|
echo "Error: Source database file $SOURCE_DB not found."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user