お手軽テレワークMattermost
twitterでmattermostのことを書くとリツイートしてもらえたので、ちょっと調子に乗って書いてみます。
今回はコンテナ版のmattermostを立てて、Tunaclo API Connectというサービスを使ってリモート接続をしてみます。普通に立ててもいいんですが、メリットとして
- 簡単に構築できる
- インターネットに公開不要/Firewallに穴を開けなくていい
- エージェントを持ってる人しかつながらない
というところですね。まぁTunacloはうちのサービスなのでぶっちゃけ宣伝なのですが、慣れてていれば30分もあれば構築できちゃうと思います。では。
環境の準備
今回は Azureの上にUbuntuでVMを建てました。その上にdockerを使う環境を構築します。docker-composeも入れておきましょう。探せば日本語の記事も沢山見つかると思うのでこの辺は割愛します。
Mattermostの入手
mattermostをdockerでお手軽に動かすdocker-composeのキットが公開されているのでこれを使います。こちら
これを手元に持ってきます。
#git clone https://github.com/mattermost/mattermost-docker.git
docker-composeの編集①
今回は team editionで動かすので、公式の説明通りこうしましょう。
version: "3"
services:
db:
build: db
read_only: true
restart: unless-stopped
volumes:
- ./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
environment:
- POSTGRES_USER=mmuser
- POSTGRES_PASSWORD=mmuser_password
- POSTGRES_DB=mattermost
# uncomment the following to enable backup
# - AWS_ACCESS_KEY_ID=XXXX
# - AWS_SECRET_ACCESS_KEY=XXXX
# - WALE_S3_PREFIX=s3://BUCKET_NAME/PATH
# - AWS_REGION=us-east-1
app:
build:
context: app
#uncomment following lines for team edition or change UID/GID
args:
- edition=team <-------コメントアウトを外す
# - PUID=1000
# - PGID=1000
restart: unless-stopped
volumes:
- ./volumes/app/mattermost/config:/mattermost/config:rw
- ./volumes/app/mattermost/data:/mattermost/data:rw
- ./volumes/app/mattermost/logs:/mattermost/logs:rw
- ./volumes/app/mattermost/plugins:/mattermost/plugins:rw
- ./volumes/app/mattermost/client-plugins:/mattermost/client/plugins:rw
- /etc/localtime:/etc/localtime:ro
# When you want to use SSO with GitLab, you have to add the cert pki chain of GitLab inside Alpine
# to avoid Token request failed: certificate signed by unknown authority (link: https://github.com/mattermost/mattermost-server/issues/13059)
# - <path_to_your_gitlab_pki>/pki_chain.pem:/etc/ssl/certs/pki_chain.pem:ro
environment:
# set same as db credentials and dbname
- MM_USERNAME=mmuser
- MM_PASSWORD=mmuser_password
- MM_DBNAME=mattermost
# use the credentials you've set above, in the format:
# MM_SQLSETTINGS_DATASOURCE=postgres://${MM_USERNAME}:${MM_PASSWORD}@db:5432/${MM_DBNAME}?sslmode=disable&connect_timeout=10
- MM_SQLSETTINGS_DATASOURCE=postgres://mmuser:mmuser_password@db:5432/mattermost?sslmode=disable&connect_timeout=10
# in case your config is not in default location
#- MM_CONFIG=/mattermost/config/config.json
web:
build: web
#ports:
- "80:80"
- "443:443"
read_only: true
restart: unless-stopped
volumes:
# This directory must have cert files if you want to enable SSL
- ./volumes/web/cert:/cert:ro
- /etc/localtime:/etc/localtime:ro
今回はパスワードは変えてませんが、変えておいた方がいいでしょうね。
この状態で、mattermost用のディレクトリを作り
mkdir -p ./volumes/app/mattermost/{data,logs,config}
sudo chown -R 2000:2000 ./volumes/app/mattermost/
このコマンドで立ち上げると
# docker-compose up
curlか何かでアクセスできるはずです。http://localhost:80/
これをリモートから繋いでみます
Tunacloの設定
tunacloの管理画面から、サービスを作成し、今回は
手元のWindows Clientからlocalhost:3000 -> リモートのweb:80
という転送経路を設定します。
docker-composeの編集②
tunacloを組み合わせるためにちょっと設定いじります。後半部分をこう変えましょう。tunacloに関してはマニュアルを見ればすぐわかると思います。
web:
build: web
#ports:
# - "80:80" <-------- コメントアウト
# - "443:443" <--------コメントアウト
read_only: true
restart: unless-stopped
volumes:
# This directory must have cert files if you want to enable SSL
- ./volumes/web/cert:/cert:ro
- /etc/localtime:/etc/localtime:ro
tunaclo:
image: tunacloac/backagent
container_name: mmbackagent
restart: always
command: 'back_agent -controller ${TUNAAP} -projectID ${PROJECTID} -agentID ${AGENTID} -agentKey ${AGENTKEY}'
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Webとして公開しているポートを全部閉じて、tunaclo/backagentからの中継に任せます。今回はback_agentのパラメータは .envファイルの中で環境変数として定義して渡しています。この状態で起動しましょう。
# docker-compose up -d
これでサービス側の準備はOKです。
クライアントからアクセスする
tunacloのポータルからクライアントアプリをダウンロードします。ポータルから入手したIDやKeyのパラメータを設定ファイルに反映しましょう。
# FUJITSU CONFIDENTIAL
# COPYRIGHT 2020 FUJITSU LIMITED
# projectID はプロジェクト固有のIDです
# projectID はポータルにログイン後にプロフィール画面から確認できます。
# このプロパティは必須です。
# (例)projectID: "505f5c71-c67f-48f6-9214-xxxxxxxxxxxx"
projectID: xxxxxxxxx
# agentName はAgent(client,service)を識別するための名前です。
# Agent作成時に入力した名前を指定してください。
# このプロパティは必須です。
# (例)agentName: "example-agent"
agentName: mattermost-client
# agentID はAgentごと固有のIDです。
# このIDはAgent作成時に払い出されます。
# このプロパティは必須です。
# (例)agentID: "WMSFBSZSEEroXXXXXXXXXX"
agentID: xxxxxx
# agentKey はAgentの認証鍵です。
# この認証鍵はAgent作成時に払いだされます。
# このプロパティは必須です。
# (例)agentKey: "iYZtysXakndTXXXXXXXXXX"
agentKey: xxxxxx
# agentMode はAgentの動作モードです。
# "frontAgent"を指定してください
# このプロパティは必須です。
agentMode: "frontAgent"
# httpservers はFront AgentのHTTPの待ち受けアドレスを指定します。
# 複数の値を指定できます。
httpservers:
- "127.0.0.1:3000" # example
# httpsservers はFront AgentのHTTPSの待ち受けアドレスを指定します。
# 複数の値を指定できます。
httpsservers:
- "127.0.0.1:30001" # example
# E2E 暗号化を有効化する場合に指定します。
# オプショナルな設定なので必要な時に指定してください。
# 用意したルートCA証明書のパスを指定してください。
# (例)e2e-rootca-file : "C:\\Users\\exampleuser\\Documents\\tunaclo\\certs\\rootca.crt"
# e2e-rootca-file: <PATH/TO/rootcafile>
Tunacloのクライアントアプリを起動します
上で作った設定ファイルを指定したら、起動を押します。
ブラウザからつないでみましょう。
http://127.0.0.1:3000/でリモートのVM上のmattermostに繋がりました。
実際のところコンテナの外にmattermostのポートを出してないので、このエージェント経由でしかつながらない状態です。関係者にエージェントと設定を配るとクローズドなチャット環境のできあがり。VPNとは違うのでこの http://web:80 以下のURLにのみクライアントはアクセスできることになります。
まとめ
社内にmattermostを置いていると社外の人やテレワークでの活用でどうしようか?となりますが、クラウド上に置いてアクセスを限定するような使い方もあるよね、というご紹介でした。(Tunacloはオンプレでも勿論動作しますが)Tunaclo自体はただの転送経路なのでMattermost側でのユーザ管理はちゃんとやってくださいね。
勿論フルマネージドのほうが好ましい場合の方が多いだろうとは思いますけども、mattermostに限らずOSSのグループウェアも頑張ってほしいですね。
※今回は手を抜きましたが実際はコンテナ側を mattermost.localみたいな名前にして手元のWindowsのhostファイルに mattermost.local 127.0.0.1 とかすることで、一環したURLで扱えるので実用上はそんなところを手を入れます。