Keycloak 21.1.1を本番モードで動かしてみた（ローカル環境／Docker使用）

# 本記事で行うこと

Keycloakの起動には開発モードと本番モードの2種類があります。
[前回書いた記事](https://qiita.com/kanedaq/items/2678cfe978724dbca117)では開発モードで起動しましたが、本記事では本番モードで起動してみます。
ただしサーバーやクラウドにはデプロイしません。
ローカル環境でDockerを使用し、httpsとhttpの両方を試します。

開発モードでの起動
```
bin/kc.[sh|bat] start-dev
```

本番モードでの起動
```
bin/kc.[sh|bat] start
```

# Dockerコンテナ

Dockerコンテナはデータベース用とKeycloak用の2種類を用意しました。
後日Keycloak側をクラウドにデプロイするつもりなので、Docker Composeを使わないことにします。

## データベースのコンテナ

本記事ではPostgreSQLを使用しました。

### Dockerfile

```Dockerfile

FROM postgres

ENV POSTGRES_DB keycloak
ENV POSTGRES_USER keycloak
ENV POSTGRES_PASSWORD secret

EXPOSE 5432
```

### docker build

```sh

docker build ./ -t mygres
```

### docker run

```sh

docker run -p 5432:5432 -v /home/user/mydata:/var/lib/postgresql/data mygres
```

## Keycloakコンテナ

### httpsで動かすKeycloakコンテナ（オレオレ証明書使用）

#### Dockerfile

[公式サイト](https://www.keycloak.org/server/containers)のDockerfileを利用しましたが、そのままではうまく動かなかったので、少し変更しました。

```Dockerfile

FROM quay.io/keycloak/keycloak:latest as builder

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# Configure a database vendor
ENV KC_DB=postgres

WORKDIR /opt/keycloak
# for demonstration purposes only, please make sure to use proper certificates in production instead
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
RUN /opt/keycloak/bin/kc.sh build

FROM quay.io/keycloak/keycloak:latest
COPY --from=builder /opt/keycloak/ /opt/keycloak/

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# change these values to point to a running postgres instance
ENV KC_DB=postgres
ENV KC_DB_URL=jdbc:postgresql://host.docker.internal:5432/keycloak
ENV KC_DB_USERNAME=keycloak
ENV KC_DB_PASSWORD=secret
ENV KC_HOSTNAME=localhost

EXPOSE 8443

ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start"]
```

#### docker build

```sh

docker build ./ -t mycloak
```

#### docker run

- 初回

環境変数KEYCLOAK_ADMIN（管理ユーザー名）とKEYCLOAK_ADMIN_PASSWORD（管理ユーザーパスワード）を指定しています。

```sh

docker run --add-host=host.docker.internal:host-gateway -p 8443:8443 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin mycloak
```

- 2回目以降

2回目以降のdocker runで、KEYCLOAK_ADMINを指定すると動かなくなることがありましたので、外しました。

```sh

docker run --add-host=host.docker.internal:host-gateway -p 8443:8443 mycloak
```

### httpで動かすKeycloakコンテナ

#### Dockerfile

```Dockerfile

FROM quay.io/keycloak/keycloak:latest as builder

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# Configure a database vendor
ENV KC_DB=postgres

WORKDIR /opt/keycloak
RUN /opt/keycloak/bin/kc.sh build

FROM quay.io/keycloak/keycloak:latest
COPY --from=builder /opt/keycloak/ /opt/keycloak/

# change these values to point to a running postgres instance
ENV KC_DB=postgres
ENV KC_DB_URL=jdbc:postgresql://host.docker.internal:5432/keycloak
ENV KC_DB_USERNAME=keycloak
ENV KC_DB_PASSWORD=secret
ENV KC_HOSTNAME=localhost

EXPOSE 8080
ENV KC_HTTP_PORT=8080
ENV KC_HTTP_ENABLED=true
ENV KC_HOSTNAME_STRICT=false
ENV KC_HOSTNAME_STRICT_HTTPS=false

ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start"]
```

#### docker build

```sh
docker build ./ -t mycloak_http
```

#### docker run

httpsバージョンとの違い
- PORTが8080

```sh
docker run --add-host=host.docker.internal:host-gateway -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin mycloak_http
```

# 動作確認

## httpsで動かす

ブラウザで https://localhost:8443 にアクセスします。
オレオレ証明書を使用しているので、以下のように警告が出ます。
「詳細設定」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/6196e5ba-27b5-6bf8-f1b9-2599a6e4561a.png)

「localhost にアクセスする」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/585a17d3-a0f7-2e83-0ffd-99bfeea86802.png)

「Administration Console」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/81f48ec3-83b3-8253-49bd-e75f33bbd23f.png)

Sign Inします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/23c16526-04cd-8455-f66d-5767092a74f8.png)

Sign Inできました。以降は通常通り使えました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/d15a5568-a769-eaf2-adee-f9113081d960.png)

## httpで動かす

ブラウザで http://localhost:8080 にアクセスします。
httpsバージョンのようにオレオレ証明書に対する警告が出ず、通常通り動きました。

# おまけ

試しにKeycloakをCloud Runにデプロイしてみました。
まだ本番では使えない中途半端な状態ですが、一応動いたので、Dockerfileを載せておきます
（何らかの方法で、環境変数KEYCLOAK_ADMINとKEYCLOAK_ADMIN_PASSWORDを設定する必要があります）。

```Dockerfile

FROM quay.io/keycloak/keycloak:18.0 as builder

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

WORKDIR /opt/keycloak
RUN /opt/keycloak/bin/kc.sh build

FROM quay.io/keycloak/keycloak:18.0

LABEL version="0.1"
LABEL maintainer="***.*** <****@****.com>"

COPY --from=builder /opt/keycloak/ /opt/keycloak/

ENV KC_HTTP_ENABLED=true
ENV KC_HOSTNAME_STRICT=false
ENV KC_HOSTNAME_STRICT_HTTPS=false
ENV KC_HOSTNAME_URL=http://localhost:8080
ENV KC_PROXY=edge

ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start"]
```