{"id":3367,"date":"2025-10-11T05:59:18","date_gmt":"2025-10-11T05:59:18","guid":{"rendered":"https:\/\/www.devopsconsulting.in\/blog\/?p=3367"},"modified":"2025-12-06T05:17:12","modified_gmt":"2025-12-06T05:17:12","slug":"keycloak-production-deployment-on-ubuntu-apache-lampp","status":"publish","type":"post","link":"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/","title":{"rendered":"Keycloak Production Deployment on Ubuntu + Apache (LAMPP)"},"content":{"rendered":"\n<p>Here\u2019s a clean, copy-paste <strong>Production Runbook<\/strong> for your current setup (Ubuntu + LAMPP\/Apache reverse proxy + Keycloak in <code>\/opt\/auth.holidaylandmark.com<\/code>), making sure it starts on boot, auto-recovers, and serves reliably over <code>https:\/\/auth.holidaylandmark.com\/<\/code>.<\/p>\n\n\n\n<p>I\u2019ve included all steps end-to-end: prerequisites, config edits, Apache modules, WebSocket support, systemd service, verification, and common fixes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"683\" height=\"1024\" src=\"https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak-683x1024.png\" alt=\"\" class=\"wp-image-3371\" srcset=\"https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak-683x1024.png 683w, https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak-200x300.png 200w, https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak-768x1152.png 768w, https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak.png 1024w\" sizes=\"auto, (max-width: 683px) 100vw, 683px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Keycloak @ <code>auth.holidaylandmark.com<\/code> \u2014 Production Runbook<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">0) Prerequisites (one-time)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># Update system packages\nsudo apt update\n\n# Ensure Java 17+ is available (Temurin\/OpenJDK). Example for OpenJDK 17:\nsudo apt install -y openjdk-17-jre\n\n# Confirm Java\njava -version\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Keycloak 22+ requires Java 17+. Keep using your existing LAMPP (XAMPP on Linux) for Apache\/SSL.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1) Create service user and permissions (one-time)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># Create a dedicated OS user for Keycloak\nsudo useradd --system --user-group --home \/opt\/auth.holidaylandmark.com keycloak\n\n# Give ownership of the Keycloak directory\nsudo chown -R keycloak:keycloak \/opt\/auth.holidaylandmark.com\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2) Configure Keycloak (<code>keycloak.conf<\/code>)<\/h2>\n\n\n\n<p>Edit: <code>\/opt\/auth.holidaylandmark.com\/conf\/keycloak.conf<\/code><br>Use these values (replace credentials if needed):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ===============================\n# Keycloak Production Config (Apache TLS termination)\n# Hostname: auth.holidaylandmark.com\n# ===============================\n\n# --- Database (MariaDB\/MySQL over local socket) ---\ndb=mariadb\ndb-url=jdbc:mariadb:\/\/localhost:3306\/keycloak_db?localSocket=\/opt\/lampp\/var\/mysql\/mysql.sock\ndb-username=REPLACE_ME_USER\ndb-password=REPLACE_ME_PASSWORD\n\n# Pooling (tune with your RAM\/traffic)\ndb-pool-initial-size=5\ndb-pool-min-idle=5\ndb-pool-max-size=25\ndb-pool-prefill=true\n\n# --- HTTP \/ Proxy (Apache terminates TLS) ---\nhttp-enabled=true\nhttp-port=8080\nproxy=edge                 # IMPORTANT: TLS ends at Apache\nproxy-headers=xforwarded   # Trust X-Forwarded-*\n\n# --- Hostname ---\nhostname=auth.holidaylandmark.com\nhostname-strict=true\nhostname-strict-backchannel=false  # Avoid 400s on internal callbacks\n\n# If Keycloak is NOT mounted under \/auth, leave this commented\n# http-relative-path=\/auth\n\n# --- Cache \/ Health \/ Metrics \/ Logging ---\ncache=local\nhealth-enabled=true\nmetrics-enabled=true\nlog-level=INFO\nhostname-debug=false\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Why <code>proxy=edge<\/code>?<\/strong> You terminate TLS at Apache and proxy to KC over HTTP:8080. This mode ensures correct URL building and cookie handling.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3) Apache (LAMPP) \u2014 enable required modules<\/h2>\n\n\n\n<p>Open <code>\/opt\/lampp\/etc\/httpd.conf<\/code> and ensure these lines are present (uncomment\/add if needed):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>LoadModule headers_module        modules\/mod_headers.so\nLoadModule proxy_module          modules\/mod_proxy.so\nLoadModule proxy_http_module     modules\/mod_proxy_http.so\nLoadModule proxy_wstunnel_module modules\/mod_proxy_wstunnel.so\nLoadModule ssl_module            modules\/mod_ssl.so\nLoadModule rewrite_module        modules\/mod_rewrite.so\n<\/code><\/pre>\n\n\n\n<p>Restart Apache:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo \/opt\/lampp\/lampp restart\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4) Apache vhosts for <code>auth.holidaylandmark.com<\/code><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">:80 \u2192 :443 redirect (keep as is)<\/h3>\n\n\n\n<p><code>\/opt\/lampp\/etc\/extra\/httpd-vhosts.conf<\/code> or wherever you keep vhosts:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;VirtualHost *:80&gt;\n    ServerName auth.holidaylandmark.com\n    Redirect permanent \/ https:\/\/auth.holidaylandmark.com\/\n&lt;\/VirtualHost&gt;\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">:443 reverse proxy to Keycloak (with WebSocket support)<\/h3>\n\n\n\n<p>Edit your SSL vhost (you showed <code>\/opt\/lampp\/etc\/extra\/httpd-ssl.conf<\/code>). Replace backend <strong>IP<\/strong> with <strong>127.0.0.1<\/strong> if Keycloak is on the same host (recommended):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;VirtualHost *:443&gt;\n    ServerName auth.holidaylandmark.com\n\n    SSLEngine on\n    SSLCertificateFile      \/opt\/lampp\/etc\/certs\/auth.holidaylandmark.com\/auth.holidaylandmark.com.cer\n    SSLCertificateKeyFile   \/opt\/lampp\/etc\/certs\/auth.holidaylandmark.com\/auth.holidaylandmark.com.key\n    SSLCACertificateFile    \/opt\/lampp\/etc\/certs\/auth.holidaylandmark.com\/fullchain.cer\n\n    ErrorLog  \"\/opt\/lampp\/logs\/auth.holidaylandmark.com_error_log_\"\n\n    # Security hardening\n    Header always set Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\"\n\n    ProxyPreserveHost On\n    ProxyRequests Off\n\n    # --- Prefer loopback if KC is on same box ---\n    # If it's truly remote, replace 127.0.0.1 with that host\/IP.\n    ProxyPass        \/ http:\/\/127.0.0.1:8080\/ retry=0\n    ProxyPassReverse \/ http:\/\/127.0.0.1:8080\/\n\n    # Fix cookies if Keycloak sets cookie domain = backend host\n    ProxyPassReverseCookieDomain 127.0.0.1 auth.holidaylandmark.com\n\n    # Pass original scheme\/host\/port to Keycloak\n    RequestHeader set X-Forwarded-Proto \"https\"\n    RequestHeader set X-Forwarded-Host  \"auth.holidaylandmark.com\"\n    RequestHeader set X-Forwarded-Port  \"443\"\n\n    # --- WebSocket upgrade for admin console ---\n    RewriteEngine On\n    RewriteCond %{HTTP:Upgrade} =websocket &#91;NC]\n    RewriteRule \/(.*) ws:\/\/127.0.0.1:8080\/$1 &#91;P,L]\n\n    ProxyTimeout 120\n&lt;\/VirtualHost&gt;\n<\/code><\/pre>\n\n\n\n<p>Restart Apache:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo \/opt\/lampp\/lampp restart\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>If you must keep a <strong>public IP<\/strong> backend instead of 127.0.0.1, use it consistently in <code>ProxyPass<\/code>, <code>ProxyPassReverse<\/code>, <code>ProxyPassReverseCookieDomain<\/code>, and the WebSocket <code>RewriteRule<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5) First-time admin bootstrap (only if you don\u2019t have admin)<\/h2>\n\n\n\n<p>Choose <strong>one<\/strong> method:<\/p>\n\n\n\n<p><strong>A. One-shot start with env vars:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export KC_BOOTSTRAP_ADMIN_USERNAME=admin\nexport KC_BOOTSTRAP_ADMIN_PASSWORD='Str0ngP@ss!'\nsudo -u keycloak \/opt\/auth.holidaylandmark.com\/bin\/kc.sh start --optimized\n# After confirming admin login works, Ctrl+C to stop (we\u2019ll run as a service next).\n<\/code><\/pre>\n\n\n\n<p><strong>B. Bootstrap command (preferred on newer KC):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export KC_BOOTSTRAP_ADMIN_PASSWORD='Str0ngP@ss!'\nsudo -u keycloak \/opt\/auth.holidaylandmark.com\/bin\/kc.sh bootstrap-admin user \\\n  --username admin --password:env KC_BOOTSTRAP_ADMIN_PASSWORD\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6) (Optional) Build\/optimize Keycloak once<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo -u keycloak \/opt\/auth.holidaylandmark.com\/bin\/kc.sh build\n<\/code><\/pre>\n\n\n\n<p>This precompiles\/optimizes extensions and reduces start time.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7) Create a systemd service (always-on)<\/h2>\n\n\n\n<p>Create <code>\/etc\/systemd\/system\/keycloak.service<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=Keycloak (auth.holidaylandmark.com)\nAfter=network-online.target\nWants=network-online.target\n\n&#91;Service]\nType=simple\nUser=keycloak\nGroup=keycloak\nWorkingDirectory=\/opt\/auth.holidaylandmark.com\nEnvironment=JAVA_OPTS=-Xms512m -Xmx2048m\nExecStart=\/opt\/auth.holidaylandmark.com\/bin\/kc.sh start --optimized\nExecStop=\/bin\/kill -TERM $MAINPID\nRestart=on-failure\nRestartSec=5\nTimeoutStartSec=120\nLimitNOFILE=65535\n\n&#91;Install]\nWantedBy=multi-user.target\n<\/code><\/pre>\n\n\n\n<p>Enable and start:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl daemon-reload\nsudo systemctl enable --now keycloak\nsudo systemctl start keycloak\nsudo systemctl status keycloak\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>From now on, Keycloak will start on boot and auto-restart on failure.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8) Firewall (if UFW is enabled)<\/h2>\n\n\n\n<p>You\u2019re serving through Apache only:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow 'Apache Full'\nsudo ufw status\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9) Verification Checklist<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Service running<\/strong> <code>systemctl is-active keycloak # should print: active journalctl -u keycloak -f # tail logs; no errors<\/code><\/li>\n\n\n\n<li><strong>Port check (local)<\/strong> <code>ss -lntp | grep 8080 # Keycloak listening on 0.0.0.0:8080 ss -lntp | grep ':443 ' # Apache listening on :443<\/code><\/li>\n\n\n\n<li><strong>Browser tests<\/strong>\n<ul class=\"wp-block-list\">\n<li>Open <code>https:\/\/auth.holidaylandmark.com\/<\/code><\/li>\n\n\n\n<li>Admin console loads without infinite redirects<\/li>\n\n\n\n<li>Open page source on login: form\/action URLs use <strong><a href=\"https:\/\/auth.holidaylandmark.com\/\">https:\/\/auth.holidaylandmark.com\/<\/a><\/strong> (not <code>127.0.0.1:8080<\/code>)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>If 400\/hostname errors<\/strong>\n<ul class=\"wp-block-list\">\n<li>Confirm <code>hostname=auth.holidaylandmark.com<\/code><\/li>\n\n\n\n<li>Ensure <code>proxy=edge<\/code> and <code>proxy-headers=xforwarded<\/code><\/li>\n\n\n\n<li>Keep <code>hostname-strict=true<\/code> and <strong><code>hostname-strict-backchannel=false<\/code><\/strong> (as in the config)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Admin console save\/test errors<\/strong>\n<ul class=\"wp-block-list\">\n<li>Almost always WebSocket\/proxy misconfig: re-check Apache <code>mod_proxy_wstunnel<\/code> and the <code>Upgrade<\/code> rewrite block.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10) Maintenance Commands<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># Watch logs\nsudo journalctl -u keycloak -f\n\n# Apply config changes\nsudo systemctl restart keycloak\n\n# Show effective config (useful for debugging)\nsudo -u keycloak \/opt\/auth.holidaylandmark.com\/bin\/kc.sh show-config\n\n# Apache logs\ntail -f \/opt\/lampp\/logs\/error_log\ntail -f \/opt\/lampp\/logs\/auth.holidaylandmark.com_error_log_\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">11) Common Pitfalls (and exact fixes)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Used <code>proxy=reencrypt<\/code><\/strong> while Apache terminates TLS<br>\u279c Set <strong><code>proxy=edge<\/code><\/strong> in <code>keycloak.conf<\/code>.<\/li>\n\n\n\n<li><strong>Missing WebSocket support<\/strong> (admin console issues)<br>\u279c Enable <code>mod_proxy_wstunnel<\/code> and add: <code>RewriteEngine On RewriteCond %{HTTP:Upgrade} =websocket [NC] RewriteRule \/(.*) ws:\/\/127.0.0.1:8080\/$1 [P,L]<\/code><\/li>\n\n\n\n<li><strong>Backchannel strictness causes 400<\/strong> on internal calls<br>\u279c <code>hostname-strict-backchannel=false<\/code>.<\/li>\n\n\n\n<li><strong>Proxying via public IP while both run on same host<\/strong><br>\u279c Prefer <code>127.0.0.1<\/code> for <code>ProxyPass<\/code>\/<code>ProxyPassReverse<\/code>\/<code>ProxyPassReverseCookieDomain<\/code>\/WebSocket rule.<\/li>\n\n\n\n<li><strong>Wrong cookie domain<\/strong> in browser<br>\u279c Ensure <code>ProxyPassReverseCookieDomain 127.0.0.1 auth.holidaylandmark.com<\/code> (or appropriate backend host).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">12) Optional Hardening (later)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Move DB credentials to environment variables or secrets manager.<\/li>\n\n\n\n<li>Set stricter JVM heap (<code>-Xms<\/code>, <code>-Xmx<\/code>) per RAM.<\/li>\n\n\n\n<li>Consider switching to a managed MariaDB\/MySQL or PostgreSQL instance for durability.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">You\u2019re done<\/h3>\n\n\n\n<p>With the above, Keycloak will (a) always run via <strong>systemd<\/strong>, (b) serve <strong>HTTPS<\/strong> through Apache with proper proxy\/WebSocket handling, and (c) behave correctly with <strong><code>proxy=edge<\/code><\/strong> and your hostname settings.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here\u2019s a clean, copy-paste Production Runbook for your current setup (Ubuntu + LAMPP\/Apache reverse proxy + Keycloak in \/opt\/auth.holidaylandmark.com), making [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3367","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Keycloak Production Deployment on Ubuntu + Apache (LAMPP) - DevOps Consulting<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Keycloak Production Deployment on Ubuntu + Apache (LAMPP) - DevOps Consulting\" \/>\n<meta property=\"og:description\" content=\"Here\u2019s a clean, copy-paste Production Runbook for your current setup (Ubuntu + LAMPP\/Apache reverse proxy + Keycloak in \/opt\/auth.holidaylandmark.com), making [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/\" \/>\n<meta property=\"og:site_name\" content=\"DevOps Consulting\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-11T05:59:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-06T05:17:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"1536\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Abhishek Singh\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Abhishek Singh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/\",\"url\":\"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/\",\"name\":\"Keycloak Production Deployment on Ubuntu + Apache (LAMPP) - DevOps Consulting\",\"isPartOf\":{\"@id\":\"https:\/\/www.devopsconsulting.in\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak-683x1024.png\",\"datePublished\":\"2025-10-11T05:59:18+00:00\",\"dateModified\":\"2025-12-06T05:17:12+00:00\",\"author\":{\"@id\":\"https:\/\/www.devopsconsulting.in\/blog\/#\/schema\/person\/fc397ba8be42f9fdd53450edfc73006f\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/#primaryimage\",\"url\":\"https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak.png\",\"contentUrl\":\"https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak.png\",\"width\":1024,\"height\":1536},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.devopsconsulting.in\/blog\/#website\",\"url\":\"https:\/\/www.devopsconsulting.in\/blog\/\",\"name\":\"DevOps Consulting\",\"description\":\"DevOps Consulting | SRE Consulting | DevSecOps Consulting | MLOps Consulting\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.devopsconsulting.in\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.devopsconsulting.in\/blog\/#\/schema\/person\/fc397ba8be42f9fdd53450edfc73006f\",\"name\":\"Abhishek Singh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.devopsconsulting.in\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/790feefe779852cdf344ca7318bf6c13832223c9b3c6bf4d217658412041026d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/790feefe779852cdf344ca7318bf6c13832223c9b3c6bf4d217658412041026d?s=96&d=mm&r=g\",\"caption\":\"Abhishek Singh\"},\"description\":\"I\u2019m Abhishek, a DevOps, SRE, DevSecOps, and Cloud expert with a passion for sharing knowledge and real-world experiences. I\u2019ve had the opportunity to work with Cotocus and continue to contribute to multiple platforms where I share insights across different domains: \u2022 DevOps School \u2013 Tech blogs and tutorials \u2022 Holiday Landmark \u2013 Travel stories and guides \u2022 Stocks Mantra \u2013 Stock market strategies and tips \u2022 My Medic Plus \u2013 Health and fitness guidance \u2022 TrueReviewNow \u2013 Honest product reviews \u2022 Wizbrand \u2013 SEO and digital tools for businesses I\u2019m also exploring the fascinating world of Quantum Computing.\",\"url\":\"https:\/\/www.devopsconsulting.in\/blog\/author\/abhishek\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Keycloak Production Deployment on Ubuntu + Apache (LAMPP) - DevOps Consulting","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/","og_locale":"en_US","og_type":"article","og_title":"Keycloak Production Deployment on Ubuntu + Apache (LAMPP) - DevOps Consulting","og_description":"Here\u2019s a clean, copy-paste Production Runbook for your current setup (Ubuntu + LAMPP\/Apache reverse proxy + Keycloak in \/opt\/auth.holidaylandmark.com), making [&hellip;]","og_url":"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/","og_site_name":"DevOps Consulting","article_published_time":"2025-10-11T05:59:18+00:00","article_modified_time":"2025-12-06T05:17:12+00:00","og_image":[{"width":1024,"height":1536,"url":"https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak.png","type":"image\/png"}],"author":"Abhishek Singh","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Abhishek Singh","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/","url":"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/","name":"Keycloak Production Deployment on Ubuntu + Apache (LAMPP) - DevOps Consulting","isPartOf":{"@id":"https:\/\/www.devopsconsulting.in\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/#primaryimage"},"image":{"@id":"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/#primaryimage"},"thumbnailUrl":"https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak-683x1024.png","datePublished":"2025-10-11T05:59:18+00:00","dateModified":"2025-12-06T05:17:12+00:00","author":{"@id":"https:\/\/www.devopsconsulting.in\/blog\/#\/schema\/person\/fc397ba8be42f9fdd53450edfc73006f"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.devopsconsulting.in\/blog\/keycloak-production-deployment-on-ubuntu-apache-lampp\/#primaryimage","url":"https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak.png","contentUrl":"https:\/\/www.devopsconsulting.in\/blog\/wp-content\/uploads\/2025\/10\/keycloak.png","width":1024,"height":1536},{"@type":"WebSite","@id":"https:\/\/www.devopsconsulting.in\/blog\/#website","url":"https:\/\/www.devopsconsulting.in\/blog\/","name":"DevOps Consulting","description":"DevOps Consulting | SRE Consulting | DevSecOps Consulting | MLOps Consulting","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.devopsconsulting.in\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.devopsconsulting.in\/blog\/#\/schema\/person\/fc397ba8be42f9fdd53450edfc73006f","name":"Abhishek Singh","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.devopsconsulting.in\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/790feefe779852cdf344ca7318bf6c13832223c9b3c6bf4d217658412041026d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/790feefe779852cdf344ca7318bf6c13832223c9b3c6bf4d217658412041026d?s=96&d=mm&r=g","caption":"Abhishek Singh"},"description":"I\u2019m Abhishek, a DevOps, SRE, DevSecOps, and Cloud expert with a passion for sharing knowledge and real-world experiences. I\u2019ve had the opportunity to work with Cotocus and continue to contribute to multiple platforms where I share insights across different domains: \u2022 DevOps School \u2013 Tech blogs and tutorials \u2022 Holiday Landmark \u2013 Travel stories and guides \u2022 Stocks Mantra \u2013 Stock market strategies and tips \u2022 My Medic Plus \u2013 Health and fitness guidance \u2022 TrueReviewNow \u2013 Honest product reviews \u2022 Wizbrand \u2013 SEO and digital tools for businesses I\u2019m also exploring the fascinating world of Quantum Computing.","url":"https:\/\/www.devopsconsulting.in\/blog\/author\/abhishek\/"}]}},"_links":{"self":[{"href":"https:\/\/www.devopsconsulting.in\/blog\/wp-json\/wp\/v2\/posts\/3367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsconsulting.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsconsulting.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsconsulting.in\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsconsulting.in\/blog\/wp-json\/wp\/v2\/comments?post=3367"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsconsulting.in\/blog\/wp-json\/wp\/v2\/posts\/3367\/revisions"}],"predecessor-version":[{"id":3834,"href":"https:\/\/www.devopsconsulting.in\/blog\/wp-json\/wp\/v2\/posts\/3367\/revisions\/3834"}],"wp:attachment":[{"href":"https:\/\/www.devopsconsulting.in\/blog\/wp-json\/wp\/v2\/media?parent=3367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsconsulting.in\/blog\/wp-json\/wp\/v2\/categories?post=3367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsconsulting.in\/blog\/wp-json\/wp\/v2\/tags?post=3367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}