# --- Base de datos ----------------------------------------------------------- # En local basta un archivo SQLite. En producción, la URL de Turso (libsql://…). DATABASE_URL=postgresql://senza_paura_web:CLAVE@192.168.18.171:5432/senzapaura # --- Audio ------------------------------------------------------------------- # Directorio privado con los archivos completos. NO debe servirse como estático: # es lo que se entrega solo a quien ha comprado. Las canciones completas de # escucha viven a menor calidad en media/escucha/ y pasan por autorización. MEDIA_DIR=./media/audio ESCUCHA_DIR=./media/escucha # El panel escribe aquí los resúmenes de amplitud. El sitio lee la misma ruta # para servir también las ondas creadas después del último build. ONDA_DIR=./static/ondas # adapter-node limita por defecto los cuerpos de las peticiones. El panel # necesita margen para un máster; el propio formulario aplica el límite real de # 256 MB. En el sitio público, el proxy puede conservar un límite mucho menor. BODY_SIZE_LIMIT=260M # --- Pagos (Stripe) ---------------------------------------------------------- # Sin estas claves la tienda funciona salvo el cobro: el botón de pagar avisa. STRIPE_SECRET_KEY= # Secreto del endpoint /api/stripe/webhook. En local sale de: # stripe listen --forward-to localhost:5173/api/stripe/webhook STRIPE_WEBHOOK_SECRET= # --- Entrar con Google / Facebook -------------------------------------------- # Sin estas claves, los botones no se pintan y solo queda el código por correo: # un botón de «Continuar con Google» sin configurar solo lleva a un error. # # La dirección de retorno tiene que estar dada de alta EXACTA en cada consola, # y ser la misma que ORIGIN de más abajo: # # https://senzapaura.es/acceso/google/retorno # https://senzapaura.es/acceso/facebook/retorno # # En desarrollo, además, esta otra (Google la admite; Facebook no): # # http://localhost:5173/acceso/google/retorno # # Un aviso que cuesta días si se descubre tarde: Facebook exige HTTPS y, para # que lo pueda usar cualquiera y no solo los administradores de la app, pasar # su verificación de empresa y la revisión del permiso `email`. Google es más # rápido, pero también pide pantalla de consentimiento y el dominio verificado # en Search Console. # # Google: https://console.cloud.google.com/apis/credentials # Tipo «ID de cliente de OAuth» → «Aplicación web». # Facebook: https://developers.facebook.com/apps → producto «Inicio de sesión». GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= FACEBOOK_CLIENT_ID= FACEBOOK_CLIENT_SECRET= # --- Correo (Resend) --------------------------------------------------------- # Manda los códigos de acceso y los mensajes del formulario de contacto. # Sin RESEND_API_KEY, en desarrollo el código se imprime por consola. RESEND_API_KEY= CONTACTO_DESTINO=hola@senzapaura.es CONTACTO_REMITENTE="Web Senza Paura " # Solo para revisar la web en loopback: no envía correo y acepta siempre 123456. # La comprobación exige además localhost/127.0.0.1, por lo que no se activa en # el dominio público aunque esta variable se copie por error. ACCESO_PRUEBAS= # --- Servidor ---------------------------------------------------------------- # adapter-node necesita conocer el origen público para validar los formularios. # En el servidor va https://senzapaura.es; en local, el puerto de desarrollo. # Si no coincide con la dirección por la que se entra de verdad, SvelteKit # rechaza todos los formularios con un 403 y parece que la web está rota. ORIGIN=http://localhost:3000 # --- Página de «muy pronto» -------------------------------------------------- # Con esto encendido, quien llegue de fuera ve la página de espera y nadie más # que la lista de abajo ve la web. Apagado salvo que se diga: una web que se # esconde sola porque falta una variable es peor fallo que una que se ve cuando # no tocaba. # # La red local (192.168.x, 10.x, 172.16-31.x) y el propio equipo entran siempre, # sin ponerlos aquí: encender el portón y quedarse fuera uno mismo es la forma # más rápida de no poder comprobar si funciona. # # Aquí van las direcciones de fuera que sí pueden mirar: la tuya cuando estés en # otro sitio, la de quien tenga que revisar. Direcciones sueltas o rangos: # PROXIMAMENTE_PERMITIDAS=89.46.247.16,85.60.0.0/16 # # En este montaje hay que poner ahí la IP pública de la propia línea —fija y # contratada como tal— aunque se mire desde casa: el router hace NAT de retorno, # así que una petición al dominio desde la red local llega al proxy con la IP # pública y no con la 192.168. Sin ella verías tu propia página de espera. # # IMPORTANTE: con un proxy delante hay que poner también ADDRESS_HEADER y # XFF_DEPTH, aquí abajo. Sin ellas todas las peticiones parecen venir del proxy # —una IP local—, así que el portón deja pasar a todo el mundo y no se nota. PROXIMAMENTE= PROXIMAMENTE_PERMITIDAS= # --- Detrás de un proxy inverso ---------------------------------------------- # Solo en el servidor, y solo si hay un proxy delante (Nginx, Nginx Proxy # Manager, Caddy…). En local se dejan vacías. # # Sin esto, `getClientAddress()` devuelve la IP del proxy en vez de la de quien # pide. Y esa función es la que usa el limitador del formulario de acceso: con # todas las peticiones pareciendo venir de la misma dirección, el límite salta # con una sola persona insistiendo y nadie más puede pedir su código. # # XFF_DEPTH es el número de proxies entre internet y Node, contando desde el # final de la cadena. Uno solo → 1. Si algún día se mete un Cloudflare delante, # pasa a 2; equivocarlo deja la IP a merced de quien mande su propia cabecera. ADDRESS_HEADER= XFF_DEPTH= # Portadas y fotografías subidas; misma ruta absoluta en sitio y panel. IMAGEN_DIR=./media/imagenes