同一WIFIネットワーク(ローカル)で使えるチャットアプリ

同一WIFIネットワーク(ローカル)で使えるチャットアプリ

外部サーバーに依存せず、オフィス内やセキュアな環境で手軽に導入できるリアルタイムチャットアプリの構築方法を説明します。

チャット #WEB socket#チャット#Socket

同一WIFIネットワーク(ローカル)で使えるチャットアプリ

サムネイル

外部サーバーに依存せず、オフィス内やセキュアな環境で手軽に導入できるリアルタイムチャットアプリの構築方法を説明します。

更新日: 8/8/2025

こちらのリポジトリで完成系が動かせます

なぜローカルチャットアプリが必要なのか

外部サーバー依存の課題

オフィス環境では、機密性の高い情報を扱う際に外部チャットサービスの利用が制限される場合があります。

外部サービスの課題 ローカルアプリの利点
データの外部流出リスク 社内ネットワーク内で完結
月額利用料金 導入・運用コスト不要
外部規約への準拠 自社ポリシーに完全準拠
アカウント管理の複雑さ 即座に利用開始

活用シーン

  • 機密プロジェクトチーム内での情報共有
  • セキュアな開発環境での開発者間連絡
  • 一時的なワーキンググループでの意思疎通
  • ネットワーク障害時の緊急連絡手段

3分で導入完了するセットアップ手順

必要な環境

# Node.jsのみが必要(他のインフラ不要)
node --version  # v18以上推奨

インストールと起動

# 1. プロジェクトの初期化
npm init -y
npm install express socket.io

# 2. ファイル配置
# server.js と public/index.html を配置

# 3. 即座に起動
npm start

# → http://192.168.1.100:3000 (仮)でアクセス可能
ISSUE - 課題

一般的なオフィス環境では、IT部門による事前のポート開放設定が必要な場合があります。3000番ポートが使用できない場合は環境変数PORTで変更してください。

セキュアな環境での運用設計

プライベートネットワーク内完結

// ローカルIPアドレスでのみリッスン
server.listen(PORT, '0.0.0.0', () => {
  const localIP = getLocalIPAddress();
  console.log(`チーム内アクセス: http://${localIP}:${PORT}`);
});

この設計により以下のセキュリティ特性を実現します:

セキュリティ要素 実装方法 効果
外部ネットワーク遮断 ローカルIPのみ インターネット経由でのアクセス不可
データの外部送信なし 完全自己完結型 情報漏洩リスクゼロ
認証システム不要 ネットワークアクセス制御に依存 管理コスト削減
ログの内部管理 サーバーローカルでのログ出力 外部送信なし

オフィス環境での接続制御

// 同じWiFiネットワーク内のデバイス検出
function getLocalIPAddress() {
  const interfaces = os.networkInterfaces();
  for (const name of Object.keys(interfaces)) {
    for (const interface of interfaces[name]) {
      // プライベートIPアドレス範囲のチェック
      if (interface.family === 'IPv4' && !interface.internal) {
        return interface.address; // 例: 192.168.1.100
      }
    }
  }
  return 'localhost';
}

チーム内コミュニケーションの最適化

即座の情報共有機能

// リアルタイムメッセージ配信
socket.on('chat message', (data) => {
  const messageData = {
    username: users.get(socket.id),
    message: data.message,
    timestamp: new Date().toLocaleTimeString('ja-JP'),
    room: 'office-team' // オフィス内グループ識別
  };
  io.emit('chat message', messageData);
});

ユーザー参加状況の可視化

// チームメンバーの参加・退出通知
socket.on('set username', (username) => {
  users.set(socket.id, username);
  io.emit('user joined', {
    username: username,
    userCount: users.size,
    joinTime: new Date().toLocaleString('ja-JP')
  });
});

運用面での実装ポイント

データの永続化不要設計

// メモリ内でのユーザー管理(軽量・高速)
const users = new Map();
const messageHistory = []; // 直近100件のみ保持

// セッション終了時の自動クリーンアップ
process.on('SIGTERM', () => {
  console.log('サーバーを安全に終了します...');
  users.clear();
  messageHistory.length = 0;
});

接続の安定性確保

// ネットワーク断絶からの自動復旧
const socket = io({
  reconnection: true,
  reconnectionDelay: 2000,
  reconnectionAttempts: 10,
  timeout: 5000
});

socket.on('reconnect', () => {
  // ユーザー名の再設定
  if (currentUsername) {
    socket.emit('set username', currentUsername);
  }
});

プライバシー保護の実装

データ保存なしのポリシー

// メッセージの永続化を行わない設計
socket.on('chat message', (data) => {
  // 即座に配信し、サーバーには保存しない
  io.emit('chat message', {
    username: users.get(socket.id),
    message: data.message,
    timestamp: new Date().toLocaleTimeString('ja-JP')
  });
  // データベースへの保存処理は意図的に省略
});

機密情報の扱い

オフィス内で完結する環境ならほぼ考慮しなくていい。

// 入力値のサニタイズ(XSS対策)
function sanitizeInput(input) {
  return input
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .trim();
}
ISSUE - 課題

機密情報を扱う場合は、チャット履歴をブラウザのローカルストレージに保存しない設定を推奨します。セッション終了と同時に全データが消去されます。

導入後の運用管理

簡単な起動・停止手順

# 起動(担当者のPC上で実行)
npm start

# 停止(Ctrl+C または以下のコマンド)
pkill -f "node server.js"

# バックグラウンド実行
nohup npm start > chat.log 2>&1 &

チームメンバーへの共有方法

// 起動時に接続情報を表示
server.listen(PORT, '0.0.0.0', () => {
  const localIP = getLocalIPAddress();
  console.log('=================================');
  console.log('🏢 オフィスチャットが開始されました');
  console.log('=================================');
  console.log(`チーム内アクセス: http://${localIP}:${PORT}`);
  console.log('このアドレスを同僚に共有してください');
  console.log('=================================');
});

トラブルシューティング

オフィス環境での一般的な問題

問題 原因 対処法
接続が不安定 WiFi電波状況 有線LAN接続を推奨
起動時にポートエラー ポート競合 PORT=XXXX npm startで変更

セキュリティチェックリスト

✓ 外部インターネットからアクセス不可能
✓ 社内ネットワーク内のみでの通信
✓ メッセージデータの外部送信なし
✓ 個人情報の永続化なし
✓ ログの社内管理

どこでも使えるというより、例えばローカル環境で完結させたいなど、セキュアで軽量なチャット環境を構築できます。外部サーバーに依存しない設計により、機密性の高いプロジェクトでも安心して利用できるコミュニケーションツールとして活用可能です。

検索

検索条件に一致する記事が見つかりませんでした