📅 実施日: 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 アプリ(招待リンク生成)
作業前に手動バックアップを実行しました。
# 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
既存の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
Cloudflareダッシュボードで以下のDNSレコードを追加しました。
| Type | Name | Target | Proxy |
|---|---|---|---|
| CNAME | talk | 6ace0e0b-373d-452f-80be-af40048d0875.cfargotunnel.com | Proxied (🟠) |
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
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/*
原因: port 9000を手動起動したnohup python3 -m uvicornプロセスが占有していた。
解決策:
# 手動プロセスを停止
kill 78914
# 正規のsystemdサービスを起動
systemctl start mikyun-cloud.service
原因: nginx設定で/dist/、/custom_apps/パスが許可されていなかった。
解決策: 最終的に全パスを許可する設定に変更(location /)。
cloud.k2-o.netでリダイレクトされる原因: Nextcloudのoverwrite.cli.urlがcloud.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
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でスーパーリロード
'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 VPNに接続
https://cloud.k2-o.net/でNextcloudにログイン- Talkアプリを開く
- 「新しい会話」でグループ会話を作成
- 会話の設定(⚙️)→「ゲスト用リンクを共有」
- 生成されたリンク(
https://talk.katuocloud.com/call/xxxxx)をコピー - LINE、メール、SMS等で外部ユーザーに送信
- 会話ルームで待機
- 招待リンク(
https://talk.katuocloud.com/call/xxxxx)をクリック - 名前を入力
- 「会話に参加」をクリック
- チャット・ビデオ通話が利用可能
overwritehostがtalk.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を持たない外部ユーザーを招待し、チャット・ビデオ通話が可能になりました。
作業日: 2026年4月5日
目的: Nextcloud Talk外部ゲスト招待機能の完全ロールバックと、katuocloud.comサービスからの「ゲスト招待ビデオ通話」オプション削除
- 外部ゲスト招待機能: talk.katuocloud.com 経由でWireGuard不要の通話
- オプション料金: ¥2,000/月(ゲスト招待ビデオ通話)
- 技術的制限: ユーザー単位の制限不可、参加者数制限なし
- 追加端末 (+¥500/月) = 友人へWireGuard QR発行
- 友人も完全な内部ユーザーとしてNextcloudアカウント取得
- 全ユーザーが契約者のストレージクォータを共有
- Talk機能は全内部ユーザーに完全開放(通話無制限)
- 外部ゲスト招待機能は完全廃止
/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.phpのoverwritehostがtalk.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_domains | cloud.k2-o.net, files.wan-secure.net |
| spreed:enable_guests | 未設定(デフォルト: 無効) |
| spreed:start_conversations | 未設定(デフォルト: 全員可能) |
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
/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 Dashboardから以下のレコードを削除:
- CNAME:
talk.katuocloud.com→6ace0e0b-373d-452f-80be-af40048d0875.cfargotunnel.com
/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}
/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_enabledAPI呼び出しパラメータ(常に"no")- データベースフィールド
guest_video_enabledの取得処理
php -l /var/www/katuocloud/wp-content/themes/astra-child/functions.php # No syntax errors detected
| 項目 | 値 |
|---|---|
| 商品名 | ゲスト招待ビデオ通話 |
| Price ID(テスト) | price_1TIg2jDxP0kEA5q8qeDO28f9 |
| 料金 | ¥2,000/月 |
| 処理 | 削除(未販売のため完全削除) |
curl -I https://portal.katuocloud.com/health # HTTP/2 200 ✅
curl -I https://talk.katuocloud.com # curl: (6) Could not resolve host ✅
| プラン | 料金 | 内容 |
|---|---|---|
| 基本プラン | ¥1,980/月 | WireGuard 3台、200GB、Talk無制限 |
| 追加端末 | +¥500/月/台 | WireGuard QR発行、追加ユーザー枠 |
| 追加容量 | +¥500/月/100GB | ストレージ拡張 |
- 追加端末オプション (+¥500/月) を購入
- WireGuard QRコードを友人に渡す
- 友人も完全な内部ユーザーとしてNextcloudアカウント取得
- Talk機能で自由にビデオ通話・音声通話可能
- 契約者のストレージクォータを共有
- 全アクセスにWireGuard VPN接続必須
- 外部からの直接アクセス完全ブロック
- ゲスト招待機能なし(シンプル&セキュア)
- 内部ユーザーのみがTalk機能を利用可能
| ファイル | パス |
|---|---|
| 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 |
| ファイル | パス |
|---|---|
| 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 |
以下の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 削除 | ✅ 完了 |
| 動作確認 | ✅ 完了 |
