要將舊伺服器的資料搬移到新的 VPS,最簡單且穩定的方式是使用 rsync 指令。這個工具可以透過 SSH 安全地傳輸檔案,並且會保留檔案的權限與屬性。
準備工作
在開始搬運之前,請確保你已經把新伺服器的 SSH 公鑰加入到舊伺服器,或者擁有新伺服器的 root 密碼。此外,新舊伺服器之間必須網路互通,因為你提供的是私有 IP (10.130.0.5),這代表兩台伺服器必須位在同一個 VPS 的 VPC 網路內。
執行資料搬移
請在舊伺服器上執行以下指令,這會將 /root 目錄下的所有內容同步到新伺服器:
Bash
rsync -avzP /root/ [email protected]:/root/
指令參數解釋:
-a:代表歸檔模式,會保留連結檔、權限、時間戳記等資訊。
-v:顯示詳細過程。
-z:傳輸時進行壓縮,加快速度。
-P:顯示進度條,如果中斷了可以續傳。
搬移系統設定檔
如果你指的 config 包含 /etc 底下的系統設定(例如 Nginx 或資料庫設定),建議針對特定目錄個別搬移,而不是直接覆蓋整個 /etc,因為新舊伺服器的硬體驅動或部分系統組件可能略有不同。
例如搬移 Nginx 設定:
Bash
rsync -avzP /etc/nginx/ [email protected]:/etc/nginx/
資料庫搬移建議
如果你的 /root 底下包含資料庫原始檔案(例如 MySQL 的 /var/lib/mysql),直接用 rsync 搬移運行中的資料庫檔案可能會導致資料損壞。建議先在舊伺服器執行資料庫匯出(dump),將產出的 .sql 檔放在 /root 內,再執行上述的 rsync 指令,最後到新伺服器匯入。
這是一個簡單的自動化搬移腳本。這個腳本會先在舊伺服器將資料庫打包(假設使用 MySQL/MariaDB),接著把 /root 目錄與指定的設定目錄同步到新伺服器。
自動化搬移腳本
請在舊伺服器上建立一個名為 migrate.sh 的檔案,並貼入以下內容:
Bash
#!/bin/bash
# 設定變數
NEW_SERVER_IP="10.130.0.5"
BACKUP_SQL="/root/all_databases.sql"
echo "正在匯出資料庫..."
mysqldump --all-databases > $BACKUP_SQL
echo "正在傳輸 /root 目錄資料..."
rsync -avzP /root/ root@$NEW_SERVER_IP:/root/
echo "正在傳輸 Nginx 設定 (如果有)..."
if [ -d "/etc/nginx" ]; then
rsync -avzP /etc/nginx/ root@$NEW_SERVER_IP:/etc/nginx/
fi
echo "正在傳輸 SSL 憑證 (LetsEncrypt)..."
if [ -d "/etc/letsencrypt" ]; then
rsync -avzP /etc/letsencrypt/ root@$NEW_SERVER_IP:/etc/letsencrypt/
fi
echo "搬移完成"
如果要改變 port
#!/bin/bash
# 設定變數
NEW_SERVER_IP="10.130.0.5"
PORT="22"
echo "正在傳輸 /root 目錄資料 (Port: $PORT)..."
rsync -avzP -e "ssh -p $PORT" /root/ root@$NEW_SERVER_IP:/root/
修改後的指令碼
如果你想要在使用 rsync 時排除所有以點號開頭的隱藏檔案或目錄,可以使用 –exclude 參數並配合通配符。
NEW_SERVER_IP="10.130.0.5"
PORT="22"
echo "正在傳輸 /root 目錄資料 (排除隱藏檔, Port: $PORT)..."
rsync -avzP -e "ssh -p $PORT" --exclude=".*" /root/ root@$NEW_SERVER_IP:/root/
參數說明
在 rsync 中加入 –exclude=”.*” 會讓程式跳過所有名稱開頭為點的檔案與資料夾。這包括常見的設定檔如 .bashrc 或隱藏目錄如 .ssh。
需要注意的是,這個寫法會排除所有層級下的隱藏內容。如果你原本的 /root/ 目錄下有特定的隱藏資料夾是你需要的,則必須改用更具體的排除規則。另外,rsync 預設就不會處理代表目前目錄的 . 與上層目錄的 ..,所以加上這個排除規則不會影響基本的目錄定位。
搬移自定義 Service 設定檔
在 Linux 系統中,使用者自定義的 service 設定檔通常放在 /etc/systemd/system/ 目錄下。你可以延用之前的 rsync 指令,將這些 .service 檔案同步到新伺服器。
NEW_SERVER_IP="10.130.0.5"
PORT="22"
echo "正在傳輸自定義 service 設定檔 (Port: $PORT)..."
rsync -avzP -e "ssh -p $PORT" /etc/systemd/system/*.service root@$NEW_SERVER_IP:/etc/systemd/system/
注意事項與後續步驟
同步完成後,新伺服器不會自動偵測到這些新檔案,你需要手動執行以下步驟來啟動服務:
- 重新載入系統設定登入新伺服器,執行以下指令讓系統辨識新加入的 service 檔案:
systemctl daemon-reload - 啟用並啟動服務針對你搬移過來的特定服務,執行啟用與啟動指令:
systemctl enable 服務名稱
systemctl start 服務名稱
安全建議
如果你的 service 檔案中包含 ExecStart 指向的路徑(例如 /root/my-app/start.sh),請確保這些執行檔也已經透過之前的指令搬移到新伺服器的相同位置,否則服務將無法順利啟動。
這是一個自動化腳本片段,你可以將它加入到之前的搬移腳本中。這段程式碼會找出你搬移過去的 service 檔案名稱,並在新伺服器上執行重新載入與啟動的動作。
自動化啟動腳本 (新伺服器執行)
你可以將以下指令存在新伺服器的 setup_services.sh 並執行:
Bash
#!/bin/bash
echo "正在重新載入 systemd 設定..."
systemctl daemon-reload
# 取得剛剛搬移過來的自定義 service 列表 (排除系統預設連結)
SERVICES=$(ls /etc/systemd/system/*.service | xargs -n 1 basename)
for SERVICE in $SERVICES; do
echo "正在啟動並設定服務開機啟動: $SERVICE"
systemctl enable $SERVICE
systemctl restart $SERVICE
done
echo "所有自定義服務已嘗試啟動,請執行 systemctl status [服務名] 檢查狀態"
遠端一鍵執行 (從舊伺服器觸發)
如果你希望在舊伺服器同步完檔案後,直接遠端觸發新伺服器載入設定,可以在原本的 rsync 指令後加上這行:
ssh -p $PORT root@$NEW_SERVER_IP “systemctl daemon-reload && echo ‘新伺服器已重新載入設定'”
貼心提醒
自定義服務通常會依賴特定的執行環境,請確認以下項目在新伺服器是否已就緒:
- 執行路徑:檢查 .service 檔內的 ExecStart 路徑是否存在。如果路徑是在 /root 底下,請確認你之前的 rsync 已經完整同步該目錄。
- 軟體環境:如果你的服務是用 Python、Node.js 或 Docker 執行,新伺服器必須先安裝好對應的 runtime。
- 使用者權限:如果服務設定以特定使用者執行 (User=xxx),新伺服器必須建立該使用者。
執行腳本
賦予執行權限並執行:
Bash
chmod +x migrate.sh
./migrate.sh
後續操作
當資料傳輸完成後,請登入到新伺服器(10.130.0.5)執行以下步驟來恢復資料庫:
Bash
mysql < /root/all_databases.sql
如果你的服務包含 Nginx 或 Docker,記得在新伺服器安裝對應的軟體後,重啟服務以讀取搬過來的設定檔。
為了讓新伺服器能承接舊有的服務,你需要安裝與舊伺服器相同的執行環境。以下是一個針對常見網頁環境(Ubuntu/Debian 系統)的自動化安裝腳本,它會安裝 Nginx、MariaDB(MySQL)以及 PHP。
環境安裝腳本
請在新伺服器(10.130.0.5)建立並執行這個腳本:
Bash
#!/bin/bash
echo "更新系統軟體源..."
apt update && apt upgrade -y
echo "安裝基礎工具..."
apt install -y curl wget vim rsync unzip
echo "安裝 Nginx..."
apt install -y nginx
echo "安裝 MariaDB 資料庫..."
apt install -y mariadb-server
systemctl enable mariadb
systemctl start mariadb
echo "安裝 PHP 常用組件..."
apt install -y php-fpm php-mysql php-common php-cli
echo "環境安裝完成"
匯入資料與恢復服務
在環境安裝好,且你已經執行過舊伺服器的搬移腳本後,請在新伺服器執行以下指令來完成最後的對接:
- 匯入資料庫:Bash
mysql < /root/all_databases.sql - 檢查 Nginx 設定並重啟:Bash
nginx -t && systemctl restart nginx
注意事項
由於新舊伺服器的 IP 不同,如果你的設定檔(如 Nginx 的 config 或網站的 wp-config.php)中有寫死舊伺服器的 IP 位址,記得要搜尋並修改為新伺服器的位址。另外,如果原本有設定防火牆(如 ufw),在新伺服器上也需要重新開啟對應的連接埠(80, 443, 22 等)。
既然要使用 MySQL,我們需要調整安裝腳本的套件名稱,並在安裝過程中處理可能的權限問題。
MySQL 環境安裝腳本
請在新伺服器(10.130.0.5)執行以下指令:
Bash
#!/bin/bash
echo "更新系統軟體源..."
apt update
echo "安裝 MySQL Server..."
# 設定非互動模式,避免安裝過程跳出視窗要求輸入密碼
export DEBIAN_FRONTEND=noninteractive
apt install -y mysql-server
echo "啟動並設定 MySQL 開機自啟..."
systemctl start mysql
systemctl enable mysql
echo "安裝 Nginx 與 PHP 組件..."
apt install -y nginx php-fpm php-mysql
echo "MySQL 環境安裝完成"
匯入資料庫的注意事項
在執行 mysql < /root/all_databases.sql 之前,由於 MySQL 8.0 以上版本的 root 帳號預設使用 auth_socket 認證,你可能需要使用 sudo 權限才能順利匯入:
Bash
sudo mysql < /root/all_databases.sql
調整舊 IP 關鍵字
如果你擔心舊的設定檔(例如 Nginx config)裡還留著舊伺服器的 IP,可以在新伺服器的 /etc 目錄執行這行指令,將所有舊 IP 批次替換成新的(請將 1.2.3.4 替換為你的舊伺服器公網或私網 IP):
Bash
grep -rl "1.2.3.4" /etc/nginx | xargs sed -i 's/1.2.3.4/10.130.0.5/g'
最後記得重啟服務讓設定生效:
Bash
systemctl restart nginx
systemctl restart mysql
需要我幫你寫一個檢查 MySQL 服務是否正常啟動的監控腳本嗎?