DockerでGitBucketの環境を構築してDocker上の他のサービスからSSHで接続する

# 動機
とあるdocker-compose.ymlで立ち上げたサービスから、新たに別のdocker-compose.ymlで立ち上げたGitBucketのリポジトリへ接続する際に少し手間取ったので、備忘録として
コンテナ間通信については本記事で紹介する方法の他に`host.docker.internal`を利用するものもあるようですが、ここでは触れません

# 環境
WSL2 Ubuntu24.04 LTS
Docker 及び Docker compose plugin

# 本題

### GitBucketの立ち上げ準備
殆どは以下の記事の通りです
> [DockerでGitBucketのコンテナを作成し永続化させる](https://qiita.com/sey323/items/499721598e8c2fec62c6)

DockerhubにあるGitBucketのイメージは更新されていないので、最新版を使用するためにはDockerfileからイメージをビルドする必要があります

#### GitBucketのDockerfile
```
FROM tomcat:10-jre11

ADD https://github.com/gitbucket/gitbucket/releases/download/4.41.0/gitbucket.war /opt/gitbucket.war

EXPOSE 8080 29418

CMD ["java", "-jar", "/opt/gitbucket.war"]

```
- 使用するGitBucketのバージョンに合わせて以下の記述を適宜変更してください。
`FROM tomcat:10-jre11`
`ADD https://github.com/gitbucket/gitbucket/releases/download/4.41.0/gitbucket.war `

- Dockerfileの準備が終わったら`docker build`でイメージをビルドします
例：`docker build -t gitbucket:4.41.0 ./`

#### GitBucketのdocker-compose.yml
```YAML
services:
  gitbucket:
    image: gitbucket:4.41.0
    container_name: gitbucket
    ports:
      - "127.0.0.1:88:8080"
      - "127.0.0.1:29418:29418"
    volumes:
      - "./gitbucket:/root/.gitbucket"
    restart: no
    networks:
      - git_network
networks:
    git_network:
        external: true
```
- imageには先ほどビルドしたイメージを指定します
- volumesの記述は`docker-compose.yml`のある`./`以下に`gitbucket`ディレクトリを作成し、コンテナ内の`/root/.gitbucket`へのバインドマウントを行うことを意味しています
- networksでは、あらかじめ作成するdocker networkを指定します。ネットワークの名前はどのようなものでも構いませんが、今回は`git_network`としています
    ネットワーク作成のコマンド例：`docker network create git_network`
    >これは異なる`docker-compose.yml`を跨いで通信を行うために必要な設定となります。今回gitbucketのリポジトリへ接続するサービスの例として、同一の`git_network`を設定したappsmithの`docker-compose.yml`を示します
#### appsmithのdocker-compose.yml
```yaml
services:
   appsmith:
    image: index.docker.io/appsmith/appsmith-ce:v1.26
    container_name: appsmith
    ports:
         - "127.0.0.1:80:80"
         - "127.0.0.1:443:443"
    volumes:
         - ./stacks:/appsmith-stacks
    restart: unless-stopped
    networks:
      - git_network
networks:
    git_network:
        external: true
```
###  gitbucketの立ち上げ・設定

`docker-compose.yml`の準備が整ったら、`docker compose up -d`でコンテナを立ち上げます
上記の設定のままであれば、ブラウザで`localhost:88`へと接続すると、GitBucketの管理画面が表示されると思いますので`root`でログインしてください。以降はGitBucket管理画面上の操作になります
各記述のポートやホスト名(サービス名)は、適宜`docker-compose.yml`の設定に合わせて変更してください
1. 右上の`System administration`から、`System settings`へと遷移する
1. **Base URL**に`http://localhost:88`を設定する
1. `Integrations`タブで、**Enable SSH access to git repository**にチェックを入れ、**SSH bind host**に`gitbucket`を、**SSH bind port**には`29418`を設定する
1. リポジトリを作成し、デプロイキーの登録等を行う

以上の設定を行うことで、docker上の同一ネットワークが設定されたサービスから`ssh://git@gitbucket:29418/~`でリポジトリへの接続ができるようになります
<p></p>

`docker-compose.yml`のネットワークの設定と、サービス名による名前解決が肝で、他は特に気にかけるべきことはありませんね

# 付記
GitBucketの標準のデータベースはH2ですが、その実PostgreSQL等の利用が推奨されています

> [GitBucketをPostgreSQLやMySQLで動かす](https://takezoe.hatenablog.com/entry/2016/07/16/025154)

以下にPostgreSQLを用いる場合の各種設定の例を示します

#### GitBucketのdocker-compose.yml
```yaml
services:
  gitbucket:
    image: gitbucket:4.41.0
    container_name: gitbucket
    ports:
      - "127.0.0.1:88:8080"
      - "127.0.0.1:29418:29418"
    restart: no
    volumes:
      - "./gitbucket:/root/.gitbucket"
    depends_on: 
      git_db: 
        condition: service_healthy
    networks:
      - default
      - git_network

  git_db: 
    image: postgres:16.2
    environment: 
      POSTGRES_DB: gitbucket
      POSTGRES_PASSWORD: gitbucket
      POSTGRES_USER: gitbucket
    healthcheck: 
      interval: 10s
      retries: 10
      test: "pg_isready -U \"$$POSTGRES_USER\" -d \"$$POSTGRES_DB\""
      timeout: 2s
    restart: no
    volumes: 
      - "./postgres:/var/lib/postgresql/data"

networks:
   git_network:
        external: true
```


#### GitBucketのdatabase.conf
```conf
db {
  url = "jdbc:postgresql://git_db/gitbucket"
  user = "gitbucket"
  password = "gitbucket"
}
```

`gitbucket`サービスのnetworksに`default`と`git_network`の両方を設定するのがミソですね