Slide 1 / 15

Caddy Learning Curriculum

Web Server powerful dan mudah

2 Minggu - 10 Hari - Complete Guide

Caddy adalah web server dengan konfigurasi sederhana dan automatic HTTPS

Overview

Tujuan Pembelajaran

Goals

Keunggulan Caddy

Minggu 1

Dasar-Dasar Caddy

Jadwal Minggu 1

HariTopikPraktik
1Pengenalan CaddyApa itu Caddy? Keunggulan
2InstalasiInstall Caddy di Linux
3Caddyfile DasarSyntax dan struktur
4Static FilesServe static website
5Reverse ProxyProxy ke backend
Minggu 1 - Hari 1

Apa itu Caddy?

Definisi: Caddy adalah web server open-source yang otomatis mengaktifkan HTTPS dan menyediakan konfigurasi yang sangat sederhana.

Sejarah

Kapan Pakai Caddy?

Minggu 1 - Hari 2

Instalasi Caddy

Install di Ubuntu/Debian

# Install dependencies
sudo apt install -y apt-transport-https ca-certificates curl gnupg

# Add Caddy repository
sudo curl -fsSL "https://dl.cloudsmith.io/public/caddy/stable/gpg.key" | gpg --dearmor -o /usr/share/keyrings/caddy-archive-keyring.gpg
sudo curl -fsSL "https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt" | sudo tee /etc/apt/sources.list.d/caddy-stable.list

# Install Caddy
sudo apt update
sudo apt install caddy

Verify Installation

caddy version
Catatan: Pastikan port 80 dan 443 tidak dipakai service lain
Minggu 1 - Hari 3

Caddyfile Dasar

Caddyfile adalah file konfigurasi utama Caddy. Sederhana dan readable.

Struktur Dasar

# Basic Caddyfile
example.com {
    respond "Hello, World!"
}

Dengan Static Files

mysite.com {
    root * /var/www/html
    file_server
}

Commands Penting

# Validate Caddyfile
caddy validate

# Format Caddyfile
caddy fmt

# Reload konfigurasi
caddy reload
Minggu 1 - Hari 4

Static Files

Serve Static Website

www.example.com {
    # Root folder
    root * /var/www/mysite
    
    # Enable file server
    file_server
    
    # Enable index files
    index index.html index.htm
}

Dengan PHP Support

www.example.com {
    root * /var/www/html
    
    php_fastcgi localhost:9000
    file_server
}

Path Rewrite

www.example.com {
    root * /var/www/app
    
    # Rewrite /app ke /app/public
    rewrite /app /app/public
    
    php_fastcgi localhost:9000
    file_server
}
Minggu 1 - Hari 5

Reverse Proxy

Reverse Proxy meneruskan request dari client ke backend server

Proxy ke Local Port

api.example.com {
    reverse_proxy localhost:3000
}

Proxy ke Docker Container

myapp.example.com {
    reverse_proxy container-name:3000
}

Proxy dengan WebSocket Support

app.example.com {
    reverse_proxy localhost:8080 {
        header_up X-Real-IP {remote}
        header_up X-Forwarded-For {remote}
        header_up X-Forwarded-Proto {scheme}
    }
}
Minggu 2

Advanced Caddy

Jadwal Minggu 2

HariTopikPraktik
1Automatic HTTPSLet's Encrypt config
2TLS OptionsCustom certificates
3Load BalancingMultiple backends
4Security HeadersHardening
5Logging - MonitoringLogs dan metrics
Minggu 2 - Hari 1

Automatic HTTPS

Caddy automatic HTTPS: Secara otomatis mengambil dan renew SSL certificate dari Let's Encrypt

Cara Kerja

Konfigurasi Domain

example.com {
    # Automatic HTTPS - tidak perlu konfigurasi tambahan
    root * /var/www/html
    file_server
}

Disable HTTPS (Development)

localhost:8080 {
    http_port 8080
    https_port 8443
    respond "Dev Server"
}
Minggu 2 - Hari 2

TLS Options

Custom TLS Config

example.com {
    tls {
        protocols tls1.2 tls1.3
        ciphers TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256
    }
    
    reverse_proxy localhost:3000
}

External TLS (Managed Elsewhere)

example.com {
    tls external
    
    reverse_proxy backend:443 {
        transport http {
            tls
            tls_server_name backend.example.com
        }
    }
}

Self-Signed Certificate (Development)

example.com {
    tls self_signed
    
    respond "Internal Dev"
}
Minggu 2 - Hari 3

Load Balancing

Round Robin

api.example.com {
    reverse_proxy localhost:3000 localhost:3001 localhost:3002
}

dengan Health Check

api.example.com {
    reverse_proxy localhost:3000 localhost:3001 localhost:3002 {
        health_uri /health
        health_interval 5s
        health_timeout 3s
    }
}

IP Hash (Sticky Session)

app.example.com {
    reverse_proxy localhost:3000 localhost:3001 {
        lb_policy ip_hash
    }
}
Minggu 2 - Hari 4

Security Headers

Header Security

example.com {
    header {
        X-Frame-Options "SAMEORIGIN"
        X-Content-Type-Options "nosniff"
        X-XSS-Protection "1; mode=block"
        Referrer-Policy "strict-origin-when-cross-origin"
        Content-Security-Policy "default-src 'self'"
    }
    
    reverse_proxy localhost:3000
}

CORS Headers

api.example.com {
    @cors {
        header Origin *
    }
    
    respond @cors "OK" 200 {
        Access-Control-Allow-Origin "*"
        Access-Control-Allow-Methods "GET, POST, OPTIONS"
    }
    
    reverse_proxy localhost:3000
}
Minggu 2 - Hari 5

Logging - Monitoring

Access Log

example.com {
    log {
        output file /var/log/caddy/access.log
    }
    
    reverse_proxy localhost:3000
}

Error Log

example.com {
    log {
        output file /var/log/caddy/error.log
        level ERROR
    }
    
    reverse_proxy localhost:3000
}

Console Output (Development)

example.com {
    log {
        output stdout
    }
    
    respond "Debug mode"
}
Final

Cheat Sheet

Commands

caddy run                 # Start Caddy
caddy start               # Start as daemon
caddy stop                # Stop Caddy
caddy reload              # Reload config
caddy validate            # Validate Caddyfile
caddy fmt                 # Format Caddyfile
caddy list-certificates   # List certificates
caddy revoke              # Revoke certificate

Common Directives

root * /path/to/files    # Document root
file_server              # Enable static file serving
reverse_proxy localhost:3000  # Proxy to backend
php_fastcgi localhost:9000   # PHP support
encode gzip             # Enable gzip compression
log { }                 # Logging
header { }              # Set headers
tls { }                 # TLS configuration
Selamat! Anda telah menyelesaikan Caddy Learning Curriculum.