dokku-sync/dokku-sync.sh

103 lines
2.7 KiB
Bash

#!/bin/sh
# vim: set ts=2 sw=2 et:
set -e
set -u
# Generate SSH keypair on control machine (in temporary directory)
TEMP_DIR=$(mktemp -d)
MIGRATION_SSH_KEY="$TEMP_DIR/dokku-sync-migration_ed25519"
SSH_KEY="/path/to/control/key"
ssh-keygen -t ed25519 -f "$SSH_KEY" -N ""
usage() {
echo "Usage: $0 --src USER@HOSTNAME --dest USER@HOSTNAME --privkey PATH_TO_PRIVATE_KEY"
echo
echo "Options:"
echo " --src Source SSH address in the format USER@HOSTNAME"
echo " --dest Destination SSH address in the format USER@HOSTNAME"
echo " --privkey Path to the private SSH key"
echo " -h, --help Show this help message"
}
dest_run() {
ssh -i "$SSH_KEY" "$SOURCE_SSH_ADDR" "$*"
}
source_run() {
ssh -i "$SSH_KEY" "$SOURCE_SSH_ADDR" "$*"
}
## ENTRYPOINT
# Loop and parse command line arguments
while [ "$#" -gt 0 ]; do
case "$1" in
--src)
SRC_SSH_ADDR="$2"
shift 2
;;
--dest)
DEST_SSH_ADDR="$2"
shift 2
;;
--privkey)
SSH_KEY="$2"
shift 2
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown option: $1"
usage
exit 1
;;
esac
done
# Split values for SRC and DEST
DEST_HOST=$(echo "$DEST_SSH_ADDR" | cut -d'@' -f2)
DEST_USER=$(echo "$DEST_SSH_ADDR" | cut -d'@' -f1)
SOURCE_HOST=$(echo "$SRC_SSH_ADDR" | cut -d'@' -f2)
SOURCE_USER=$(echo "$SRC_SSH_ADDR" | cut -d'@' -f1)
# Stop all remote services
source_run "dokku ps:stop --all"
source_run "dokku mariadb:list |tail -n+2 |xargs -iSERVICE -- dokku mariadb:stop SERVICE"
source_run "dokku postgres:list |tail -n+2 |xargs -iSERVICE -- dokku postgres:stop SERVICE"
source_run "dokku redis:list |tail -n+2 |xargs -iSERVICE -- dokku redis:stop SERVICE"
source_run "dokku mongo:list |tail -n+2 |xargs -iSERVICE -- dokku mongo:stop SERVICE"
source_run "systemctl stop docker"
source_run "systemctl stop docker.socket"
# Stop all local services
dest_run "dokku ps:stop --all"
dest_run "systemctl stop docker"
dest_run "systemctl stop docker.socket"
# Prepare directories
dest_run "mkdir -p /home/dokku/"
dest_run "mkdir -p /home/data/"
dest_run "mkdir -p /var/lib/dokku/"
# Copy all data
rsync -avz --delete "$SOURCE_SSH_ADDR:/home/dokku/" "$DEST_SSH_ADDR:/home/dokku/"
rsync -avz --delete "$SOURCE_SSH_ADDR:/var/lib/dokku/" "$DEST_SSH_ADDR:/var/lib/dokku/"
rsync -avz --delete "$SOURCE_SSH_ADDR:/home/data/" "$DEST_SSH_ADDR:/home/data/"
rsync -avz --delete "$SOURCE_SSH_ADDR:/home/git/" "$DEST_SSH_ADDR:/home/git/"
# FIXME: check if rsync succeeded
# Start all local services
dest_run "dokku apps:list"
# Patch URLs from imported domains
dest_run "find /home/dokku/ -name VHOST -or -name URLS -print0 | xargs -0 -iFILE -- sed -i \"s/$SOURCE_HOST/$DEST_HOST/g\" FILE"
echo "SUCCESS"