I will be with you again…

新しい年がやってきました。昨年は crazy な年でしたね。我々も仮想空間と現実空間を行ったり来たりで大変でした。

物事の始まりは3月頃。段々とCOVIDが近づいてきて、大学でみんなで研究する、学生さんに講義する、というような日常が怪しくなってきた頃でした。

しかし!我々はテクノロジーの権化。(権化ってこんなふうに使う言葉なんだろうか???)指をくわえて黙っているわけには行きません。Show must go on!

というわけで、まず最初に学生さんのテーマを少し計算寄りに修正して、で、Xeon Silver 4216 16C/32T + 192GB を組んで、synology の10GbE NAS に 12T disks + SSD を放り込んでそれなりの計算できるようにしました。計算ラックの中は何年か前に 10GbE にしてあったので、これでようやく先行投資が花咲く?

で、自宅待機中に寂しくないように、いつでも online discussion ができる環境を構築しよう!いろいろと調べたら、jitsi-meet が最高!やっぱ、世界のみんなはすごいな。というわけで、研究室のserver に deploy しよう。(その頃は、きっとみんながzoom や google meet 等を使って、net負荷がきつくなると予想して、オンプレミスdeploy必須かな、と予想していました。そうはならなかったけどね。)でも、 jitsi-meetは onlineに移行した授業でも大変役に立ちました。(週に一回質問時間を設定して、質問のある学生さんが匿名で好きな時間に入ってきて、好きな時間に出ていく、というのを実現したかったのですが、これがあっという間にできた!)

Jitsi-meet は結構通らないネットが多いので turnserver も入れたりなんだかんだで、結構大変。このときに、apache から nginx に変更もしました。古い php5 とか使っているところがあったので、これは大変でした。

2020年の終わり頃には rocket-chat もオンプレミスで deployしました。メールと違ってちょっとした議論やアイデアが残るのは大変便利。

もう少し研究に近いところでは、ドイツに帰った Johannes が残していった GPU (GeForce 1070) が思いの外使えることが判明。主に学生さんが使っていたんだけど、空いているときに私もFDTDで電磁場計算に使ってみました。はやい!そんなこんなで、学生さんにせがまれて新製品 GeForce 3080 を導入。うん、この値段でこの速度はすごいな。すごすぎる。ちなみに夏休みには proton NMR を作ってみました。生まれて初めて FID を自分の目で見ました。あぁ、あと70年早かったらブロッホに勝てたのに。。。ははは。

というわけで、昨年は研究成果(論文)という意味ではあんまり生産的な年ではなかったけど、色々と新しいことができた年でした。今年は放電するぞ!

さて、以下は Jitsi-Meet の install log です。なにかのお役に立てるかもと思っここに残しておきます。まぁ、色々と失われた情報も多いので、このとおりやってうまく行かなくても怒らないでくださいね。

jitsi-meet install log

まず、debian を upgrade。最初は古いdebian に入れていたんだけど、結局最終的にはdebian 10.6に入れました。これだとあまり苦労せずに入ります。(古いバージョンだと、結構苦労します。)

で、web service には nginx を使用しているとします。apache だと turnserver が動かない。。。

DNS に aaa.xxx.ac.jp の別名としてbbb.xxx.ac.jp を登録してもらう。

マニュアルには/etc/hostname に FQDNを書けとありますが、これやるとoctaのほうが困ったことになりそうなので、これはしない。ただ、/etc/hosts の 127.0.0.1 の最後に bbb.xxx.ac.jp も入れておく。

/etc/apt/sources.list.d/ に repository 登録:
more /etc/apt/sources.list.d/jitsi-unstable.list
deb https://download.jitsi.org unstable/

Key もdownload:
wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | sudo apt-key add -

さて、すべて install しましょう。
apt-get install jitsi-meet
apt-get install coturn
この段階では self certificate を選ぶ。

次は let's encrypt の設定。なぜか昔 mail 用に入れた certbot が邪魔するので、一度消します。
rm -r /opt/eff.org/certbot/
(消す必要なかったかも。多分、path の順番を変えればよかったはず。あと、他の事情で /usr/local/certbot/certbot-auto に入っていたから、script の /usr/local/bin/ を /usr/local/certbot/ に書き換えることもやった。)

で、let's encrypot の certificateをゲットする。
/usr/share/jitsi-meet/scripts/install-letsencryt-cert.sh

なぜか、自動で nginx が動き出さないので、手動で(多分 jitsiの install script は systemd じゃ無いだと思う)
systemctl restart nginx

これで、authentication なしで jitsi が動き出します。次は authentication 周りの設定。

/etc/prosody/conf.avail/bbb.xxx.ac.jp.cfg.lua を編集
VirtualHost "bbb.xxx.ac.jp" のところで
"anonymous" を抜いて、
authentication = "internal_plain"
あと、最後の guest.bbb.xxx.ac.jp のところで
/etc/prosody/conf.d/bbb.xxx.ac.jp.cfg.lua
VirtualHost "guest.bbb.xxx.ac.jp"
authentication = "anonymous"
modules_enabled = {
"bosh";
"pubsub";
"ping"; -- Enable mod_ping
"speakerstats";
"turncredentials";
"conference_duration";
}
c2s_require_encryption = false
を足します。これでよし。

次に、/etc/jitsi/meet/bbb.xxx.ac.jp-config.js を編集
hosts: に以下を足します。
anonymousdomain: 'guest.bbb.xxx.ac.jp',

あとは、default の画質を落として、ちょっとネットワーク負荷を下げる。もしかしたらこんなことしなくても自動で画質落とされるのかな?ともかく、書いておこう。
/etc/jitsi/meet/bbb.xxx.ac.jp-config.jsのなかです。

    resolution: 240,
    maxFps: 10,

    // w3c spec-compliant video constraints to use for video capture. Currently                     
    // used by browsers that return true from lib-jitsi-meet's                                      
    // util#browser#usesNewGumFlow. The constraints are independency from                           
    // this config's resolution value. Defaults to requesting an ideal aspect                       
    // ratio of 16:9 with an ideal resolution of 720.                                               
    constraints: {
        video: {
            aspectRatio: 16 / 9,
            frameRate: 10,
            height: {
                ideal: 240,
                max: 480,
                min: 240
            }
        }
    },
 このぐらいでいい感じに動きます。

あと、aaa.xxx.ac.jp は 2 つの physical NIC 持っていて、2サブネットにつながっているので、話が怪しくなっている。そこで、一つ(global eth0 側だけ)使うことにする。(nnn.mmm.lll.248 は global 側の IP)
/etc/jitsi/videobridge/sip-communicator.propertiesのなかです。
## add following
net.core.rmem_max=104857600
net.core.netdev_max_backlog=100000
for IP address? may be not necessary
org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=nnn.mmm.lll.248
org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=nnn.mmm.lll.248
org.ice4j.ice.harvest.BLOCKED_INTERFACES=eth2;eth3;enp3s0f0;enp3s0f1
org.ice4j.ipv6.DISABLED=true
## in addition, I put the following in /etc/turnserver.conf
listening-ip=nnn.mmm.lll..248
listening-ip=127.0.0.1
最後に listening-ip に 127.0.0.1 が入っているのは、nginx が一度受けて、それを turnserver に送るから。turnserver 使わないなら関係ない。

あと、turnsever 用の certificate を準備。(permission の問題で、新たに入れるのがいちばんよさそう、という判断。)
/etc/letsencrypt/renewal-hooks/deploy/0000-coturn-certbot-deploy.shとして以下の内容を置きます。
#!/bin/sh

set -e

COTURN_CERT_DIR="/etc/coturn/certs"
TURN_CONFIG="/etc/turnserver.conf"

# create a directory to store certs if it does not exists
if [ ! -d "$COTURN_CERT_DIR" ]; then
    mkdir -p $COTURN_CERT_DIR
    chown -R turnserver:turnserver /etc/coturn/
    chmod -R 700 /etc/coturn/
fi

# This is a template and when copied to /etc/letsencrypt/renewal-hooks/deploy/
# during creating the Let's encrypt certs script
# bbb.xxx.ac.jp will be replaced with the real domain of deployment
for domain in $RENEWED_DOMAINS; do
        case $domain in
        bbb.xxx.ac.jp)
                # Make sure the certificate and private key files are
                # never world readable, even just for an instant while
                # we're copying them into daemon_cert_root.
                umask 077

                cp "$RENEWED_LINEAGE/fullchain.pem" "$COTURN_CERT_DIR/$domain.fullchain.pem"
                cp "$RENEWED_LINEAGE/privkey.pem" "$COTURN_CERT_DIR/$domain.privkey.pem"

                # Apply the proper file ownership and permissions for
                # the daemon to read its certificate and key.
                chown turnserver "$COTURN_CERT_DIR/$domain.fullchain.pem" \
                        "$COTURN_CERT_DIR/$domain.privkey.pem"
                chmod 400 "$COTURN_CERT_DIR/$domain.fullchain.pem" \
                        "$COTURN_CERT_DIR/$domain.privkey.pem"

                if [ -f $TURN_CONFIG ] && grep -q "jitsi-meet coturn config" "$TURN_CONFIG" ; then
                    echo "Configuring turnserver"
                    sed -i "/^cert/c\cert=\/etc\/coturn\/certs\/${domain}.fullchain.pem" $TURN_CONFIG
                    sed -i "/^pkey/c\pkey=\/etc\/coturn\/certs\/${domain}.privkey.pem" $TURN_CONFIG
                fi
                ##                service coturn restart
                systemctl restart coturn
                ;;
        esac
done
 これは、https://serverfault.com/questions/849683/how-to-setup-coturn-with-letsencrypt にあったスクリプトで、service -> systemctl に変更しただけ。
で、
/opt/eff.org/certbot/venv/bin/certbot renew --force-renewal
で、動くはず。


最後に、関連サービスを再起動。
systemctl restart prosody
systemctl restart jitsi-videobridge2
systemctl restart jicofo
systemctl restart coturn
まぁ、こんな感じでしょうか。