RaspberryPi3にGitBucket4.10.0をインストールして自前Gitサーバーを立てる

前回、RapberryPiのDockerでGitbucketを動かすという記事を書きましたが、やっぱりDocker上だと重かったです…
Dockerでnginxやphp-fpmで軽量のアプリケーションを動かす程度であれば全然大丈夫だと思うのですが、Javaを動かすのは流石にRasperryPi3といえど厳しかったです。

そこで、Dockerはやめて直接GitBucketをRaspberryPi3へインストールして利用することにしました。

概要

  • RaspberryPi3へGitBucket4.10.0(2017/3/19時点の最新)をインストールする
  • 保存先データは外付けHDD

外付けHDDのフォーマットとマウント

フォーマットの細かい手順は省略するとして、RaspberryPi3でXFSフォーマットするには、下記パッケージが必要なのでインストールします。

$ sudo apt-get install xfsprogs

これでXFSでフォーマットができるようになります。
あとは、いつも通りに、

$ sudo fdisk -l <-- ブロックデバイス名を確認する
$ sudo fdisk /dev/sda

もともと使っていたHDDであれば「d」オプションでパーティション消して、「n」で作成します。最後に「w」で書き込み。
パーティションが作成できたら、mkfsでXFSフォーマットします。

$ sudo mkfs.xfs /dev/sda

XFSフォーマットが完了したら、外付けHDDをマウントする先を準備します。

$ mkdir /mnt/usbhdd/

fstabにマウント先を書いて、再起動後もマウントされるようにします。

$ sudo vim /etc/fstab
~~ snip ~~

/dev/sda1 /mnt/usbhdd xfs rw 0 0

保存したらマウントします。

$ sudo mount -a
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
~~ snip ~~

/dev/sda1        233G  101M  233G    1% /mnt/usbhdd

ここまできたら外付けHDDの準備はOKです。

GitBucketをインストールする

GitBucketはJavaで動いており、Javaのインストールが必要です。

$ sudo apt-get install oracle-java8-jdk

インストールが終わったら、Gitbucketを保存する先を作成します。※上記で作成した外付けHDDの先。

$ mkdir /mnt/usbhdd/gitbucket

次に、GitBucketのGithubページで最新のgitbucket.warをダウンロードします。

$ cd /mnt/usbhdd/gitbucket
$ sudo wget -O gitbucket.war https://github.com/gitbucket/gitbucket/releases/download/4.10/gitbucket.war

対象のgitbucket.warを使って、データが外付けHDDへ保存されるようにオプションを指定して起動します。

$ sudo java -jar /opt/gitbucket/gitbucket.war --gitbucket.home=/mnt/usbhdd/gitbucket/&

そうすると、バラバラとログが流れるかと思います。
ブラウザで、http://RaspberryPiのIPアドレス:8080/ へアクセスして、「root/root」でログインできればOKです。
あとはrootのパスワードを変更したり、使用するユーザーを追加したり、リポジトリを追加したりすると良さそうです。

試してみる

MacにVagrant環境がなかったので、セットアップついでにgit-flowの流れで使い勝手を試してみました。

普通に使えますね!素晴らしい!!
外付けHDDへデータ保存するようにしたので、応答がタイムアウトするようだと厳しいなぁと思ったのですがストレスなく使えてます。
インストールだけならめちゃ簡単だし、外付けHDDとかあれば保存容量を気にせずに使えます。
自宅のなにがしをGit管理したいけど、外で管理したくないな〜って人にはオススメです。

今まで投げてきたけど、ついに自宅サーバーを構成管理しちゃうかなぁ〜。

おしまい。

参考にさせていただいたサイト

Raspberry Pi 2にGitBucketをインストールする

RaspberryPiのDockerでGitbucketを動かす

Raspberry Pi3を去年の夏くらいに買いまして、pythonでLチカしただけで放置しててさすがにもったいないなぁと思ってた矢先、ARMでもDockerが動くらしいという情報をネットで知ったのでやってみることにしました。
とは言え、docker runだけだとつまらないのでgitbucketとか、gitクローンが動いたら最高かもと思ってgitbucketを動かすことにしました。

環境

  • Raspberry Pi3
  • Rasbian
pi@raspberrypi:~ $ sudo cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.4.13-v7+ #894 SMP Mon Jun 13 13:13:27 BST 2016 armv7l GNU/Linux

Dockerのインストール

Raspberry  PiでDockerをインストールするのはめちゃ簡単で、ワンライナーを実行するだけです。

pi@raspberrypi:~ $ curl -sSL https://get.docker.com/ | sh

とは言え、私の環境だとなんかapt-get updateでコケまくってて、どうもミラーリストが死んでる?っぽいような状態だったので、ミラーリストを日本のに変更するなどしました。
普通にapt-get updateが動けば、問題なくインストールできると思われます。

pi@raspberrypi:~ $ sudo cat /etc/apt/sources.list
#deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
deb http://ftp.jaist.ac.jp/raspbian jessie main contrib non-free rpi
pi@raspberrypi:~ $ docker -v
Docker version 1.13.1, build 092cba3

2017/2/7現在では1.13.1がインストールされました。

Dockerイメージ

いつものようにdocker pullすると普通にイメージがダウンロードできるのですが、全てx86/64版なので、docker runしても起動できません。
raspberry pi用のイメージを有志たちが作っていて、頭に「rpi」がついたイメージであればraspberry piでも利用できるようです。
例えばnginxだとrpi-nginxというようなイメージ名となっています。
ただ、有志が作っているので、hub.docker.comで目的のイメージを探すと良さそうです。

gitbucketのイメージ

gitbucketもraspberry pi用のイメージを作ってくれている人がいて、イメージをダウンロードしてdocker runするだけで起動できます。

knjcode_rpi-gitbucket

docker run

ここまできたら、あとはコンテナを起動するだけです。

pi@raspberrypi:~ $ sudo docker run --name gitbucket -d -p 8080:8080 -p 29418:29418 -v ${PWD}/rpi-bitbucket/:/gitbucket knjcode/rpi-gitbucket

ブラウザでアクセスしてみる

ブラウザでアクセスしてみたところ、最初はアクセスできず。
というのも、やはりいくら4コアあるraspberry piとは言え、リソース不足。
LAも5を越えてしまって、かなり重たい状況になりました。

しかし、少し経つと段々落ち着いてきて、普通にログインできるようになりました。(デフォルト root/root でログイン可能です。)
試しにtestリポジトリを作ってみました。

起動直後と比べると圧倒的に軽くなりましたが、応答はやはり遅いです。
自宅でGit管理したいものに軽く使ってみようと思います。

おしまい。

Rubyでメールの送受信をする

みなさんはメールの送受信ってどうやってますか?

普通MacだったらMailなり、ThunderbirdなりのGUIアプリケーションを使用するかと思います。
しかし、インフラをやっているエンジニアだと、telnetなどでメールサーバーにつないで、接続確認を取ることがままあります。
しかし、メールサーバーへ接続するのにtelnetでつなぐと、認証情報をbase64エンコードしたりする場面が出てきます。
これが結構面倒だし、それに加えて手動だとコマンドミスなのかサーバー側の問題かを切り分けしやすいようスクリプト化したいなぁと思ってました。

シェルスクリプトで愚直にexpectも考えましたが、もう少しスマートでメンテナンスしやすいようにできないか調べてたところRubyのmailというgemが簡単そうということを知り、メールの送受信ができるようなスクリプトを作ってみました。

参考にしたサイト

参考にしたはのはこちらのサイトです。
メソッドの使い方などがどのサイトよりも丁寧に書かれていたので、このサイトに書いてあることを参考に下記スクリプトを書きました。

mailscript.rbファイル
require 'yaml'
require 'mail'
require 'date'
require 'socket'
require 'thor'

class EmailScript < Thor

  desc 'smtp','[Usage] ruby emailscript.rb smtp SMTPPORT MAILADDRESS ENVIRONMENT'
  def smtp(port, mailaddress, mailenv)
    pwinfo = YAML.load_file("mailenv.yaml")

    Mail.defaults do
      delivery_method :smtp, :address    => pwinfo["#{mailenv}"]['hostaddress'],
                             :domain     => pwinfo["#{mailenv}"]['hostaddress'],
                             :port       => "#{port}",
                             :authentication => :login,
                             :user_name  => pwinfo["#{mailenv}"]['user_name'],
                             :password   => pwinfo["#{mailenv}"]['password']
    end

    todaydate = Time.now
    svrhostaddress = pwinfo["#{mailenv}"]['hostaddress']

    begin
      Mail.deliver do
        from pwinfo["#{mailenv}"]['from_name']
        to "#{mailaddress}"
        header["X-Mailer"] = "Ruby-EmailScript"
        subject "TEST Mail from #{svrhostaddress} Port #{port} at #{todaydate}"
        body File.read("body.txt")
      end
      puts "Success send mail to #{port} port from #{mailenv}"
    rescue => e
      puts e
      puts "Failed send mail..."
    end
  end

  desc 'popimap', '[Usage] ruby emailscript.rb POPPORTorIMAPPORT ENVIRONMENT'
  def popimap(port, mailenv)
    pwinfo = YAML.load_file("mailenv.yaml")

    case "#{port}"
    when "110", "995"
      Mail.defaults do
        retriever_method :pop3, :address    => pwinfo["#{mailenv}"]['hostaddress'],
                                :port       => "#{port}",
                                :user_name  => pwinfo["#{mailenv}"]['user_name'],
                                :password   => pwinfo["#{mailenv}"]['password'],
                                :enable_ssl => pwinfo["#{mailenv}"]['enable_ssl']
      end
    when "143", "993"
    Mail.defaults do
        retriever_method :imap, :address    => pwinfo["#{mailenv}"]['hostaddress'],
                                :port       => "#{port}",
                                :user_name  => pwinfo["#{mailenv}"]['user_name'],
                                :password   => pwinfo["#{mailenv}"]['password'],
                                :enable_ssl => pwinfo["#{mailenv}"]['enable_ssl']
      end
    end

    begin
        puts <<-EOS
### HEADER \n#{Mail.last.header}
### subject \n#{Mail.last.subject}\n
### body \n#{Mail.last.body}
EOS
      puts "---\nSuccess pop/imap mail #{port} port from #{mailenv}"
    rescue => e
      puts e
      puts "Failed pop/imap mail..."
    end
  end

end

EmailScript.start(ARGV)

mailenv.yamlファイル
docker:
  hostaddress: 接続先サーバーアドレス
  user_name: 認証用のユーザー名
  password: パスワード
  enable_ssl: false
使い方

送信

$ ruby mailscript.rb smtp 25 info@hogepiyo.com docker

受信

$ ruby mailscript.rb popimap 110 docker

※dockerでテストしながら作っていたので、dockerという環境名を例にしています。

ポイントは、認証情報をyamlで管理してることと、thorでオプション追加することでクライアントツールっぽさを出したところです。
mail gemが標準でSSLにも対応しているのと、送信と受信それぞれにとても使いやすいメソッドが用意されていたのでそれを活用してます。
mailenv.yamlに同じように環境を追加していけば、送信と受信をこれ一つで試すことが可能です。

改善余地は多々あると思いますが、ちょっと前から考えていたスクリプトがとりあえず出来たので満足です。
これでメールサーバーへの接続方法が短縮できて、生産性向上です。