#!/usr/bin/env bash # Complete SSL setup for Blockscout with Cloudflare Tunnel # Sets up Let's Encrypt certificates, Nginx SSL, and Cloudflare tunnel HTTPS # Usage: ./setup-blockscout-ssl-complete.sh set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ENV_FILE="${ENV_FILE:-$SCRIPT_DIR/../.env}" # Configuration VMID="${VMID:-5000}" IP="${IP:-192.168.11.140}" DOMAIN="${DOMAIN:-explorer.d-bis.org}" BLOCKSCOUT_PORT="${BLOCKSCOUT_PORT:-4000}" PROXMOX_HOST="${PROXMOX_HOST:-192.168.11.10}" EMAIL="${EMAIL:-admin@d-bis.org}" PASSWORD="${PASSWORD:-L@kers2010}" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[✓]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } # Load environment variables if [ -f "$ENV_FILE" ]; then source "$ENV_FILE" fi echo "════════════════════════════════════════════════════════" echo "Blockscout SSL Setup with Cloudflare Tunnel" echo "════════════════════════════════════════════════════════" echo "" echo "Configuration:" echo " VMID: $VMID" echo " IP: $IP" echo " Domain: $DOMAIN" echo " Email: $EMAIL" echo "" # Function to execute command in container (direct SSH to container IP) exec_container() { local cmd="$1" sshpass -p "$PASSWORD" ssh -o StrictHostKeyChecking=no root@"$IP" "bash -c '$cmd'" 2>&1 } # Step 1: Install Certbot log_info "Step 1: Installing Certbot..." exec_container "export DEBIAN_FRONTEND=noninteractive && apt-get update -qq && apt-get install -y -qq certbot python3-certbot-nginx" || { log_error "Failed to install Certbot" exit 1 } log_success "Certbot installed" # Step 2: Configure Nginx for ACME challenge (HTTP port 80) log_info "Step 2: Configuring Nginx for ACME challenge..." # Create config file locally then copy cat > /tmp/blockscout-nginx-acme.conf <&1" || echo "FAILED") if echo "$CERT_RESULT" | grep -q "Successfully received certificate"; then log_success "SSL certificate obtained successfully" CERT_PATH="/etc/letsencrypt/live/$DOMAIN/fullchain.pem" KEY_PATH="/etc/letsencrypt/live/$DOMAIN/privkey.pem" else log_error "Failed to obtain SSL certificate" echo "$CERT_RESULT" | tail -20 exit 1 fi # Step 4: Configure Nginx with SSL log_info "Step 4: Configuring Nginx with SSL certificates..." cat > /tmp/blockscout-nginx-ssl.conf </dev/null || docker compose restart blockscout 2>/dev/null || true && echo 'Blockscout configuration updated'; else echo 'docker-compose.yml not found, skipping Blockscout config update'; fi" || { log_warn "Failed to update Blockscout configuration (may need manual update)" } # Step 7: Update Cloudflare Tunnel to use HTTPS log_info "Step 7: Updating Cloudflare Tunnel route to HTTPS..." if [ -f "$SCRIPT_DIR/configure-cloudflare-tunnel-route.sh" ]; then export EXPLORER_IP="$IP" export EXPLORER_PORT="443" bash "$SCRIPT_DIR/configure-cloudflare-tunnel-route.sh" || { log_warn "Failed to update Cloudflare tunnel route automatically" log_info "Manual update needed: Change tunnel route to https://$IP:443" } else log_warn "Cloudflare tunnel route script not found" log_info "Manual update needed: Change tunnel route to https://$IP:443" fi # Step 8: Test SSL configuration log_info "Step 8: Testing SSL configuration..." sleep 5 SSL_TEST=$(exec_container "timeout 5 curl -k -s -o /dev/null -w '%{http_code}' https://localhost/health 2>&1" || echo "000") if [ "$SSL_TEST" = "200" ] || [ "$SSL_TEST" = "301" ] || [ "$SSL_TEST" = "302" ]; then log_success "HTTPS is working (HTTP $SSL_TEST)" else log_warn "HTTPS test returned: HTTP $SSL_TEST" fi # Step 9: Verify certificate log_info "Step 9: Verifying SSL certificate..." CERT_INFO=$(exec_container "openssl x509 -in /etc/letsencrypt/live/$DOMAIN/fullchain.pem -noout -subject -issuer -dates 2>&1" || echo "") if [ -n "$CERT_INFO" ]; then log_success "Certificate details:" echo "$CERT_INFO" | while read line; do log_info " $line" done fi echo "" echo "════════════════════════════════════════════════════════" echo "SSL Setup Complete!" echo "════════════════════════════════════════════════════════" echo "" log_success "Configuration Summary:" echo " Domain: $DOMAIN" echo " SSL Certificate: /etc/letsencrypt/live/$DOMAIN/" echo " HTTPS Port: 443" echo " HTTP Port: 80 (redirects to HTTPS)" echo "" log_info "Access Points:" echo " Internal HTTPS: https://$IP" echo " External HTTPS: https://$DOMAIN" echo " Health Check: https://$DOMAIN/health" echo "" log_info "Next Steps:" echo " 1. Verify Cloudflare tunnel route points to https://$IP:443" echo " 2. Test external access: curl https://$DOMAIN/health" echo " 3. Monitor certificate renewal: systemctl status certbot.timer" echo "" # Cleanup rm -f /tmp/blockscout-nginx-acme.conf /tmp/blockscout-nginx-ssl.conf