Docker で 自動バックアップ付きの gitlabサイト を構築

gitlab 用の Dockerfile と関連スクリプトを公開しました。

* https://github.com/essa/docker-gitlab

一つのDockerコンテナの中で、アプリケーション本体だけでなく、assets配信用のnginx、gitlab-shell用のsshサーバ、redis-server等、一連のプロセスが全部動きます。

MySQLサーバだけ用意すれば、このDockerfileだけで、gitlabを手軽にインストールできます。

また、リポジトリを自動的に他のサーバにバックアップするための、lsyncd用のDockerfileも付属しています。

下記のDockerfileを参考に作成しました。

* https://github.com/crashsystems/gitlab-docker

## 使い方

### MySQLサーバのインストール

先に、MySQLサーバをインストールしてください。

MySQLサーバはDockerで動かす必要はありませんが、下記の記事で紹介したスクリプトを使うと、DBも自動バックアップつきで運用できます。

Docker で レプリケーションつきの MySQL を立ち上げる - Qiita [キータ] http://qiita.com/essa/items/440d76f73847e6e27099

### リポジトリをクローン

次に、Dockerfile等が入ったリポジトリをコピーします。

```bash
git clone https://github.com/essa/docker-gitlab.git
cd docker-gitlab
```

### Docker imageの構築

Docker imageをビルトします。

```bash
sudo docker build -t gitlab .
```

この処理は、Ruby のコンパイルや、gem のインストールでかなり時間がかかります。

タグを上記コマンドから変更した場合は、以下のstart_xxx.sh の起動スクリプトもそれに合わせて変更してください。

### 設定ファイルの修正

次に下記のスクリプトを実行します。

```bash
./setup_config.sh
```

最初に実行した時は、このスクリプトは、env というファイルを以下の内容で作成します。

```bash
# password for git user of gitlab
export Password="password"

export MySQLServerIP="(IP ADDRESS OF YOUR MYSQL SERVER)"
export MySQLServerPort="3306"
export MySQLPasswordForRoot="password"

export ServerName="(YOUR SERVER NAME FOR GITLAB)"
export GitlabPort="8080"

export LsyncdTargetHost="(YOUR SLAVE HOST)"
export LsyncdUser="(YOUR ACCOUNT OF SLAVE HOST)"
export LsyncdIdentityFile=$HOME/.ssh/id_rsa
```

このファイルをエディタで、ご自分の環境に合わせて修正してください。

修正したら、もう一度、先のスクリプトを実行します。

```bash
./setup_config.sh
```

"env"が存在すると、このスクリプトは、この内容を元に、config/の下に、以降で必要な設定ファイルを作成します。作成するのは、以下のファイルです。

* database.yml
* gitlab.yml
* nginx (gitlab コンテナ内の nginx 用定義ファイル)
* nginx_front (front end 用別コンテナ内の nginx 用定義ファイル)
* ssh_config_for_lsyncd (lsyncdで使用する、ssh/config ファイル)

これらの内容を確認して、必要があれば修正してください。

### gitlab 初期設定

次に以下のコマンドで gitlab用のコンテナを起動して、gitlabの初期設定を行います。

```bash
chmod +x scripts/firstrun.sh
sudo ./start_docker_gitlab.sh
```

このコンテナの起動スクリプトは、script/start.sh ですが、script/firstrun.sh が実行可能な場合は、start.shの中からこれを起動し、その中で初期設定が行なわれます。

初期設定の内容は、

* gitlab用DB、MySQLユーザの作成
* rake gitlab:setup の実行

です。実行後に、firstrun.shの実行許可ビットを落として、二度と実行しないようにします。

何らかの理由で、初期設定をやり直す場合は、chmod +x script/firstrun.sh を行なってから、コンテナを再起動してください。

### 実行

初期設定完了後、そのままgitlabが起動します。二回目以降は、下記のコマンドで起動してください。

```bash
sudo ./start_docker_gitlab.sh
```

http://localhost:8080/ からアクセスできます。初期設定の時に、下記の管理者アカウントが作成されていますので、これでログインしてください。

```
admin@local.host
5iveL!fe
```

### 制限事項

メール送信の機能はまだ設定、テストしていません。ユーザ登録後のパスワード通知メールが送信されないので、管理者アカウントからパスワードを設定して使ってください。

## おまけ1 (lsyncd によるリポジトリのコピー)

gitlabのデータは、MySQLのDBと、data/ ディレクトリに保存されます。この data/ ディレクトリを別のサーバにバックアップするための lsyncd をDocker 配下で起動するスクリプトを付属しています。

ビルド

```bash
(cd docker-lsyncd; sudo docker build -t lsyncd .)
```

実行

```bash
sudo docker-lsyncd/start_lsyncd.sh `pwd`/data
```

バックアップ先のサーバは、config/ssh_config_for_lsyncd で指定します。( env に設定した内容により、./setup_config.sh で作成されているはずです)

docker-lsyncd/ssh/ が、コンテナ内で lsyncd を実行するユーザの .ssh にマップされますので、必要であれば、秘密鍵等をここにコピーしてください。

## おまけ2 (front end 用の nginx)

上記のgitlabコンテナは、nginxを含んでいますが、このnginxは、gitlab専用になります。

もし、同じサーバで別の virtual host を立ちあげる場合は、別のコンテナで front end 専用の nginx を起動することができます。

docker-nginx-front/sites-enabled/ に、virtual host 用の定義ファイルをコピーしてから、下記のコマンドで起動してください。

```bash
(cd docker-nginx-front; sudo docker build -t nginx .)
```

```bash
sudo docker-nginx-front/start_nginx.sh
```