ローカルビデオチャット hidden.in 構築メモ

# 経緯

* 巷では「びでおちゃっと」というものが流行ってるらしい…
* ウチはクローズドな環境だから、「ずーむ」とか「みーつ」、「ちーむ」とかは使えない…
* オンプレでそれらしいことができるもの、ないの？

という無茶振りを受けて調べたところ
「[hidden.in](https://github.com/ukiuni/hidden.in)」というアプリを発見したので検証した。

# hidden.inって何？

WebRTCを使ったカメラやマイクの映像・音声ストリームを媒介するサーバアプリケーション。
Node.jsで構築されている。

[GitHub hidden.in リポジトリ](https://github.com/ukiuni/hidden.in)

2017年で更新が止まっているが、検証したところ少し手直しするだけで動作した。


# 前提条件

* ローカル環境（インストール時にインターネット接続が必要）
* Fedora Server 33 x64にて動作確認

# はじめに
hidden.in 専用ユーザを作成し、ホームディレクトリに構築することとする。


# サーバの初期設定

諸々最新化したり、hidden.in専用ユーザを作成したりしておく

```bash:一般ユーザ作業
$ sudo dnf update
$ sudo useradd hidden.in
$ sudo reboot
```




# ファイアウォールの開放

TCP/3000を開放する。
以下は `firewalld` がインストールされている環境での手順
ゾーン名等は適宜読み替えてください

現在のファイアウォールの状態を表示

```bash:sudoer作業
$ sudo firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources: 
  services: ssh mdns dhcpv6-client
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

上記例では、`public` ゾーンがアクティブになっており、`ssh mdns dhcpv6-client` が許可されている。

TCP/3000を開放する。

```bash:sudoer作業
$ sudo firewall-cmd --add-port=3000/tcp --zone=public --permanent
success

$ sudo firewall-cmd --reload
success


$ sudo firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp4s0
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 3000/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

`public` ゾーンにて、`3000/tcp` が追加で許可された。


# 依存性パッケージのインストール

Git, node.js, npm が必要


## 各種パッケージのインストール

```bash:sudoer作業
$ sudo yum install -y nodejs npm git 
```


# hidden.in本体のインストール、サービス化

## インストール

コードをclone、npmパッケージの導入

```bash:hidden.inユーザ作業
$ git clone https://github.com/ukiuni/hidden.in
$ cd hidden.in
$ npm install
```

非推奨となったコードを書き換え
そのままでは function not found となり画像と音声が流れないと思われる

```bash:hidden.inユーザ作業
$ vim ~/hidden.in/static/js/index.js
```

```js:index.js
// 173行目付近
//remoteVideo.src = URL.createObjectURL(event.stream);
//    ↓
remoteVideo.srcObject = event.stream;

// 195行目付近
//localVideo.src = URL.createObjectURL(stream);
//    ↓
localVideo.srcObject = stream;
```

（参考） https://one-it-thing.com/6066/


## サービス化

```bash:sudoer作業
$ sudo vim /etc/systemd/system/hidden.in.service
```

```ini:hidden.in.service
[Unit]
Description=hidden.in
After=network.target

[Service]
Type=simple
User=hidden.in
WorkingDirectory=/home/hidden.in/hidden.in/
Environment="HTTP=false"
ExecStart=npm start
ExecReload=/bin/kill -SIGUSR1 $MAINPID
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target
```

```bash:sudoer作業
$ sudo systemctl daemon-reload
$ sudo systemctl start hidden.in.service
$ sudo systemctl status hidden.in.service 
● hidden.in.service - hidden.in
     Loaded: loaded (/etc/systemd/system/hidden.in.service; enabled; vendor preset: disabled)
     Active: active (running) since Wed 2021-02-03 09:12:58 JST; 2h 14min ago
   Main PID: 40291 (node)
      Tasks: 22 (limit: 2206)
     Memory: 55.3M
        CPU: 6.537s
     CGroup: /system.slice/hidden.in.service
             ├─40291 npm
             └─40302 node index.js
```

Runnning :tada: 



# 動作確認

1. Webカメラとマイクが付いた端末から、ブラウザ（できればChromeの最新版）で `https://(hidden.inサーバIP):3000` へアクセスする。
1. ルーム名を聞かれるので、適当に入れる。
1. Webカメラの映像がブラウザ上に表示されればOK。
1. そのほかの端末から、同じようにアクセスし、同じルーム名を入れて参加する。
1. 双方の端末に、それぞれの映像が映ればOK。


# Todo

* Nginx等でリバースプロキシをかけていい感じにSurveしたい


# あとがき

* 自分用にメモした手順です。必要に応じて読み替えてください。
* こうしたほうがいいよ的なアドバイスを頂けると大変助かります


以上