# =============================================================================
# Keycloak — generado por tai-kc
#
# Dos imágenes desde el mismo fichero, elegidas con --target:
#
#   dev   start-dev: H2 en un volumen (o PostgreSQL si se pasa KC_DB), HTTP, sin optimizar.
#   prod  imagen optimizada (kc.sh build en tiempo de construcción), para cualquier
#         orquestador: Docker Compose, Azure, Kubernetes…  Es el target por defecto.
#
# Ningún secreto entra en la imagen: contraseñas, secretos de clientes y credenciales de
# la base de datos se pasan como variables de entorno al arrancar el contenedor. Los ARG
# de este fichero son solo opciones de construcción (versión, motor de base de datos y ruta).
# =============================================================================
ARG KEYCLOAK_VERSION={{keycloak_version}}

# -----------------------------------------------------------------------------
# builder: fija en la imagen las opciones de construcción (base de datos, salud, métricas)
# -----------------------------------------------------------------------------
FROM quay.io/keycloak/keycloak:${KEYCLOAK_VERSION} AS builder
# Opciones de construcción de Keycloak: con `start --optimized` no se pueden cambiar en runtime.
#   KC_DB                  motor de la base de datos (postgres, mysql, mssql…)
#   KC_HTTP_RELATIVE_PATH  ruta bajo la que se sirve (/ o, por ejemplo, /auth). La interfaz de
#                          gestión (9000) se queda en /, para que la salud esté siempre en
#                          /health/ready: por defecto heredaría la ruta.
ARG KC_DB=postgres
ARG KC_HTTP_RELATIVE_PATH=/
ENV KC_DB=${KC_DB} \
    KC_HTTP_RELATIVE_PATH=${KC_HTTP_RELATIVE_PATH} \
    KC_HTTP_MANAGEMENT_RELATIVE_PATH=/ \
    KC_HEALTH_ENABLED=true \
    KC_METRICS_ENABLED=true
RUN /opt/keycloak/bin/kc.sh build

# -----------------------------------------------------------------------------
# dev
# -----------------------------------------------------------------------------
FROM quay.io/keycloak/keycloak:${KEYCLOAK_VERSION} AS dev
# La carpeta de H2 tiene que existir con su dueño: un volumen nuevo hereda los permisos de la
# imagen, y si no existe Docker la crea como root y Keycloak no puede escribir.
USER root
RUN mkdir -p /opt/keycloak/data/h2 && chown -R keycloak:keycloak /opt/keycloak/data
USER keycloak
COPY --chown=keycloak:keycloak realms/ /opt/keycloak/data/import/
ENV KC_HEALTH_ENABLED=true \
    KC_DB=dev-file
EXPOSE 8080 9000
HEALTHCHECK --interval=10s --timeout=5s --start-period=60s --retries=10 \
    CMD bash -c 'exec 3<>/dev/tcp/127.0.0.1/9000 && printf "GET /health/ready HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" >&3 && head -1 <&3 | grep -q " 200"'
CMD ["start-dev", "--import-realm"]

# -----------------------------------------------------------------------------
# prod
#
# Detrás de un proxy que termina TLS (Traefik, Azure, un Ingress): Keycloak habla HTTP
# con el proxy y confía en sus cabeceras X-Forwarded-*. KC_HOSTNAME (la URL pública,
# obligatoria) se pasa en runtime. La salud y las métricas están en el puerto de gestión
# (9000), que no hay que publicar.
# -----------------------------------------------------------------------------
FROM quay.io/keycloak/keycloak:${KEYCLOAK_VERSION} AS prod
COPY --from=builder /opt/keycloak/ /opt/keycloak/
COPY --chown=keycloak:keycloak realms/ /opt/keycloak/data/import/
ENV KC_HTTP_ENABLED=true \
    KC_PROXY_HEADERS=xforwarded \
    KC_HOSTNAME_STRICT=true
EXPOSE 8080 9000
HEALTHCHECK --interval=30s --timeout=5s --start-period=120s --retries=5 \
    CMD bash -c 'exec 3<>/dev/tcp/127.0.0.1/9000 && printf "GET /health/ready HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" >&3 && head -1 <&3 | grep -q " 200"'
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]
CMD ["start", "--optimized", "--import-realm"]
