障害・トラブル — 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時点) |
|---|---|---|
| R640 | 172.31.22.1 | 173.0.0.9 (R640-HIRAME-FAB) |
| hirame | 172.31.22.2 | 173.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) 経由で届いている。 これは内部通信として想定外。
// 原因分析 (当時)
- hirame の
/etc/hostsに 2行:173.0.0.9 cloud.k2-o.net+192.168.20.21 cloud.k2-o.net - hirame は VLAN20 を持たない → 192.168.20.21 に到達不可
- DNS フォールバックで外部DNS (パブリックIP) を解決
- 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 | 範囲 | ホスト数 |
|---|---|---|
| /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 制限
- 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-host | cloud.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 IP | 192.168.30.21 (R640 出口) | 173.0.0.6 (hirame SM-fabric) |
| wopi_allowlist | 173.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分で済む。
