# /etc/caddy/Caddyfile — copy this file there, then: sudo systemctl reload caddy
#
# Caddy fetches and renews Let's Encrypt certificates automatically the first
# time a domain's DNS points at this server. Order matters on a cutover: move
# the A record here first, then reload Caddy — the ACME HTTP-01 challenge for
# vienalatina.com only succeeds once the domain already resolves to this box.

git.vienalatina.com {
	reverse_proxy 127.0.0.1:3000
}

ci.vienalatina.com {
	reverse_proxy 127.0.0.1:8000
}

# ---------------------------------------------------------------------------
# Live since cutover (A record for vienalatina.com points at this server).
# ---------------------------------------------------------------------------

www.vienalatina.com {
	redir https://vienalatina.com{uri} 301
}

vienalatina.com {
	root * /var/www/vienalatina.com
	encode zstd gzip
	file_server

	# Members area — the only part of this site that runs code. Both paths are
	# matched: Flask redirects /comunidad to /comunidad/, and a matcher of
	# /comunidad/* alone would let the bare path fall through to file_server
	# and 404 before the app ever sees it.
	#
	# No `handle` wrapper is needed. Caddy runs reverse_proxy ahead of
	# file_server in its directive order, and reverse_proxy is terminal, so a
	# matched request never reaches the static tree.
	@board path /comunidad /comunidad/*
	reverse_proxy @board 127.0.0.1:8080

	# llms.txt is markdown (matches the old WP behaviour)
	header /llms.txt Content-Type "text/markdown; charset=utf-8"

	# --- 301s for old WordPress URL patterns -----------------------------

	# /?p=123 style permalinks → home (add specific mappings as GSC reports them)
	@wp_query_permalink {
		path /
		query p=*
	}
	redir @wp_query_permalink / 301

	# WP category base was /categoria/… (Spanish slugs); Hugo uses /categories/…
	@old_category path_regexp oldcat ^/categoria/(.*)$
	redir @old_category /categories/{re.oldcat.1} 301

	# WP author archives have no Hugo equivalent → home
	@old_author path /autor/*
	redir @old_author / 301

	# Old WP media library URLs → migrated uploads folder
	@old_uploads path_regexp oldup ^/wp-content/uploads/(?:\d{4}/\d{2}/)?(.*)$
	redir @old_uploads /uploads/{re.oldup.1} 301

	# Anything else that starts with /wp- doesn't exist anymore
	@wp_leftovers path /wp-admin/* /wp-login.php /wp-json/* /xmlrpc.php
	redir @wp_leftovers / 301

	# Custom 404 falls back to Hugo's 404 page
	handle_errors {
		@404 expression {err.status_code} == 404
		rewrite @404 /404.html
		file_server
	}
}
