Nextcloud Talk 外部ゲスト招待機能 構築完了

📅 実施日: 2026年4月5日
🎯 目的: WireGuard VPNを持たない外部ユーザーをNextcloud Talkに招待できる機能の実装
✅ 結果: 外部ゲスト招待が完全動作、チャット・ビデオ通話が正常に機能

実装概要

かつおcloud(みーきゅんクラウド)の顧客が、WireGuard VPNを持たない外部ユーザーをNextcloud Talkに招待し、チャット・ビデオ通話ができる機能を構築しました。

項目 内容
外部公開URL https://talk.katuocloud.com/
内部URL(WireGuard経由) https://cloud.k2-o.net/apps/spreed/
招待リンク形式 https://talk.katuocloud.com/call/xxxxx
アクセス経路 Cloudflare Tunnel → R640 nginx:9082 → Nextcloud Docker:9080
アーキテクチャ
【外部ゲスト(WireGuard不要)】
        ↓
https://talk.katuocloud.com/call/xxxxx
        ↓
Cloudflare Tunnel (6ace0e0b-373d-452f-80be-af40048d0875)
        ↓
R640 nginx port:9082 (talk.katuocloud.com専用vhost)
        ↓
Nextcloud Docker port:9080
        ↓
Nextcloud Talk アプリ

【かつおcloud顧客(WireGuard接続)】
        ↓
https://cloud.k2-o.net/apps/spreed/
        ↓
RTX1300 NAT (port 443)
        ↓
R640 nginx port:443 (cloud.k2-o.net)
        ↓
Nextcloud Docker port:9080
        ↓
Nextcloud Talk アプリ(招待リンク生成)
実装手順
Phase 1: バックアップ取得

作業前に手動バックアップを実行しました。

# Nextcloud完全バックアップ
bash /opt/mikyun/bin/nc_backup.sh

# hirame遠隔バックアップ
bash /opt/mikyun/bin/remote_backup.sh

# バックアップ確認
ls -lth /srv/storage/SM-storage/backup/nextcloud/ | head -5
Phase 2: Cloudflare Tunnel設定追加

既存のCloudflare Tunnel(portal.katuocloud.com用)に、Talk専用エンドポイントを追加しました。

# /etc/cloudflared/config.yml
tunnel: 6ace0e0b-373d-452f-80be-af40048d0875
credentials-file: /root/.cloudflared/6ace0e0b-373d-452f-80be-af40048d0875.json

ingress:
  - hostname: portal.katuocloud.com
    service: http://127.0.0.1:9000
  
  # 新規: Talk専用エンドポイント
  - hostname: talk.katuocloud.com
    service: http://127.0.0.1:9082
  
  - service: http_status:404

# cloudflared再起動
systemctl restart cloudflared
Phase 3: Cloudflare DNS設定

Cloudflareダッシュボードで以下のDNSレコードを追加しました。

Type Name Target Proxy
CNAME talk 6ace0e0b-373d-452f-80be-af40048d0875.cfargotunnel.com Proxied (🟠)
Phase 4: nginx設定追加

Talk専用のnginx vhostを作成し、port 9082でリスニングするよう設定しました。

# /etc/nginx/sites-available/talk.katuocloud.com
server {
    listen 9082;
    server_name talk.katuocloud.com;
    
    client_max_body_size 10G;
    
    # 完全にTalkを許可(セキュリティよりも動作優先)
    location / {
        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;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

# シンボリックリンク作成
ln -sf /etc/nginx/sites-available/talk.katuocloud.com /etc/nginx/sites-enabled/

# nginx再起動
nginx -t
systemctl reload nginx
Phase 5: Nextcloud設定

Nextcloud側でTalk専用ドメインを認識させ、ゲスト機能を有効化しました。

# trusted_domainsに追加
docker exec nextcloud-stack-app-1 php occ config:system:set trusted_domains 2 --value="talk.katuocloud.com"

# ゲスト機能有効化
docker exec nextcloud-stack-app-1 php occ config:app:set spreed enable_guests --value=yes

# 会話開始権限を全ユーザーに
docker exec nextcloud-stack-app-1 php occ config:app:set spreed start_conversations --value=0

# HTTPS強制認識
docker exec nextcloud-stack-app-1 php occ config:system:set overwriteprotocol --value="https"

# 招待リンク生成ドメインを固定
docker exec nextcloud-stack-app-1 php occ config:system:set overwritehost --value="talk.katuocloud.com"
docker exec nextcloud-stack-app-1 php occ config:system:set overwrite.cli.url --value="https://talk.katuocloud.com"
docker exec nextcloud-stack-app-1 php occ config:system:set spreed.baseUrl --value="https://talk.katuocloud.com"

# overwritecondaddr削除(動的判定を無効化)
docker exec nextcloud-stack-app-1 php occ config:system:delete overwritecondaddr

# JavaScriptキャッシュクリア
docker exec nextcloud-stack-app-1 rm -rf /var/www/html/data/appdata_*/js/*
トラブルシューティング
問題1: ポータル(portal.katuocloud.com)が別ページに置き換わった

原因: port 9000を手動起動したnohup python3 -m uvicornプロセスが占有していた。

解決策:

# 手動プロセスを停止
kill 78914

# 正規のsystemdサービスを起動
systemctl start mikyun-cloud.service
問題2: 静的ファイル(CSS/JS)が403 Forbidden

原因: nginx設定で/dist//custom_apps/パスが許可されていなかった。

解決策: 最終的に全パスを許可する設定に変更(location /)。

問題3: 招待リンクがcloud.k2-o.netでリダイレクトされる

原因: Nextcloudのoverwrite.cli.urlcloud.k2-o.netに設定されていた。

解決策:

# システム全体のoverwrite.cli.urlをtalk.katuocloud.comに変更
docker exec nextcloud-stack-app-1 php occ config:system:set overwrite.cli.url --value="https://talk.katuocloud.com"

# Talkアプリ側の設定を削除(システム設定を優先)
docker exec nextcloud-stack-app-1 php occ config:app:delete spreed overwrite.cli.url
問題4: 設定変更後もリンクがcloud.k2-o.netのまま

原因: ブラウザとNextcloudのキャッシュが残っていた。

解決策:

# overwritehostを明示的に設定
docker exec nextcloud-stack-app-1 php occ config:system:set overwritehost --value="talk.katuocloud.com"

# overwritecondaddrを削除
docker exec nextcloud-stack-app-1 php occ config:system:delete overwritecondaddr

# JavaScriptキャッシュクリア
docker exec nextcloud-stack-app-1 rm -rf /var/www/html/data/appdata_*/js/*

# ブラウザ側: Ctrl+F5でスーパーリロード
最終設定確認
Nextcloud config.php
'overwriteprotocol' => 'https',
'overwritehost' => 'talk.katuocloud.com',
'spreed.baseUrl' => 'https://talk.katuocloud.com',
'overwrite.cli.url' => 'https://talk.katuocloud.com',
'trusted_domains' => 
array (
  0 => 'cloud.k2-o.net',
  1 => 'files.wan-secure.net',
  2 => 'talk.katuocloud.com',
),
動作確認
テスト項目 結果
外部アクセス(WireGuard未接続) https://talk.katuocloud.com/call/xxxxx で正常にアクセス可能
ゲスト参加画面 ✅ 名前入力欄とビデオ通話UI表示
チャット機能 ✅ 正常動作
ビデオ通話機能 ✅ 正常動作(カメラ・マイク接続可能)
招待リンク自動生成 https://talk.katuocloud.com/call/xxxxx が自動生成
ポータル(portal.katuocloud.com) ✅ 正常動作
使用方法
顧客(WireGuard接続)側の操作
  1. WireGuard VPNに接続
  2. https://cloud.k2-o.net/ でNextcloudにログイン
  3. Talkアプリを開く
  4. 「新しい会話」でグループ会話を作成
  5. 会話の設定(⚙️)→「ゲスト用リンクを共有」
  6. 生成されたリンク(https://talk.katuocloud.com/call/xxxxx)をコピー
  7. LINE、メール、SMS等で外部ユーザーに送信
  8. 会話ルームで待機
外部ゲスト側の操作
  1. 招待リンク(https://talk.katuocloud.com/call/xxxxx)をクリック
  2. 名前を入力
  3. 「会話に参加」をクリック
  4. チャット・ビデオ通話が利用可能
運用上の注意事項
⚠️ 重要な制約事項
  • overwritehosttalk.katuocloud.comに固定されているため、WireGuard経由でアクセスしても招待リンクは常にtalk.katuocloud.comで生成されます。
  • nginx設定(talk.katuocloud.com)は現在、全パスを許可する設定になっています。セキュリティ強化が必要な場合は、必要なパスのみを許可する設定に変更する必要があります。
  • Cloudflare Tunnelを経由するため、外部ゲストの通信はCloudflareのネットワークを経由します。
📝 ポート使用状況
  • 9000: FastAPIポータル(portal.katuocloud.com)
  • 9080: Nextcloud Docker(cloud.k2-o.net)
  • 9081: VPN Engine(mikyun-vpn-engine)
  • 9082: nginx Talk専用vhost(talk.katuocloud.com)
今後の改善案
  • セキュリティ強化: nginx設定でTalk以外のエンドポイントへのアクセスを制限
  • TURN/STUNサーバー設定: NAT越え通話の品質向上
  • ゲスト参加ログ: 外部ゲストの参加履歴を記録する仕組み
  • 料金プラン統合: katuocloud.comの「ゲスト招待ビデオ通話 +¥2,000/月」オプションとの連携
関連ファイルパス
種類 パス
Cloudflare Tunnel設定 /etc/cloudflared/config.yml
nginx Talk設定 /etc/nginx/sites-available/talk.katuocloud.com
nginx cloud.k2-o.net設定 /etc/nginx/sites-available/cloud.k2-o.net
Nextcloud config.php Docker内: /var/www/html/config/config.php
Nextcloud Talkログ Docker内: /var/www/html/data/nextcloud.log
✅ 構築完了
2026年4月5日時点で、外部ゲスト招待機能が完全に動作しています。かつおcloud顧客がWireGuardを持たない外部ユーザーを招待し、チャット・ビデオ通話が可能になりました。
Nextcloud Talk 外部ゲスト招待機能ロールバック作業
作業概要

作業日: 2026年4月5日

目的: Nextcloud Talk外部ゲスト招待機能の完全ロールバックと、katuocloud.comサービスからの「ゲスト招待ビデオ通話」オプション削除

全システムの修正が完了し、新しいビジネスモデル「追加端末=追加ユーザー枠」に移行しました。既存契約はすべてテストのため、顧客への影響はゼロです。
ビジネスモデルの変更
旧モデル(廃止)
  • 外部ゲスト招待機能: talk.katuocloud.com 経由でWireGuard不要の通話
  • オプション料金: ¥2,000/月(ゲスト招待ビデオ通話)
  • 技術的制限: ユーザー単位の制限不可、参加者数制限なし
新モデル(実装済み)
  • 追加端末 (+¥500/月) = 友人へWireGuard QR発行
  • 友人も完全な内部ユーザーとしてNextcloudアカウント取得
  • 全ユーザーが契約者のストレージクォータを共有
  • Talk機能は全内部ユーザーに完全開放(通話無制限)
  • 外部ゲスト招待機能は完全廃止
Nextcloud 設定復元
使用バックアップ
/srv/storage/SM-storage/backup/nextcloud/20260405_181221/

作業開始前(18:12)のバックアップを使用

復元手順
# メンテナンスモード有効化
docker exec nextcloud-stack-app-1 php occ maintenance:mode --on

# config.php復元
cp /srv/storage/SM-storage/backup/nextcloud/20260405_181221/config.php \
   /mnt/secure/docker/volumes/nextcloud-stack_nextcloud/_data/config/config.php

# Talk設定クリア
docker exec nextcloud-stack-app-1 php occ config:app:delete spreed enable_guests
docker exec nextcloud-stack-app-1 php occ config:app:delete spreed start_conversations

# データベース修復
docker exec nextcloud-stack-app-1 php occ maintenance:repair --include-expensive

# メンテナンスモード解除
docker exec nextcloud-stack-app-1 php occ maintenance:mode --off
重要な修正

初回復元時、config.phpoverwritehosttalk.katuocloud.comのままだったため、手動で修正:

docker exec nextcloud-stack-app-1 php occ config:system:set overwritehost --value="cloud.k2-o.net"
docker exec nextcloud-stack-app-1 php occ config:system:set overwrite.cli.url --value="https://cloud.k2-o.net"
docker exec nextcloud-stack-app-1 php occ config:system:delete trusted_domains 2
最終設定状態
設定項目
trusted_domainscloud.k2-o.net, files.wan-secure.net
spreed:enable_guests未設定(デフォルト: 無効)
spreed:start_conversations未設定(デフォルト: 全員可能)
インフラストラクチャ設定変更
nginx設定削除(R640)
sudo rm /etc/nginx/sites-enabled/talk.katuocloud.com
sudo rm /etc/nginx/sites-available/talk.katuocloud.com
sudo nginx -t && sudo systemctl reload nginx
Cloudflare Tunnel設定(R640)

/etc/cloudflared/config.yml をportalのみに変更:

tunnel: 6ace0e0b-373d-452f-80be-af40048d0875
credentials-file: /root/.cloudflared/6ace0e0b-373d-452f-80be-af40048d0875.json
ingress:
  - hostname: portal.katuocloud.com
    service: http://127.0.0.1:9000
  - service: http_status:404
sudo systemctl restart cloudflared
Cloudflare DNS削除(手動実施)

Cloudflare Dashboardから以下のレコードを削除:

  • CNAME: talk.katuocloud.com6ace0e0b-373d-452f-80be-af40048d0875.cfargotunnel.com
R640 FastAPI コード修正
ファイルパス
/opt/mikyun-portal.old/app/main.py
/opt/mikyun-portal.old/.env
削除した箇所

main.py:

  • 30行目: STRIPE_PRICE_VIDEO = os.getenv("STRIPE_PRICE_VIDEO")
  • 653-654行目: ゲストビデオのStripe line item追加処理
# 削除されたコード
if guest_video_enabled == "yes":
    items.append({"price": STRIPE_PRICE_VIDEO, "quantity": 1})

.env:

# 削除
STRIPE_PRICE_VIDEO=price_1TIg2jDxP0kEA5q8qeDO28f9
保持した機能(互換性のため)
  • guest_video_enabled: str = Form(default="no") - フォーム受け取りパラメータ
  • データベースカラム guest_video_enabled - 常に"no"で書き込み
  • guest_video: bool = False - モデル定義
サービス再起動
sudo systemctl restart mikyun-cloud
sudo systemctl status mikyun-cloud
curl http://127.0.0.1:9000/health  # {"ok":true}
WordPress functions.php 修正
ファイルパス(XServer VPS)
/var/www/katuocloud/wp-content/themes/astra-child/functions.php
削除した箇所
  • 215-216行目: 契約情報表示の「ゲスト招待ビデオ」行
  • 520行目: $guest_video_text変数定義
  • 532行目: Telegram通知の「🎥 ゲスト招待ビデオ」行
変更した箇所

275行目を固定値に変更:

$guest_video = false; // 常にfalse(ゲスト招待機能は販売終了)
保持した機能(互換性のため)
  • $guest_video 関数パラメータ(常にfalse)
  • guest_video_enabled API呼び出しパラメータ(常に"no")
  • データベースフィールド guest_video_enabled の取得処理
シンタックスチェック
php -l /var/www/katuocloud/wp-content/themes/astra-child/functions.php
# No syntax errors detected
Stripe 商品削除
削除した商品
項目
商品名ゲスト招待ビデオ通話
Price ID(テスト)price_1TIg2jDxP0kEA5q8qeDO28f9
料金¥2,000/月
処理削除(未販売のため完全削除)
既存契約への影響なし。すべてテスト契約のため、実際の顧客は存在しない。
最終動作確認
portal.katuocloud.com
curl -I https://portal.katuocloud.com/health
# HTTP/2 200 ✅
talk.katuocloud.com(削除確認)
curl -I https://talk.katuocloud.com
# curl: (6) Could not resolve host ✅
新しいサービス構造
料金体系
プラン料金内容
基本プラン¥1,980/月WireGuard 3台、200GB、Talk無制限
追加端末+¥500/月/台WireGuard QR発行、追加ユーザー枠
追加容量+¥500/月/100GBストレージ拡張
友人共有の仕組み
  1. 追加端末オプション (+¥500/月) を購入
  2. WireGuard QRコードを友人に渡す
  3. 友人も完全な内部ユーザーとしてNextcloudアカウント取得
  4. Talk機能で自由にビデオ通話・音声通話可能
  5. 契約者のストレージクォータを共有
セキュリティ設計
  • 全アクセスにWireGuard VPN接続必須
  • 外部からの直接アクセス完全ブロック
  • ゲスト招待機能なし(シンプル&セキュア)
  • 内部ユーザーのみがTalk機能を利用可能
重要ファイル保存場所
R640
ファイルパス
FastAPI main.py/opt/mikyun-portal.old/app/main.py
環境変数/opt/mikyun-portal.old/.env
バックアップ(修正前)/opt/mikyun-portal.old/app/main.py.before_video_removal
Nextcloud config.php/mnt/secure/docker/volumes/nextcloud-stack_nextcloud/_data/config/config.php
Nextcloudバックアップ/srv/storage/SM-storage/backup/nextcloud/20260405_181221/
Cloudflare Tunnel設定/etc/cloudflared/config.yml
XServer VPS
ファイルパス
WordPress functions.php/var/www/katuocloud/wp-content/themes/astra-child/functions.php
バックアップ(修正前)/var/www/katuocloud/wp-content/themes/astra-child/functions.php.before_video_removal
今後の任意作業
Webサイト更新(準備済み)

以下のHTMLファイルをWordPress管理画面から貼り付け:

  • katuocloud-plan-revised.html - 料金ページ(ゲスト招待削除済み)
  • talk-feature-card.html - Talk機能説明(WireGuard必須を明記)
  • katuocloud-chat-fixed.html - 会話形式の説明(友人共有の仕組み)
  • katuocloud-form-fixed.html - 申し込みフォーム(ゲスト招待チェックボックス削除)
完了タスク一覧
タスク状態
Nextcloud config.php 復元✅ 完了
Nextcloud Talk 外部ゲスト無効化✅ 完了
nginx talk.katuocloud.com 削除✅ 完了
Cloudflare Tunnel portalのみに変更✅ 完了
R640 FastAPI コード修正✅ 完了
R640 .env 修正✅ 完了
mikyun-cloud サービス再起動✅ 完了
WordPress functions.php 修正✅ 完了
Stripe 商品削除✅ 完了
Cloudflare DNS 削除✅ 完了
動作確認✅ 完了
全作業完了。既存契約はすべてテストのため、顧客への影響はゼロ。新しいビジネスモデル「追加端末=追加ユーザー枠」に完全移行しました。