Docker Compose安装Keycloak

Keycloak的安装其实挺烦人的,相关文章并不多,参考也不多,很多例子都是旧版本的,随手记录下安装和配置信息吧。

使用的数据库是postgresql,假设已经有安装好的postgresql,并且默认管理员账号是postgres,那么我们先创建keycloak的用户

su - postgres
# 我们创建一个名为keycloak的pgsql用户,和名为keycloak的数据库
createuser -s -P keycloak
createdb keycloak -O keycloak

然后我们创建一个文件,docker-compose.yml

version: "3"
services:
  keycloak:
    image: quay.io/keycloak/keycloak:20.0
    container_name: keycloak
    environment:
      KC_HOSTNAME: <域名,如sso.naizhao.com>
      KC_HTTP_PORT: <监听的http端口,比如8080>
      KC_HTTPS_PORT: <监听的http端口,比如8443>
      KC_HOSTNAME_STRICT_HTTPS: true
      KC_FEATURES: token-exchange
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://<pgsql的IP,比如127.0.0.1>:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: <前面创建pgsql账号时输入的密码>
      KEYCLOAK_ADMIN: <管理员账号,比如admin>
      KEYCLOAK_ADMIN_PASSWORD: <管理员密码>
      KC_HEALTH_ENABLED: "true"
      KC_LOG_LEVEL: info
      KC_PROXY: edge
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:8080/health/ready" ]
      interval: 15s
      timeout: 2s
      retries: 15
    command: start
    ports:
      # 这里把8080端口映射到10080,8443映射到10443,防止和服务器上其他端口冲突
      - 10080:8080
      - 10443:8443

如果自己没有装postgresql的话,那就在上面的文件上增加一个pgsql的实例吧,比如下面这样

version: "3"
services:
  postgres:
    container_name: pgsql
    image: postgres:15
    ports:
      - "5432:5432"
    volumes:
      - ./database-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "user"]
      interval: 30s
      timeout: 20s
      retries: 3
    environment:
      POSTGRES_USER: 'keycloak'
      POSTGRES_PASSWORD: '<pgsql数据库密码>'
      POSTGRES_DB: 'keycloak'
      TZ: Asia/Shanghai
  keycloak:
    image: quay.io/keycloak/keycloak:20.0
    container_name: keycloak
    environment:
      KC_HOSTNAME: <域名,如sso.naizhao.com>
      KC_HTTP_PORT: <监听的http端口,比如8080>
      KC_HTTPS_PORT: <监听的http端口,比如8443>
      KC_HOSTNAME_STRICT_HTTPS: true
      KC_FEATURES: token-exchange
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: <pgsql数据库密码>
      KEYCLOAK_ADMIN: <管理员账号,比如admin>
      KEYCLOAK_ADMIN_PASSWORD: <管理员密码>
      KC_HEALTH_ENABLED: "true"
      KC_LOG_LEVEL: info
      KC_PROXY: edge
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:8080/health/ready" ]
      interval: 15s
      timeout: 2s
      retries: 15
    command: start
    ports:
      # 这里把8080端口映射到10080,8443映射到10443,防止和服务器上其他端口冲突
      - 10080:8080
      - 10443:8443
    depends_on:
      - postgres

然后把keycloak跑起来

docker-compose up -d

然后我们修改下Caddyfile,增加一个反代

https://<域名,如sso.naizhao.com> {
    encode zstd gzip

    tls <改成你的邮箱,或者指定的ssl证书,又或者internal>

    header / {
        X-Content-Type-Options nosniff
        X-Frame-Options "SAMEORIGIN"
        X-XSS-Protection "1; mode=block"
        X-Robots-Tag all
        X-Download-Options noopen
        X-Permitted-Cross-Domain-Policies none
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    }

    reverse_proxy {
        to 127.0.0.1:10080
    }
}

用这个方式跑起来的keycloak,因为经过了前端的反代,好像不需要创建keystore(好像是,没提示,不太确定)

如果需要整合AD/LDAP的话,是需要创建的。参考『Keycloak使用群晖Synology Directory Server作为AD/LDAP用户数据源

然后,打开浏览器,使用前面配置的admin账号和密码就可以登录使用了。