Retrobot on Docker

2年前の夏くらいから、white_retro という名前の twitter bot を運用してる。
このアカウント(bot)では、

  • 1年前の @7kajii の発言
  • 2年前の @7kajii の発言
  • 1年前の whitech0c0late のブックマークした記事 *1

をツイートしている。

運用所感

2年弱、運用しているけど自分(成長したとこ、成長してないとこ、イベントなど) を振り返るとてもよいツールだなぁと感じている。

今回やったこと

1,2 年前の発言は Heroku で運用しているが、このたび Herokuの料金体系(無料枠)が変更になるということで、 DigitalOcean に引っ越すついでに Docker(CoreOS)で動かすことにした。

DegitalOcean *2

DegitalOcean は、初めて使った。以下のスライドが超絶わかりやすい。

API が充実していて、いろんな設定・管理がプログラマブルにできる。 今回は、Vagrant で Droplet を起動してみた。 vagrant-digitalocean *3 を使えば、Vagrant の扱いとほぼ同じ感じでちょいさくでいろいろ試すことができる。

# Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Dotenv.load

if ENV["NUM_INSTANCES"].to_i > 0 && ENV["NUM_INSTANCES"]
  $num_instance = ENV["NUM_INSTANCES"].to_i
end

Vagrant.configure('2') do |config|
  config.ssh.username = 'core'
  (1..$num_instance).each do |i|
    config.vm.define "core-retrobot-#{i}" do |config|
      config.vm.provider :digital_ocean do |provider, override|
        override.ssh.private_key_path = '~/.ssh/id_rsa'
        override.vm.box               = 'digital_ocean'
        override.vm.box_url           = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"
        provider.token                = "#{ENV['TOKEN']}"
        provider.image                = 'coreos-stable'
        provider.region               = 'sgp1'
        provider.size                 = '512MB'
        provider.ssh_key_name         = "YOUR SSH KEY NAME"
        provider.setup                = false
        provider.private_networking   = true
        provider.user_data            = File.read('user-data.yml')
      end
    end
  end
end

fleet も使ってみたかったので、2つのDroplet(インスタンス)を立てて、user-data.yml も同じディレクトリ以下に配置している。
ここはよしなに。

起動

$ vagrant up
$ vagrant status
Current machine states:

core-retrobot-1           active (digital_ocean)
core-retrobot-2           active (digital_ocean)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

エイリアス設定しとく

$ vagrant ssh-config core-retrobot-1 >> ~/.ssh/config
$ vagrant ssh-config core-retrobot-2 >> ~/.ssh/config

ログイン

$ ssh core-retrobot-※

かくにん

CoreOS stable (647.0.0)
core@core-retrobot-1 ~ $ docker -v
Docker version 1.5.0, build a8a31ef-dirty
core@core-retrobot-1 ~ $ etcdctl -v
etcdctl version 0.4.6
core@core-retrobot-1 ~ $ fleetctl -version
fleetctl version 0.9.2

Docker化

retrobot 用のDockerfile *4 をつくる必要がある。

FROM ruby:2.2.2

ENV LANG C.UTF-8                      
RUN cd /opt && git clone https://github.com/mirakui/retrobot.git

WORKDIR /opt/retrobot
RUN bundle install

ADD retrobot.yml retrobot.yml
ADD tweets tweets

# CMD bundle exec get-twitter-oauth-token
ENTRYPOINT ["retrobot"]
CMD ["-c", "rebtrobot.yml"]

retrobot.yml に twitter の TOKEN などを設定 & tweets.zip を解凍して配置する。 ビルドして、push。

$ docker build -t 7kaji/retrobot .
$ docker push 7kaji/retrobot

いちおうプライベートリポジトリににした。
Quay.io を利用するのもよさそう。

retrobot 起動

$ docker login

クラスタ確認

$ fleetctl list-machines

起動(Unit ファイル)

$ fleetctl start retrobot.service

# fleet を使わない場合は docker run で起動

ログ確認

$ fleetctl journal -f retrobot.service

retrobot.service

# retrobot.service
[Unit]
Description=Retrobot: tweet what 7kajii tweets in 1 year ago

# Requirements
After=docker.service

[Service]
User=core
TimeoutStartSec=0
KillMode=none
Restart=always
RestartSec=5

# Start
ExecStartPre=-/usr/bin/docker kill retrobot
ExecStartPre=-/usr/bin/docker rm retrobot
ExecStart=/usr/bin/docker run --name retrobot 7kaji/retrobot
ExecStop=/usr/bin/docker stop retrobot

X-Fleet のセクションは、使っていない。

Unitファイルについては、以下の記事がとても丁寧で、わかりやすい

Fleetの使い方,Unitファイルの書き方 | SOTA : http://deeeet.com/writing/2014/11/20/fleet/

動作確認

ちゃんと動いているっぽい。 

今後やりたいこと

  • Datadog とかを使って監視とかしてみたい
  • failover とかの実験(etcd, fleet のこといろいろ知りたい)
  • 1アカウントしか動いていないし、なにかしらに有効活用したい (retrobot 運用受託してもよいかもしれない)

REF

github.com

*1:1年前の whitech0c0late のブックマークした記事は、自分のブックマークをRSS として発信( Pipes: Rewire the web)して IFTTT でフックして発言しているため、関係なし。

*2:もし、使い始めるならここから!https://www.digitalocean.com/?refcode=e88d63da1e6d

*3:github.com

*4:github.com