Instala un servidor keycloak en producción con docker

En esta entrada vamos a instalar un servidor keycloak en producción, utilizando docker, mariadb y certbot

Los pasos que vamos a seguir son

  • Genera un certificado para producción utilizando certbot
  • Configura la red de docker y configura los contenedores.
  • Instala el reverse proxy para tu servidor.

Genera un certificado para producción utilizando certbot

$ sudo certbot certonly -d tu.dominio.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Nginx Web Server plugin (nginx)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 3
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for tu.dominio.com
Input the webroot for tu.dominio.com: (Enter 'c' to cancel): /var/www/html
Waiting for verification...
Cleaning up challenges
Subscribe to the EFF mailing list (email: pruebas@dominio.com).

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/tu.dominio.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/tu.dominio.com/privkey.pem
   Your cert will expire on 2021-11-18. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Si no quieres utilizar certbot, puedes ocupara para crear el certificado openssl, solo que como no es emitido por una entidad certificadora, seguramente lo va a detectar como aprocrifo.

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/tudominio-selfsigned.key -out /etc/ssl/certs/tudominio-selfsigned.crt
   Country Name (2 letter code) [AU]:
   State or Province Name (full name) [Some-State]:
   Locality Name (eg, city) []:
   Organization Name (eg, company) [Internet Widgits Pty Ltd]:
   Organizational Unit Name (eg, section) []:
   Common Name (e.g. server FQDN or YOUR name) []:
   Email Address []:

Para que podamos leer la llave privada desde el servidor docker debemos de cambiarle los permisos para que se pueda leer.

Si lo hicimios con certbot

$ sudo chmod 644 /etc/letsencrypt/live/tu.dominio.com/privkey.pem

Si lo hicimos con openssl

$ sudo chmod 644 /etc/ssl/private/tudominio-selfsigned.key

Configura la red de docker

Esto lo vamos a ocupar para que sea vea el contenedor de keycloak y el de la base de datos.

$ docker network create keycloak-network

Instala una instancia de mariadb para almacenar la información

$ docker run -d --name mariadb \
--net keycloak-network \
-e MYSQL_ROOT_PASSWORD=root_p@assword \
-e MYSQL_DATABASE=keycloak \
-e MYSQL_USER=keycloak \
-e MYSQL_PASSWORD=p@ssword \
mariadb

Si ya tienes una instancia de mariadb en un contenedor docker solo debes de poner ponerla en la misma red de keycloak, con la sentencia

$ docker network connect mariadb

Donde mariadb es el nombre del contenedor de mariadb.

Descarga e instala la imagen de keycloak para producción.

$ docker run -it -d --name keycloak \
--net keycloak-network \
-p8080:8080 -p 8443:8443s \
-v /etc/ssl/certs/keycloak-selfsigned.crt:/etc/x509/https/tls.crt \
-v /etc/ssl/private/keycloak-selfsigned.key:/etc/x509/https/tls.key \
-e KEYCLOAK_USER=administrador \
-e KEYCLOAK_PASSWORD=p@ssword \
-e DB_VENDOR=mariadb \
-e DB_DATABASE=keycloak \
-e DB_USER=keycloak \
-e DB_PASSWORD=p@assworddb \
jboss/keycloak

donde

-v se indican el certificado y la llave privada para el keycloak.

Por último, si necesitamos reiniciar el servidor, debemos detener el contenedor, borrarlo y volverlo a construir

$ docker stop keycloak
$ docker rm keycloak