-
Notifications
You must be signed in to change notification settings - Fork 34
Expand file tree
/
Copy pathmigrate.sh
More file actions
197 lines (170 loc) · 6.53 KB
/
migrate.sh
File metadata and controls
197 lines (170 loc) · 6.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#!/bin/bash
# This script will backup your Coolify instance and move everything to a new server. Docker volumes, Coolify database, and ssh keys
# 1. Script must run on the source server
# 2. Have all the containers running that you want to migrate
# Configuration - Modify as needed
sshKeyPath="$HOME/.ssh/your_private_key" # Key to destination server
destinationHost="server.example.com"
# -- Shouldn't need to modify anything below --
backupSourceDir="/data/coolify/"
backupFileName="coolify_backup.tar.gz"
# Check if the source directory exists
if [ ! -d "$backupSourceDir" ]; then
echo "❌ Source directory $backupSourceDir does not exist"
exit 1
fi
echo "✅ Source directory exists"
# Check if the SSH key file exists
if [ ! -f "$sshKeyPath" ]; then
echo "❌ SSH key file $sshKeyPath does not exist"
exit 1
fi
echo "✅ SSH key file exists"
# Check if we can SSH to the destination server, ignore "The authenticity of host can't be established." errors
if ! ssh -i "$sshKeyPath" -o "StrictHostKeyChecking no" -o "ConnectTimeout=5" root@$destinationHost "exit"; then
echo "❌ SSH connection to $destinationHost failed"
exit 1
fi
echo "✅ SSH connection successful"
# Get the names of all running Docker containers
containerNames=$(docker ps --format '{{.Names}}')
# Initialize an empty string to hold the volume paths
volumePaths=""
# Loop over the container names
for containerName in $containerNames; do
# Get the volumes for the current container
volumeNames=$(docker inspect --format '{{range .Mounts}}{{printf "%s\n" .Name}}{{end}}' "$containerName")
# Loop over the volume names
for volumeName in $volumeNames; do
# Check if the volume name is not empty
if [ -n "$volumeName" ]; then
# Add the volume path to the volume paths string
volumePaths="$volumePaths /var/lib/docker/volumes/$volumeName"
fi
done
done
# Calculate the total size of the volumes
# shellcheck disable=SC2086
totalSize=$(du -csh $volumePaths 2>/dev/null | grep total | awk '{print $1}')
# Print the total size of the volumes
echo "✅ Total size of volumes to migrate: $totalSize"
# Print size of backupSourceDir
backupSourceDirSize=$(du -csh $backupSourceDir 2>/dev/null | grep total | awk '{print $1}')
echo "✅ Size of the source directory: $backupSourceDirSize"
# Check if the backup file already exists
if [ ! -f "$backupFileName" ]; then
echo "🚸 Backup file does not exist, creating"
# Recommend stopping docker before creating the backup
echo "🚸 It's recommended to stop all Docker containers before creating the backup
Do you want to stop Docker? (y/n)"
read -r answer
if [ "$answer" != "${answer#[Yy]}" ]; then
if ! systemctl stop docker; then
echo "❌ Docker stop failed"
exit 1
fi
echo "✅ Docker stopped"
else
echo "🚸 Docker not stopped, continuing with the backup"
fi
# shellcheck disable=SC2086
if ! tar --exclude='*.sock' -Pczf $backupFileName -C / $backupSourceDir $HOME/.ssh/authorized_keys $volumePaths; then
echo "❌ Backup file creation failed"
exit 1
fi
echo "✅ Backup file created"
else
echo "🚸 Backup file already exists, skipping creation"
fi
# Define the remote commands to be executed
remoteCommands="
# Check if Docker is a service
if systemctl is-active --quiet docker; then
# Stop Docker if it's a service
if ! systemctl stop docker; then
echo '❌ Docker stop failed';
exit 1;
fi
echo '✅ Docker stopped';
else
echo 'ℹ️ Docker is not a service, skipping stop command';
fi
echo '🚸 Checking if curl is installed...';
if ! command -v curl &> /dev/null; then
echo 'ℹ️ curl is not installed. Installing curl...';
# Detect OS and install curl accordingly
if [ -f /etc/debian_version ] || { [ -f /etc/os-release ] && grep -iq "raspbian" /etc/os-release; }; then
echo 'ℹ️ Detected Debian-based or Raspberry Pi OS';
if ! apt-get update && apt-get install -y curl; then
echo '❌ Failed to install curl on Debian-based or Raspberry Pi OS';
exit 1;
fi
elif [ -f /etc/redhat-release ]; then
echo 'ℹ️ Detected Redhat-based system';
if ! yum install -y curl; then
echo '❌ Failed to install curl on Redhat-based system';
exit 1;
fi
elif [ -f /etc/SuSE-release ] || [ -f /etc/os-release ] && grep -iq "suse" /etc/os-release; then
echo 'ℹ️ Detected SUSE-based system';
if ! zypper install -y curl; then
echo '❌ Failed to install curl on SUSE-based system';
exit 1;
fi
elif [ -f /etc/arch-release ]; then
echo 'ℹ️ Detected Arch Linux';
if ! pacman -Sy --noconfirm curl; then
echo '❌ Failed to install curl on Arch Linux';
exit 1;
fi
elif [ -f /etc/alpine-release ]; then
echo 'ℹ️ Detected Alpine Linux';
if ! apk add --no-cache curl; then
echo '❌ Failed to install curl on Alpine Linux';
exit 1;
fi
else
echo '❌ Unsupported OS. Please install curl manually.';
exit 1;
fi
echo '✅ curl installed';
else
echo '✅ curl is already installed';
fi
echo '🚸 Saving existing authorized keys...';
cp ~/.ssh/authorized_keys ~/.ssh/authorized_keys_backup;
echo '🚸 Extracting backup file...';
if ! tar -Pxzf - -C /; then
echo '❌ Backup file extraction failed';
exit 1;
fi
echo '✅ Backup file extracted';
echo '🚸 Merging authorized keys...';
cat ~/.ssh/authorized_keys_backup ~/.ssh/authorized_keys | sort | uniq > ~/.ssh/authorized_keys_temp;
mv ~/.ssh/authorized_keys_temp ~/.ssh/authorized_keys;
chmod 600 ~/.ssh/authorized_keys;
echo '✅ Authorized keys merged';
if ! curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash; then
echo '❌ Coolify installation failed';
exit 1;
fi
echo '✅ Coolify installed';
"
# SSH to the destination server, execute the remote commands
if ! ssh -i "$sshKeyPath" -o "StrictHostKeyChecking no" root@$destinationHost "$remoteCommands" <$backupFileName; then
echo "❌ Remote commands execution or Docker restart failed"
exit 1
fi
echo "✅ Remote commands executed successfully"
# Clean up - Ask the user for confirmation before removing the local backup file
echo "Do you want to remove the local backup file? (y/n)"
read -r answer
if [ "$answer" != "${answer#[Yy]}" ]; then
if ! rm -f $backupFileName; then
echo "❌ Failed to remove local backup file"
exit 1
fi
echo "✅ Local backup file removed"
else
echo "🚸 Local backup file not removed"
fi