GitBucketのデータベースを postgreSQLに移行する

## 想定する読者

これまで GitBucketを組み込みデータベースで運用していて、安定性に不安を感じ始めている管理者。

#### あまり想定していない読者

これから GitBucket + postgreSQLを運用していこうと考えている管理者は以下のページを参考にしたほうが良い。
 → [Qiita: docker-composeでGitBucket+PostgreSQLを起動する](https://qiita.com/y0sikatu/items/0691b3aad19207d1f69e)

## 手順
仮のGitBucketサーバを作り、そのデータを postgreSQLに移行する手順を追っていく。

この手順は基本的に公式ガイドに従っている。
→ https://github.com/gitbucket/gitbucket/wiki/External-database-configuration#postgresql

サーバ動作環境として dockerを使っているが、実サーバ上の稼働でも Webブラウザ上や psqlの操作は変わらない。

### GitBucketサーバを組み込みDBで起動

    docker run -it --rm --name gitbucket -p 8080:8080 -v `pwd`/gitbucket-data:/gitbucket gitbucket/gitbucket

```http://localhost:8080/``` にアクセスし、```root/root```で Sign in。移行するデータを作るために、ユーザーやグループ、プロジェクト, issueを適当に追加する。

#### データの export

Webページ右上のメニューから System Administration → Data export/import。エクスポートする項目(基本的に全部でいい)にチェックを入れて Exportボタン。 ```gitbucket-export-7106966519106537149.sql``` といった名前でローカルに保存される。

#### GitBucketサーバ停止

ここで一旦 GitBucketを停止する。

### PostgreSQLサーバ準備

    docker run -it --rm --name postgres -p 5432:5432 -v `pwd`/postgres-data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=passwordX postgres:12-alpine

サーバが起動したら、psqlコマンドで postgreSQLサーバに接続し、データベースとユーザーを作成する。ユーザー名、パスワードは適切に設定する。 ユーザー postgresのパスワードも変更したほうがいい。

```
 $ psql -h localhost -p 5432 -U postgres
Password for user postgres: 
psql (9.2.24, server 12.5)
WARNING: psql version 9.2, server version 12.0.
         Some psql features might not work.
Type "help" for help.

postgres=# create database gitbucket;
CREATE DATABASE
postgres=# create user sa password 'sa';
CREATE ROLE
postgres=# 
 $ 
```

設定が終わったら一旦 postgresサーバを停止する。

### GitBucketのデータベース設定変更
gitbucket-data/database.confを編集する。

編集前

```
db {
  url = "jdbc:h2:${DatabaseHome};MVCC=true"
  user = "sa"
  password = "sa"
}
```

編集後

```
db {
  url = "jdbc:postgresql://postgres:5432/gitbucket"
  user = "sa"
  password = "sa"
}
```

```//postgres:5432```の部分は実際に postgreSQLサーバが動作するホスト名とポート番号が入る。ユーザとパスワードは先程 psqlコマンドで設定したもの。

### サーバの起動

postgreSQL、gitbubketサーバを順に起動する。がちょっと注意が必要。

#### (docker環境のみ) ネットワークブリッジの作成

これはサーバを dockerで動かしている場合のみの話だが、dockerコンテナ間で通信を行うためのブリッジを作成する必要がある (→ https://knowledge.sakura.ad.jp/16082/)。

    docker network create gitbucket-network

dockerコンテナの起動時に、このネットワークを指定する

#### postgreSQLサーバの起動

    docker run -it --rm --name postgres --network gitbucket-network -p 5432:5432 -v `pwd`/postgres-data:/var/lib/postgresql/data postgres:12-alpine

#### gitbucketサーバの起動

    docker run -it --rm --name gitbucket --network gitbucket-network -p 8080:8080 -v `pwd`/gitbucket-data:/gitbucket gitbucket/gitbucket

#### gitbucketと postgreSQLが連携できていることを確認する

この時点で gitbucketは postgreSQLサーバと接続し gitbucketデータベースが空であることを認識して、初期状態で起動している。

```root/root```でログイン、 System Administration → System settingsを開き、データベースが postgresqlとなっていることを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847/4acd94df-78b5-2537-4ca3-20900631f72e.png)


### データのインポート

最後にデータのインポート。 ```Data export/import``` を開き、画面下部の Importセクションのファイルの選択から、export時にダウンロードしたファイルを指定して緑のimportボタンを押す。

次に Data viewerを開き、以下のSQLを1行ずつ実行する。 psqlコマンドでも可。

```
SELECT setval('label_label_id_seq', (select max(label_id) + 1 from label));
SELECT setval('access_token_access_token_id_seq', (select max(access_token_id) + 1 from access_token));
SELECT setval('commit_comment_comment_id_seq', (select max(comment_id) + 1 from commit_comment));
SELECT setval('commit_status_commit_status_id_seq', (select max(commit_status_id) + 1 from commit_status));
SELECT setval('milestone_milestone_id_seq', (select max(milestone_id) + 1 from milestone));
SELECT setval('issue_comment_comment_id_seq', (select max(comment_id) + 1 from issue_comment));
SELECT setval('ssh_key_ssh_key_id_seq', (select max(ssh_key_id) + 1 from ssh_key));
SELECT setval('priority_priority_id_seq', (select max(priority_id) + 1 from priority));
```

※ 開発者 takezoeさんの初期記事 ( [GitBucketをPostgreSQLやMySQLで動かす](https://takezoe.hatenablog.com/entry/2016/07/16/025154) )では activityに関する SQLも記載されているが、これはバージョン 4.34.0以降不要になっている。

#### done

一通り動かして問題がないことを確かめる。