KeycloakをFreeBSD 12.1Rで動かす

## 環境

- OS：FreeBSD 12.1R(Jail内)
- Keycloak：Keycloak 8.0.1

とりあえず、動くことを目的としているため、Keycloak内蔵のデータベースを利用し、最小環境で動かします。

## 環境の準備

```
# pkg install openjdk8-jre ca_root_nss
```

## Keycloakのインストール

# ダウンロード

```
# fetch https://downloads.jboss.org/keycloak/8.0.1/keycloak-8.0.1.tar.gz
# tar xvzf keycloak-8.0.1.tar.gz
```

### 起動スクリプトを作成

どっかで見つけたスクリプトをベースにさせてもらっています。

```/usr/local/etc/rc.d/keycloak
#!/bin/sh
#
# PROVIDE: keycloak
# REQUIRE: LOGIN DAEMON NETWORKING
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf.local to enable the Keycloak:
#
# keycloak_enable="YES"
# keycloak_path="/root/keycloak-8.0.1/bin/standalone.sh"
# keycloak_args="<keycloak options>"
#

. /etc/rc.subr

export PATH=$PATH:/usr/local/bin/

name="keycloak"
rcvar=`set_rcvar`

load_rc_config ${name}
pidfile="/var/run/${name}.pid"
logfile="/var/log/${name}.log"

export LAUNCH_JBOSS_IN_BACKGROUND=true
export JBOSS_PIDFILE=${pidfile}

extra_commands="status"
start_cmd="${name}_start"
stop_cmd="${name}_stop"
status_cmd="${name}_status"

: ${keycloak_enable="NO"}
: ${keycloak_path=""}
: ${keycloak_args="-b=0.0.0.0"}

keycloak_start() {
    if [ "x${keycloak_path}" == "x" ]; then
        echo "keycloak_path is empty."
        return 0
    fi

    echo "Starting ${name}"
    if keycloak_running; then
        echo ": already running?"
    else
        ${keycloak_path} ${keycloak_args} >>$logfile 2>&1 &
    fi
}

keycloak_stop() {
    if [ -e ${pidfile} ]; then
        echo "Stopping ${name}"
        kill `cat ${pidfile}`;
    else
        echo ${name} is not running?
    fi
}

keycloak_status() {
   if keycloak_running; then
       echo "${name} is running."
   else
       echo "${name} is not running."
   fi
}

keycloak_running() {
    if [ -e ${pidfile} ]; then
        return 0
    else
        return 1
    fi
    return 1
}

run_rc_command $1
```

```
# chmod 755 /usr/local/etc/rc.d/keycloak
# sysrc keycloak_enable="YES"
# sysrc keycloak_path="/root/keycloak-8.0.1/bin/standalone.sh"
```

### Jailで動かす場合の注意

設定ファイルで 127.0.0.1 で待ち受けするように設定されていますが、Jail環境だとローカルループバックアドレスで待ち受けできないため、
次のように設定を変更します。

```./standalone/configuration/standalone.xml
    <interfaces>
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:192.168.1.xxx}"/>
        </interface>
        <interface name="public">
            <inet-address value="${jboss.bind.address:192.168.1.xxx}"/>
        </interface>
    </interfaces>
```

## 起動

```
# /usr/local/etc/rc.d/keycloak start
```

Webブラウザから、「http://ホスト名:8080」へアクセスすると、Keycloakの画面が表示されます。

## Windows統合認証の設定方法

書きかけ

```/etc/krb5.conf
[libdefaults]
    default_realm = AD-DOMAIN.EXAMPLE.LOCAL
[realms]
    AD-DOMAIN.EXAMPLE.LOCAL = {
        kdc = ad-domain.example.local
        admin_server = ad-domain.example.local
    }
[domain_realm]
    .ad-domain.example.local = AD-DOMAIN.EXAMPLE.LOCAL
```

## Keycloakのバージョンアップ

Keycloak 3.4.3→4.2.1→8.0.1とバージョンした実績あり
参考記事や公式と同じだけど、特殊なことをしていなければこんな感じ

1. トランザクションの確認
2. 新しいバージョン展開
3. ./standalone/ ディレクトリコピー
4. マイグレーションスクリプト実行

### トランザクション確認

```
# ./bin/jboss-cli -c
[standalone@localhost:9990 /] /subsystem=transactions/log-store=log-store/:probe
# 存在するトランザクションを確認 - コマンドの結果resultがないことを確認
[standalone@localhost:9990 /] /subsystem=transactions/log-store=log-store:read-children-names(child-type=transactions)
{
    "outcome" => "success",
    "result" => []
}
```

### 新しいバージョンの展開

```
# fetch ...
# tar xvzf ...
```

### ./standalone/ ディレクトリコピー

```
# cp -Rp ./keycloak-Old/standalone/ ./keycloak-New/
```

### マイグレーションスクリプト実行

```
# ./bin/jboss-cli.sh --file=bin/migrate-standalone.cli
```

## 参考記事

- [Keycloakのアップグレードについて・・・Keycloakを少しでも長く使い続けるために - Qiita](https://qiita.com/katakura__pro/items/b020dbdfa58ede35c00e) @katakura__proさん