Initial commit: 106.105.181.40 server documentation

Hospital Media Server 運維筆記,包含 Caddy、Ant Media Server、SSL 憑證更新流程等。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-09 23:29:30 +08:00
commit 7d6a7ef848
2 changed files with 304 additions and 0 deletions

25
CLAUDE.md Normal file
View File

@@ -0,0 +1,25 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## 概述
此目錄為伺服器 `106.105.181.40`SSH 別名: `hospital_media`)的運維筆記,主要記錄 Ant Media Server 的部署與操作資訊。
## 伺服器操作
Ant Media Server 以 Docker 容器方式運行於 `/opt/antmedia`
- **建構映像**: `bash build.sh`
- **啟動容器**: `bash run.sh`
- **停止容器**: `bash stop.sh`
- **進入容器**: `bash shell.sh`
- **從容器提取資料快照**: `bash init/init.sh`
## 重要注意事項
- 容器**無持久化 Volume**,所有資料存於容器內部,刪除容器即遺失資料
- `data/` 目錄是透過 `init/init.sh` 從容器 tar 出來的快照,非即時同步的 bind mount
- 容器以 `--privileged` + `--network host` 模式運行
- 目前版本為 Ant Media Server Enterprise 2.13.2Docker image: `antmediaserver:2.13.2`
- 歷史版本資料備份於 `data.243/`v2.4.3)和 `data.290/`v2.9.0

279
hospital_media_antmedia.md Normal file
View File

@@ -0,0 +1,279 @@
# Hospital Media Server 筆記
## 主機資訊
- IP: `106.105.181.40`
- SSH 別名: `hospital_media`
- 檔案擁有者: `tpech_1duan` / `sftpuser` / `root`
## 全部容器一覽
| 容器名稱 | Image | 網路 | 用途 |
|----------|-------|------|------|
| `caddy` | `caddy` | host | 反向代理、SSL 終端、靜態檔案 |
| `antmedia` | `antmediaserver:2.13.2` | host | Ant Media Server串流 |
| `php` | `timmy/php_base:v1.0` | port 8888→80 | 正式環境 PHP 應用 |
| `php-staging` | `timmy/php_base:v1.0` | port 6666→80 | 測試環境 PHP 應用ISO27001 驗證用) |
| `coturn` | `coturn` | port 3478 | TURN/STUN 伺服器 |
| `phpmyadmin` | `phpmyadmin` | port 1888→80 | 資料庫管理介面 |
| `mysql-container` | `mysql:latest` | port 3306 | MySQL 資料庫 |
所有容器皆設為 `restart: always`
---
## Caddy 反向代理
- 部署路徑: `/opt/caddy`
- 使用 `docker-compose.yaml` 管理,`--network host` 模式
- Volume 掛載:`Caddyfile``caddy_data`、SSL 憑證、`tel-server` 靜態檔案
### 操作腳本
```bash
./run.sh # docker-compose up -d
./stop.sh # docker-compose down
./restart.sh # stop + run
./shell.sh # docker exec -it caddy sh
./list-containers.sh # docker-compose ps
./view-output-from-containers.sh # docker-compose logs -f
```
### 路由規則Caddyfile
| 入口 | 後端 | 說明 |
|------|------|------|
| `tel.tpech.gov.tw:443` | `127.0.0.1:8888`php 容器) | 正式環境HTTPS |
| `tel.tpech.gov.tw:443/phpmyadmin/*` | `10.200.251.40:1888` | phpMyAdminstrip prefix 後轉發) |
| `tel.tpech.gov.tw:80` | `127.0.0.1:8888` | 正式環境HTTP |
| `:1443` | `127.0.0.1:6666`php-staging 容器) | 測試環境ISO27001 |
| `tel-server.tpech.gov.tw:80/443` | `/srv/tel-server` | 靜態檔案服務(用於 PKI 驗證 `.well-known` |
| `:443` / `:80` | `127.0.0.1:8888` | 其他網域的 fallback |
| `:8081` | — | 健康檢查(回傳 "I am 8081" |
- `auto_https off`:不使用 Caddy 自動 HTTPS手動管理憑證
### Caddy SSL 憑證
| 項目 | 值 |
|------|-----|
| 網域 | `tel.tpech.gov.tw` |
| 簽發者 | 中華電信 HiPKI OV TLS CA - G1 |
| 有效期 | 2025-04-23 ~ 2026-04-23 |
| 憑證路徑(主機) | `/opt/caddy/fullchain.pem``/opt/caddy/privkey.pem` |
| 憑證路徑(容器內) | `/etc/caddy/ssl/fullchain.pem``/etc/caddy/ssl/privkey.pem` |
更新 Caddy 憑證:
```bash
# 1. 上傳新憑證到主機
scp fullchain.pem privkey.pem hospital_media:/opt/caddy/
# 2. 重啟 Caddyvolume 掛載會自動載入新憑證)
ssh hospital_media "cd /opt/caddy && ./restart.sh"
# 3. 驗證
openssl s_client -connect tel.tpech.gov.tw:443 -servername tel.tpech.gov.tw < /dev/null 2>/dev/null | openssl x509 -noout -dates
```
### 憑證備份hospital/
| 目錄 | 內容 |
|------|------|
| `hospital/ssl_tel_tpech_gov_tw_2025/` | `tel.tpech.gov.tw` 2025 年憑證key + csr + fullchain |
| `hospital/ssl_tel_server_tpech_gov_tw_2025/` | `tel-server.tpech.gov.tw` 2025 年憑證key + csr + fullchain |
---
## Ant Media Server
- 部署路徑: `/opt/antmediaserver`
### 服務狀態
| 項目 | 值 |
|------|-----|
| 容器名稱 | `antmedia` |
| Docker Image | `antmediaserver:2.13.2` |
| 安裝包 | `ant-media-server-enterprise-2.13.2-20250207_1708.zip` |
| 基礎映像 | `ubuntu:22.04` |
| 網路模式 | `--network host` |
| 時區 | `Asia/Taipei` |
| 重啟策略 | `--restart=always` |
| 資料 Volume | `antmedia_volume``/usr/local/antmedia/` |
### 操作腳本(/opt/antmediaserver
```bash
./build_antmedia_image.sh # 建構 Docker image
./run.sh # 停舊容器 → 啟動新容器(掛載 antmedia_volume
./stop.sh # docker stop antmedia
./shell.sh # docker exec -it antmedia bash
./enable_ssl.sh <CERT_DIR> [DOMAIN] # 一鍵更新 SSL 憑證
./backup_antmedia_data.sh # 備份 antmedia_volume 到當前目錄
```
### build_antmedia_image.sh
```bash
docker build --network=host -t antmediaserver \
--build-arg AntMediaServer=ant-media-server-enterprise-2.13.2-20250207_1708.zip .
```
### run.sh
```bash
docker stop antmedia && docker rm antmedia
docker run -d --network host --privileged \
--restart=always \
-e TZ=Asia/Taipei \
-v /etc/localtime:/etc/localtime:ro \
--mount source=antmedia_volume,target=/usr/local/antmedia/ \
--name antmedia antmediaserver:2.13.2
```
### backup_antmedia_data.sh
```bash
docker run --rm \
-v antmedia_volume:/data \
-v "$(pwd)":/backup \
busybox \
sh -c "cd /data && tar czf /backup/antmedia_backup_$(date +%Y%m%d_%H%M%S).tar.gz ."
```
## AMS SSL 憑證
### 目前憑證資訊
| 項目 | 值 |
|------|-----|
| 網域 | `tel-server.tpech.gov.tw` |
| 簽發者 | 中華電信 HiPKI OV TLS CA - G1 |
| 有效期 | 2025-04-23 ~ 2026-04-23 |
| 憑證位置(容器內) | `/usr/local/antmedia/conf/fullchain.pem``privkey.pem``chain.pem` |
| Keystore 密碼 | 網域名稱 `tel-server.tpech.gov.tw`(由容器內 `enable_ssl.sh``generate_password` 決定) |
### 更新 AMS SSL 憑證
#### 方法一:使用 /opt/antmediaserver/enable_ssl.sh推薦
將新的 fullchain.pem + key 放入憑證資料夾,然後一行搞定:
```bash
# 把憑證檔案放到對應資料夾(資料夾內需有 fullchain.pem 和 tel_server_tpech_gov_tw.key
cd /opt/antmediaserver
./enable_ssl.sh ssl_tel_server_tpech_gov_tw_2025
# 或指定網域
./enable_ssl.sh ssl_tel_server_tpech_gov_tw_2025 tel-server.tpech.gov.tw
```
此腳本會自動:`docker cp` 憑證進容器 → 在容器內執行 `enable_ssl.sh` 生成 keystore/truststore 並重啟 AMS。
#### 方法二:手動操作
1. 準備 PEM 檔:`fullchain.pem`(伺服器憑證 + 中繼 CA`privkey.pem``chain.pem`(中繼 CA
如果拿到的是 `.cer`DER 格式),先轉換:
```bash
openssl x509 -inform der -in certificate.cer -out certificate.pem
cat server.pem intermediate_ca.pem > fullchain.pem
cp intermediate_ca.pem chain.pem
```
2. 複製進容器並執行:
```bash
docker cp fullchain.pem antmedia:/usr/local/antmedia/
docker cp privkey.pem antmedia:/usr/local/antmedia/
docker cp chain.pem antmedia:/usr/local/antmedia/
docker exec -it antmedia bash -c "cd /usr/local/antmedia && ./enable_ssl.sh \
-d tel-server.tpech.gov.tw \
-f /usr/local/antmedia/fullchain.pem \
-p /usr/local/antmedia/privkey.pem \
-c /usr/local/antmedia/chain.pem"
```
#### 驗證
```bash
openssl s_client -connect tel-server.tpech.gov.tw:5443 -servername tel-server.tpech.gov.tw < /dev/null 2>/dev/null | openssl x509 -noout -dates
```
## 連接埠
| 協定 | Port |
|------|------|
| HTTP | 5080 |
| HTTPS | 5443 |
| RTMP | 1935 |
| RTMPS | 8443 |
| TURN/STUN | 3478 |
| WebRTC UDP | 50000-60000 |
## Web 應用
| 應用 | 路徑 | 說明 |
|------|------|------|
| LiveApp | `/LiveApp` | 直播應用主要使用WebRTC 20fpsHLS 啟用 |
| WebRTCAppEE | `/WebRTCAppEE` | WebRTC 企業版30fps目前無串流 |
| root | `/` | AMS 管理後台Angular SPA |
- 轉碼設定720p (1.5Mbps) + 480p (1Mbps)
- TURN/STUN 指向 `106.105.181.40:3478`(帳密為預設 `testuser`/`testpassword`,建議更換)
- LiveApp 的 `remoteAllowedCIDR` 有格式錯誤:`106.105.181.40.106.105.181.70`,中間句點應為逗號
## 系統維護
### SSL 憑證到期時間
兩張憑證皆為中華電信簽發,每年需手動更新:
| 網域 | 到期日 | 使用於 |
|------|--------|--------|
| `tel.tpech.gov.tw` | 2026-04-23 | Caddy 反向代理 |
| `tel-server.tpech.gov.tw` | 2026-04-23 | Ant Media Server |
### 年度 SSL 更新 checklist
#### 步驟一網域驗證DCV
中華電信 HiPKI 簽發憑證前,會要求透過 HTTP 驗證網域所有權。驗證檔案放在:
```
/opt/caddy/tel-server/.well-known/pki-validation/
├── DN_CHECK_FILE.htm # HiPKI DCV 驗證檔JSON 格式,含 randomNumber + expireTime
└── whois.txt # 域名所有權驗證
```
Caddy 中 `tel-server.tpech.gov.tw:80` 設定為靜態檔案服務,就是為了讓 CA 能存取:
`http://tel-server.tpech.gov.tw/.well-known/pki-validation/DN_CHECK_FILE.htm`
流程:
1. 向中華電信提交 CSR 申請憑證
2. 中華電信會提供新的驗證檔案內容
3. 更新 `/opt/caddy/tel-server/.well-known/pki-validation/` 下的檔案
4. 等待 CA 驗證通過後取得新憑證
#### 步驟二:安裝新憑證
1. 更新 Caddy 憑證:覆蓋 `/opt/caddy/fullchain.pem` + `privkey.pem` → `./restart.sh`
2. 更新 AMS 憑證:`cd /opt/antmediaserver && ./enable_ssl.sh ssl_tel_server_tpech_gov_tw_<年份>`
3. 備份新憑證到 `/opt/caddy/hospital/` 和 `/opt/antmediaserver/ssl_tel_server_tpech_gov_tw_<年份>/`
4. 備份 AMS 資料:`cd /opt/antmediaserver && ./backup_antmedia_data.sh`
### 備份
| 項目 | 方式 | 說明 |
|------|------|------|
| AMS 資料卷備份 | `/opt/antmediaserver/backup_antmedia_data.sh` | 從 `antmedia_volume` 備份到當前目錄 |
| AMS 歷史完整備份 | `/opt/antmedia_*.tar.gz` | 手動 tar 備份最新2025-05-123.4GB |
| 憑證備份 | `/opt/caddy/hospital/`、`/opt/antmediaserver/ssl_*/` | 各時期憑證 |
### 注意事項
- **AMS 使用 Docker volume**`antmedia_volume`):容器刪除後資料仍保留,但刪除 volume 則遺失
- **AMS 特權模式**: 容器以 `--privileged` 運行
- **Caddy 使用 bind mount**: Caddyfile 和憑證直接掛載主機檔案
- **host 網路**: `caddy` 和 `antmedia` 皆使用 host 網路模式,直接共用主機所有 port
- **TURN/STUN 帳密為預設值** `testuser`/`testpassword`,建議更換
- **LiveApp 的 `remoteAllowedCIDR` 有格式錯誤**`106.105.181.40.106.105.181.70`,中間句點應為逗號