You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
senzapaura_es/.env.example

99 lines
4.9 KiB

# --- 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 <web@senzapaura.es>"
# --- 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» para quien llega de fuera Con `PROXIMAMENTE=1`, quien no esté en la lista acaba en una página de espera con el mismo fondo animado que la portada. La red local entra siempre sin configurar nada: encender el portón y quedarse uno mismo fuera es la forma más rápida de no poder comprobar si funciona. Tres decisiones que salieron de probarlo: - **Redirige, no pinta la espera en la dirección pedida.** Se intentó lo segundo, que conserva la dirección en la barra, y no vale: el HTML sale compuesto para /proximamente y el navegador lo hidrata creyendo estar en otra ruta, así que al terminar de cargar volvía a pintar la cabecera y el pie que la espera no debe tener. - **503, no 200.** La web existe pero todavía no atiende. Es lo que impide que un buscador se lleve el cartel como si fuera el sitio. Y el robots.txt pasa a cerrar el paso entero mientras dure: si no, anunciaría un mapa lleno de direcciones que hoy contestan «muy pronto». - **Rutas de recursos absolutas.** Con las relativas que SvelteKit usa por defecto, la página servida en otra dirección pedía sus hojas de estilo en un sitio donde no hay ninguna. El reconocimiento de direcciones va aparte y con pruebas: una máscara mal interpretada no da ningún error, solo deja pasar a quien no debía. Ahí está el caso de `/0`, que en JavaScript se cuela porque el desplazamiento de 32 bits es un no-op. Y el portón está abierto mientras nadie diga lo contrario. Una web que se esconde sola porque falta una variable es peor fallo que una que se ve antes de tiempo: nadie mira una página que cree no publicada, así que puede pasar semanas caída sin que se note. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
4 weeks ago
# --- 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.
#
Página de «muy pronto» para quien llega de fuera Con `PROXIMAMENTE=1`, quien no esté en la lista acaba en una página de espera con el mismo fondo animado que la portada. La red local entra siempre sin configurar nada: encender el portón y quedarse uno mismo fuera es la forma más rápida de no poder comprobar si funciona. Tres decisiones que salieron de probarlo: - **Redirige, no pinta la espera en la dirección pedida.** Se intentó lo segundo, que conserva la dirección en la barra, y no vale: el HTML sale compuesto para /proximamente y el navegador lo hidrata creyendo estar en otra ruta, así que al terminar de cargar volvía a pintar la cabecera y el pie que la espera no debe tener. - **503, no 200.** La web existe pero todavía no atiende. Es lo que impide que un buscador se lleve el cartel como si fuera el sitio. Y el robots.txt pasa a cerrar el paso entero mientras dure: si no, anunciaría un mapa lleno de direcciones que hoy contestan «muy pronto». - **Rutas de recursos absolutas.** Con las relativas que SvelteKit usa por defecto, la página servida en otra dirección pedía sus hojas de estilo en un sitio donde no hay ninguna. El reconocimiento de direcciones va aparte y con pruebas: una máscara mal interpretada no da ningún error, solo deja pasar a quien no debía. Ahí está el caso de `/0`, que en JavaScript se cuela porque el desplazamiento de 32 bits es un no-op. Y el portón está abierto mientras nadie diga lo contrario. Una web que se esconde sola porque falta una variable es peor fallo que una que se ve antes de tiempo: nadie mira una página que cree no publicada, así que puede pasar semanas caída sin que se note. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
4 weeks ago
# 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=

Powered by TurnKey Linux.