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/
動作確認
ちゃんと動いているっぽい。
むくり。がばっ
— ななかじレトロ (@white_retro) 2015, 5月 16
今後やりたいこと
- Datadog とかを使って監視とかしてみたい
- failover とかの実験(etcd, fleet のこといろいろ知りたい)
- 1アカウントしか動いていないし、なにかしらに有効活用したい (retrobot 運用受託してもよいかもしれない)
REF
*1:1年前の whitech0c0late のブックマークした記事は、自分のブックマークをRSS として発信( Pipes: Rewire the web)して IFTTT でフックして発言しているため、関係なし。
*2:もし、使い始めるならここから!https://www.digitalocean.com/?refcode=e88d63da1e6d