Giteaのインストール

　以前の記事に書いたように、[Mac miniが壊れて](https://qiita.com/0xffffff/items/1c9ead863604cdaf9c5f)しまいました。
　この時の作業で、一番時間がかかったのがデータのコピー作業でした。というのも、今まで作成したアプリ、サンプルなどが整理されないままたくさんあり、その大量のファイルをコピーしているのに時間を取られてしまいました。やっぱり、日頃から整理しないとダメだなと思い、たくさんあるgitリポジトリをうまく管理する方法はないかと調べてみました。
　必要としているのは、リポジトリの一覧を表示し、その中身を簡単に閲覧できるようなものです。要はgithubのようなものになるわけで、そうするとすぐに思いつくのがフリーで取得できる[gitlab](https://about.gitlab.com/)となります。ただ、非常に複雑なツールであり、これを今後メンテナンスしていくというのはちょっと大変な気がしました。
　それ以外に似たようなツールはないかと調べてみると[Gitea](https://docs.gitea.io)なるものがあることを知り、Ubuntu Server 16.04にインストールして、試してみました。

# バイナリパッケージを用いたインストール
　Giteaにはバイナリパッケージがあり、それを使えば、そのバイナリ一つをダウンロードするだけで作業が完了します。この点がGiteaの最大の特徴でもあります。以下で、その手順を説明します。

## ユーザの追加
Giteaを起動するユーザgiteaを新たに追加します。
`$ sudo adduser gitea`
`$ sudo gpasswd -a gitea sudo`

## mysqlの設定
MySQLにデータベースgiteaを作成します。
`$ mysql -u root -p`
`mysql> DROP DATABASE IF EXISTS gitea;`
`mysql> CREATE DATABASE IF NOT EXISTS gitea CHARACTER SET utf8 COLLATE utf8_general_ci;`
`mysql> GRANT ALL ON gitea.* to 'gitea'@'localhost' identified by '<パスワード>';`

## Giteaのインストール
Giteaのバイナリをダウンロードして、binフォルダに格納します。
`$ wget -O gitea https://dl.gitea.io/gitea/1.3.2/gitea-1.3.2-linux-amd64`
`$ chmod +x gitea`
`$ mkdir bin`
`$ mv gitea bin/`

## Giteaのサービス登録
`$ sudo vim /etc/systemd/system/gitea.service`

```text:gitea.service
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
#After=mysqld.service
#After=postgresql.service
#After=memcached.service
#After=redis.service
[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
RestartSec=2s
Type=simple
User=gitea
Group=gitea
WorkingDirectory=/home/gitea
ExecStart=/home/gitea/bin/gitea web
Restart=always
Environment=USER=gitea HOME=/home/gitea
[Install]
WantedBy=multi-user.target
```

## Giteaの起動
Giteaを起動します。
`$ sudo systemctl start gitea`
サーバの起動時にGiteaを自動起動するようにします。
`$ sudo systemctl enable gitea`

## Giteaのセットアップ
　GiteaはHTTPサーバを内蔵していますので、ブラウザで以下のURLにアクセスすればセットアップ画面を表示できます。
http://localhost:3000
セットアップ画面が表示されるので、必要な事項を入力します。ここで入力した内容はcustom/app.iniに書き込まれるので、もし間違った設定をした場合は直接編集すれば問題ないです。
　正しく設定されれば、この状態でリポジトリの作成、HTTP経由によるリポジトリへのアクセスができるはずです。

## リポジトリへのSSHでのアクセス
　GiteaはSSHサーバを内蔵しています。つまり、OpenSSHサーバを経由しないでSSHでアクセスできます。この方がコンパクトになるのはわかるのですが、22ポートで起動してしまうと、OpenSSHサーバと衝突していまいます。
　OpenSSHとGiteaのSSHの両方を起動しようとすると、ポート番号を変更しなければなりません。なので、GiteaのSSHのポートを10022に設定することとします。
　custom/app.iniに以下の設定を記述します。

```text:custom/app.ini
DISABLE_SSH      = false
SSH_PORT         = 10022
START_SSH_SERVER = true
```

 Giteaを再起動します。
`$ sudo systemctl restart gitea`
SSHサーバが正しく起動すれば、gitea.logに以下のような記述が見られるはずです。
`SSH server started on :10022.`

　次にpublic keyの追加を行います。これには、Web画面より、ユーザの設定を選択し、”SSH/GPGキー”タブを選択します。そして、public keyを追加します。これで、sshを経由して、git clone/pull/pushができるはずです。

# Giteaのビルド
　バイナリインストールは簡単ですが、文言の変更をしたいといったちょっとした変更もできないという問題があります。なので、以下ではGiteaのソースからのビルド方法について説明します。

## goのインストール
go 1.9.2をダウンロードして、/usr/localに展開します。
`$ sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz`
~/.profileに以下を追加します。(GOPATHはgoがgo getで取得したソースを格納したり、ビルドした後のバイナリを保管したりする場所として使われます）

```shell:~/.profile
export GOPATH=$HOME/go
PATH=$PATH:/usr/local/go/bin
PATH=$PATH:$GOPATH/bin
```
変更を反映します。
`$ source ~/.profile`
goが起動することを確認します。
`$ go`

## go-bindataのビルド
Giteaはgoも含めてすべてを一つのバイナリに納めたbindataという形式で配布しています。bindataを作成するためには、[go-bindata](https://github.com/jteeuwen/go-bindata)というパッケージをインストールする必要があります。
`$ go get -u github.com/jteeuwen/go-bindata/...`
$GOPATH/binにgo-bindataが作成されているはずです。

## Giteaのビルド
以下の内容に従って作業を行います。
https://docs.gitea.io/en-us/install-from-source/
giteaのソースコードをダウンロードします。
`$ go get -d -u code.gitea.io/gitea`
`$ cd $GOPATH/src/code.gitea.io/gitea`
ブランチを指定します。
`$ git branch -a`
`$ git checkout v1.3`
タグを指定します。
`$ git tag -l`
`$ git checkout v1.3.2`
ビルドを実行します。
`$ TAGS="bindata" make generate build`
$GOPATH/src/code.gitea.io/giteaにGiteaのバイナリが作成されます。既存のバイナリと入れ替えれば、ビルドしたGiteaバイナリで起動するようになります。

# Giteaの感想
　しばらく使ってみましたが機能に不満はありませんでした。省電力Celeronの非常に非力なサーバで稼働していますが、すべてGoで書かれているだけあって、速度に問題はありません。
　気になるのは、MySQLに独自形式でデータを格納しているので、一度Giteaに移行してしまうと、二度と離れることはできなくなる点と、SSHサーバを10020で立ち上げているのでgitのリモートURLにそのポート番号が入ってしまう点です
　ただ、一番の大きな問題は、既存の、Giteaで作成していないリポジトリを一括して移行する方法がないことです。何かスクリプトが書けないかと調べてみましたが、今のところはできないようです。
　なので、結局Giteaの採用はあきらめてしまいました。