障害・トラブル

{" portfolio portfolio "}

…lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla elementum, eros at sagittis facilisis, ante est rutrum ligula, at interdum eros sapien vel magna.

# R640で実行 cat > ~/collabora-migration-memo.html << ‘EOF’

Collabora Office IP移行作業メモ(2026年3月30日)
■ 作業概要
hirame fabric IP変更(172.31.22.2 → 173.0.0.10)に伴うCollabora Office統合の再設定作業。
■ 発生した問題
問題1: Discovery XMLのURL
Collaboraコンテナにserver_name環境変数が未設定だったため、discovery XMLがhttps://173.0.0.10:9980(プライベートIP)を返し、ブラウザからアクセス不可。
解決1
docker run に -e "server_name=office.wan-secure.net" を追加
問題2: WOPI allowlist不一致
hirameからcloud.k2-o.netへのアクセスが外部IP(119.26.175.225)経由となり、以下2箇所でIP制限に引っかかった:
  • R640 nginx: WOPIエンドポイントで173.0.0.0/30のみ許可(173.0.0.10は範囲外)
  • Nextcloud richdocuments: wopi_allowlistに119.26.175.225が未登録
解決2
# R640 nginx
location ^~ /index.php/apps/richdocuments/wopi/ {
    allow 173.0.0.8/29;   # 173.0.0.8-15を許可
    allow 192.168.20.0/24;
    allow 119.26.175.225; # 暫定:外部IP経由アクセス許可
    deny all;
    ...
}

# Nextcloud richdocuments
sudo docker exec -u www-data nextcloud-stack-app-1 php occ config:app:set richdocuments wopi_allowlist --value="173.0.0.10,119.26.175.225"
■ 最終的なCollaboraコンテナ設定(hirame)
docker run -d \
  --name collabora \
  -p 9980:9980 \
  -e "server_name=office.wan-secure.net" \
  -e "aliasgroup1=https://cloud\\.k2-o\\.net" \
  -e "extra_params=--o:ssl.enable=false --o:ssl.termination=true --o:net.post_allow.host[0]=173.0.0.9 --o:net.post_allow.host[1]=192.168.20.21 --o:net.post_allow.host[2]=127.0.0.1" \
  -e "username=admin" \
  -e "password=CollaboraAdmin2026" \
  --restart always \
  collabora/code
■ 現在の通信フロー
  • ブラウザ → office.wan-secure.net (HTTPS) → R640 nginx → hirame:9980 (HTTP)
  • Collabora → cloud.k2-o.net (DNS解決 → 119.26.175.225外部IP経由) → R640 nginx → Nextcloud WOPI
■ 今後の改善予定(hirameにVLAN20追加時)
目的
CollaboraからNextcloudへのアクセスを内部ネットワーク経由に変更し、外部IP依存を解消。
手順
  1. hirameにVLAN20インターフェース追加(例: 192.168.20.40/24)
  2. hirame /etc/hosts 修正: 173.0.0.9 cloud.k2-o.net のみ残す(192.168.20.21行削除済み)
  3. Collaboraコンテナ再作成時に --add-host cloud.k2-o.net:173.0.0.9 追加(Docker内部DNS優先)
  4. R640 nginx: allow 119.26.175.225; 削除
  5. Nextcloud: wopi_allowlist から119.26.175.225削除、VLAN20 IP追加
■ 関連ファイル
  • R640: /etc/nginx/sites-available/cloud.k2-o.net
  • R640: /etc/nginx/sites-available/office.k2-o.net
  • R640: /etc/nginx/sites-available/office.wan-secure.net
  • R640: /etc/hosts(173.0.0.10 office.wan-secure.net追加済み)
  • hirame: /etc/hosts(173.0.0.9 cloud.k2-o.net のみ)
■ トラブルシューティング
ファイルが開かない場合
  1. R640 nginxログ確認: sudo tail -f /var/log/nginx/access.log | grep wopi
  2. hirame Collaboraログ確認: docker logs collabora -f
  3. Nextcloud管理画面: 設定 → 管理 → Nextcloud Office でステータス確認
  4. 送信元IPが想定通りか確認(現在は119.26.175.225が正常)
Discovery確認
curl -s http://173.0.0.10:9980/hosting/discovery | grep urlsrc | head -3
# https://office.wan-secure.net が含まれていればOK

EOF cat ~/collabora-migration-memo.html

# R640で実行 cat > ~/collabora-detailed-troubleshooting.html << ‘EOF’

Collabora Office 統合トラブルシューティング詳細記録
作業日: 2026年3月30日
作業者: みーきゅんわんわん + Claude
作業時間: 約4時間
結果: ✅ 成功
■ 背景:ネットワーク構成変更
変更前(旧fabric構成)
ホスト 旧IP 用途
hirame 172.31.22.2 Collabora Office (port 9980)
R640 172.31.22.1 Nextcloud + nginx reverse proxy
変更後(新fabric構成)
ホスト 新IP インターフェース
R640 173.0.0.9 R640-HIRAME-FAB
hirame 173.0.0.10 HIRAME-R640-FAB
重要: hirameは現時点でVLAN20を持たず、すべて直結線(fabric)で通信している。VLAN20はR640のみ存在(192.168.20.21)。
■ 問題発生の時系列
Phase 1: 初期症状
  • 現象: Nextcloudでofficeファイル(.docx, .xlsx等)をクリックしても開かない
  • エラーメッセージなし、ただ読み込み中のまま停止
  • hirameのCollaboraコンテナログに何も出力されない = リクエストが届いていない
Phase 2: 初期診断
# R640からhirameへの接続確認
ping 173.0.0.10  # OK: 0.2ms

# Collabora discovery endpoint確認
curl http://173.0.0.10:9980/hosting/discovery  # OK: XMLが返ってくる
問題発見: Discovery XMLの中身にhttps://173.0.0.10:9980というプライベートIPが含まれていた。ブラウザはこのIPにアクセスできない。
■ 問題1: Discovery URLがプライベートIP
根本原因
Collaboraコンテナ起動時にserver_name環境変数が設定されていなかったため、CollaboraがWOPI discoveryレスポンスで自身のIPアドレス(173.0.0.10)をそのまま返していた。
診断コマンド
# R640で実行
curl -s http://173.0.0.10:9980/hosting/discovery | grep urlsrc | head -3

# 誤った出力例(修正前):
<action ... urlsrc="https://173.0.0.10:9980/browser/..." />

# 正しい出力例(修正後):
<action ... urlsrc="https://office.wan-secure.net/browser/..." />
解決方法
# hirameで実行
docker stop collabora
docker rm collabora

docker run -d \
  --name collabora \
  -p 9980:9980 \
  -e "server_name=office.wan-secure.net" \  # ← これを追加
  -e "aliasgroup1=https://cloud\\.k2-o\\.net" \
  -e "extra_params=--o:ssl.enable=false --o:ssl.termination=true" \
  -e "username=admin" \
  -e "password=CollaboraAdmin2026" \
  --restart always \
  collabora/code
結果: Discovery XMLが正しい外部ドメイン(office.wan-secure.net)を返すようになった。
■ 問題2: aliasgroup1のポート番号問題
エラーメッセージ
ERR  #31: WOPI::CheckFileInfo returned 403 (Forbidden)
認証されていないWOPIホストです。
根本原因
aliasgroup1にポート番号:443を含めていたため、Collaboraがcloud.k2-o.netからのリクエストを正しく識別できなかった。
修正内容
# 誤り:
-e "aliasgroup1=https://cloud\\.k2-o\\.net:443"

# 正しい:
-e "aliasgroup1=https://cloud\\.k2-o\\.net"
■ 問題3: R640 nginx WOPIエンドポイントのIP制限
診断ログ
# R640 nginxログ
173.0.0.10 - - [30/Mar/2026:09:23:58 +0900] "GET /index.php/apps/richdocuments/wopi/files/test HTTP/2.0" 403 162

# hirameからのcurlテスト
curl -v https://cloud.k2-o.net/index.php/apps/richdocuments/wopi/files/test
# → HTTP/2 403
根本原因
R640のnginx設定でallow 173.0.0.0/30;としていたが、このCIDRは173.0.0.0~173.0.0.3のみを許可する。hirameのIP 173.0.0.10は範囲外。
修正内容
# /etc/nginx/sites-available/cloud.k2-o.net

# 修正前:
location ^~ /index.php/apps/richdocuments/wopi/ {
    allow 173.0.0.0/30;  # 173.0.0.0-3のみ許可(範囲不足)
    deny all;
    ...
}

# 修正後:
location ^~ /index.php/apps/richdocuments/wopi/ {
    allow 173.0.0.8/29;  # 173.0.0.8-15を許可
    allow 192.168.20.0/24;
    deny all;
    proxy_pass http://127.0.0.1:9080;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port 443;
    proxy_read_timeout 3600;
    proxy_send_timeout 3600;
}
結果: hirameからのcurlテストが403→500に変化。nginx層は通過したが、Nextcloudアプリ層で拒否されていることが判明。
■ 問題4: Collaboraコンテナの外部IP経由アクセス
重大な発見
# R640 nginxアクセスログ
119.26.175.225 - - [30/Mar/2026:09:18:42 +0900] "GET /index.php/apps/richdocuments/wopi/files/31124_ocxlsgn0mq31?access_token=... HTTP/1.1" 403 162
問題: Collaboraコンテナからのリクエストが119.26.175.225(外部IP)経由で到着している。これは内部通信としては想定外。
原因分析
  1. hirameの/etc/hostsに以下の2行が存在:
    173.0.0.9 cloud.k2-o.net
    192.168.20.21 cloud.k2-o.net
  2. hirameはVLAN20を持たないため、192.168.20.21には到達できない
  3. DNS解決がフォールバックして外部DNS(パブリックIP: 119.26.175.225)を使用
  4. Dockerコンテナ内部のDNS解決が/etc/hostsを参照せず、独自にDNS問い合わせを実行
hirame /etc/hosts修正
# 修正前:
173.0.0.9 cloud.k2-o.net
192.168.20.21 cloud.k2-o.net  # ← hirameはVLAN20未接続なので到達不可

# 修正後:
173.0.0.9 cloud.k2-o.net  # これのみ残す
R640 nginx 暫定対処
# /etc/nginx/sites-available/cloud.k2-o.net
location ^~ /index.php/apps/richdocuments/wopi/ {
    allow 173.0.0.8/29;
    allow 192.168.20.0/24;
    allow 119.26.175.225;  # 暫定:外部IP経由アクセスを許可
    deny all;
    ...
}
■ 問題5: Nextcloud wopi_allowlist不足
最終的なエラー
nginxのIP制限は通過したが、Nextcloud richdocumentsアプリが403を返し続けた。
診断
# Nextcloud設定確認
sudo docker exec -u www-data nextcloud-stack-app-1 php occ config:list richdocuments

{
    "apps": {
        "richdocuments": {
            "wopi_allowlist": "173.0.0.10",  # ← 119.26.175.225が含まれていない
            ...
        }
    }
}
修正
# wopi_allowlistに119.26.175.225を追加
sudo docker exec -u www-data nextcloud-stack-app-1 php occ config:app:set richdocuments wopi_allowlist --value="173.0.0.10,119.26.175.225"

# 確認
sudo docker exec -u www-data nextcloud-stack-app-1 php occ config:app:get richdocuments wopi_allowlist
# 出力: 173.0.0.10,119.26.175.225
結果: ✅ ファイルが正常に開くようになった!
■ 最終的な設定一覧
hirame: Collabora Docker設定
docker run -d \
  --name collabora \
  -p 9980:9980 \
  -e "server_name=office.wan-secure.net" \
  -e "aliasgroup1=https://cloud\\.k2-o\\.net" \
  -e "extra_params=--o:ssl.enable=false --o:ssl.termination=true --o:net.post_allow.host[0]=173.0.0.9 --o:net.post_allow.host[1]=192.168.20.21 --o:net.post_allow.host[2]=127.0.0.1" \
  -e "username=admin" \
  -e "password=CollaboraAdmin2026" \
  --restart always \
  collabora/code
hirame: /etc/hosts
173.0.0.9 cloud.k2-o.net
R640: /etc/hosts
173.0.0.10 office.wan-secure.net
R640: /etc/nginx/sites-available/cloud.k2-o.net(抜粋)
server {
    listen 443 ssl http2;
    server_name cloud.k2-o.net;
    ...
    
    location ^~ /index.php/apps/richdocuments/wopi/ {
        allow 173.0.0.8/29;
        allow 192.168.20.0/24;
        allow 119.26.175.225;  # 暫定
        deny all;
        proxy_pass http://127.0.0.1:9080;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port 443;
        proxy_read_timeout 3600;
        proxy_send_timeout 3600;
    }
    
    location / {
        allow 192.168.20.0/24;
        allow 192.168.10.0/24;
        allow 10.251.0.0/24;
        allow 10.200.0.0/16;
        allow 10.250.0.0/24;
        allow 173.0.0.0/30;
        allow 172.31.20.0/30;
        allow 172.31.21.0/30;
        allow 127.0.0.1;
        deny all;
        proxy_pass http://127.0.0.1:9080;
        ...
    }
}
R640: /etc/nginx/sites-available/office.wan-secure.net(抜粋)
server {
    listen 443 ssl http2;
    server_name office.wan-secure.net;
    ssl_certificate /etc/letsencrypt/live/office.wan-secure.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/office.wan-secure.net/privkey.pem;
    
    location / {
        proxy_pass http://173.0.0.10:9980;  # hirame fabric IP
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_read_timeout 36000s;
    }
}
R640: Nextcloud richdocuments設定
{
    "DocumentServerInternalUrl": "http://173.0.0.10:9980/",
    "allow_local_remote_servers": 1,
    "public_wopi_url": "https://office.wan-secure.net",
    "wopi_allowlist": "173.0.0.10,119.26.175.225",
    "wopi_url": "http://173.0.0.10:9980"
}
■ 通信フロー詳細
ブラウザ → Collabora(正常系)
1. DarkHero (192.168.40.10)
   ↓ HTTPS
2. office.wan-secure.net (R640 nginx:443)
   ↓ HTTP proxy_pass
3. 173.0.0.10:9980 (hirame Collabora)
   ↓ WebSocket upgrade
4. Collabora UI表示
Collabora → Nextcloud WOPI(現在の暫定構成)
1. hirame Collabora container
   ↓ DNS解決(Docker内部DNS)
2. cloud.k2-o.net → 119.26.175.225 (外部IP経由)
   ↓ HTTPS
3. WAN → RTX1300 → R640 nginx:443
   ↓ proxy_pass(送信元IP: 119.26.175.225)
4. Nextcloud container :9080
   ↓ WOPI CheckFileInfo処理
5. wopi_allowlistチェック(119.26.175.225が含まれている → OK)
暫定構成の問題点: 内部通信が外部IP経由になっており、WAN帯域を消費する。またセキュリティ的にも望ましくない。
■ 今後の改善計画(hirameにVLAN20追加時)
目標構成
Collabora → Nextcloud WOPI を完全に内部ネットワーク経由に変更

1. hirame Collabora container
   ↓ Docker内部DNS(--add-hostで強制)
2. cloud.k2-o.net → 173.0.0.9 (R640 fabric IP)
   ↓ HTTPS
3. R640 nginx:443
   ↓ proxy_pass(送信元IP: 173.0.0.10)
4. Nextcloud container :9080
実装手順
# 1. hirameにVLAN20追加(例: 192.168.20.40/24)

# 2. hirame Collaboraコンテナ再作成
docker stop collabora && docker rm collabora
docker run -d \
  --name collabora \
  -p 9980:9980 \
  --add-host cloud.k2-o.net:173.0.0.9 \  # ← Docker内部DNSで強制解決
  -e "server_name=office.wan-secure.net" \
  -e "aliasgroup1=https://cloud\\.k2-o\\.net" \
  -e "extra_params=--o:ssl.enable=false --o:ssl.termination=true --o:net.post_allow.host[0]=173.0.0.9 --o:net.post_allow.host[1]=192.168.20.21 --o:net.post_allow.host[2]=127.0.0.1" \
  -e "username=admin" \
  -e "password=CollaboraAdmin2026" \
  --restart always \
  collabora/code

# 3. R640 nginx修正
sudo nano /etc/nginx/sites-available/cloud.k2-o.net
# allow 119.26.175.225; の行を削除

# 4. Nextcloud wopi_allowlist修正
sudo docker exec -u www-data nextcloud-stack-app-1 php occ config:app:set richdocuments wopi_allowlist --value="173.0.0.10,192.168.20.40"
# ※192.168.20.40はhirameのVLAN20 IP例

# 5. 動作確認
# R640でログ監視
sudo tail -f /var/log/nginx/access.log | grep wopi
# 送信元IPが173.0.0.10になっていることを確認
■ トラブルシューティングコマンド集
接続確認
# R640 → hirame疎通確認
ping 173.0.0.10

# hirame → R640疎通確認
ping 173.0.0.9

# R640からCollabora discovery取得
curl http://173.0.0.10:9980/hosting/discovery

# Discovery URLが正しいか確認
curl -s http://173.0.0.10:9980/hosting/discovery | grep urlsrc | head -3
# https://office.wan-secure.net が含まれていればOK
Collaboraログ確認
# hirame
docker logs collabora -f

# 成功時のログパターン:
# INF  WOPI::CheckFileInfo succeeded
# INF  Loaded document from storage

# エラー時のログパターン:
# ERR  WOPI::CheckFileInfo returned 403 (Forbidden)
# ERR  Access denied to CheckFileInfo
R640 nginxログ確認
# アクセスログ(送信元IP確認)
sudo tail -f /var/log/nginx/access.log | grep wopi

# エラーログ
sudo tail -f /var/log/nginx/error.log

# 設定テスト
sudo nginx -t

# 設定リロード
sudo systemctl reload nginx
Nextcloud設定確認
# richdocuments全設定表示
sudo docker exec -u www-data nextcloud-stack-app-1 php occ config:list richdocuments

# wopi_allowlistのみ確認
sudo docker exec -u www-data nextcloud-stack-app-1 php occ config:app:get richdocuments wopi_allowlist

# Nextcloudログ確認
sudo docker logs nextcloud-stack-app-1 --tail 100 | grep -i "wopi\|403"
DNS/hosts確認
# hirame
cat /etc/hosts | grep cloud
getent hosts cloud.k2-o.net

# R640
cat /etc/hosts | grep office
getent hosts office.wan-secure.net
Nextcloudコンテナ再起動
# R640
sudo docker restart nextcloud-stack-app-1

# 起動完了待ち(30秒程度)
sleep 30
■ 学んだポイント
1. Docker内部DNSの挙動
Dockerコンテナは/etc/hostsをそのまま参照せず、独自のDNS解決を行う。ホストの/etc/hostsをコンテナに反映させるには--add-hostオプションが必要。
2. CIDR範囲の計算
CIDR 範囲 ホスト数
/30 x.x.x.0 – x.x.x.3 4個
/29 x.x.x.0 – x.x.x.7 8個
/24 x.x.x.0 – x.x.x.255 256個
173.0.0.10を許可するには/30では不足、/29以上が必要。
3. nginxとNextcloudの2段階IP制限
  • R640 nginx: allow/denyディレクティブ
  • Nextcloud richdocuments: wopi_allowlist設定
両方を一致させる必要がある。
4. Collabora環境変数の重要性
  • server_name: Discovery XMLのURL生成に使用
  • aliasgroup1: WOPI host認証に使用(ポート番号不要)
  • extra_params: net.post_allow.hostでNextcloud IPを許可
■ 参考リンク
  • Collabora公式ドキュメント: https://sdk.collaboraonline.com/
  • Nextcloud Office設定: https://docs.nextcloud.com/server/stable/admin_manual/office/
  • WOPI protocol: https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/
■ バックアップファイル一覧
  • R640: /etc/nginx/sites-available/cloud.k2-o.net.bak.20260330
  • R640: /etc/nginx/sites-available/office.k2-o.net.bak.20260330
  • R640: /etc/nginx/sites-available/office.wan-secure.net.bak.20260330
  • R640: ~/nextcloud-richdocuments-config.json(設定エクスポート)

EOF cat ~/collabora-detailed-troubleshooting.html