Autoalojamiento
Solución de problemas
Los problemas típicos de una instalación propia y cómo resolverlos: arranque, HTTPS, emails, archivos grandes, PDF, permisos y logs.
Casi todos los problemas se ven en los logs. Empieza siempre por ahí.
Ver los logs
Desde la carpeta deploy/:
docker compose ps # estado de cada servicio
docker compose logs -f app # la API (arranque, migraciones, errores)
docker compose logs -f worker # emails, PDF y tareas en segundo plano
docker compose logs --tail 200 app worker # las últimas 200 líneas de los dos
docker compose logs --since 1h caddy # la última hora del proxy (perfil https)
Los logs rotan solos (5 archivos de 10 MB por servicio). Nunca muestran secretos ni contraseñas.
Para saber si la API y la base responden: curl -fsS https://tu-dominio/api/health devuelve
{"status":"ok"}.
La API no arranca
Síntoma: docker compose ps muestra app reiniciándose o unhealthy, y el worker no arranca
(espera a que la app esté sana).
Causa habitual: una variable de .env falta o tiene un formato incorrecto. El log lo dice:
Variables de entorno inválidas o faltantes: JWT_ACCESS_SECRET, MFA_ENCRYPTION_KEY
Revisa cada variable nombrada:
| Variable | Error típico |
|---|---|
JWT_ACCESS_SECRET |
Tiene menos de 64 caracteres. Genérala con openssl rand -base64 48. |
EMAIL_ENCRYPTION_KEY, MFA_ENCRYPTION_KEY |
No son 32 bytes en base64 (44 caracteres terminados en =), falta alguna o son iguales entre sí. |
APP_URL, WEB_URL |
No son una URL completa (falta https://). |
SMTP_HOST, MAIL_FROM |
Están vacías. |
S3_REGION, S3_BUCKET, S3_ACCESS_KEY, S3_SECRET_KEY |
Faltan con STORAGE_DRIVER=s3. |
ANTHROPIC_API_KEY |
Falta con BIAN_ENABLED=true. |
EMAIL_ALLOW_PRIVATE_HOSTS |
Está en true: no se permite en producción. |
Si docker compose se niega a arrancar antes de crear los contenedores, con un mensaje sobre
POSTGRES_PASSWORD o DOMAIN, es que esa variable está vacía (DOMAIN solo se pide con el perfil
https).
Después de corregir .env: docker compose up -d --force-recreate app worker.
Otras causas: si el log repite «La base todavía no responde o falló la migración», mira
docker compose logs db. Si es una migración que falla, el mensaje anterior dice cuál; la base no queda
a medias.
Inicias sesión pero te vuelve a pedir la contraseña
Causa: entras por HTTP. La sesión usa una cookie segura que el navegador solo guarda por HTTPS (o en
localhost).
Solución: entra siempre por https:// con el perfil https o tu propio proxy, y deja APP_URL con
esa misma dirección exacta. Ver Proxy y HTTPS.
Caddy no consigue el certificado
- Comprueba que el dominio apunta al servidor:
dig +short tu-dominio. - Abre los puertos 80 y 443 en el firewall del servidor y en el del proveedor.
- Revisa que no haya otro servicio usando esos puertos (
sudo ss -tlnp | grep -E ':80|:443'). - Mira
docker compose logs caddy: Let’s Encrypt limita los intentos fallidos; corrige la causa antes de reintentar muchas veces.
Los emails no llegan
Los emails los envía el worker, no la API. Revisa:
docker compose logs worker: ahí aparece el error del servidor SMTP (autenticación, conexión rechazada, remitente no permitido…).- Puerto:
587usa STARTTLS y465TLS directo. Muchos proveedores de servidores bloquean el puerto 25 y algunos también el 587 o el 465 de salida. - Usuario y contraseña:
SMTP_USERySMTP_PASS, sin comillas de más. - Remitente:
MAIL_FROMtiene que ser una dirección que tu proveedor te deje usar. - Spam: si llegan a spam o no llegan a ciertos dominios, configura SPF y DKIM del dominio de
MAIL_FROMen tu proveedor.
Los envíos que fallan se reintentan solos. Si una empresa usa su propio servidor de email, sus avisos salen por él: el estado y el último error se ven en Gestión › Seguridad, pestaña Email (Email SMTP).
Error 413 o archivos grandes que no suben
Causa: el proxy limita el tamaño de las peticiones. Con el disco local, los archivos de hasta 100 MB se suben en una sola petición, que pasa por tu proxy.
- nginx: sube
client_max_body_size(por ejemplo110m) y los tiempos de espera (proxy_read_timeout,proxy_send_timeout). - Un CDN delante (Cloudflare u otro): revisa su límite de subida por petición, que puede quedar justo por debajo de 100 MB.
- El perfil
httpscon Caddy no tiene límite.
Si el mensaje dice que el archivo supera el tamaño máximo, no es el proxy: es un límite de la empresa, que se cambia en Gestión › Límites y uso (Límites).
Las subidas fallan con S3
- CORS: en la consola del navegador aparece un error de CORS. Configura la regla del bucket con tu
APP_URLexacto yETagexpuesto (Almacenamiento). - Endpoint interno:
S3_ENDPOINTtiene que ser accesible desde los equipos de tu equipo, no solo desde el servidor. - Credenciales: comprueba que pueden leer, escribir y borrar en los dos buckets.
«Este servidor no genera el PDF de las páginas controladas»
Falta Gotenberg. Pon GOTENBERG_URL=http://gotenberg:3000 en .env y arranca con el perfil pdf:
docker compose --profile https --profile pdf up -d --force-recreate
Si sigue sin generarse, mira docker compose logs worker gotenberg. Ver
Gotenberg.
Errores de permisos en los archivos
Síntoma: el log muestra EACCES o permission denied en /data/files.
Causa: la app corre con el usuario node (UID 1000) y no puede escribir en la carpeta. Pasa cuando
cambias el volumen files por una carpeta del servidor o restauras archivos con otro usuario.
sudo chown -R 1000:1000 /ruta/de/la/carpeta
Con el volumen de Docker por defecto no hace falta nada.
Todos quedan bloqueados por «demasiados intentos»
Causa: TRUST_PROXY_HOPS no coincide con tu red. Si es menor que el número real de proxies, todo el
mundo parece venir de la misma IP y comparte el límite.
Solución: 1 detrás de Caddy o de tu proxy, 2 si además hay un CDN. Ver
Proxy y HTTPS.
Nadie puede entrar con la verificación en dos pasos
Si cambiaste o perdiste MFA_ENCRYPTION_KEY, los códigos ya no se pueden comprobar. Recupera el valor
original desde la copia del .env (Copias de seguridad). Si solo le
pasa a una persona (perdió el teléfono y los códigos de recuperación), un administrador puede reiniciar
su verificación desde Gestión › Miembros.
Si nada de esto lo resuelve
- Busca o abre un issue en GitHub con la versión, los pasos y las líneas del
log. Nunca pegues tu
.envni secretos. - Si crees que encontraste una vulnerabilidad, no abras un issue público: escribe a security@spiderjad.com.