Skip to content

Caddyfile Directives ​

Configuration type du Caddyfile

Paramùtres de base ​

Configurer le port d'écoute du serveur web en haut du fichier Caddyfile

shell
{
    admin off # désactive l'interface d'administration de Caddy
	http_port 80 # Port HTTP
	https_port 443 # Port HTTPS
}

Ă  la suite de cette configuraiton je configure les domaines pour servir les sites et applications web.

Configuration d'un domaine avec une application PHP ​

shell
mondomaine.ext {
    # configuration des headers sécurisés
	header {
		-Server
		Set-Cookie: __Host-sess=123; path=/; Secure; HttpOnly; SameSite=Lax # exemple de configuration de cookie sécurisé
		Permissions-Policy "geolocation=(self), microphone=(), camera=()" # exemple de configuration de permissions
		Strict-Transport-Security "max-age=31536000; includeSubDomains" # exemple de configuration de HSTS (HTTP Strict Transport Security) veut dire que le navigateur doit toujours utiliser HTTPS
		X-Content-Type-Options "nosniff" # empĂȘche le navigateur de deviner le type de contenu
		Referrer-Policy "no-referrer-when-downgrade" # empĂȘche le navigateur de transmettre le referrer Ă  un site HTTP
		Content-Security-Policy: "default-src 'self'; script-src 'self'; style-src 'self'; font-src 'self'; img-src 'self' data:;" # adapter aux besoins de l'application ici tout est bloqué sauf les ressources du site
		X-Frame-Options "DENY" # empĂȘche le site d'ĂȘtre affichĂ© dans un iframe
	}

    # stockage des logs de requĂȘtes HTTP dans un fichier
	log {
		output file /var/log/caddy/requests.json {
			roll_size 2mb # taille maximale du fichier de logs
			roll_keep 2 # nombre de fichiers de logs à conserver (crée un .zip quand le fichier de log atteint la taille maximale roll_size)
			roll_keep_for 24h # durée de conservation des fichiers de logs
		}
	}

	root * /var/www/html/phpmyadmin/public # définir le dossier racine du site (le point d'ntrée de l'application - index.php)
	php_fastcgi unix//run/php/php8.2-fpm.sock # configuration du serveur PHP (version 8.2)
	encode gzip # compression des fichiers pour une meilleure performance
	file_server # activer le serveur de fichiers pour servir les fichiers statiques (assets, images, etc.)

    @blocked { # configuration pour bloquer l'accĂšs Ă  certains fichiers
		path /uploads/* # bloquer l'accĂšs au dossier uploads et Ă  tous ses fichiers et sous-dossiers (on ne pourra pas accĂ©der Ă  ces fichiers directement mĂȘme si on connait le chemin il faudra impĂ©rativement que le fichier soit servi par unr route de l'application pour y accĂ©der)
	}
	respond @blocked 403 # renvoyer une erreur 403 (Forbidden) si l'accÚs est bloqué
}

Configuration par exemple pour une application PHP (phpmyadmin) avec des headers sĂ©curisĂ©s, stockage des logs de requĂȘtes HTTP dans un fichier, configuration du serveur PHP, compression des fichiers et serveur de fichiers activĂ©.

Configuration d'un domaine avec redirection ​

shell
mondomaine.ext {
    redir https://www.mondomaine.ext{uri}
}

Permet de rediriger les requĂȘtes http://mondomaine.ext vers https://www.mondomaine.ext/uri

Configuration d'un reverse proxy ​

shell
mondomaine.ext {
    reverse_proxy localhost:3000
}

Permet de rediriger les requĂȘtes http://mondomaine.ext vers le serveur local sur le port 3000 Par exemple pour rediriger les requĂȘtes vers un serveur Node.js ou Mercure...

Configuration d'un domaine avec un site statique ​

shell
mondomaine.ext {
    root * /var/www/html/monsite
    file_server
    try_files {path} {path}/ /index.html   # servir le fichier index.html par défaut
}

Bonus crĂ©er des configs rĂ©utilisables ​

Permet de déclarer des configurations réutilisables directement dans le CaddyFile.

shell

# un anti bot pour rejeter avant exécution
(bot-protection) {
	@_bots {
		path_regexp wp_paths ^/(wp-admin|wp-content|wp-includes|wp-.*\.php|xmlrpc\.php|\.env(\..*)?$|phpinfo.*|\.git.*|\.aws.*|\.htaccess|\.DS_Store|\.vscode|\.idea|\.editorconfig|composer\.(json|lock)|package(-lock)?\.json|yarn\.lock|docker-compose\.ya?ml|application\.properties|settings\.py|config\.env|.*\.(bak|sql|ini|log|conf|yml|old))$
	}
	respond @_bots "Access denied" 403
}
# Les headers secudisés de base à importer là ou necessaire
(basic-headers) {
	header {
		-Server
		Set-Cookie: __Host-sess=123; path=/; Secure; HttpOnly; SameSite=Lax
		Permissions-Policy "geolocation=(self), microphone=(), camera=()"
		Strict-Transport-Security "max-age=31536000; includeSubDomains"
		X-Content-Type-Options "nosniff"
		Referrer-Policy "no-referrer-when-downgrade"
		Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://apis.google.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data:;"
		X-Frame-Options "DENY"
	}
}

# on les importe
mon-sous-domaine.mon-domaine.ext {
	import bot-protection
	import basic-headers
	
	root * /var/www/html/monsite
    file_server
    try_files {path} {path}/ /index.html   # servire le fichier index.html par défaut
}