# DR-Nginx — Nginx 設定錯誤回滾 SOP

**目標時間**: < 5 分鐘  
**觸發場景**: nginx conf 錯誤導致 reload 失敗，或手動修改造成設定漂移  
**工具**: Ansible, git  
**最後更新**: 2026-04-11 (Claude Sonnet 4.6 Asia/Taipei)

---

## 場景 A：nginx conf 語法錯誤（最常見）

```bash
# 在 MacBook 執行
# 1. 確認問題
ssh wooo@192.168.0.188 "sudo nginx -t 2>&1"

# 2. 用 Ansible 從 Git 重新部署正確版本
cd /Users/ogt/awoooi
ansible-playbook -i infra/ansible/inventory/hosts.yml \
  infra/ansible/playbooks/nginx-sync.yml \
  --tags 188

# 3. 驗收
curl -s -o /dev/null -w '%{http_code}' https://awoooi.wooo.work
# 期望: 200
```

---

## 場景 B：需要回滾到前一版本

```bash
# 查看最近 nginx conf 變更
git log --oneline -- infra/ansible/roles/nginx/templates/188-all-sites.conf.j2 | head -5

# 回滾到前一個 commit
git revert HEAD --no-edit  # 或 git checkout <commit-hash> -- <file>
git push gitea main

# 立即用 Ansible 套用回滾版本
ansible-playbook -i infra/ansible/inventory/hosts.yml \
  infra/ansible/playbooks/nginx-sync.yml \
  --tags 188
```

---

## 場景 C：188 nginx 完全無法啟動，需要 110 接管

```bash
# 在 192.168.0.110 或 188 強制 keepalived failover
# （僅在 188 完全失效時使用）
ssh wooo@192.168.0.110 "sudo systemctl status keepalived"

# 若 110 已自動接管 VIP:200，確認：
ssh wooo@192.168.0.110 "ip addr show | grep 192.168.0.200"
# 期望：顯示 VIP 已在 110

# 確認對外服務正常（透過 VIP）
curl -s -o /dev/null -w '%{http_code}' https://awoooi.wooo.work
```

---

## 預防

- 所有 nginx conf 變更必須透過 `infra/ansible/playbooks/nginx-sync.yml` 部署
- 禁止直接 SSH 到 188 修改 `/etc/nginx/sites-enabled/`
- Ansible 會自動 `backup: true`（在部署前備份 `.bak.TIMESTAMP`）
