共有メモがほしい
ブラウザで使えるちょっとした共有やメモに使える社内Wikiとチャットが欲しい。
今は色々なサービスがあるけど調べるのも面倒なので、余っているラズパイを使って、昔使っていて気に入ってたDevHubを使うことにします。
全体的に前時代的な取り組みになります◎
- 軽量なwebサーバ
- すぐ編集できて履歴も残る共有Markdownメモ
- 通知のあるチャット
- 他のツールからAPIでもチャットに書ける
- 画像やファイルのドロップでのアップロード
- やろうと思えば自分で改造できる
古いOSSですが、10人くらいまでのゆるめの開発チームにはピッタリなのです。
あんまり大規模になると不向きですがぁ。
使う端末はRaspberry Pi 4 Model B
です。
なにやら最近は品薄で価格高騰しているようで...
売っぱらちゃいたい気持ちを抑えつつ、会社備品なので有効活用します。
どんなふうに作るか構想
- オンプレミス
- サーバにするラズパイは社内の壁にでもくっつける
- 基本的に付けっぱなしで、再起動したら勝手にサーバ起動するように
- MongoDB
- DevHub
- クライアントは社内の数名がブラウザから
- バックアップは毎日深夜に社内のNASへ
構築手順
OS → MongoDB → Nodejs → DevHub → バックアップの機構
という流れ
入れるもの
OS含めて次の4つのインストール
- Raspberry Pi OS Lite
- リリース: 2022-09-26 09:37
- Debian GNU/Linux 11 (bullseye)
- MongoDB 4.4
- Nodejs (Latest)
- DevHub 2.4 (Latest) (npm "mongodb" ^3.3.2 を含む)
MongoDBのバージョンが最新ではないのは、DevHubが使用するnpmのMongoDB Driverのバージョンが古いからです。
DevHubpackage.json
によれば、どうやらDriverは3.X.X
"dependencies": {
~~~
"mongodb": "^3.3.2",
MongoDBのDriverとDBの対応表を見るに、MongoDB本体は4.4が良さそうです。
今はMongoDB 6.1まであるみたいなので、最新のものを入れないように注意。
対応表: https://www.mongodb.com/docs/drivers/node/current/compatibility/
ちなみにMongoDB 4.4
の依存が、64bitかつ、OpenSSL 1.1.1
です。
OSによってはこのOpenSSL 1.1.1
がパッケージ提供されないことに注意です。
調べるとRpiOS LITEのLatestは、デフォルトでOpenSSL 1.1.1
なので問題なしです。
https://lindevs.com/get-list-of-default-packages-on-raspberry-pi-os
Raspberry Pi OS Lite 64bit (リリース: 2022-09-26 09:37)
OS を Raspberry Pi Imager を使ってインストール
Raspberry Pi Imager を使うとインストールするときにGUIでwifiもSSHも設定できます
ラズパイには電源以外触る必要がなくて楽ちん
こんなふうに設定しました。
Bonjourを使ったホスト名割り当てで、勝手に.local
が付く。
ともかく次のコマンドで接続
ssh pi@devpi.local
# -> pi@devpi:~$
MongoDB 4.4
MongoDBをインストール
このチュートリアルからの抜粋
https://www.mongodb.com/developer/products/mongodb/mongodb-on-raspberry-pi/
sudo apt update
sudo apt upgrade
# Install the MongoDB 4.4 GPG key:
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
# Add the source location for the MongoDB packages:
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
# Download the package details for the MongoDB packages:
sudo apt-get update
# Install MongoDB:
sudo apt-get install -y mongodb-org
mongod
: MongoDBのデーモンを、systemctl
でサービスに設定
sudo systemctl daemon-reload
sudo systemctl enable mongod
ラズパイを再起動して、mongodが起動していることが確認できればOK
sudo systemctl status mongod
ちなみに、認証をしないデフォルトで起動したMongoDB URIは
127.0.0.1:27017/?
今回はURIは知らなくてもいい
Nodejs
sudo apt update
sudo apt install -y nodejs npm
DevHub
インストール
wget https://github.com/volpe28v/DevHub/archive/refs/heads/master.zip
unzip master.zip
rm master.zip
cd DevHub-master
npm install
次のコマンドで起動
node app.js -d devhub_db -t "Deep Insight"
http://devpi:3000
アクセスして動いていることを確認
書き込み/写真のアップロードなどできればOK
デーモン化
mongodのようにデーモン化するため、forever
を使う
npm install forever
# デーモン化するコマンド
forever start app.js -d devhub_db -t DeepInsight
# 確認
forever list
ラズパイ起動時に立ち上がるようにcrontab
に追記(フルパスで書く)
@reboot /usr/local/bin/forever start /home/pi/DevHub-master/app.js -d devhub_db -t DeepInsight
ラズパイを再起動後、http://devpi:3000にアクセス出来ればOK
バックアップ機構
今回は社内にSAMBAのNASがあり、これにバックアップする
NASをマウント
NAS://STRAGE.local/share/DevPi/backupdir
を、~/backupdir_mount
をマウントする
sudoはしたくないので、工夫が必要
「起動時にはroot
でマウントしていて、バックアップのときはpi
で明示的にマウント」という形にする
sudo apt install -y cifs-utils
mkdir backupdir_mount
まず/etc/fstab
にマウント設定記述
# 追記
//STRAGE.local/share/DevPi/backupdir /home/pi/backupdir_mount cifs username=<USER>,password=<PASS>,users,vers=1.0 0 0
-
users
: 全てのユーザにマウント/アンマウントを許可 -
vers=1.0
はNASのcifsバージョンに従う
これで、任意のユーザ、任意のタイミングで mount backupdir_mount/umount backupdir_mount
できる。
次のように確認できればOK
-
ラズパイ再起動時には、所有者
root
でマウントされていることpi@devpi:~ $ ls -l total 4 drwxr-xr-x 2 root root 0 Jan 19 23:33 backupdir_mount drwxr-xr-x 10 pi pi 4096 Jan 19 19:20 DevHub-master
-
ユーザ
pi
でもマウントできることpi@devpi:~ $ mount backupdir_mount/ pi@devpi:~ $ ls -l total 4 drwxr-xr-x 2 pi pi 0 Jan 19 23:33 backupdir_mount drwxr-xr-x 10 pi pi 4096 Jan 19 19:20 DevHub-master
-
マウントした後、unmountすると、所有者が
root
にもどることpi@devpi:~ $ ls -l total 4 drwxr-xr-x 2 root root 0 Jan 19 23:33 backupdir_mount drwxr-xr-x 10 pi pi 4096 Jan 19 19:20 DevHub-master
バックアップのときはユーザpi
で明示的にmountすることにする。
MongoDB バックアップの仕方
mongodump
コマンド
mongodump --db devhub_db
# devhub_db/ が生成される
DevHubの画像/アップロードファイル バックアップの仕方
ユーザのアイコンや画像、アップロードされたファイルは、DevHub-master/static/uploads
に保存される
これをディレクトリごと圧縮
# 圧縮
tar acvf uploads.tar.gz -C ~/DevHub-master/static uploads
# uploads.tar.gz が生成される
バックアップを世代管理
毎朝4時にバックアップして、7日分取っておきたい。
一回分のバックアップは、20230119
のような日付名ディレクトリを作って保存していく。
保存先は、マウントしたディレクトリ。
スクリプトを作り
#!/bin/bash
cd /home/pi
# NASをユーザでマウント
mount backupdir_mount
pushd backupdir_mount
# 今回のバックアップディレクトリの名前
TODAY=`/bin/date '+%Y%m%d'`
# バックアップ
mongodump --db devhub_db --out ${TODAY}
tar acvf ${TODAY}/uploads.tar.gz -C ../DevHub-master/static uploads
# 古いバックアップを削除
NOKOSU_NUM=7
IFS=$'\n'
for dir in $(ls -t1 | tail -n +$(($NOKOSU_NUM+1))); do
rm -fr ${dir}
done
# アンマウント
popd
umount backupdir_mount
実行権限を与え、これをcrontab
に設定(フルパスで書く)
0 4 * * * /home/pi/run-backup.sh
完成
かんたんグループウェアを設置できました◎
復旧手順
仮にある日ラズパイが壊れてしまったときの復旧方法
1. 環境再構築
新しいラズパイでこのドキュメントに従って再構築
2. MongoDBリストア
チャットとwikiはDBなので、Mongoのダンプファイルを使ってmongorestore
コマンド
# DB`devhub_d`に何か入っていれば、先にdropしておく必要がある
mongorestore --db devhub_db <dumpしたdevhub_db>
3. アップロードデータ
DevHubにドロップでアップロードされたファイルは、普通に元あった場所に展開
# 展開
tar axvf <バックアップしたuploads.tar.gz> -C ~/DevHub-master/static