# --- 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. Los fragmentos de muestra viven # aparte, en static/muestras/, y esos sí son públicos. MEDIA_DIR=./media/audio # --- 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 " # --- 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=