# HTTPS automático para tu app con una bandera — sin nginx, sin certbot

> El servidor incorporado de Synsema emite y renueva los certificados de Let's Encrypt por su cuenta. Una bandera convierte el archivo que corrés en desarrollo en un sitio HTTPS de producción, con HTTP/2, HSTS y www → apex.

Published 2026-09-02 · https://synsema.org/es/blog/automatic-https-lets-encrypt-one-flag


La lista de siempre para poner un servicio chico en producción: instalar nginx, escribir la
configuración del sitio, instalar certbot, correrlo una vez, agregar un cron para renovar, recargar
nginx después de cada renovación y acordarse de todo esto en el próximo servidor. El servidor de
Synsema hace la lista entera solo, porque TLS y ACME son parte del runtime y no de un proxy inverso
que ponés adelante.

## El mismo archivo, en desarrollo y en producción

Nada en el programa dice "producción". En desarrollo lo corrés pelado:

```sh
synsema serve app.syn                      # http://127.0.0.1:8080
```

Y en producción corrés **el mismo archivo** con banderas:

```sh
synsema serve app.syn --port 443 --domain example.com --tls-auto you@example.com
```

`--tls-auto` es el interruptor. El servidor pide un certificado a Let's Encrypt, responde el desafío
HTTP-01 en el `:80`, guarda el certificado en `~/.synsema/certs/` y un hilo en segundo plano lo
renueva cuando quedan menos de 30 días. El `:80` además redirige todo lo demás a HTTPS. Se exige
TLS 1.2+, HSTS está prendido y HTTP/2 se negocia por ALPN.

## Un certificado para el apex y el www

Pasale una lista a `--domain` (o a `domain` en el archivo) y obtenés un único certificado SAN. Para
canonicalizar `www` al apex, dale a `www` su propio host virtual cuyo único trabajo sea redirigir:

```synsema
require serve(443)

serve on 443
    tls auto "you@example.com"
    domain ["example.com", "www.example.com"]
    host "www.example.com"
        route "GET /"
            give redirect("https://example.com/")
        route "GET /*path"
            give redirect("https://example.com/" + params.path)
    static "/assets" from "./static"
    route "GET /"
        give render("pages/home.html", {"title": "Home"})
```

Cada nombre de la lista tiene que resolver al servidor y ser alcanzable en el `:80`, o el pedido
falla ruidosamente al arrancar en vez de quedar funcionando a medias.

## Lo que no tuviste que escribir

Ninguna configuración de nginx, ningún timer de certbot, ningún hook de recarga, ninguna cabecera de
proxy que reenviar. El certificado es por host (SNI), así que varios sitios pueden compartir un
proceso. Y si igual querés algo adelante, el servidor también habla proxy inverso (`proxy to`) y
transporta SSE y WebSockets a través de él.

**Probalo en diez minutos:** [instalá Synsema](/es/install), apuntá un dominio a tu servidor y corré
el segundo comando de arriba. La página completa de despliegue — systemd, Docker, Kubernetes — está
en la [documentación](https://synsema.dev/es/0.6.x/71-deploy).

