R640 WireGuard剥がし — 完了レポート
// R640 PIVOT — Phase 1+2+3 完遂 (2026-05-14) / Phase 4 残: VPS解約 + 他サイト移行
完了 Phase 1〜3 (基盤・移行・WG剥がし・DMZ化) 完遂 残 VPS解約 (xserver 6月末) + 他クライアントHP移行
最終アーキテクチャ (実装済)
┌──────────────────────────────────────────┐
│ katuocloud (統一ブランド) │
│ “築地から世界へ” 自社インフラ運用 │
└──────────────────────────────────────────┘
↓
┌───────────────────┴────────────────────┐
│ │
┌───┴──────────────────┐ ┌──────────┴──────────────┐
│ Web Service層 │ │ Secure Storage層 │
│ R640 (katuo) │ │ Supermicro (maguro) │
│ DMZ公開フロント │ │ WG必須プライベート │
└──────────────────────┘ └──────────────────────────┘
├─ katuocloud.com ├─ cloud.k2-o.net (NC)
│ WordPress (LE cert) │ 既存5人体制継続
├─ nginx stream SNI router ├─ mikyun-portal (運営・顧客・VPN engine)
│ └─ cloud.k2-o.net → ├─ WG: wg-clients/customers/storage
│ maguro:443 passthrough ├─ Nextcloud Talk
└─ /mnt/data LUKS 3.3T ├─ MariaDB + Redis + bcache
└─ /srv/storage 64TB XFS
┌────────────────────────────┐
│ Office Layer │
│ hirame (X58A-UD3R) │
│ Collabora Online (Docker) │
│ fabric直結 173.0.0.4/30 │
└────────────────────────────┘
達成事項: 物理ホスト名 (katuo / maguro / hirame) は変更せず、 ブランドだけ「katuocloud」で統一。 既存5人のNCユーザーには切替時に断続なく移行完了。
サブドメイン / DNS 実態整理
| FQDN | 役割 | 到達経路 | Cloudflare |
|---|---|---|---|
katuocloud.com | WP公開サイト | 外部DNS → RTX NAT (20000/11) → R640 nginx SNI → R640 inner (127.0.0.1:8443) | DNS only |
www.katuocloud.com | 同上 | 同上 | DNS only |
cloud.k2-o.net | Nextcloud (既存) | 外部DNS → R640 SNI → maguro:443 passthrough | DNS only |
office.k2-o.net | WG必須 (内部用) | WG 越し | — |
vpn.k2-o.net | WG エンドポイント | RTX NAT (UDP 54024) → maguro:54024 | DNS only |
admin.wan-secure.net | 運営ポータル | maguro (WG経由) | — |
office.wan-secure.net | WG必須サービス | maguro (WG経由) | — |
方針変更: 当初計画にあった
wp.katuocloud.com / cloud.katuocloud.com / meet.katuocloud.com / mail.katuocloud.com / secure.katuocloud.com は不採用。 既存 cloud.k2-o.net (NC) と katuocloud.com (WP) の二本立てで運用継続中。
実施履歴
Phase 1 / 2026-05-12〜13: 基盤・スイッチ・LACP整理
- ✓ 12XS/T48 スイッチ大規模再設定 (VLAN70新設、 Po1削除、 全ポート左シフト、 Po70新設 20G LACP)
- ✓ 全 LACP bond 健全化 (80Gbps)
- ✓ maguro NIC増設 + VLAN70
- ✓ 永続化設定 (re-boot safe)
- ✓ Telegram監視スクリプト 3本改善
- ✓ 初期フルバックアップ + リストア検証 (97MB、 18ファイル SHA256 一致)
- ✓ Phase A〜D: orphan NC DB削除、 HOST→Docker MariaDB統合、 mikyun-portal コンテナ化
Phase 2 / 2026-05-14: Nextcloud + mikyun-portal → maguro 全面移植
- ✓ NC stack (mariadb:11 + redis:7-alpine + nextcloud-stack-app) を maguro
/opt/nextcloud/compose/で稼働 - ✓ NC データを maguro
/srv/storage/nextcloud-data/へ rsync - ✓ mikyun-portal を maguro Docker image
mikyun-portal:1.1として稼働 - ✓ ホスト MariaDB の mikyun_cloud DB を Docker MariaDB へ統合
- ✓ WireGuard wg-clients (10.200.0.0/16) / wg-customers (61001) / wg-storage (62001) を maguro へ移植
- ✓ nginx vhost (cloud.k2-o.net 等) を maguro へ
- ✓ Let’s Encrypt 証明書を maguro snap certbot で再発行
Phase 3 / 2026-05-14: R640 再構築 + DMZ転換
- ✓ ディスク再構成: 6本 RAID10 (3.3T) + 2本 RAID1 (1.1T OS)
- ✓
/mnt/dataLUKS化 + auto-unlock (keyfile/etc/cryptsetup-keys.d/data.key) - ✓ Ubuntu 22.04 fresh install + Xfce (GNOME は Matrox G200 で不安定)
- ✓ katuocloud.com WP を xserver VPS から R640 へ rsync 移行 (fabric 経由)
- ✓ wp-config.php に
HTTP_X_FORWARDED_PROTO対応追加 (301ループ防止) - ✓ Let’s Encrypt 本物 cert 取得 (katuocloud.com + www)
- ✓ nginx stream module + ssl_preread で SNI 振り分け
- ✓ R640 WG完全停止・退避 (元の
/etc/wireguard/はwireguard-r640-snapshot/に保存済)
Phase 4 / 残作業
- ! xserver VPS (162.43.8.20) 解約 (¥3,000/月節約、 月末まで)
- ! 他クライアントHP (can-construction, shinkoujyuusetu 等) 移行 — 未着手
- ! WiFi 移管 (VLAN80 独立) finalize
- ! iDRAC Console Redirection 無効化 (Web手作業)
R640 WG剥がし手順 (実施済記録)
WG関連を削除でなく退避方式で実施。 緊急時の復活も可能な状態を維持している。
# 1. 現状WG確認 sudo wg show # 2. WG停止 sudo systemctl stop wg-quick@wg0 wg-quick@wg1 wg-quick@wg2 sudo systemctl disable wg-quick@wg0 wg-quick@wg1 wg-quick@wg2 # 3. WG関連ファイル退避 (R640再構築前にスナップショット取得) sudo cp -r /etc/wireguard /etc/wireguard-r640-snapshot # → 現在 /etc/wireguard-r640-snapshot/ に wg0/wg1/wg2 + disabled/wg0.base.conf 保管 # 4. WG用ポート (UDP 54024 等) は RTX1300 NAT を maguro 向けに切替 # RTX1300 NAT エントリ (現状): # 20000/10 udp 54024 → 192.168.70.30:54024 (maguro wg-clients) # 20000/13 udp 61001 → 192.168.70.30:61001 (wg-customers) # 20000/14 udp 62001 → 192.168.30.30:62001 (wg-storage) # 20000/11 tcp 443 → 192.168.20.21:443 (R640 nginx SNI) # 20000/12 tcp 80 → 192.168.20.21:80 (R640 nginx) # 5. R640 OS再インストール時に WG 一式は新OS に持ち込まず
緊急時の WG 復活: snapshot ディレクトリから戻して再有効化可能。 ただし maguro 側でも並行運用中のため、 ピア鍵衝突に注意。
セキュリティ多層防御 (現状)
// Layer 0: 物理・回線
- 業務用フレッツ光 + 固定IP
- UPS導入済
- R640: HW RAID10 (PERC H730P)、 maguro: SW RAID + LUKS + bcache
/mnt/data(R640) と LUKS raid1-4 (maguro) は auto-unlock keyfile で起動時自動マウント
// Layer 1: Cloudflare (DNS only)
現状は DNS only (proxy なし)。 SNI による振り分けが必要なため、 Cloudflare の TLS終端は使えない。
// Layer 2: nginx (R640 + maguro)
# R640 nginx - stream module + ssl_preread で SNI 判定 - katuocloud.com → inner block (LE cert で終端) - cloud.k2-o.net → maguro へ TCP passthrough - /wp-admin は IP制限 (作業時のみ開放) ※未実装 # maguro nginx - cloud.k2-o.net 等の最終終端 - WOPI コールバックは fabric subnet (173.0.0.0/29) のみ許可 - location / の allow: 192.168.30.21 (R640 SNI), 192.168.20.0/24, 10.200.0.0/16 等
// Layer 3: Fail2ban
! 未実装。 nginx access.log と sshd の brute-force 検知設定は今後追加予定。
// Layer 4: 監視 (Telegram)
全ホストに監視 timer/cron を配置:
| ホスト | 監視内容 | 周期 |
|---|---|---|
| maguro | supermicro_watch (md/storage/NFS/ATA/LUKS×5) | 5min |
| maguro | mdadm_watch (md0) | 5min |
| maguro | raid_watch (IPMI SEL) | 5min |
| maguro / R640 | cert_watch (LE全証明書<14日警告/失効) | daily 06:30 |
| R640 | perc_watch (SAS×8 + NVMe×2 + megaraid kernel) | 5min |
| R640 | wp-katuocloud-db-backup (失敗+サイズ異常) | daily 02:30 |
// Layer 5: バックアップ (3-2-1)
- WP DB daily backup →
/mnt/data/backup/wp/katuocloud_wp/*.sql.gz(14日保持) - NC データは
/srv/storage/nextcloud-data/+ Time Machine 的に Snapshot 想定 (未実装) - 月次オフサイト: 検討中 (Backblaze B2 / wasabi 等)
Collabora 接続 — fabric 直結化 (2026-05-14)
Collabora (hirame) と maguro NC の WOPI 接続経路を、 旧 R640 SNI 経由から fabric 直結 に変更。 セキュリティ・性能・可用性を同時に向上。
| 項目 | 旧 (R640 SNI 経由) | 新 (fabric 直結) |
|---|---|---|
Collabora --add-host | cloud.k2-o.net:173.0.0.9 (R640 fabric) | cloud.k2-o.net:173.0.0.5 (maguro fabric) |
| ホップ数 | 3 (container → R640 SNI → maguro) | 1 (container → maguro) |
| maguro 着信時 remote_addr | 192.168.30.21 (R640 VLAN30 IF) | 173.0.0.6 (hirame SM-fabric IF) |
NC wopi_allowlist | 173.0.0.9, 173.0.0.10, 192.168.30.21, 192.168.20.21, 119.26.175.225 | 173.0.0.4/30, 173.0.0.8/30, 119.26.175.225 |
知見: R640 SNI passthrough は L4 (TCP生proxy) で source IP が R640 出口IFに置換される。 内部 LAN クライアントも cloud.k2-o.net を外部DNSで解決すると R640 SNI 経由になり、 全部 192.168.30.21 と見える。 nginx allow から「R640 SNI IP」を消すと、 内部 LAN ユーザーが access forbidden になるため要注意。
想定外シナリオへの備え
// もし R640 が落ちたら
- katuocloud.com (WP) は閲覧不可
- cloud.k2-o.net (NC) は SNI 経由が落ちるが、 内部 LAN + WG クライアントは fabric / 内部VLAN 経由で生存
- Collabora は fabric 直結化により R640 経由を不要としたため、 NC ⇄ Collabora は継続稼働
// もし maguro が落ちたら
- cloud.k2-o.net (NC) 全停止
- WG 全顧客接続不可
- katuocloud.com (R640内 WP) は継続稼働
// もし固定IPが変わったら
- 業務用フレッツなので原則変わらない
- 万一の時は Cloudflare DNS Aレコード更新でカバー
- RTX NAT は内部IP指定なので影響なし
完了後の状態 (確認可能)
| 機器 | 役割 | 主要サービス | 監視 |
|---|---|---|---|
| R640 (katuo) | DMZ + Webサーバー | nginx SNI router + WordPress (katuocloud.com) | perc-watch, cert-watch, WP backup |
| Supermicro (maguro) | セキュアストレージ + WG + Portal | Nextcloud + mikyun-portal + WG (wg-clients/customers/storage) | supermicro/mdadm/raid-watch, cert-watch |
| hirame | Collabora Online | Collabora Code (Docker, fabric直結) | — (本体OSの監視は別途) |
Phase 1〜3 完遂。 残るは VPS解約 (¥3,000/月節約) + 他クライアント HP移行 + Fail2ban 等のセキュリティ強化。 営業時には「自社インフラ運用 (Tier1相当の冗長性・暗号化・監視体制)」を武器に変えられる状態。
Phase 4 残作業 + Phase 5〜8 計画 (2026-05-14 検討、 実施は数日後)
残 Phase 4 (期限あり) + 計画 Phase 5〜8
Phase 4 (期限あり)
| 項目 | 期限 | 担当 |
|---|---|---|
| xserver VPS (162.43.8.20) 解約 | 6月末 | わん Web手続き |
| WiFi VLAN80 移管 finalize | — | 共同 |
Phase 5: R640 を WP/NC ホスティング基盤に整備
// 5a: Cockpit (OS+コンテナ統合GUI) 設置 [所要 30分・リスク低]
apt install cockpit cockpit-docker→systemctl enable --now cockpit.socket- ポート
9090を内部のみ公開 (WG経由でアクセス)、 外部公開する場合は LE cert + nginx SNI で振り分け - HTTPS 自己署名 cert で初期動作、 LE は別途
- cockpit-docker plugin で OS と Docker container を 1画面で管理 (cPanel感)
// 5b: Nginx Proxy Manager (NPM) 設置 [所要 1〜2時間・要注意]
| 項目 | 内容 |
|---|---|
| 役割 | リバプロ + SSL 自動取得 GUI (LE 自動更新含む) |
| ポート衝突 | NPM は 80/443 を握る → 既存 nginx stream SNI router と衝突 |
| 解決方針 | (1) NPM を内部ポート 8080/8443 で起動 → (2) 動作確認 → (3) 既存 nginx 停止 + NPM に 80/443 譲渡 |
| stream 対応 | NPM の stream機能で TCP/UDP passthrough も GUI 設定可能 |
// 5c: WP テンプレート + 共通ライブラリ設計 [所要 2〜4時間]
/srv/wp-lib/: mu-plugins、 共通 PHP コード、 セキュリティ baseline (WP Hardening、 2FA、 fail2ban-wp 等)/srv/wp-templates/<業種>/: 業種別雛形 (飲食 / 建築 / 動画 / サービス業)/srv/wp-customers/<name>/: 顧客個別ディレクトリ- プロビジョニング:
wp_new_customer.sh <name> <template> <customer.env>で WP-CLI ベース一発展開 - 狙い: 顧客情報を流し込むだけで爆速展開 + 均一品位 (画一的な高品質)
// 5d: NVMe RAID1+LUKS (高速プラン用 storage) [所要 1時間・既存影響無]
- R640 内蔵 NVMe ×2 (Toshiba 512GB + KIOXIA 512GB) を活用
- mdadm RAID1 → LUKS → ext4/xfs →
/srv/wp-nvme/ - auto-unlock keyfile (既存
/etc/cryptsetup-keys.d/と同じ仕組み) - サイト表示速度重視プランの WP データ置き場
Phase 6: 既存 WP 全移行 (xserver VPS 他 → R640) [サイト数次第]
- 各サイトを isolated docker-compose で立ち上げ (nginx+php-fpm+mariadb 個別)
- rsync + mariadb-dump で R640 に移行
- DNS Cloudflare A レコード切替 (事前に TTL 300秒に下げてから)
- Let’s Encrypt cert 個別取得
- サイトごとの WP version / プラグイン互換性確認
Phase 7: R640 に Open Nextcloud 新設 [所要 2時間]
| 項目 | 内容 |
|---|---|
| 方針 | WG不要・公開 NC instance、 既存 maguro NC (WG必須5人) とは別 instance |
| hostname 候補 | files.katuocloud.com / cloud-open.katuocloud.com 等 |
| セキュリティ | 2FA 必須 / Brute Force Settings / Cloudflare proxy / 監査ログ / Fail2ban |
| データ置き場 | HDD (標準) or NVMe (高速プラン)、 maguro NFS export も検討 |
Phase 8: Collabora R640 統合 + hirame 停止 [所要 1時間]
- R640 で Collabora docker container 立ち上げ
aliasgroup1=cloud.k2-o.net+aliasgroup2=files.katuocloud.com等で 1 Collabora で 2 NC 兼用- maguro NC の
wopi_urlを173.0.0.10:9980 (hirame)→173.0.0.2:9980 (R640)に変更 - 動作確認後、 hirame 停止 (電気代節約 — i7-980X世代 130W級)
- hirame の将来活用候補: 検証 docker host / 代替 backup / Open NC 移管 等
問題点と検証ポイント
1. R640 単一障害点リスク: 全機能集約で R640 down 時の影響大。 hirame 停止後は冗長性が落ちる。 maguro は NC + Portal + WG + Storage を持つので、 R640 障害でも maguro 側は生存可能だが、 katuocloud.com / 移行 WP / Open NC / Collabora は全滅する。
2. NPM と既存 nginx の共存: 既存 stream SNI router がポート 80/443 を握っている。 NPM 切替時に短時間ダウンタイム発生。 (a) NPM を内部ポートで起動 → (b) 動作確認 → (c) 既存 nginx 停止 + NPM に 80/443 譲渡、 が安全。
3. DNS 切替時のダウンタイム: Cloudflare の A レコード変更は TTL ベース。 事前に TTL を 300秒に下げて切替、 完了後に長くする。
4. 公開 Nextcloud のセキュリティ: WG なし = brute force / scanner / DDoS リスク。 必須対策: 2FA 全ユーザ強制 / fail2ban / Cloudflare proxy 経由 / Brute Force Settings app / 監査ログ。
5. WP テンプレート設計の複雑さ: 雛形が増えるとメンテ負担増。 まずは 2〜3 業種で start、 顧客増えてから拡張。
6. バックアップ戦略の再設計: WP複数 + Open NC で backup 対象増。
wp-katuocloud-db-backup を template化 して 全 WP サイトに展開、 NC も同様に。
推奨実施順 (リスク低 → 高)
| 順 | Phase | 所要 | リスク |
|---|---|---|---|
| 1 | 5a: Cockpit | 30分 | 低 |
| 2 | 5d: NVMe RAID1+LUKS | 1時間 | 低 (新規) |
| 3 | 5c: WP テンプレート設計 | 2〜4時間 | 低 (静的) |
| 4 | 5b: NPM (既存 nginx 並行運用 → 段階置換) | 1〜2時間 | 中 |
| 5 | 6: WP 全移行 | 1〜2時間/サイト | 中 (DNS切替) |
| 6 | 8: Collabora R640 統合 (hirame 停止は最後) | 1時間 | 中 |
| 7 | 7: Open NC 新設 | 2時間 | 高 (公開・セキュリティ) |
| 8 | hirame 停止 | 5分 | 低 |
Phase 4 (期限あり)は並行で: xserver VPS 解約 (Phase 6 完了後)、 WiFi VLAN80 移管 (任意のタイミング)
合計時間目安: 半日〜1日 (10〜14時間 = 検証時間込みで 2〜3日 分散実施推奨)。 各 Phase は独立して実施可能、 失敗時の影響範囲も限定的に設計。
📌 Phase 5a + 5b 実行ログ (2026-05-15)
実施時刻: 2026-05-15 03:50〜03:55 JST (約25分、別端末コード君が他サーバ作業中につき競合確認の上で並行実施) 事前競合チェック (全クリア):- R640 アクティブ SSH セッションは作業端末のみ (
192.168.10.10)、他者ログイン無し apt/dpkg稼働中プロセス無し、ロック無し- tty2 の gnome-session は 11時間アイドルの local desktop 残骸 (作業と無関係)
- 別端末コード君は他サーバ (maguro 想定) で作業中と判断 → R640 単独使用OK
✅ Phase 5a: Cockpit 導入完了
| 項目 | 内容 |
|---|---|
| インストールパッケージ | cockpit cockpit-storaged cockpit-networkmanager cockpit-packagekit cockpit-pcp (Ubuntu 22.04 archive) |
| サービス状態 | cockpit.socket enabled + active (listening) |
| LISTEN | [::]:9090 (IPv4/IPv6 両対応) |
| HTTPS 応答 | HTTP 200 (自己署名証明書、初回ブラウザ警告は許容で進む) |
| アクセスURL | https://192.168.10.21:9090/ |
| ログイン | katuo / OSパスワード (sudo 権限あり) |
| UI 言語 | ブラウザ Accept-Language に従う (日本語ブラウザなら日本語表示) |
| PCP 監視 | pmcd / pmlogger / pmie / pmproxy systemd unit 自動有効化 → Cockpit でリソースグラフ表示可 |
- サーバー概要: CPU / メモリ / ディスク / ネットワーク グラフ (PCP 連携)
- ログ: journalctl の検索可能 GUI
- ストレージ: LUKS / mdadm / LVM / NFS の状態確認
- ネットワーク: NetworkManager 経由でインターフェース・ブリッジ管理
- サービス: systemd unit の起動/停止/有効化
- ターミナル: ブラウザ内 SSH 不要のシェル
- ソフトウェア更新: PackageKit 経由 (注意: 既存 unattended-upgrades と棲み分け)
✅ Phase 5b: Nginx Proxy Manager 導入完了 (既存 nginx と共存)
戦略: 既存 stream SNI router (port 80/443) を絶対に壊さないため、NPM は代替ポートで起動。後日 Phase 6 (WP 全移行) の段階で 80/443 を NPM に譲渡する。| 項目 | 内容 |
|---|---|
| イメージ | jc21/nginx-proxy-manager:latest (Docker Hub) |
| compose 配置 | /srv/npm/docker-compose.yml |
| データ永続化 | /srv/npm/data /srv/npm/letsencrypt |
| ポート割当 | 81→81 (管理GUI) / 8181→80 (HTTP proxy) / 18443→443 (HTTPS proxy) |
| コンテナ状態 | npm Up running (restart: unless-stopped) |
| LISTEN | 0.0.0.0:81 0.0.0.0:8181 0.0.0.0:18443 |
| HTTP 応答 | HTTP 200 (NPM admin UI HTML) |
| アクセスURL | http://192.168.10.21:81/ |
| 初期ログイン | admin@example.com / changeme → 初回ログイン直後にパスワード変更必須 |
| compose 環境 | docker-compose-v2 (apt universe) v2.40.3 + docker.io 29.1.3 |
| 追加対応 | katuo を docker グループ追加 (次回SSHから sudo 不要) |
- nginx.service: active (running) — 既存 SNI router 無傷
nginx -t: syntax OKhttps://katuocloud.com(SNI ルーター経由): HTTP 200 維持- cockpit.socket: active
- npm container: running
- 3者並列稼働、相互干渉なし
R640 ポート状況 (Phase 5b 完了後)
| Port | 用途 | 所属 |
|---|---|---|
| 22 | SSH | OS |
| 80 | HTTP (ACME challenge / katuocloud.com 等) | 既存 nginx |
| 81 | NPM 管理 GUI | NPM (新規) |
| 443 | HTTPS (stream SNI router) | 既存 nginx |
| 8181 | NPM HTTP プロキシ (将来 80 へ移行) | NPM (新規) |
| 8443 | katuocloud.com SSL 終端 (内部、127.0.0.1) | 既存 nginx |
| 9090 | Cockpit 管理 GUI | Cockpit (新規) |
| 18443 | NPM HTTPS プロキシ (将来 443 へ移行) | NPM (新規) |
次のステップ
- NPM 初回ログイン → admin パスワード変更 (admin@example.com / changeme から変更必須)
- Cockpit ブラウザ動作確認 → 日本語UI / リソースグラフ / ターミナル動作 を実機確認
- Phase 5c (WP テンプレートライブラリ設計) または Phase 5d (NVMe RAID1+LUKS) へ進む
- Phase 5b の 80/443 譲渡は Phase 6 (WP 全移行) と同じタイミングで実施 (DNS切替前にダウンタイム最小化策を準備)
📌 Phase 8 完了報告 (2026-05-15 06:00 JST) — Collabora R640 統合
結果: Collabora を hirame → R640 へ完全移植、 ブラウザでの .docx/.odt 編集動作確認済。 hirame はsystemctl poweroff で停止。
所要時間実績: 04:30 開始 → 06:00 完了 = 約1.5時間 (見積1時間からトラブル分 +30分)。 切り分け工程多数。
最終構成 (確定)
| 項目 | 値 |
|---|---|
| Collabora host | R640 (katuo) |
| fabric Listen | 173.0.0.2:9980 |
| image | collabora/code:latest (25.04.9.4) |
| compose 配置 | /srv/collabora/docker-compose.yml |
| aliasgroup mode | groups (extra_params 明示) |
| aliasgroup1 host | https://cloud\.k2-o\.net:443 |
| extra_hosts | cloud.k2-o.net:173.0.0.1 (maguro fabric) |
| net.post_allow.host | 127.0.0.1, ::1, 173.0.0.1 |
NC wopi_url | http://173.0.0.2:9980 |
NC DocumentServerInternalUrl | http://173.0.0.2:9980/ |
NC wopi_allowlist | 173.0.0.0/30, 173.0.0.4/30, 173.0.0.8/30, 119.26.175.225 |
| maguro nginx 3ファイル (cloud/office/office-secure) | 173.0.0.2:9980 へ proxy_pass |
| maguro nginx wopi location allow | 173.0.0.0/30 追加 |
| hirame | poweroff (Collabora container 削除済) |
つまづきポイント 7 つ (詳細は nc-collabora ページ)
DocumentServerInternalUrlはwopi_urlとは別の設定、両方更新必要- NC
wopi_allowlistと nginxallowは別物、両方更新必要 - maguro
sites-enabled/cloud.k2-o.netは実ファイル (シンボリックリンクでない) - nginx backup ファイルを sites-enabled に置くと conflicting server_name で旧設定が勝つ場合あり
- Collabora
aliasgroup1env var は coolwsd.xml に反映されない → extra_params で明示 extra_hostsの IP は移植先の fabric 接続先に合わせ変更必須- Collabora
convert-toはnet.post_allow.hostという別 allow リスト
動作確認の正規ルート
- R640 self:
curl http://173.0.0.2:9980/hosting/capabilities→ JSON - maguro→R640: 同上 (maguro から実行)
- Collabora 内DNS:
docker exec collabora getent hosts cloud.k2-o.net→ 173.0.0.1 - Collabora→NC:
docker exec collabora curl -sk https://cloud.k2-o.net/status.php→ 200 - 外部 UI:
curl https://cloud.k2-o.net/browser/dist/cool.html→ 200 - 外部 discovery:
curl https://cloud.k2-o.net/hosting/discovery→ 200 + XML - NC 再キャプ:
occ richdocuments:activate-config→ 全 ✓ - ブラウザで .docx 編集 → ✅
ロールバック手順 (もし問題が再発したら)
hirame は poweroff したので即時 rollback はできない。 hirame を起動 → Collabora container を立ち上げ直して NC config を 173.0.0.10:9980 に戻す。 約30分。 ただし 7 つの罠が同様に出るので、 むしろ R640 上で trouble shoot する方が早い場合多し。
記録者: コード君 (Claude Opus 4.7、別セッション)。🕐 2026-05-15 実行タイムライン (コマンド・結果すべて)
担当: コード君 (Claude Opus 4.7、別セッション) / 03:50〜06:10 JST 計約2時間20分 別端末コード君: 同時刻 xserver→R640 WP移行プラン起草 (実行は別) 競合: 別コード君は他サーバ作業中、R640 は単独使用 OK 確認済03:50〜03:55 — Phase 5a (Cockpit)
| 時刻 | コマンド | 結果 |
|---|---|---|
| 03:50 | SSH 接続テスト + 競合確認 (w, ss, fuser /var/lib/dpkg/lock*, .bash_history) | 他SSHセッション無し、apt/dpkg ロック無し |
| 03:51 | sudo apt-get install cockpit cockpit-storaged cockpit-networkmanager cockpit-packagekit cockpit-pcp | パッケージ全部 OK インストール |
| 03:52 | systemctl enable --now cockpit.socket | [::]:9090 LISTEN、curl HTTPS 200 |
03:55〜04:00 — Phase 5b (NPM)
| 時刻 | コマンド | 結果 |
|---|---|---|
| 03:55 | apt install docker-compose-v2 (Ubuntu universe v2.40.3) | インストール OK |
| 03:56 | usermod -aG docker katuo + mkdir -p /srv/npm/{data,letsencrypt} | OK |
| 03:57 | /srv/npm/docker-compose.yml 作成 (jc21/nginx-proxy-manager:latest、ポート 81→81 / 8181→80 / 18443→443) | OK |
| 03:58 | docker compose up -d | container npm Started、81/8181/18443 LISTEN、HTTP 200 |
| 03:59 | 既存 nginx 共存確認 (systemctl is-active nginx + curl https://katuocloud.com) | active / HTTP 200 維持 |
04:00〜04:30 — wanchance.com Phase 5a+5b ログ追記の試行錯誤
| 時刻 | 事象 | 解決 |
|---|---|---|
| 04:00 | WP REST API auth 401 失敗 (username=”コード君” 試行) | username は実 email neo.wan.chance@gmail.com |
| 04:01 | POST content で raw 更新 → 200 OK だが public ページに反映されず | 原因: ページが Elementor 製、_elementor_data 側のウィジェットを更新する必要 |
| 04:02 | maguro 上 /tmp/wp/update_page.py で widget id=3dbf7c3 を更新 → 200 OK | 正規ルート確立 |
| 04:03〜10 | 公開ページが依然古いまま (バイト完全一致 158,368B) | xserver Xアクセラレータ Ver.2 キャッシュ。 サーバーパネルから手動 flush 必要 (memory reference_wanchance_cache.md に記録) |
04:30〜04:35 — Phase 5d (NVMe RAID1 + LUKS2)
| 時刻 | コマンド | 結果 |
|---|---|---|
| 04:30 | NVMe 状態調査 (smartctl, lsblk, /proc/mdstat) | 既に RAID1 (md0) 構築済、plain ext4、/mnt/nvme-cache、中身 lost+found のみ |
| 04:31 | 重要データ事前チェック (find, lsof, fuser, grep -r nvme-cache /etc/ /opt/ /srv/ /root/, docker volume ls) | NPM のみ /srv 使用、NVMe 未参照、データ無し |
| 04:32 | umount /mnt/nvme-cache + fstab 該当行削除 (バックアップ /etc/fstab.bak.20260515-phase5d) + rmdir /mnt/nvme-cache | OK |
| 04:32 | install -m 0400 /dev/null /etc/cryptsetup-keys.d/nvme.key + dd if=/dev/urandom bs=1 count=4096 | keyfile 4096B 生成 |
| 04:33 | cryptsetup luksFormat /dev/md0 --type luks2 --batch-mode --key-file /etc/cryptsetup-keys.d/nvme.key | LUKS2 format 完了 |
| 04:33 | cryptsetup open /dev/md0 nvme --key-file /etc/cryptsetup-keys.d/nvme.key + mkfs.ext4 -L wp-nvme /dev/mapper/nvme + mkdir -p /srv/wp-nvme && mount /dev/mapper/nvme /srv/wp-nvme | 469GB available |
| 04:34 | /etc/crypttab + /etc/fstab 追記 (LUKS_UUID=30483e91-3f68-4361-9d30-71c071fde6fd / FS_UUID=5370ffcd-24ff-4d0e-ac02-563e5846eea9) | OK |
| 04:35 | auto-unlock 検証: umount → cryptsetup close nvme → systemctl daemon-reload → systemctl start systemd-cryptsetup@nvme.service → mount /srv/wp-nvme | active (exited) / 再mount OK、再起動レスでブート再現成功 |
04:35〜04:50 — Phase 8 (Collabora R640 統合) 初動
| 時刻 | コマンド | 結果 |
|---|---|---|
| 04:35 | hirame 上 Collabora docker inspect (image, env, ports, server_name, aliasgroup1) | image=collabora/code、aliasgroup1=https://cloud\.k2-o\.net:443 |
| 04:36 | R640 fabric 疎通 (ip -4 addr、ping 173.0.0.1) + maguro NC occ richdocuments 設定確認 | R640: 173.0.0.2 (→maguro)、wopi_url=http://173.0.0.10:9980 (hirame) |
| 04:37 | /srv/collabora/docker-compose.yml v1 作成 + docker compose up -d | container started、173.0.0.2:9980 LISTEN、capabilities 応答 OK |
| 04:38 | maguro NC occ config:app:set richdocuments wopi_url --value=http://173.0.0.2:9980 + occ richdocuments:activate-config | capabilities 全 ✓、Detected WOPI server 25.04.9.4 |
| 04:48 | hirame Collabora 停止 (docker stop && docker rm collabora) + R640/maguro Collabora 確認 | hirame Collabora 完全停止、R640 単独稼働 |
| 04:50 | hirame systemctl poweroff | SSH 接続不能で停止確認 |
04:50〜06:00 — Phase 8 トラブルシュート (7 つの罠突破)
| 時刻 | 症状 / 修正 | 結果 |
|---|---|---|
| 05:00 | 症状: 「ドキュメントの読み込みに失敗 / Nextcloud Office が読み込めませんでした」 | NC エラーログ: Failed to fetch capabilities: 173.0.0.10:9980 → DocumentServerInternalUrl が hirame のまま |
| 05:01 | 修正: occ config:app:set richdocuments DocumentServerInternalUrl --value=http://173.0.0.2:9980/ + wopi_allowlist に 173.0.0.0/30 追加 + activate-config | capabilities 全 ✓ 再確認 |
| 05:03 | wanchance.com の Collabora 関連ページ (r640wgdatu / collabora-online / nc-collabora) を WebFetch で熟読 | 「maguro nginx で /browser /cool /hosting/* を hirame に proxy_pass」「extra_hosts で Collabora 内部DNS 設定」など重大な見落とし発見 |
| 05:04 | maguro nginx 3 設定 (cloud.k2-o.net / office.k2-o.net / office.wan-secure.net) で sed -i s|http://173.0.0.10:9980|http://173.0.0.2:9980|g → reload | sites-available 編集、reload OK だが… |
| 05:05 | 外部から /browser/dist/cool.html が 502 Bad Gateway | 原因判明: sites-enabled/cloud.k2-o.net は実ファイル (シンボリックリンクでない)。 sites-available 側の sed は反映されない |
| 05:06 | sed -i を sites-enabled/cloud.k2-o.net 実ファイル側に再実行 + reload | nginx: conflicting server_name 警告。 私が作成した .bak.20260515-052X-collabora-r640 も sites-enabled に置いてしまっていた |
| 05:07 | backup を mv ... /etc/nginx/sites-available/ へ移動 + reload | 外部 /browser/dist/cool.html, /hosting/discovery, /hosting/capabilities すべて 200 OK |
| 05:30 | R640 Collabora compose v2 (extra_hosts: cloud.k2-o.net:173.0.0.1 追加) → down && up | container 内 DNS で cloud.k2-o.net→173.0.0.1 解決、Collabora→NC /status.php 200 |
| 05:45 | 症状: 「認証されていないWOPIホストです」 | coolwsd.xml が alias_groups mode="first" のまま、env aliasgroup1 反映されてない |
| 05:50 | compose v3 (extra_params に --o:storage.wopi.alias_groups.mode=groups --o:storage.wopi.alias_groups.group[0].host=https://cloud\.k2-o\.net:443 --o:storage.wopi.alias_groups.group[0].host[@allow]=true) → down && up | process args 反映確認、ready to accept |
| 05:58 | 症状: 「認証されていないWOPIホスト」依然 | Collabora ログ: WOPI::CheckFileInfo returned 403 (Forbidden) for https://cloud.k2-o.net/... |
| 05:59 | maguro nginx /index.php/apps/richdocuments/wopi/ location の allow リストに allow 173.0.0.0/30; 追加 + reload | container 内から curl で /wopi/files/test → 500 (NC アプリ層エラー、nginx 通過) |
| 06:00 | わんさん ブラウザで .docx 開く → ✅ 動作 | Phase 8 完全完了 |
06:00〜06:10 — ドキュメント記載
- wanchance.com page 658 (
nc-collabora): 7 つの罠 + 切り分けチート + 動作確認 8 段階 を新セクション追加 - wanchance.com page 1191 (本ページ): Phase 8 完了報告 + 最終構成 + 罠サマリ 追記
- ローカル worklog 3 本作成:
worklog/20260515_phase5ab_r640.mdworklog/20260515_phase5d_phase8.mdworklog/20260515_phase8_collabora_traps.md
- わんくんが見るところ:
phase7_open_nc_checklist.html(Phase 7 仕様検討書、HTML+CSS スタイリング) - 別コード君引き継ぎ:
R640_STACK_READY_for_WP_migration.md
📊 全実行コマンド集計
| カテゴリ | 件数 |
|---|---|
| SSH コマンド (R640 / maguro / hirame) | 約 80 件 |
| apt インストール | cockpit×5 / docker-compose-v2 / cryptsetup (既存) など |
| docker compose up/down | NPM 1回、Collabora 3回 (v1/v2/v3 イテレーション) |
| sed -i によるファイル編集 | maguro nginx 4ファイル (cloud×2, office, office-wan-secure)、fstab |
| NC occ 設定変更 | wopi_url / DocumentServerInternalUrl / wopi_allowlist / activate-config × 複数回 |
| WP REST API POST | page 1191 × 2回、page 658 × 1回 (Elementor + Gutenberg 両方) |
| ローカルファイル作成 | HTML 1本、Markdown 3本 |
🎯 完了サマリ
| Phase | 内容 | 状態 |
|---|---|---|
| 5a | Cockpit (https://192.168.10.21:9090/) | ✅ |
| 5b | NPM (http://192.168.10.21:81/)、既存nginx並走 | ✅ |
| 5d | NVMe RAID1+LUKS2 → /srv/wp-nvme (469GB) | ✅ |
| 8 | Collabora R640 統合 (罠 7 つ突破) | ✅ |
| hirame | poweroff | ✅ |
| 7 | Open NC 検討書 (最終仕上げ) | 📋 仕様策定のみ |
| 5c | WP テンプレート設計 | 📤 別コード君に委譲 |
| 6 | WP 移行 | 📤 別コード君が起草中 |
