7 min read

Hostinger KVM 4 搬家到 KVM 2:VPS 省錢攻略與 Ghost CMS 遷移實戰

Hostinger KVM 4 搬家到 KVM 2:VPS 省錢攻略與 Ghost CMS 遷移實戰

前言

最近收到 Hostinger 的續約通知,KVM 4 一年要價 $371.88 USD,換算下來月費約 $31,對於只跑一個 Ghost CMS 部落格來說,這個價格實在太貴了,於是決定趁這次機會好好研究一下 VPS 市場,順便紀錄整個搬家過程。

為什麼要搬?

先看一下舊機的實際使用狀況:

  • RAM:16GB 配置,全年最高用到 4GB 左右
  • CPU:長年在 10% 以下
  • 用途:只跑 Ghost CMS 部落格

簡單來說,4 vCPU / 16GB RAM 的 KVM 4 對一個部落格完全是殺雞用牛刀,Ghost 官方建議最低 1GB RAM 就能跑了,我卻在用 16GB,等於有 12GB 的 RAM 在那邊空轉燒錢。

VPS 比價:同規格能省多少?

既然要搬家,那就來好好比較一下市場上類似規格的 VPS 方案。以下是跑 Ghost CMS 夠用的規格(2-4 vCPU / 4-16GB RAM)的比較:

供應商 方案 規格 月費 年費估算 備註
Hostinger KVM 4 續約 4C/16G/200G ~$31 $371.88 舊方案
Hostinger KVM 2 新帳號首購 2C/8G/100G $6.99 ~$84 24 個月方案
Hetzner CX32 Shared 4C/8G/80G NVMe ~$7.5 ~$90 美國 Ashburn 有機房
Vultr HF High Frequency 2C/4G/128G NVMe $24 $288 Intel 3GHz+ 保證
DigitalOcean Premium Intel 2C/4G/80G NVMe $21 $252 可指定 Intel CPU

最終選擇:Hostinger KVM 2 新帳號

決定用吃 Hostinger 新購優惠:

  • KVM 2 / 24 個月方案
  • 2 vCPU / 8GB RAM / 100GB NVMe
  • $6.99/月,兩年共 $167.76
  • 美國 Phoenix 機房

兩年 $167.76,比原本 KVM 4 一年 $371.88 還便宜一半以上。

省錢小提醒

  1. 不要加 Daily auto-backup:Hostinger 的自動備份 $6-12/月,兩年下來 $144-288,幾乎跟 VPS 一樣貴,自己寫 cron job 備份免費搞定。
  2. 續約價會變貴:KVM 2 續約價是 $14.99/月,兩年後記得重新評估。
  3. 免費 Domain 用不到就別理它:附贈的免費域名一年後續約要 ~$64/年。

Ghost CMS 遷移實戰

以下是完整的搬家步驟,從舊機備份到新機上線。

環境資訊

  • 舊機:Hostinger KVM 4 / Ubuntu 24.04 with CloudPanel / Phoenix
  • 新機:Hostinger KVM 2 / Ubuntu 24.04 / Phoenix
  • Ghost 版本:v6.19.3
  • 資料庫:MySQL
  • DNS:Cloudflare

Step 1:備份舊機資料

SSH 進入舊機,打包 Ghost 的 content 資料夾和設定檔:

cd /path/to/ghost
sudo tar czf /root/ghost-backup.tar.gz content/ config.production.json

因為舊機用的是 MySQL,還需要 dump 資料庫:

sudo mysqldump --no-tablespaces -u DB_USER -p'DB_PASSWORD' ghost_db > ~/ghost-db-backup.sql
💡 如果你的 Ghost 是用 SQLite,資料庫檔案就在 content/data/ 裡面,不用額外 dump。

Step 2:新機基礎設定

新機開好之後,先更新系統:

apt update && apt upgrade -y
reboot

建立非 root 使用者(Ghost 官方不建議用 root 跑):

adduser youruser
usermod -aG sudo youruser

記得幫新使用者加 SSH key:

mkdir -p /home/youruser/.ssh
echo "your-public-key" >> /home/youruser/.ssh/authorized_keys
chmod 700 /home/youruser/.ssh
chmod 600 /home/youruser/.ssh/authorized_keys

Step 3:安裝 Ghost 依賴

安裝 Node.js v22(Ghost 目前要求的版本):

curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs

安裝 MySQL 和 Nginx:

apt install -y mysql-server nginx

建立 Ghost 用的資料庫:

GHOST_DB_PASS=$(openssl rand -base64 24)
echo "Ghost DB Password: $GHOST_DB_PASS"  # 記下這個密碼
mysql -u root -e "
CREATE DATABASE ghost_db;
CREATE USER 'ghost_user'@'localhost' IDENTIFIED BY '$GHOST_DB_PASS';
GRANT ALL PRIVILEGES ON ghost_db.* TO 'ghost_user'@'localhost';
FLUSH PRIVILEGES;
"

安裝 Ghost-CLI:

npm install -g ghost-cli

Step 4:安裝 Ghost

切換到非 root 使用者,建立目錄並安裝:

sudo mkdir -p /var/www/ghost
sudo chown youruser:youruser /var/www/ghost
cd /var/www/ghost
ghost install \
  --db mysql \
  --dbhost localhost \
  --dbuser ghost_user \
  --dbpass YOUR_DB_PASSWORD \
  --dbname ghost_db \
  --url https://yourdomain.com \
  --process systemd \
  --no-prompt

Step 5:匯入舊資料

把備份檔傳到新機(透過本地當中繼):

# 從舊機拉到本地
scp user@OLD_IP:~/ghost-backup.tar.gz ~/ghost-backup.tar.gz
scp user@OLD_IP:~/ghost-db-backup.sql ~/ghost-db-backup.sql

# 從本地傳到新機
scp ~/ghost-backup.tar.gz user@NEW_IP:/tmp/
scp ~/ghost-db-backup.sql user@NEW_IP:/tmp/

在新機上匯入資料庫和 content:

# 匯入資料庫
sudo mysql -u root ghost_db < /tmp/ghost-db-backup.sql

# 還原 content
cd /var/www/ghost
sudo tar xzf /tmp/ghost-backup.tar.gz -C /var/www/ghost/
sudo chown -R ghost:ghost /var/www/ghost/content

Step 6:修正設定檔

解壓縮會把舊的 config 蓋過去,需要修正成新機的設定:

{
  "url": "https://yourdomain.com",
  "server": {
    "port": 2368,
    "host": "127.0.0.1"
  },
  "database": {
    "client": "mysql",
    "connection": {
      "host": "localhost",
      "user": "ghost_user",
      "password": "YOUR_NEW_DB_PASSWORD",
      "database": "ghost_db"
    }
  },
  "mail": {
    "transport": "Direct"
  },
  "logging": {
    "transports": ["file", "stdout"]
  },
  "process": "systemd",
  "paths": {
    "contentPath": "/var/www/ghost/content"
  }
}

記得修正權限:

sudo chown ghost:ghost /var/www/ghost/config.production.json
sudo chmod 664 /var/www/ghost/config.production.json

重啟 Ghost:

sudo systemctl restart ghost_taiwanding-com

Step 7:設定 SSL

先刪除 Nginx 預設頁面(不然會擋住 Ghost):

sudo rm /etc/nginx/sites-enabled/default
sudo nginx -s reload

如果用 Cloudflare,先暫時把 Proxy 關掉(橘色雲朵改灰色),讓 Let's Encrypt 能直接驗證:

cd /var/www/ghost
ghost setup ssl --sslemail [email protected]

Step 8:切換 DNS

  1. 去 Cloudflare 修改 A record,把 IP 改成新機的 IP
  2. 打開橘色雲朵(Proxied)
  3. SSL/TLS 模式設為 Full (Strict)
  4. 瀏覽器確認網站正常

Step 9:善後

  • 舊機的自動續約記得關掉
  • 舊機資料確認搬完後,到期自然就好

踩坑紀錄

搬家過程中遇到幾個問題,紀錄一下:

1. Ghost 啟動失敗 - config 權限問題

錯誤訊息EACCES: permission denied, open '/var/www/ghost/config.production.json'

原因:解壓縮舊備份時,舊的 config.production.json 蓋掉了新的,權限變成了舊使用者的。

解法

sudo chown ghost:ghost /var/www/ghost/config.production.json
sudo chmod 664 /var/www/ghost/config.production.json

2. Cloudflare 522 Error

原因:Nginx 預設頁面把 Ghost 的 vhost 擋住了。

解法:刪掉 default site:

sudo rm /etc/nginx/sites-enabled/default
sudo nginx -s reload

3. ERR_TOO_MANY_REDIRECTS

原因:Cloudflare SSL 設成 Flexible,但 Ghost URL 設成 https,造成無限重導迴圈。

解法:裝 Let's Encrypt 後把 Cloudflare SSL 模式改成 Full (Strict)。

伺服器強化

搬完家之後,別忘了做基本的安全強化。

SSH 強化

關掉 root 登入和密碼登入,只允許 SSH key:

sudo sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart ssh
⚠️ 跑之前務必確認你的使用者 + SSH key 可以正常登入,不然會把自己鎖在外面。

UFW 防火牆

只開放必要的 port:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Fail2ban

防暴力破解:

sudo apt install -y fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Terminal 美化

都搬完了,也來幫 terminal 換個風格。加入 ~/.bashrc

# === Hacker Style Prompt ===
GREEN='\[\033[01;32m\]'
CYAN='\[\033[01;36m\]'
RED='\[\033[01;31m\]'
YELLOW='\[\033[01;33m\]'
RESET='\[\033[00m\]'

PS1="${GREEN}┌──[${CYAN}\t${GREEN}]─[${RED}⚡${GREEN}]─[${YELLOW}\u@\h${GREEN}]─[${CYAN}\w${GREEN}]\n${GREEN}└──╼ \$ ${RESET}"

alias ll='ls -lah --color=auto'
alias gs='systemctl status ghost_taiwanding-com'
alias gr='sudo systemctl restart ghost_taiwanding-com'
alias ports='sudo ss -tlnp'

幾個實用 alias:

  • gs → 查看 Ghost 狀態
  • gr → 重啟 Ghost
  • ports → 查看開放的 port

結語

整個搬家過程大概花了一小時左右,最後成功從 KVM 4($371.88/年)降到 KVM 2 新帳號($83.88/年),一年省了將近 $290 USD

對於只跑 Ghost CMS 的用途來說,2 vCPU / 8GB RAM 完全綽綽有餘,搬家前記得先確認自己的實際資源使用量,很多時候我們都在為用不到的資源付費。

如果你也在考慮 VPS 搬家,希望這篇文章對你有幫助有任何問題歡迎留言討論!