Files
ubuntu-post-install/fix-keycloak-proxy.sh
T
Claude 7cf82d5d28 Add no-keycloak and CrowdSec script variants; restore originals
Provide three tiers of the install script for both 24.04 and 26.04:

- Originals (ubuntu-post-install-24.04.sh / -26.04.sh): restored to their
  true original state, with Keycloak intact, as a fallback baseline. (This
  reverts the in-place Keycloak removal from the previous commit; the cleanup
  now lives in the -no-keycloak variants instead.)
- -no-keycloak.sh: Keycloak fully removed, Authelia as the SSO/2FA option.
- -crowdsec.sh: builds on -no-keycloak and replaces fail2ban entirely with
  CrowdSec (SSH via auth.log/sshd collection, Caddy via caddy collection + log
  acquisition, firewall bouncer for enforcement, plus geo-blocking and
  community IP-reputation blocklists).

Add SCRIPT-VARIANTS.md documenting the three tiers and how the Authelia /
fail2ban / CrowdSec security layers differ.

All variants pass 'bash -n'.

https://claude.ai/code/session_017eA2qqq9jfF2tNtpUYL8vK
2026-06-03 11:34:43 +00:00

185 lines
6.7 KiB
Bash
Executable File

#!/bin/bash
#
# Fix Keycloak proxy configuration
# This updates Keycloak to use v2 proxy headers (KC_PROXY_HEADERS)
# instead of deprecated v1 (KC_PROXY)
#
set -e
KC_DIR="$HOME/docker/keycloak"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Keycloak Proxy Configuration Fix"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "This script will:"
echo " 1. Backup your current .env file"
echo " 2. Replace deprecated KC_PROXY with KC_PROXY_HEADERS"
echo " 3. Ensure docker-compose.yml uses env_file"
echo " 4. Restart Keycloak with new configuration"
echo ""
if [ ! -d "$KC_DIR" ]; then
echo "❌ Error: Keycloak directory not found at $KC_DIR"
exit 1
fi
cd "$KC_DIR"
# Backup existing configuration
BACKUP_DIR="$KC_DIR/backups"
mkdir -p "$BACKUP_DIR"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# Check if .env exists
if [ -f ".env" ]; then
echo "✓ Found existing .env file"
cp .env "$BACKUP_DIR/.env.backup.$TIMESTAMP"
echo "✓ Backed up .env to $BACKUP_DIR/.env.backup.$TIMESTAMP"
# Check if it has the old KC_PROXY setting
if grep -q "KC_PROXY=" .env 2>/dev/null; then
echo ""
echo "Updating .env file..."
# Replace KC_PROXY with KC_PROXY_HEADERS
sed -i 's/^KC_PROXY=.*/KC_PROXY_HEADERS=xforwarded/' .env
# Add KC_PROXY_HEADERS if it doesn't exist and KC_PROXY didn't either
if ! grep -q "KC_PROXY_HEADERS=" .env 2>/dev/null; then
echo "" >> .env
echo "# Proxy settings (v2) - Trust X-Forwarded-* headers from Caddy2" >> .env
echo "KC_PROXY_HEADERS=xforwarded" >> .env
fi
echo "✓ Updated KC_PROXY to KC_PROXY_HEADERS=xforwarded"
elif grep -q "KC_PROXY_HEADERS=" .env 2>/dev/null; then
echo "✓ Already using KC_PROXY_HEADERS - no changes needed"
else
echo ""
echo "Adding KC_PROXY_HEADERS to .env..."
echo "" >> .env
echo "# Proxy settings (v2) - Trust X-Forwarded-* headers from Caddy2" >> .env
echo "KC_PROXY_HEADERS=xforwarded" >> .env
echo "✓ Added KC_PROXY_HEADERS=xforwarded"
fi
else
echo "⚠ No .env file found"
echo ""
echo "Please create a .env file with your Keycloak credentials."
echo "See SECURITY-IMPROVEMENTS.md for the template."
exit 1
fi
# Check docker-compose.yml
if [ -f "docker-compose.yml" ]; then
cp docker-compose.yml "$BACKUP_DIR/docker-compose.yml.backup.$TIMESTAMP"
echo "✓ Backed up docker-compose.yml to $BACKUP_DIR/docker-compose.yml.backup.$TIMESTAMP"
# Check if docker-compose.yml has hardcoded KC_PROXY
if grep -q "KC_PROXY=" docker-compose.yml 2>/dev/null; then
echo ""
echo "⚠ Found KC_PROXY in docker-compose.yml"
echo " Removing it (should be in .env file instead)..."
# Remove the KC_PROXY line from docker-compose.yml
sed -i '/KC_PROXY=/d' docker-compose.yml
echo "✓ Removed KC_PROXY from docker-compose.yml"
fi
# Ensure it uses env_file
if ! grep -q "env_file:" docker-compose.yml 2>/dev/null; then
echo "⚠ docker-compose.yml doesn't use env_file"
echo " You may need to update it manually to use 'env_file: - .env'"
else
echo "✓ docker-compose.yml uses env_file"
fi
fi
# Show current configuration
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Current Configuration:"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
if [ -f ".env" ]; then
echo "Proxy Settings:"
grep "KC_PROXY" .env | grep -v "^#" || echo " (none found)"
echo ""
if grep -q "KC_HOSTNAME=" .env | grep -v "^#" 2>/dev/null; then
echo "Hostname:"
grep "KC_HOSTNAME=" .env | grep -v "^#"
echo ""
fi
fi
# Ask to restart
echo ""
read -p "Restart Keycloak with new configuration? (y/n): " RESTART
if [ "$RESTART" = "y" ] || [ "$RESTART" = "Y" ]; then
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Restarting Keycloak..."
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
docker compose down
echo "✓ Stopped Keycloak"
echo ""
echo "Starting Keycloak (this may take a minute)..."
docker compose up -d
# Wait for Keycloak to be ready
echo ""
echo "Waiting for Keycloak to be ready..."
KC_READY=false
for i in {1..60}; do
if docker exec keycloak curl -sf http://localhost:8080/health/ready > /dev/null 2>&1; then
KC_READY=true
echo ""
echo "✓ Keycloak is ready"
break
fi
echo -n "."
sleep 2
done
echo ""
if [ "$KC_READY" = true ]; then
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ Keycloak successfully updated!"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "Changes applied:"
echo " • Deprecated KC_PROXY removed"
echo " • New KC_PROXY_HEADERS=xforwarded configured"
echo " • Configuration stored in .env file"
echo ""
echo "The 'Hostname v1 options [proxy]' warnings should be gone."
echo ""
echo "Check the logs:"
echo " docker compose logs -f keycloak"
echo ""
else
echo ""
echo "⚠ Keycloak may still be starting. Check logs:"
echo " docker compose logs -f keycloak"
fi
else
echo ""
echo "Skipping restart. To apply changes later, run:"
echo " cd $KC_DIR && docker compose restart"
fi
echo ""
echo "Backup location: $BACKUP_DIR/"
echo " - .env.backup.$TIMESTAMP"
echo " - docker-compose.yml.backup.$TIMESTAMP"
echo ""