障害・トラブル

障害・トラブル — Collabora 統合の苦戦記録

// TROUBLE LOG — 過去の障害と教訓のアーカイブ / 最終更新: 2026-05-14

解決済 2026-03-30 Collabora 統合作業 参考 「過去のハマりポイント」として残す

このページの位置づけ: ここに残してる Collabora 統合の苦戦は 2026-03 時点の話。 その後 2026-05-14 の R640 再構築で経路自体が変わり (Collabora は fabric 直結 173.0.0.5 で maguro に直接行く)、 当時の暫定対処 (119.26.175.225 を allow に追加) は すでに不要。 ただし「Docker内部DNSがhostsを参照しない」「CIDR /30 と /29 の差」など、 教訓は今でも有効なので残してる。
作業背景 (2026-03-30 当時)
項目当時の状況
作業日2026年3月30日 (約4時間の格闘)
作業者みーきゅんわんわん + Claude
結果✓ 成功 (暫定対処込み)
引き金hirame fabric IP変更 (172.31.22.2 → 173.0.0.10) に伴う Collabora 統合の再設定
// 当時のfabric構成 (旧 → 新)
ホスト旧IP新IP (2026-03時点)
R640172.31.22.1173.0.0.9 (R640-HIRAME-FAB)
hirame172.31.22.2173.0.0.10 (HIRAME-R640-FAB)
今 (2026-05-14) は経路が違う: Collabora ⇄ Nextcloud は maguro fabric 173.0.0.5--add-host で指す構成。 詳しくは「Collabora Online」ページ参照。
時系列で起きた問題
Phase 1 / 初期症状
  • Nextcloud で office ファイル (.docx, .xlsx) をクリックしても開かない
  • エラーメッセージなし、 読み込み中のまま停止
  • hirame の Collabora コンテナログに 何も出てこない = リクエスト到達せず
Phase 2 / 初期診断
# R640 → hirame 疎通
ping 173.0.0.10                                # OK 0.2ms
curl http://173.0.0.10:9980/hosting/discovery  # OK XML返ってくる

! 問題発見: Discovery XML の中に https://173.0.0.10:9980 が含まれていた。 ブラウザから到達不可なプライベートIPが返ってる。

問題1: Discovery URL がプライベートIP
// 根本原因

Collabora コンテナ起動時に server_name 環境変数が未設定だったため、 Collabora が WOPI discovery レスポンスで自身のIP (173.0.0.10) をそのまま返していた。

// 診断
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/..." />
// 対処
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=***" \
  --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 制限 — CIDR 不一致
// 診断ログ
173.0.0.10 - - [30/Mar/2026:09:23:58 +0900] "GET /index.php/apps/richdocuments/wopi/files/test HTTP/2.0" 403 162

根本原因: nginx で allow 173.0.0.0/30; としていたが、 これは 173.0.0.0 〜 173.0.0.3 しか許可しない。 hirame の 173.0.0.10 は範囲外。

// 対処 — CIDR を /29 に拡大
# /etc/nginx/sites-available/cloud.k2-o.net
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;
    ...
}
問題4: Collabora が外部IP経由で着信

R640 nginx access log:

119.26.175.225 - - "GET /index.php/apps/richdocuments/wopi/files/... HTTP/1.1" 403 162

! 問題: Collabora コンテナからのリクエストが 外部IP (119.26.175.225) 経由で届いている。 これは内部通信として想定外。

// 原因分析 (当時)
  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) を解決
  4. Docker コンテナは /etc/hosts を参照せず、 独自にDNS問い合わせを実行
// 暫定対処 (当時)
  • hirame /etc/hosts から 192.168.20.21 行を削除
  • R640 nginx の allow に 119.26.175.225; を追加
  • Nextcloud wopi_allowlist にも 119.26.175.225 を追加
当時の問題点: 内部通信が WAN経由 になっており、 帯域消費 + セキュリティリスク。 「とりあえず動かす」状態だった。
問題5: Nextcloud wopi_allowlist 不足
# 当時の設定
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 が無い
    }
  }
}

# 修正
php occ config:app:set richdocuments wopi_allowlist --value="173.0.0.10,119.26.175.225"
結果: ファイルが開くようになった (4時間の格闘の末)
学んだポイント (今でも有効)
// 1. Docker内部DNS の挙動

Docker コンテナはホストの /etc/hostsそのまま参照しない。 独自のDNS解決を行う。 ホストの hosts をコンテナに反映させるには --add-host オプションが必要。

// 2. CIDR 範囲の計算
CIDR範囲ホスト数
/30x.x.x.0 〜 x.x.x.34個
/29x.x.x.0 〜 x.x.x.78個
/24x.x.x.0 〜 x.x.x.255256個

173.0.0.10 を許可するには /30 では不足、 /29 以上が必要。

// 3. nginx と Nextcloud の 2段階 IP 制限
  • nginx: allow/deny ディレクティブ
  • Nextcloud richdocuments: wopi_allowlist 設定

両方を一致させる必要がある。 片方だけ通っても 403 になる。

// 4. Collabora 環境変数の重要性
  • server_name: Discovery XML の URL 生成に使用
  • aliasgroup1: WOPI host 認証 (ポート番号 不要)
  • extra_params: net.post_allow.host で Nextcloud IP を許可
現在 (2026-05-14) の構成 — fabric 直結化で解決

2026-05-14 の R640 再構築 + maguro 集約により、 Collabora 問題は本質的に解消した。

項目旧 (2026-03 当時)新 (2026-05-14)
Collabora --add-hostcloud.k2-o.net:173.0.0.9 (R640 経由)cloud.k2-o.net:173.0.0.5 (maguro 直結)
ホップ数3 (container → R640 SNI → maguro)1 (container → maguro)
maguro 着信時 source IP192.168.30.21 (R640 出口)173.0.0.6 (hirame SM-fabric)
wopi_allowlist173.0.0.10, 119.26.175.225 等173.0.0.4/30, 173.0.0.8/30, 119.26.175.225
外部IP経由?あり (WAN往復)なし (fabric内完結)
今 (2026-05-14) のメリット: ① WAN帯域を消費しない ② R640 が落ちても NC⇄Collabora は継続 ③ ホップ数削減で低遅延 ④ source IP が固定なので allowlist 管理楽。
トラブルシューティングコマンド集 (汎用)
// 接続確認
# fabric 疎通
ping 173.0.0.5    # maguro fabric (現用)
ping 173.0.0.10   # hirame

# Collabora discovery
curl -s http://173.0.0.10:9980/hosting/discovery | grep urlsrc | head -3
# https://office.wan-secure.net が含まれていればOK
// Collabora ログ
ssh hirame@192.168.10.40
docker logs collabora -f

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

# 失敗パターン:
#   ERR  WOPI::CheckFileInfo returned 403 (Forbidden)
// maguro nginx ログ (新経路)
ssh maguro@192.168.70.30
sudo tail -f /var/log/nginx/access.log | grep wopi
# remote_addr が 173.0.0.6 になっていれば正常 (fabric直結経路)
// Nextcloud 設定確認
# maguro Docker
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
教訓まとめ
  • Docker のDNS は独立 — ホストの /etc/hosts は効かない。 --add-host で明示する。
  • CIDR を確認しろ — /30 は 4個しか入らない。 ホストIPを許可するときは要計算。
  • 多段 allowlist は両方合わせる — nginx allow と app側 allowlist は別物。 片方だけだと無音で 403。
  • ログを見る順番: 1) ブラウザ DevTools 2) nginx access 3) Collabora docker logs 4) Nextcloud 内部ログ。 1段ずつ進む。
  • L4 passthrough は source IP を消す — nginx stream で SNI 振り分けすると source は nginx の出口IFになり、 内部識別不能になる。 fabric 直結に逃がせるなら逃がす方が良い。
このページを残す理由: 同じハマり方は今後も起きる (DNS、 CIDR、 多段allowlist は普遍的な落とし穴)。 「やった事実」と「考え方」をペアで残しておけば、 次回 30分で済む。