[{"data":1,"prerenderedAt":243},["ShallowReactive",2],{"seo-verification":3,"blog-desplegar-keycloak-sso-en-un-vps-ma-es":6,"promo-bar-likely":242},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-desplegar-keycloak-sso-en-un-vps-ma-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":182,"ctaBody":183,"ctaButton":184,"ctaUrl":185,"relatedPosts":186},112,"desplegar-keycloak-sso-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"keycloak-sso-vps","deploy-keycloak-for-sso-on-your-vps","نشر-keycloak-لتسجيل-الدخول-الموحد-sso-على-خادمك-vps","Desplegar Keycloak para el SSO en su VPS","Despliegue Keycloak en su VPS para un SSO de nivel empresarial: OIDC, SAML, realms y federación. Guía Docker completa y comparativa.",10,0,false,"2026-02-28T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},8,"Seguridad y monitorización","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fkeycloak-sso-vps-poster.svg",{"categorySlug":34,"appSlug":35},"ciberseguridad-bastion","keycloak","Keycloak es la referencia open source del SSO empresarial, respaldada por Red Hat y utilizada incluso en contextos altamente regulados. Con sus realms, su federación LDAP y su soporte completo de OIDC y SAML, cubre necesidades que pocos IdP alcanzan. Autoalojado en un VPS, le ofrece ese nivel de industrialización sin licencia ni dependencia de la nube.",[38,42,52,55,77,80,95,135,138,147,150,158,176,180],{"type":39,"title":40,"body":41},"h2","Por qué desplegar Keycloak en su VPS","Donde algunos IdP buscan la simplicidad, Keycloak busca la exhaustividad: aislamiento multi-tenant mediante los realms, federación de directorios LDAP\u002FActive Directory, brokering hacia proveedores externos (Google, GitHub, otro OIDC), theming completo de las páginas de login y fine-grained authorization. Para una agencia que gestiona varios clientes o para un sistema de información con exigencias de conformidad, ese nivel de control es decisivo. El autoalojamiento en VPS le evita los costos por usuario de las ofertas IdP gestionadas y mantiene la totalidad de la base de identidades bajo su jurisdicción, un punto crítico para datos sensibles que no desea confiar a un tercero.",{"type":43,"title":44,"items":45},"ul","Las ventajas de un Keycloak autoalojado",[46,47,48,49,50,51],"Múltiples realms para aislar por completo varios clientes o entornos en una misma instancia.","Soporte nativo y completo de OpenID Connect, OAuth2 y SAML 2.0.","Federación LDAP \u002F Active Directory para reutilizar un directorio existente sin migración.","Identity brokering: conexión mediante Google, GitHub o cualquier IdP externo en unos clics.","Páginas de login totalmente personalizables (temas, idiomas, branding por realm).","Políticas de autenticación detalladas: MFA condicional, duración de sesión, restricciones por rol.",{"type":39,"title":53,"body":54},"Requisitos previos para este despliegue","Keycloak se ejecuta sobre la JVM (Quarkus desde la v17+) y sigue siendo más exigente que un IdP ligero. Prevea un VPS con 2 vCPU y 4 GB de RAM como mínimo, idealmente 6 GB si espera carga o varios realms activos. Una base PostgreSQL externa es muy recomendable en producción (no use nunca la base H2 integrada más allá de las pruebas). Docker y Docker Compose, un dominio dedicado (`sso.midominio.com`) y un reverse proxy que gestione el SSL completan los requisitos, ya que Keycloak necesita saber que se sirve detrás de un proxy HTTPS.",{"type":56,"title":57,"steps":58},"steps","Desplegar Keycloak con PostgreSQL",[59,62,65,68,71,74],{"title":60,"body":61},"Definir Keycloak y PostgreSQL en Compose","En su `docker-compose.yml`, declare el servicio `postgres` (imagen `postgres:16`) y el servicio `keycloak` (imagen `quay.io\u002Fkeycloak\u002Fkeycloak`). Conecte Keycloak a la base mediante `KC_DB=postgres`, `KC_DB_URL`, `KC_DB_USERNAME` y `KC_DB_PASSWORD`.",{"title":63,"body":64},"Configurar el modo producción y el proxy","Arranque con el comando `start` (y no `start-dev`). Indique `KC_HOSTNAME=sso.midominio.com` y `KC_PROXY_HEADERS=xforwarded` para que Keycloak genere URL correctas detrás del reverse proxy. Defina el administrador inicial mediante `KC_BOOTSTRAP_ADMIN_USERNAME` \u002F `KC_BOOTSTRAP_ADMIN_PASSWORD`.",{"title":66,"body":67},"Arrancar y finalizar el build","Ejecute `docker compose up -d`. En el primer arranque, Keycloak realiza un build Quarkus optimizado y luego migra el esquema PostgreSQL. Siga `docker compose logs -f keycloak` hasta el mensaje que indica que el servidor está escuchando.",{"title":69,"body":70},"Poner en marcha el reverse proxy SSL","Enrute `sso.midominio.com` hacia el puerto `8080` del contenedor Keycloak mediante Caddy, Traefik o Nginx, con un certificado Let's Encrypt. Asegúrese de transmitir las cabeceras `X-Forwarded-*`, ya que de lo contrario las redirecciones de login se romperán.",{"title":72,"body":73},"Crear un realm y un cliente","Conéctese a la consola de administración, cree un realm dedicado (nunca el realm `master` para sus aplicaciones) y luego un cliente OIDC. Ajuste el `Valid redirect URIs` de su aplicación y recupere el `Client ID` y el secreto en la pestaña Credentials.",{"title":75,"body":76},"Conectar una aplicación y probar el flujo","Configure su aplicación con la URL de descubrimiento `https:\u002F\u002Fsso.midominio.com\u002Frealms\u002Fmi-realm\u002F.well-known\u002Fopenid-configuration`. Cree un usuario de prueba en el realm, inicie un login y compruebe la emisión del token en las Sessions de la consola.",{"type":39,"title":78,"body":79},"Imagen preoptimizada: separar el build del arranque","Por defecto, el comando `start` comprueba al arrancar si hace falta una fase de build de Quarkus y la ejecuta si es necesario: eso alarga el primer arranque y es lo que escribe en el árbol de la instalación. La documentación del fabricante recomienda lo contrario para un contenedor: ejecutar `kc.sh build` durante la construcción de la imagen y arrancar después con `start --optimized`. El parámetro `--optimized` indica a Keycloak que se ejecuta en una imagen ya optimizada y que puede omitir esa comprobación. Las opciones de build, como el tipo de base de datos (`db`) o la activación de las sondas (`health-enabled`), quedan fijadas en la imagen: si se repiten al arrancar con el mismo valor, se ignoran; con un valor distinto, provocan un error y exigen un nuevo build. Los secretos, contraseña de la base incluida, pertenecen a las opciones de configuración y se siguen suministrando en tiempo de ejecución.",{"type":56,"title":81,"steps":82},"Construir y ejecutar una imagen preoptimizada",[83,86,89,92],{"title":84,"body":85},"Escribir un Dockerfile en dos etapas","La primera etapa parte de `quay.io\u002Fkeycloak\u002Fkeycloak` con el nombre `builder`, define `ENV KC_DB=postgres` y `ENV KC_HEALTH_ENABLED=true` y ejecuta `RUN \u002Fopt\u002Fkeycloak\u002Fbin\u002Fkc.sh build`. Fije un número de versión concreto en lugar de `latest`, para que cada reconstrucción sea reproducible.",{"title":87,"body":88},"Copiar el resultado a la imagen final","La segunda etapa parte de la misma imagen y ejecuta `COPY --from=builder \u002Fopt\u002Fkeycloak\u002F \u002Fopt\u002Fkeycloak\u002F`. Coloque sus temas y proveedores personalizados antes del build: así los tiene en cuenta la optimización. Si añade archivos con `COPY`, añada `--chown=keycloak:keycloak` para que Keycloak pueda escribir en las carpetas afectadas.",{"title":90,"body":91},"Arrancar con la opción optimizada","En Compose, sustituya el comando por `start --optimized`. Detrás de un reverse proxy que termina el TLS, añada `KC_HTTP_ENABLED=true`. Las variables `KC_HOSTNAME` y `KC_PROXY_HEADERS` y los accesos a la base siguen siendo configuración de ejecución.",{"title":93,"body":94},"Conectar las sondas de salud","Con `KC_HEALTH_ENABLED=true` definido en el build, los puntos `\u002Fhealth\u002Fstarted`, `\u002Fhealth\u002Flive` y `\u002Fhealth\u002Fready` se sirven en el puerto de gestión `9000`, distinto del `8080` de la aplicación. No publique este puerto en Internet: úselo solo para el `healthcheck` de Compose o su monitorización.",{"type":96,"title":97,"headers":98,"rows":102},"comparison","Keycloak o Authentik: ¿cuál elegir?",[99,100,101],"Criterio","Keycloak","Authentik",[103,107,111,115,119,123,127,131],[104,105,106],"Caso de uso objetivo","SSO empresarial, multi-tenant, conformidad","Self-hosting, homelab, agencias",[108,109,110],"Protocolos","OIDC, OAuth2, SAML, LDAP","OIDC, OAuth2, SAML, LDAP, forward auth",[112,113,114],"Forward auth (proxy)","No nativo (mediante extensiones)","Nativo y central en la herramienta",[116,117,118],"Huella de recursos","Elevada (JVM, 4 GB+ de RAM)","Moderada (2-4 GB de RAM)",[120,121,122],"Multi-realm \u002F tenants","Excelente (realms aislados)","Tenants soportados, menos avanzados",[124,125,126],"Personalización de los flujos","Temas y SPI Java","Flujos visuales por etapas",[128,129,130],"Curva de aprendizaje","Pronunciada, muy completa","Más accesible",[132,133,134],"Federación de directorios","Madura (LDAP\u002FAD)","Buena (LDAP)",{"type":39,"title":136,"body":137},"Copias de seguridad y migración sin perder un realm","El estado de Keycloak reside en dos sitios: la base PostgreSQL y sus archivos de configuración (temas, proveedores, archivos de importación). La copia de referencia es un `pg_dump` programado, copiado fuera del VPS; pruebe la restauración en una instancia desechable, porque una copia que nunca se ha restaurado sigue siendo una hipótesis. La exportación de realms completa este dispositivo sin sustituirlo: `kc.sh export --dir \u003Ccarpeta>`, o `--realm mi-realm` para un solo realm, con la opción `--users` para elegir la estrategia de exportación de usuarios. La documentación precisa que el servidor no debe estar arrancado durante la exportación, que la coherencia solo está garantizada con todos los nodos detenidos y que los eventos, las sesiones persistentes y los tokens revocados no se exportan. A partir de 50 000 usuarios, exporte a un directorio y no a un único archivo. En la importación, `start --import-realm` lee los archivos `.json` de la carpeta `\u002Fopt\u002Fkeycloak\u002Fdata\u002Fimport` e ignora un realm que ya existe.",{"type":43,"title":139,"items":140},"Lista de comprobación de operación",[141,142,143,144,145,146],"**Versión fijada** — fije el número de versión de la imagen, lea las notas de versión antes de cambiar de rama mayor y reconstruya la imagen optimizada en cada actualización.","**Base con copia** — `pg_dump` programado, copia fuera del VPS, restauración probada en una instancia desechable.","**Memoria acotada** — fije siempre un límite de memoria al contenedor: la JVM calcula su heap a partir de él, con un 70 % como máximo y un 50 % inicial por defecto.","**Sondas vigiladas** — siga `\u002Fhealth\u002Fready` en el puerto `9000`, no publicado, desde su monitorización.","**Cabeceras del proxy controladas** — el reverse proxy debe sobrescribir las cabeceras `X-Forwarded-*` recibidas del cliente, no añadirse a ellas, y no debe eludirse nunca.","**Eventos activados** — registre los inicios de sesión y las acciones de administración en cada realm, para saber quién se conectó y quién modificó qué.",{"type":39,"title":148,"body":149},"Solución de problemas: el arranque falla con un sistema de archivos de solo lectura","Endurecer un contenedor suele implicar `read_only: true` en Compose o `readOnlyRootFilesystem: true` en Kubernetes. Con Keycloak, el tema está abierto desde abril de 2022 en la issue keycloak\u002Fkeycloak n.º 11286 (\"Keycloak does not work with Docker read_only: true\") y seguía activa a finales de octubre de 2026. Lo que está establecido por parte del proyecto: un colaborador de Keycloak reprodujo el fallo en la versión 19.0.2 en septiembre de 2022, la issue está clasificada como mejora con la etiqueta \"help wanted\" y se añadió a un tablero de proyecto del repositorio en septiembre de 2026. Lo que no: la documentación oficial no describe a día de hoy ningún modo de solo lectura (la página dedicada a los contenedores no lo menciona) y ningún mantenedor ha validado una solución alternativa. Las soluciones siguientes proceden de participantes en la discusión; les funcionaron a ellos, en sus versiones, sin garantía tras una actualización. El 26 de octubre de 2026, un colaborador se ofreció a escribir la documentación que falta tras verificar él mismo estas soluciones.",{"type":43,"title":151,"items":152},"Mensajes de error que conviene reconocer",[153,154,155,156,157],"**`sed: couldn't open temporary file \u002Fopt\u002Fjboss\u002Fkeycloak\u002Fbin\u002FseduHoQM0: Read-only file system`** — mensaje del informe inicial, sobre la antigua imagen WildFly (versión 16.1.1 en la issue): un `sed -i` del script de arranque no puede crear su archivo temporal. En la distribución Quarkus los síntomas son distintos, véanse las líneas siguientes.","**`KC-SERVICES0075: Failed to get theme request: java.lang.RuntimeException: Temporary directory \u002Fopt\u002Fkeycloak\u002Fbin\u002F..\u002Fdata\u002Ftmp does not exist and it was not possible to create it.`** — notificado al actualizar a la 20.0.1: el servidor arranca y luego falla en la primera página que sirve un tema. Un participante indicó que un volumen escribible montado en `\u002Fopt\u002Fkeycloak\u002Fdata\u002Ftmp` resuelve este caso.","**Arranque lento o fallo de escritura en `\u002Fopt\u002Fkeycloak\u002Flib\u002Fquarkus`** — un participante comparó el contenedor antes y después del arranque con `docker diff`: cambian tres carpetas, `\u002Ftmp`, `\u002Fopt\u002Fkeycloak\u002Fdata` y `\u002Fopt\u002Fkeycloak\u002Flib\u002Fquarkus`. La última contiene el resultado del build, que `start` regenera salvo que la imagen esté preoptimizada.","**Carpeta `data` de solo lectura tras un `COPY`** — un participante señala que olvidar `--chown=keycloak:keycloak` al copiar un archivo de realm deja `\u002Fopt\u002Fkeycloak\u002Fdata` en manos de root y, por tanto, sin escritura para Keycloak.","**Copia de `\u002Fopt\u002Fkeycloak` a un volumen al arrancar** — solución con contenedor de inicialización, notificada en Kubernetes: funciona, pero varios participantes temen tener que volver a probarla en cada actualización.",{"type":56,"title":159,"steps":160},"Solución notificada en Docker Compose",[161,164,167,170,173],{"title":162,"body":163},"Partir de la imagen preoptimizada","Reutilice la imagen construida más arriba. `kc.sh build` se ejecuta durante la construcción: `\u002Fopt\u002Fkeycloak\u002Flib\u002Fquarkus` ya no se reescribe al arrancar, que se hace con `start --optimized`.",{"title":165,"body":166},"Declarar el sistema de archivos de solo lectura","Añada `read_only: true` al servicio `keycloak` del archivo Compose. Sin ningún otro cambio, el contenedor falla: es el comportamiento que describe la issue.",{"title":168,"body":169},"Suministrar los directorios escribibles","Monte un `tmpfs` en `\u002Ftmp` y un volumen temporal en `\u002Fopt\u002Fkeycloak\u002Fdata`. En el informe que se apoya en una imagen preoptimizada, esos dos directorios bastaron; con una imagen no optimizada, otros participantes añadieron `\u002Fopt\u002Fkeycloak\u002Flib\u002Fquarkus`.",{"title":171,"body":172},"Reponer lo que había en data","Un volumen temporal arranca vacío: lo que la imagen colocaba en esa carpeta, incluido `data\u002Fimport`, deja de verse allí. Si importa realms con `--import-realm`, monte su carpeta por separado, en solo lectura.",{"title":174,"body":175},"Comprobar abriendo una página de login","Ejecute `docker compose up -d` y luego `docker compose logs -f keycloak`, y abra después la página de inicio de sesión: la primera petición de tema es la que hizo fallar algunos montajes. Termine con `docker diff` para listar lo que el contenedor ha escrito realmente.",{"type":177,"title":178,"body":179},"tip","Solo lectura: un endurecimiento que el fabricante no documenta","Reserve este modo para los entornos donde una política lo exige, como una auditoría de seguridad o una regla del clúster, y acepte el coste: una configuración no documentada, que hay que volver a probar en cada actualización, algo que temen varios participantes de la issue. En un VPS único, otras medidas dan una ganancia más clara con menos mantenimiento: capacidades de Linux retiradas (`cap_drop: [ALL]`), opción `no-new-privileges`, puertos de gestión sin publicar y base PostgreSQL en una red Docker interna.",{"type":177,"body":181},"En producción, no sirva nunca Keycloak con la base H2 integrada ni exponga el realm `master` al público: cree un realm dedicado por aplicación o por cliente y reserve `master` para la administración. Para endurecer la instancia, desactive el registro libre, active el `brute force detection` en Realm Settings > Security Defenses y aprovisione todo mediante ficheros de importación de realm (`--import-realm`), de modo que versione su configuración en lugar de hacer clic en la interfaz.","Instala Keycloak en tu VPS","Keycloak está disponible en el Marketplace de ServOrbit: imagen oficial, base de datos PostgreSQL, HTTPS y cuenta de administrador listos al instalar.","Ver Keycloak en el Marketplace","\u002Fapplications\u002Fciberseguridad-bastion\u002Fkeycloak",[187,205,224],{"id":188,"slug":189,"slugs":190,"title":194,"excerpt":195,"readTime":23,"views":18,"isPinned":19,"noindex":19,"publishedAt":196,"updatedAt":197,"category":198,"categories":199,"featuredImage":30,"bgImage":31,"posterImage":201,"relatedSolution":202},105,"supervisar-vps-con-uptime-kuma",{"fr":191,"en":192,"ar":193,"es":189},"superviser-vps-uptime-kuma","monitoring-your-vps-with-uptime-kuma","مراقبة-خادمك-الافتراضي-vps-باستخدام-uptime-kuma","Supervisar su VPS con Uptime Kuma","Despliegue Uptime Kuma en su VPS para supervisar sus sitios y servicios en self-hosted, con alertas y página de estado pública.","2026-03-07T00:00:00+00:00","2026-11-09T20:55:19+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[200],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fsuperviser-vps-uptime-kuma-poster.svg",{"categorySlug":203,"appSlug":204},"monitorizacion-observabilidad","uptime-kuma",{"id":206,"slug":207,"slugs":208,"title":212,"excerpt":213,"readTime":214,"views":215,"isPinned":19,"noindex":19,"publishedAt":216,"updatedAt":217,"category":218,"categories":219,"featuredImage":30,"bgImage":31,"posterImage":221,"relatedSolution":222},106,"monitorizacion-vps-grafana-prometheus",{"fr":209,"en":210,"ar":211,"es":207},"monitoring-vps-grafana-prometheus","vps-monitoring-with-grafana-and-prometheus","مراقبة-الخادم-الافتراضي-vps-باستخدام-grafana-و-prometheus","Monitorización de VPS con Grafana y Prometheus","Despliegue Prometheus 3.x, Grafana 13.x, Node Exporter y Alertmanager en su VPS con Docker Compose. Paneles, alertas y bastionado.",11,1,"2026-03-06T00:00:00+00:00","2026-10-05T14:05:27+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[220],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fmonitoring-vps-grafana-prometheus-poster.svg",{"categorySlug":203,"appSlug":223},"grafana",{"id":225,"slug":226,"slugs":227,"title":231,"excerpt":232,"readTime":233,"views":215,"isPinned":19,"noindex":19,"publishedAt":234,"updatedAt":235,"category":236,"categories":237,"featuredImage":30,"bgImage":31,"posterImage":239,"relatedSolution":240},107,"monitorizar-vps-en-tiempo-real-con-netdata",{"fr":228,"en":229,"ar":230,"es":226},"monitorer-vps-netdata","monitor-your-vps-in-real-time-with-netdata","راقب-خادمك-الافتراضي-vps-في-الوقت-الفعلي-باستخدام-netdata","Monitorizar su VPS en tiempo real con Netdata","Instale Netdata en su VPS para una monitorización en tiempo real por segundo: miles de métricas, cero configuración y alertas incluidas.",3,"2026-03-05T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[238],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fmonitorer-vps-netdata-poster.svg",{"categorySlug":203,"appSlug":241},"netdata",true,1794270590474]