Dominios y SSL

sh0 usa Caddy como su proxy inverso, lo que significa que cada dominio obtiene HTTPS automático vía Let's Encrypt. Sin gestión manual de certificados, sin trabajos cron, sin archivos de configuración -- simplemente funciona.

Cómo funcionan los dominios

Cuando asignas un dominio a una app, sh0 configura automáticamente Caddy para:

  1. Escuchar solicitudes entrantes en ese dominio (puertos 80 y 443).
  2. Obtener e instalar un certificado SSL de Let's Encrypt.
  3. Redirigir todo el tráfico HTTP a HTTPS.
  4. Hacer proxy inverso del tráfico HTTPS al contenedor Docker correcto.
  5. Renovar automáticamente el certificado antes de que expire.
Flow diagram showing: Internet request to domain.com goes to Caddy (ports 80/443), which terminates SSL and proxies to the Docker container on its internal port
Caddy handles SSL termination and proxying

Todo este proceso es automático. Una vez que agregas un dominio y apuntas su DNS a tu servidor, todo lo demás es automático.

Subdominios predeterminados

Cada app desplegada en sh0 Cloud recibe un subdominio gratuito bajo *.sh0.app. Esto es útil para:

  • Pruebas rápidas sin configurar DNS
  • Ambientes de staging
  • Despliegues de vista previa para pull requests

El subdominio se basa en el nombre de tu app: si tu app se llama my-api, será accesible en my-api.sh0.app.

Note
Los subdominios predeterminados son totalmente funcionales con SSL. Son ideales para desarrollo y pruebas. Para producción, generalmente querrás usar tu propio dominio personalizado.

Agregar un dominio personalizado

Para agregar un dominio personalizado a tu app:

  1. Navega a tu app y abre la pestaña Domains.
  2. Haz clic en Add Domain.
  3. Ingresa tu nombre de dominio (ej., app.example.com o example.com).
  4. Guarda y configura tu DNS (ver abajo).
Add Domain dialog showing a text input for the domain name, with examples of valid formats: 'example.com', 'app.example.com', 'api.example.com'
Adding a custom domain

Puedes agregar múltiples dominios a una sola app. Todos servirán la misma aplicación. Esto es útil para:

  • Servir tanto example.com como www.example.com
  • Soportar múltiples nombres de dominio que apuntan al mismo servicio
  • Mantener el subdominio predeterminado como respaldo junto a tu dominio personalizado

Configuración DNS

Apunta tu dominio a tu servidor sh0 agregando registros DNS en tu registrador o proveedor DNS:

TipoNombreValorCaso de uso
A@IP de tu servidorDominio raíz (example.com)
AappIP de tu servidorSubdominio (app.example.com)
CNAMEwwwexample.comRedirección www
Example DNS Records
# For app.example.com
Type: A
Name: app
Value: 203.0.113.50
TTL: 300

# For example.com (root domain)
Type: A
Name: @
Value: 203.0.113.50
TTL: 300
Propagación DNS
Los cambios DNS generalmente se propagan en minutos pero pueden tomar hasta 24 horas. Puedes verificar que tu DNS esté correctamente configurado usando dig app.example.com o nslookup app.example.com.

SSL automático

Los certificados SSL son gestionados completamente por Caddy. No hay nada que configurar, no hay certificados que subir y no hay scripts de renovación que mantener.

Cómo funciona Let's Encrypt

Cuando agregas un dominio, lo siguiente ocurre automáticamente:

  1. Desafío -- Caddy inicia un desafío ACME HTTP-01 para demostrar la propiedad del dominio.
  2. Emisión -- Let's Encrypt verifica el desafío y emite un certificado (generalmente en segundos).
  3. Instalación -- Caddy instala el certificado y comienza a servir tráfico HTTPS.
  4. Renovación -- Caddy renueva automáticamente el certificado 30 días antes de su expiración.
El puerto 80 debe estar abierto
El desafío HTTP-01 requiere que el puerto 80 sea accesible desde internet. Si el puerto 80 está bloqueado por un firewall, Caddy no puede obtener certificados. Asegúrate de que ufw allow 80/tcp (o equivalente) esté configurado.
Domain list showing three domains with their SSL status: 'app.example.com' with a green lock icon and 'Valid until Dec 2026', 'api.example.com' with a green lock, and 'staging.example.com' with a yellow pending icon
SSL certificate status for each domain

Dominios wildcard

Los dominios wildcard (ej., *.example.com) permiten que cualquier subdominio se enrute a tu app. Esto es útil para:

  • Aplicaciones multiinquilino donde cada inquilino obtiene un subdominio
  • Despliegues de vista previa con subdominios únicos por rama
  • Enrutamiento geográfico o basado en idioma
SSL wildcard requiere desafío DNS
Los certificados wildcard requieren un desafío DNS-01 en lugar de HTTP-01. Esto significa que necesitas configurar una clave API de proveedor DNS en la configuración de sh0 para que Caddy pueda crear registros TXT para verificación. Los proveedores soportados incluyen Cloudflare, Route53, DigitalOcean y más.
Configure DNS Provider for Wildcards
# In sh0 Settings > SSL, configure your DNS provider
# Example for Cloudflare:
DNS_PROVIDER=cloudflare
CLOUDFLARE_API_TOKEN=your-api-token

Estado del certificado SSL

La sección de dominios de cada app muestra el estado SSL para cada dominio configurado:

EstadoSignificado
ActivoEl certificado es válido y sirve tráfico HTTPS.
PendienteAún sin certificado. Desde la v1.6.25 la emisión es bajo demanda: el certificado se solicita en el primer saludo TLS del dominio, así que un dominio permanece Pendiente hasta que alguien se conecta realmente. Pasa el cursor sobre la insignia para leer por qué sigue pendiente.
RenovandoEl certificado se está renovando (30 días antes de la expiración).
FallidoLa provisión del certificado falló. Verifica la configuración DNS y del firewall.

Dos reglas más desde la v1.6.25. Un dominio Activo cuyo certificado desaparece del disco vuelve a Pendiente tras dos comprobaciones consecutivas, nunca por una sola lectura. Y la fecha de expiración del certificado se lee ahora del propio certificado, de modo que las alertas de expiración tienen por fin un valor con el que trabajar.

Solución de problemas

Si tu dominio no funciona o el certificado SSL falla al provisionarse, verifica estos problemas comunes:

DNS no apunta a tu servidor

Ejecuta dig +short your-domain.com y verifica que devuelva la dirección IP de tu servidor. Si no, actualiza tus registros DNS y espera la propagación.

El puerto 80 está bloqueado

Let's Encrypt necesita el puerto 80 para verificar la propiedad del dominio. Asegúrate de que tu firewall permita tráfico TCP entrante en el puerto 80. Verifica con sudo ufw status.

Otro servicio está usando el puerto 80/443

Si Nginx, Apache u otro servidor web está corriendo, puede entrar en conflicto con Caddy. Detén el otro servicio: sudo systemctl stop nginx.

Límite de tasa excedido

Let's Encrypt tiene límites de tasa (50 certificados por dominio por semana). Si alcanzas el límite, espera o usa el ambiente de staging para pruebas. Los logs de Caddy indicarán errores de límite de tasa.

Debugging Commands
# Check if DNS resolves correctly
dig +short app.example.com

# Test if port 80 is accessible from outside
curl -I http://app.example.com

# Check Caddy logs for certificate errors
journalctl -u sh0 | grep -i "certificate\|tls\|acme"