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:
- Escuchar solicitudes entrantes en ese dominio (puertos 80 y 443).
- Obtener e instalar un certificado SSL de Let's Encrypt.
- Redirigir todo el tráfico HTTP a HTTPS.
- Hacer proxy inverso del tráfico HTTPS al contenedor Docker correcto.
- Renovar automáticamente el certificado antes de que expire.
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.
Agregar un dominio personalizado
Para agregar un dominio personalizado a tu app:
- Navega a tu app y abre la pestaña Domains.
- Haz clic en Add Domain.
- Ingresa tu nombre de dominio (ej.,
app.example.comoexample.com). - Guarda y configura tu DNS (ver abajo).
Puedes agregar múltiples dominios a una sola app. Todos servirán la misma aplicación. Esto es útil para:
- Servir tanto
example.comcomowww.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:
| Tipo | Nombre | Valor | Caso de uso |
|---|---|---|---|
| A | @ | IP de tu servidor | Dominio raíz (example.com) |
| A | app | IP de tu servidor | Subdominio (app.example.com) |
| CNAME | www | example.com | Redirección www |
# 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: 300dig 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:
- Desafío -- Caddy inicia un desafío ACME HTTP-01 para demostrar la propiedad del dominio.
- Emisión -- Let's Encrypt verifica el desafío y emite un certificado (generalmente en segundos).
- Instalación -- Caddy instala el certificado y comienza a servir tráfico HTTPS.
- Renovación -- Caddy renueva automáticamente el certificado 30 días antes de su expiración.
ufw allow 80/tcp (o equivalente) esté configurado.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
# In sh0 Settings > SSL, configure your DNS provider
# Example for Cloudflare:
DNS_PROVIDER=cloudflare
CLOUDFLARE_API_TOKEN=your-api-tokenEstado del certificado SSL
La sección de dominios de cada app muestra el estado SSL para cada dominio configurado:
| Estado | Significado |
|---|---|
| Activo | El certificado es válido y sirve tráfico HTTPS. |
| Pendiente | Aú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. |
| Renovando | El certificado se está renovando (30 días antes de la expiración). |
| Fallido | La 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.
# 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"