横国休講BOTのアーキテクチャ

休講bot

前記事でメモした、最初の横国休講botを作成してからもうすぐ2年が経つ。

twitter.com

最初は一枚のpythonファイルとpickleによるキャッシュシステムがWindowsのラップトップ上で動いていて、まともなお知らせすらままならなかったこの休講botも、自分の経験に合わせてアップデートされ、ある程度まともにユーザーが定着してくれて2年目を迎えようとしていることは、なんだか感慨深い。

そろそろ自分の卒業が迫ってきて、運営することが難しくなってしまうので、公式化や引き継ぎに向けて動き出している。 今回はそのような時期でキリのいいタイミングであるので、現時点(2017/5/18)での構成を後々の振り返りや、引き継ぎのための資料としてメモしておこうと思う。

アーキテクチャ

www.slideshare.net

メモ

アーキテクチャや工夫した点は上記のスライドの通りであるが、少し補足を残しておこうと思う。

Nginxが存在する理由

休講botの機能としては基本的に休講情報をツイートしたり、ユーザーのDMに自動応答したりするものなので、基本的にhtmlファイルを取り扱うことはない。 それなのにNginxを使用している理由は、DMシステムの「使い方」ページにのみhtmlファイルを使用しているのと、djangoの管理画面を使用していることからである。

※使い方ページ https://goo.gl/bt2Fu1

無料を意識した

最初からマネタイズすることは考えていなかったので、とにかく無料で運用することにこだわった。 AWSのt2.microは一年間の無料枠が使えるので、それをフルに活用して、全てをEC2の1インスタンスに納める構成にした。

振り返り

せっかくなので休講botに関して、軽く振り返ってみようと思う。

フォロワーの意見も聞いてみたりした

初期の頃(フォロワーが1000人もいないころ)、ツイッターのアンケート機能を使って「今日の休講情報だけ欲しいか」という質問をしたことがある。 その結果3割程度の生徒が欲しいとのことだったので、その意見を取り入れて「横国今日の休講bot」を作った。 twitter.com

いろいろなことを試した

Twitter Analyticsではエンゲージメント率(コンバージョン率みたいなもの)を見ることができるが、それをあげるためにそういうのが得意な友人といろいろ工夫した。ツイートに絵文字をつけてみてt検定でエンゲージメント率に有意差があるのかとかをやった思い出がある。懐かしい。

休講botの宿の変遷

前述のように、休講botの構成は様々な変遷を経てきた。 具体的には Windows ラップトップ→ラズベリーパイAWS のように宿を変えてきた。 今後は無料で運営する限りはAWSから離れることはないかなと思う。

総じて

楽しかった。最初にこのbotを作った時はフォロワーが集まらなくて、「使われるわけない」と言われていたが、なぜか自分的には使われる自信があった。 その後友達にツイートをリツイートしてもらうと瞬く間にフォロワーが300人以上集まってきたあの時の感動は今でも忘れられない。 横国という狭く閉じた世界ではあるが、一時でも生徒に使ってもらえたことはとても嬉しいことで、そんな経験をさせてくれたユーザーや休講bot、アドバイスしてくれた友人にはとても感謝している。 今後もその感謝の気持ちを忘れずに、次はもっと大きな規模を目指して、物を作っていきたいと強く思う。

今後

とはいえまだ稀ではあるがバグが見つかったりはするので、修正していく。 Githubのプライベートリポジトリで管理しているので、公式化できなかった場合、引き継ぎ先の人と一緒に開発していくのは楽しそうだなと思う。 また、オープンソース化して横国生の後輩みんなで運用していくという選択肢もあるのかなと思う。

施策についての反省

個人的に運営している大学の休講BOT

twitter.com twitter.com

に関して、不定期で利用者を増やすために趣味で施策をやっているが、今回やった施策に関して反省があったのでいつか見返すためにメモする。

背景

これまで休講情報は学務にメールアドレスを登録していれば、休講メールとして学生に届いていた。しかし f:id:aoponaopon:20170419224526j:plain

のように、そのシステムが廃止になった。(理由は不明) これで学生は休講情報を知るためには、物理的に掲示板に行くか、めんどくさいログインをして学務サイトに見に行くしかなくなった。 しかし、これは休講ボットにとっては好都合で販促のタネになるのではと思った。  

やった施策 

目標設定←反省点

  • フォロワーを増やす + 100弱

スコープ設定←ここも反省点

  • なんとなく新入生?やリツイートでボットを知らないユーザー  

内容

  • 学務のメールが送られなくなったことを周知する文言と画像を添付して、拡散を促しボットを知らないユーザーへのリーチを目指す。
  • DM機能説明へのリンクをつけて、DM機能を周知する。

↓のツイートを行なった

gyazo.com  

結果

  • フォロワー 1970 -> 2010 (+40) ←想定していたより増えなかった
  • DM機能登録者数 82 -> 100(+18) ←ここに効いた

反省

学務からメールが来なくなったという事実は、新規のユーザーが休講ボットをフォローするというよりも、既存のユーザーがDM機能を使う販促として有効なのにも関わらず、そこにフォーカスを当てず、なんとなく「メール来なくなりました。ボットを使ってください→DM機能へのリンク」のようにしたことで、

  • 新規フォロワーを増やす
  • DM機能を使わせる

の二点の結果がどっちつかずになってしまった。

たまたまスペースが余ったのでDM機能へのリンクを張っていたのでDM利用者が増えたが、そこを意識していればもっと文言などを工夫できたと思う。   もしやるなら

### 目標設定

* DM機能使用者の獲得 +30 ~ 50
* (サブ)リツイートでのアカウントimp増による新規フォロワー +50

### スコープ
* DM機能を使っていない既存フォロワー
* (サブ)BOTを知らないユーザー

### 内容
これまで届いていたメールが届かなくなったことを伝え、DM機能ならもっと便利にリアルタイムで情報が届くことを強調してリンクを貼る。

みたいな感じでやる

Mastodonのインスタンスを立ててみた

Mastodonとは

github.com

mstdn.jpがブレイクしたことで話題になったようで、耳に入ったのでこれは流行りに乗れるのではと思い、サーバーを立てる側に回ってみた。 docker-composeを使うだけなので、難しくはないが、あとで振り返るためにメモを残しておく。

↓作成したインスタンス

mstdn.pics

↓執筆時のスコアは629

Mastodon instances

環境

手順

ドメインを取得する

お名前.comなどでドメインを取得しておく。 今回は良しなに

  • mstdn.pics
  • mstdn.video

を取っておいた。

サーバーを用意する

AWSのコンソールで、上記の環境を用意する。 今回は、一旦お試しということで、無料枠を使うためにt2.microを使用した。 HTTPSを使用するので、EC2インスタンス作成の際にはセキュリティグループを変更して、

を追加する必要がある。(デフォルトではSSH用のポートしか開いていない)

次に、Elastic IPでインスタンスIPアドレスを固定して、Route53でDNSのレコード設定をしておく。

必要なソフトをインストールする

インスタンス作成の際にダウンロードした鍵を使用してインスタンスSSHできたらまずは必要なソフトをインストールする。

  • git
  • docker
  • docker-compose >= 1.10.0
  • lets encrypt
  • nginx

それぞれ

git

$ sudo apt-get install git

docker

$ sudo su -
$ wget -qO- https://get.docker.com/ | sh
$ docker version
$ exit
$ sudo usermod -aG docker $USER

docker-compose

$ sudo su -
$ curl -L https://github.com/docker/compose/releases/download/1.10.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

lets encrypt

$ git clone https://github.com/letsencrypt/letsencrypt.git
$ cd letsencrypt/
$ ./letsencrypt-auto --help

nginx

$ sudo apt-get install nginx

のような感じでインストールした。

Mastodonをインストールする

冒頭に紹介した本家のリポジトリをフォークして、そいつをクローンして以下のように作業する。 (リポジトリのREADMEに書いてある)

$ cd mastodon
$ cp .env.production.sample .env.production
$ vi .env.production

以下変更点

# Federation
LOCAL_DOMAIN=your domain
LOCAL_HTTPS=true

# 全て同じ
PAPERCLIP_SECRET= docker-compose run --rm web rake secret で取得できるキー
SECRET_KEY_BASE= docker-compose run --rm web rake secret で取得できるキー
OTP_SECRET= docker-compose run --rm web rake secret で取得できるキー

# https://sparkpo.st/smtp にアカウント登録してSMTP_SERVER, SMTP_LOGIN, SMTP_PASSWORDを取得しておく
# sparkpostで取得したドメインでのメアドをverifyするにはRoute 53でTXTレコード設定をする必要があった。
SMTP_SERVER=sparkpostで手に入るホスト名
SMTP_PORT=587
SMTP_LOGIN=sparkpostで手に入るログイン ID
SMTP_PASSWORD=sparkpostで手に入るパスワード
SMTP_FROM_ADDRESS=mail@ドメイン名 # 送信元にしたいメアド。domainがsparkpostに登録&verifiedならOK
$ docker-compose build
$ docker-compose run --rm web rake secret
$ docker-compose run --rm web rails db:migrate
$ docker-compose run --rm web rails assets:precompile
$ docker-compose up -d # デーモンでの起動が嫌なら -dを消す

ここまでやれば

$ curl localhost:3000

は成功するはず。

これらに外部から80, 443ポートでアクセスしたいので、Lets EncryptとNginxの設定をする。

Lets Encryptの設定

$ cd letsencrypt
$ ./letsencrypt-auto certonly --webroot -w /home/mastodon/live/public(適当で良さそう) -d ドメイン名
$ メールアドレスを入力し、利用規約に同意する

すると、 /etc/letsencrypt/live/ドメイン名/に鍵が生成されているので、nginxの設定の際に使用する。

Nginxの設定

あとはNginxの設定をする。公式リポジトリのREADMEを元に少し変更すればOK

github.com

だが、やっていることは

  • 80 -> 443ヘリダイレクト
  • 443へリダイレクトさせたリクエストを localhost:3000へ転送する
  • /api/v1/streaming へのアクセスは localhost:4000へ転送する

と、その他のチューニング。

公式READMEの設定ファイルをコピーして、以下少しだけ変更する。

$ sudo vi /etc/nginx/conf.d/mstdn.conf


server {
  listen 80;
  listen [::]:80;
  server_name ドメイン;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name ドメイン;
...
  ssl_certificate     /etc/letsencrypt/live/ドメイン/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/ドメイン/privkey.pem;
...

$ sudo systemctl restart nginx

これで、アクセスできるはず。

気持ち

  • 基本的に docker-composeするだけだが、その他メールサーバーが必要とか、HTTPSとか、READMEに指示のないところを適宜自分で設定していったので、最初はスラスラできないのではと思った。

知見

  • 作成時、上記インスタンス一覧サイトに登録されているものは700ほどで、フォロワー3000以上のTwitterアカウントで拡散などしても意外とインスタンスの登録者は集まらなかった。ので、mstdn.jpがもう日本はほぼ独占している以上、色のないインスタンスを作っても登録者は集まらなそう。 差別化を測るために .picsは写真メインのインスタンス、などのように特化していこうかなという戦略も考えられる。
  • インスタンスのスコアをあげるにはHTTPS対応を始め、

observatory.mozilla.org

CryptCheck

で診断をすることが有効である。