#!/usr/bin/env bash set -euo pipefail log() { echo -e "\033[1;32m[+] $1\033[0m"; } warn() { echo -e "\033[1;33m[!] $1\033[0m"; } error() { echo -e "\033[1;31m[-] $1\033[0m"; } CADDY_USER="" CADDY_PASS="" CADDY_PORT="8444" while [[ $# -gt 0 ]]; do case "$1" in --username) CADDY_USER="$2"; shift 2 ;; --password) CADDY_PASS="$2"; shift 2 ;; --port) CADDY_PORT="$2"; shift 2 ;; *) error "Unknown argument: $1"; exit 1 ;; esac done if [[ "$EUID" -ne 0 ]]; then error "Must run as root"; exit 1; fi if [[ -z "$CADDY_USER" ]]; then error "Error: --username required"; exit 1; fi if [[ -z "$CADDY_PASS" ]]; then error "Error: --password required"; exit 1; fi if [[ -f /etc/os-release ]]; then source /etc/os-release if [[ "$ID" != "ubuntu" && "$ID" != "debian" ]]; then error "Only Ubuntu/Debian supported" exit 1 fi else error "Cannot detect OS"; exit 1 fi log "Installing Caddy Web Server & Dependencies..." export DEBIAN_FRONTEND=noninteractive apt-get update -qq apt-get install -y -qq curl debian-keyring debian-archive-keyring apt-transport-https openssl >/dev/null if ! command -v caddy &> /dev/null; then curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --yes --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list >/dev/null apt-get update -qq apt-get install -y -qq caddy >/dev/null log "Caddy installed successfully" else log "Caddy already installed, updating..." apt-get install -y -qq caddy >/dev/null fi systemctl stop caddy || true log "Generating password hash..." PASS_HASH=$(caddy hash-password --plaintext "$CADDY_PASS") log "Generating self-signed certificate..." mkdir -p /etc/caddy openssl req -x509 -newkey rsa:2048 \ -keyout /etc/caddy/key.pem \ -out /etc/caddy/cert.pem \ -days 3650 -nodes \ -subj "/CN=caddy-admin" \ 2>/dev/null chmod 644 /etc/caddy/cert.pem /etc/caddy/key.pem log "Configuring Caddy..." mkdir -p /var/log/caddy cat > /etc/caddy/Caddyfile < /etc/systemd/system/caddy.service.d/override.conf </dev/null 2>&1 || true systemctl stop caddy 2>/dev/null || true sleep 1 systemctl start caddy sleep 2 if ! ss -tlnp | grep -q ":${CADDY_PORT}"; then error "Caddy failed to bind to port ${CADDY_PORT}. Last 10 lines of logs:" journalctl -u caddy -n 10 --no-pager exit 1 fi log "Caddy installation complete!" echo "" echo -e "\033[1;36m========================================\033[0m" echo -e "\033[1;36m Caddy Reverse Proxy Ready\033[0m" echo -e "\033[1;36m========================================\033[0m" echo -e "\033[1;33m API Port: ${CADDY_PORT}\033[0m" echo -e "\033[1;33m Username: ${CADDY_USER}\033[0m" echo -e "\033[1;33m Auth: Basic Auth + HTTPS\033[0m" echo -e "\033[1;33m Persistence: API (--resume mode)\033[0m" echo -e "\033[1;36m========================================\033[0m" echo "" echo -e "\033[1;32mPlease return to the panel and confirm the installation.\033[0m"