# /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 } }