備份說明 — 主機 106.105.181.40(hospital_media)
本目錄存放主機 106.105.181.40 各服務的每日自動備份。
備份來源主機 SSH 別名:hospital_media。
- NFS 來源:
hdsnas02.tpech.gov.tw:/TEL_BACKUP_NFS - 主機掛載點:
/mnt/tel_backup_nfs(本目錄即/mnt/tel_backup_nfs/106_105_181_40/) - 備份腳本:主機上
/opt/backup_all_to_nfs.sh - 排程:
/etc/cron.d/backup-nfs,每天 03:30 以 root 執行 - 保留天數:14 天(更舊的自動刪除,可在腳本
RETAIN_DAYS調整) - 紀錄檔:本目錄
backup.log
目錄結構
106_105_181_40/
├── README.md # 本文件
├── backup.log # 每次備份的紀錄
└── YYYYMMDD_HHMMSS/ # 每天一個資料夾(備份時間戳)
├── caddy.tar.gz
├── php.tar.gz
├── php-staging.tar.gz
├── phpmyadmin.tar.gz
├── coturn.tar.gz
├── antmedia_volume.tar.gz
└── mysql_all_databases.sql.gz
各檔案備份的是什麼
| 檔案 | 內容 | 主機來源 | 對應容器 |
|---|---|---|---|
caddy.tar.gz |
Caddy 設定、SSL 憑證、tel-server 靜態檔 |
/opt/caddy |
caddy |
php.tar.gz |
正式環境 PHP 程式碼 | /opt/php(網站根:www/) |
php |
php-staging.tar.gz |
測試環境 PHP 程式碼 | /opt/php-staging |
php-staging |
phpmyadmin.tar.gz |
phpMyAdmin compose 設定(無資料,stateless) | /opt/phpmyadmin |
phpmyadmin |
coturn.tar.gz |
TURN/STUN 設定 turnserver.conf |
/opt/coturn |
coturn |
antmedia_volume.tar.gz |
Ant Media Server 實際資料卷(串流設定、應用、錄影等) | docker volume antmedia_volume(容器內 /usr/local/antmedia) |
antmedia |
mysql_all_databases.sql.gz |
所有資料庫的邏輯匯出(含 tpech_tel、myapp 等) |
mysqldump --all-databases |
mysql-container |
注意:NAS 啟用 root_squash,檔案 owner 會顯示
nobody:nogroup,屬正常現象。
還原方法
以下指令都在主機
106.105.181.40上以 root(sudo)執行。 先設定要還原的備份時間戳,例如:BK=/mnt/tel_backup_nfs/106_105_181_40/20260629_142059
1. 檔案型服務(Caddy / PHP / PHP-staging / phpMyAdmin / Coturn)
解壓回 /opt(會覆蓋現有檔案),再重啟容器:
# 範例:還原 Caddy
sudo tar xzf "$BK/caddy.tar.gz" -C /opt
cd /opt/caddy && ./restart.sh # 或 docker restart caddy
# 其餘服務同理(換檔名與容器名):
sudo tar xzf "$BK/php.tar.gz" -C /opt && docker restart php
sudo tar xzf "$BK/php-staging.tar.gz" -C /opt && docker restart php-staging
sudo tar xzf "$BK/phpmyadmin.tar.gz" -C /opt && docker restart phpmyadmin
sudo tar xzf "$BK/coturn.tar.gz" -C /opt && docker restart coturn
2. Ant Media Server(資料卷)
必須先停容器,清空舊資料卷再解壓,避免殘留檔案:
docker stop antmedia
VOL=/var/lib/docker/volumes/antmedia_volume/_data
sudo rm -rf "$VOL"/* # 清空(確認 BK 正確再執行!)
sudo tar xzf "$BK/antmedia_volume.tar.gz" -C "$VOL"
docker start antmedia
3. MySQL(所有資料庫)
把 dump 灌回執行中的容器(會覆蓋同名資料庫):
zcat "$BK/mysql_all_databases.sql.gz" | \
docker exec -i mysql-container sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"'
只還原單一資料庫:
# 先從整包過濾出該 DB(或用 sed 擷取對應段落),簡單作法是全部灌回後只保留需要的
zcat "$BK/mysql_all_databases.sql.gz" | \
docker exec -i mysql-container sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" tpech_tel'
# ↑ 注意:dump 為 --all-databases 格式,含 USE 語句;指定單庫還原前請確認段落,
# 或改用 mysqldump 重新針對單一資料庫匯出。
還原後檢查
- 容器狀態:
docker ps - Caddy 設定語法:
docker exec caddy caddy validate --config /etc/caddy/Caddyfile - MySQL:
docker exec -it mysql-container mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e 'SHOW DATABASES;' - Ant Media:瀏覽器開管理介面確認應用與設定