跳至主要内容

維運管理

本文件說明 AppFuse 應用系統的日常維運操作,包含服務管理、監控、備份還原與更新升級。

服務管理

服務架構

直接部署:Systemd 管理

服務管理指令

# 啟動服務
sudo systemctl start appfuse.service
sudo systemctl start nginx.service

# 停止服務
sudo systemctl stop appfuse.service
sudo systemctl stop nginx.service

# 重啟服務
sudo systemctl restart appfuse.service
sudo systemctl reload nginx.service # Nginx 建議用 reload

# 查看狀態
sudo systemctl status appfuse.service
sudo systemctl status nginx.service

# 設定開機啟動
sudo systemctl enable appfuse.service
sudo systemctl enable nginx.service

# 停用開機啟動
sudo systemctl disable appfuse.service

查看服務日誌

# 即時追蹤日誌
sudo journalctl -u appfuse.service -f

# 查看最近 100 行
sudo journalctl -u appfuse.service -n 100

# 查看特定時間範圍
sudo journalctl -u appfuse.service --since "2024-01-01" --until "2024-01-02"

# 查看今天的日誌
sudo journalctl -u appfuse.service --since today

Tomcat 管理

# 啟動 Tomcat
$CATALINA_HOME/bin/startup.sh

# 停止 Tomcat
$CATALINA_HOME/bin/shutdown.sh

# 查看日誌
tail -f $CATALINA_HOME/logs/catalina.out

# 重新部署(熱部署)
# 將新的 WAR 檔案複製到 webapps 目錄
cp app-server.war $CATALINA_HOME/webapps/

監控

健康檢查

健康檢查端點

# 基本健康檢查
curl http://localhost:8080/actuator/health
# 回應:{"status":"UP"}

# 詳細健康檢查(需認證)
curl -u admin:password http://localhost:8080/actuator/health

# 應用程式資訊
curl http://localhost:8080/actuator/info

# 效能指標
curl http://localhost:8080/actuator/metrics
curl http://localhost:8080/actuator/metrics/jvm.memory.used

健康檢查腳本

建立 /opt/appfuse/bin/health-check.sh

#!/bin/bash

API_URL="http://localhost:8080/actuator/health"
NGINX_URL="http://localhost/"

echo "=== AppFuse 健康檢查 ==="
echo "時間: $(date)"
echo ""

# 檢查後端
echo -n "後端服務: "
BACKEND_STATUS=$(curl -s -o /dev/null -w "%{http_code}" $API_URL)
if [ "$BACKEND_STATUS" = "200" ]; then
echo "✓ 正常 (HTTP $BACKEND_STATUS)"
else
echo "✗ 異常 (HTTP $BACKEND_STATUS)"
fi

# 檢查前端
echo -n "前端服務: "
FRONTEND_STATUS=$(curl -s -o /dev/null -w "%{http_code}" $NGINX_URL)
if [ "$FRONTEND_STATUS" = "200" ]; then
echo "✓ 正常 (HTTP $FRONTEND_STATUS)"
else
echo "✗ 異常 (HTTP $FRONTEND_STATUS)"
fi

# 檢查資料庫連線(透過健康檢查端點)
echo -n "資料庫連線: "
DB_STATUS=$(curl -s $API_URL | grep -o '"db":{"status":"[^"]*"' | grep -o 'UP\|DOWN')
if [ "$DB_STATUS" = "UP" ]; then
echo "✓ 正常"
else
echo "✗ 異常"
fi

echo ""
echo "=== 檢查完成 ==="

日誌管理

日誌檔案位置

服務日誌位置
app-server/opt/appfuse/logs/app-server.log
Nginx access/var/log/nginx/access.log
Nginx error/var/log/nginx/error.log
Tomcat$CATALINA_HOME/logs/catalina.out

日誌輪轉配置

應用程式日誌

建立 /etc/logrotate.d/appfuse

/opt/appfuse/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 appmgr appmgr
dateext
dateformat .%Y-%m-%d
}
Tomcat 日誌

建立 /etc/logrotate.d/tomcat

/home/appmgr/opt/apache-tomcat-*/logs/catalina.out {
copytruncate
daily
dateext
dateformat .%Y-%m-%d
rotate 90
compress
delaycompress
missingok
}
測試與啟用
# 測試配置(dry-run)
sudo logrotate -d /etc/logrotate.d/appfuse
sudo logrotate -d /etc/logrotate.d/tomcat

# 手動執行輪轉
sudo logrotate -f /etc/logrotate.d/appfuse
sudo logrotate -f /etc/logrotate.d/tomcat
設定排程(選用)

如果系統未自動執行 logrotate,可手動加入 crontab:

sudo crontab -e

加入:

0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/tomcat >/dev/null 2>&1

效能監控

JVM 監控

# 查看 JVM 記憶體使用
curl http://localhost:8080/actuator/metrics/jvm.memory.used
curl http://localhost:8080/actuator/metrics/jvm.memory.max

# 查看 GC 統計
curl http://localhost:8080/actuator/metrics/jvm.gc.pause

# 查看執行緒
curl http://localhost:8080/actuator/metrics/jvm.threads.live

系統監控

# CPU 和記憶體
top -p $(pgrep -f app-server.jar)

# 磁碟使用
df -h /opt/appfuse

# 網路連線
netstat -tlnp | grep -E '8080|80|443'

備份與還原

備份策略

備份項目說明

項目路徑備份頻率保留期限
資料庫MySQL/PostgreSQL每日30 天
應用程式配置/opt/appfuse/conf/每次變更永久
上傳檔案/opt/appfuse/data/每日90 天
日誌檔案/opt/appfuse/logs/每月封存12 個月

資料庫備份

MySQL

# 完整備份
mysqldump -u root -p --single-transaction --routines --triggers appdb > backup-$(date +%Y%m%d).sql

# 壓縮備份
mysqldump -u root -p --single-transaction appdb | gzip > backup-$(date +%Y%m%d).sql.gz

# 自動備份腳本
#!/bin/bash
BACKUP_DIR=/opt/appfuse/backup/db
DATE=$(date +%Y%m%d)
mysqldump -u backup_user -p'password' --single-transaction appdb | gzip > $BACKUP_DIR/appdb-$DATE.sql.gz

# 保留最近 30 天
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete

PostgreSQL

# 完整備份
pg_dump -U postgres -F c appdb > backup-$(date +%Y%m%d).dump

# 壓縮備份
pg_dump -U postgres appdb | gzip > backup-$(date +%Y%m%d).sql.gz

SQL Server

-- 備份資料庫
-- 注意:備份目錄必須是 mssql 使用者有權限存取的目錄
BACKUP DATABASE appdb TO DISK = '/var/opt/mssql/backup/appdb-20240101.bak';

-- 備份並壓縮
BACKUP DATABASE appdb TO DISK = '/var/opt/mssql/backup/appdb-20240101.bak'
WITH COMPRESSION;

資料庫還原

MySQL

# 從 SQL 檔案還原
mysql -u root -p appdb < backup-20240101.sql

# 從壓縮檔還原
gunzip < backup-20240101.sql.gz | mysql -u root -p appdb

PostgreSQL

# 從 dump 檔案還原
pg_restore -U postgres -d appdb backup-20240101.dump

# 從 SQL 檔案還原
psql -U postgres -d appdb < backup-20240101.sql

SQL Server

-- 還原資料庫
RESTORE DATABASE appdb
FROM DISK = '/var/opt/mssql/backup/appdb-20240101.bak'
WITH REPLACE;
GO

-- 查看備份檔案內容
RESTORE FILELISTONLY FROM DISK = '/var/opt/mssql/backup/appdb-20240101.bak';
GO

檔案備份

#!/bin/bash
# backup-files.sh

BACKUP_DIR=/opt/appfuse/backup
DATE=$(date +%Y%m%d)

# 備份配置檔
tar -czf $BACKUP_DIR/conf-$DATE.tar.gz /opt/appfuse/conf/

# 備份上傳檔案
tar -czf $BACKUP_DIR/data-$DATE.tar.gz /opt/appfuse/data/

# 清理舊備份
find $BACKUP_DIR -name "conf-*.tar.gz" -mtime +90 -delete
find $BACKUP_DIR -name "data-*.tar.gz" -mtime +90 -delete

自動備份排程

編輯 crontab:

sudo crontab -e

加入排程:

# 每日凌晨 2 點備份資料庫
0 2 * * * /opt/appfuse/bin/backup-db.sh >> /opt/appfuse/logs/backup.log 2>&1

# 每日凌晨 3 點備份檔案
0 3 * * * /opt/appfuse/bin/backup-files.sh >> /opt/appfuse/logs/backup.log 2>&1

# 每日執行日誌輪轉
0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/appfuse

更新升級

更新流程

後端更新

# 1. 備份現有版本
cp $CATALINA_HOME/webapps/app-server.war /opt/appfuse/backup/app-server-$(date +%Y%m%d).war

# 2. 停止服務
sudo systemctl stop appfuse.service

# 3. 部署新版本
cp new-app-server.war $CATALINA_HOME/webapps/app-server.war

# 4. 啟動服務
sudo systemctl start appfuse.service

# 5. 驗證
curl http://localhost:8080/app-server/actuator/health

前端更新

# 1. 備份現有版本
cp $CATALINA_HOME/webapps/app-web-host.war /opt/appfuse/backup/app-web-host-$(date +%Y%m%d).war

# 2. 停止服務
sudo systemctl stop appfuse.service

# 3. 部署新版本
cp new-app-web-host.war $CATALINA_HOME/webapps/app-web-host.war

# 4. 啟動服務
sudo systemctl start appfuse.service

# 5. 驗證
curl http://localhost/app-web/

回滾程序

# 後端回滾
sudo systemctl stop appfuse.service
cp /opt/appfuse/backup/app-server-YYYYMMDD.war $CATALINA_HOME/webapps/app-server.war
sudo systemctl start appfuse.service

# 前端回滾
sudo systemctl stop appfuse.service
cp /opt/appfuse/backup/app-web-host-YYYYMMDD.war $CATALINA_HOME/webapps/app-web-host.war
sudo systemctl start appfuse.service

# 資料庫回滾
mysql -u root -p appdb < /opt/appfuse/backup/db/appdb-YYYYMMDD.sql

維運檢查清單

每日檢查

  • 檢查服務健康狀態
  • 檢查磁碟空間
  • 檢視錯誤日誌
  • 確認備份完成

每週檢查

  • 檢視效能指標趨勢
  • 檢查安全更新
  • 清理暫存檔案
  • 驗證備份可還原

每月檢查

  • 檢視系統資源使用趨勢
  • 評估擴展需求
  • 更新文件
  • 測試災難復原程序

下一步

遇到問題時,請參閱 故障排除