Files
2026-06-20 14:26:29 +08:00

139 lines
3.8 KiB
Bash

#!/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 <<EOF
{
admin localhost:2019
}
:${CADDY_PORT} {
tls /etc/caddy/cert.pem /etc/caddy/key.pem
basicauth {
${CADDY_USER} ${PASS_HASH}
}
reverse_proxy localhost:2019 {
header_up Host localhost:2019
}
log {
output file /var/log/caddy/admin-access.log {
roll_size 10mb
roll_keep 5
}
}
}
EOF
chown -R caddy:caddy /etc/caddy
chown -R caddy:caddy /var/log/caddy
sync
log "Configuring systemd for API persistence (--resume)..."
mkdir -p /etc/systemd/system/caddy.service.d
cat > /etc/systemd/system/caddy.service.d/override.conf <<EOF
[Service]
ExecStart=
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile --resume
EOF
rm -f /var/lib/caddy/.config/caddy/autosave.json
systemctl daemon-reload
log "Starting Caddy service..."
systemctl enable caddy >/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"