El dominio es senzapaura.es

Cambia las referencias al dominio de trabajo: la URL canónica, los correos
de los textos legales, las direcciones de retorno de Google y Facebook, y
lo que espera la suite.

El `robots.txt` pasa de archivo estático a ruta generada. Llevaba el
dominio escrito a mano y se quedó anunciando el anterior: un mapa del
sitio mal anunciado no da ningún error, simplemente no lo encuentra
nadie. Ahora sale de `site.url`, igual que el mapa y las etiquetas de
cada página. De paso deja fuera del rastreo lo que depende de quién mira
—cuenta, carrito, favoritos, entrar, descargas—, que no es contenido.

Y el Nginx queda listo para el dominio, con los tres pasos que hay que
dar fuera del servidor: los registros A a 89.46.247.16, la redirección de
los puertos 80 y 443 a 192.168.18.171, y Certbot.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
master
dev 4 weeks ago
parent d3cc4e3488
commit da47ba08e2

@ -22,17 +22,18 @@ STRIPE_WEBHOOK_SECRET=
# 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://TU-DOMINIO/acceso/google/retorno
# https://TU-DOMINIO/acceso/facebook/retorno
# https://senzapaura.es/acceso/google/retorno
# https://senzapaura.es/acceso/facebook/retorno
#
# Dos avisos que cuestan una tarde si se descubren tarde:
# En desarrollo, además, esta otra (Google la admite; Facebook no):
#
# - Google NO admite direcciones IP como retorno, solo nombres de dominio (y
# http://localhost para desarrollo). Con la web en 192.168.18.171 a secas,
# esto no se puede probar: hace falta el dominio.
# - 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`. Eso son días de trámite, no minutos.
# 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».
@ -46,9 +47,12 @@ FACEBOOK_CLIENT_SECRET=
# 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.com
CONTACTO_REMITENTE="Web Senza Paura <web@senzapaura.com>"
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

@ -9,20 +9,49 @@
# quien entra por IP, y se ve la página de bienvenida de Nginx en lugar de la
# web.
#
# Tal como está, sirve por IP y sin cifrar, que es lo que se puede hacer en una
# red local sin dominio. Al final del archivo está lo que hay que cambiar
# cuando lo haya.
# ---------------------------------------------------------------------------
# Para que esto conteste desde internet hacen falta tres cosas fuera del
# servidor, y en este orden:
#
# 1. DNS. En el panel del dominio, dos registros A apuntando a la IP pública:
#
# senzapaura.es. A 89.46.247.16
# www.senzapaura.es. A 89.46.247.16
#
# Comprobar antes de seguir, desde cualquier sitio: dig +short senzapaura.es
#
# 2. Router. Redirigir los puertos 80 y 443 a la máquina interna:
#
# 80 TCP -> 192.168.18.171:80
# 443 TCP -> 192.168.18.171:443
#
# Sin el 80 abierto, Certbot no puede emitir el certificado: su
# comprobación entra por ahí.
#
# 3. Certificado. Ya con lo anterior funcionando:
#
# sudo apt install -y certbot python3-certbot-nginx
# sudo certbot --nginx -d senzapaura.es -d www.senzapaura.es
#
# Certbot añade solo el bloque de 443 y la redirección desde el 80, y deja
# puesta la renovación automática. Después:
#
# ORIGIN=https://senzapaura.es en /var/www/senzapaura/.env
# sudo systemctl restart senzapaura
#
# Sin ese ORIGIN, SvelteKit rechaza todos los formularios con un 403 por
# comprobación de origen y parece que la web está rota, aunque se vea.
#
# Y sin HTTPS no se puede abrir al público: aquí se escriben correos y se paga.
# ---------------------------------------------------------------------------
server {
# `default_server` es lo que hace que este sitio conteste a quien entra por
# la IP o por un nombre que no coincida con ninguno. Sin esto, Nginx elige
# el sitio `default` y enseña su bienvenida.
listen 80 default_server;
listen [::]:80 default_server;
# `_` no casa con ningún nombre real: es la forma de decir «cualquiera».
# Cuando haya dominio, aquí va el dominio.
server_name _;
# El dominio, y `_` para que siga contestando a quien entre por la IP
# mientras el DNS no haya propagado del todo.
server_name senzapaura.es www.senzapaura.es _;
# Los mp3 completos pesan varios megas; los fragmentos, cientos de kilos.
client_max_body_size 20m;
@ -53,7 +82,7 @@ server {
# Imágenes, fuentes, vídeo, los fragmentos de muestra y el panel. No llevan
# huella, así que se cachean un día: lo justo para no pedirlos en cada
# visita sin que un cambio tarde una semana en verse.
location ~* ^/(images|background|video|muestras|admin)/ {
location ~* ^/(images|background|video|muestras|fuentes|admin)/ {
root /var/www/senzapaura/build/client;
access_log off;
expires 1d;
@ -65,9 +94,10 @@ server {
# Todo lo demás, a Node
#
# Incluidas /descargas/… —que comprueban la compra antes de entregar el
# archivo— y el webhook de Stripe. Ojo: las descargas NO se pueden servir
# desde Nginx; el audio completo vive fuera de `build/` justamente para que
# no haya forma de pedirlo por URL sin haberlo comprado.
# archivo—, la vuelta de Google y Facebook, y el webhook de Stripe. Ojo:
# las descargas NO se pueden servir desde Nginx; el audio completo vive
# fuera de `build/` justamente para que no haya forma de pedirlo por URL
# sin haberlo comprado.
# -----------------------------------------------------------------------
location / {
proxy_pass http://127.0.0.1:3000;
@ -90,22 +120,3 @@ server {
proxy_buffering off;
}
}
# ---------------------------------------------------------------------------
# Cuando haya dominio
#
# 1. Cambiar `server_name _;` por `server_name DOMINIO www.DOMINIO;` y quitar
# `default_server` de las dos líneas `listen` de arriba.
# 2. Poner el certificado:
#
# sudo apt install -y certbot python3-certbot-nginx
# sudo certbot --nginx -d DOMINIO -d www.DOMINIO
#
# Certbot añade solo el bloque de 443 y la redirección desde el 80.
# 3. Cambiar `ORIGIN` en /var/www/senzapaura/.env a `https://DOMINIO` y
# reiniciar el servicio. Sin eso, SvelteKit rechaza todos los formularios
# con un 403 por comprobación de origen, y parece que la web está rota.
#
# Sin HTTPS no se puede publicar de cara al exterior: aquí se escriben correos
# y se paga.
# ---------------------------------------------------------------------------

@ -42,7 +42,11 @@ test.describe('Mapa del sitio', () => {
expect(respuesta.headers()['content-type']).toContain('xml');
const robots = await (await request.get('/robots.txt')).text();
expect(robots).toContain('Sitemap: https://senzapaura.com/sitemap.xml');
expect(robots).toContain('Sitemap: https://senzapaura.es/sitemap.xml');
// Y lo que no es contenido, fuera del rastreo.
for (const privada of ['/cuenta', '/carrito', '/descargas', '/acceso']) {
expect(robots).toContain(`Disallow: ${privada}`);
}
});
test('incluye el catálogo entero', async ({ request }) => {
@ -68,7 +72,7 @@ test.describe('Mapa del sitio', () => {
'/descargas',
'/admin'
]) {
expect(xml).not.toContain(`<loc>https://senzapaura.com${privada}`);
expect(xml).not.toContain(`<loc>https://senzapaura.es${privada}`);
}
});
});
@ -79,7 +83,7 @@ test.describe('Imagen al compartir', () => {
await expect(page.locator('meta[property="og:image"]')).toHaveAttribute(
'content',
'https://senzapaura.com/og.jpg'
'https://senzapaura.es/og.jpg'
);
});

@ -18,7 +18,7 @@ de la información y de comercio electrónico:
- **Titular:** [nombre y apellidos o razón social]
- **NIF / CIF:** [documento]
- **Domicilio:** [dirección completa]
- **Correo electrónico:** hola@senzapaura.com
- **Correo electrónico:** hola@senzapaura.es
- **Actividad:** creación musical y venta de fonogramas en formato digital
- **Registro mercantil:** [si es sociedad: registro, tomo, folio, hoja]

@ -23,7 +23,7 @@ otra persona para que le lleguen los códigos es un uso indebido, y el sistema
lo limita activamente.
Puedes pedir que se cierre tu cuenta cuando quieras escribiendo a
hola@senzapaura.com. Las compras y los datos de facturación se conservan el
hola@senzapaura.es. Las compras y los datos de facturación se conservan el
tiempo que obliga la ley, según se explica en la
[política de privacidad](/legal/privacidad).

@ -59,13 +59,13 @@ días.
[**Pendiente:** el proceso de compra debe recoger ese consentimiento de forma
explícita antes de la primera descarga. Está sin implementar.]
Para desistir dentro de plazo, escribe a hola@senzapaura.com indicando el
Para desistir dentro de plazo, escribe a hola@senzapaura.es indicando el
pedido. La devolución se hace por el mismo medio de pago.
## Si algo va mal
Si un archivo no se descarga, está corrupto o no corresponde a lo comprado,
escribe a hola@senzapaura.com y se resuelve. Si no quedas conforme, puedes
escribe a hola@senzapaura.es y se resuelve. Si no quedas conforme, puedes
acudir a la plataforma de resolución de litigios en línea de la Comisión
Europea.

@ -15,7 +15,7 @@ orden: 3
- **Responsable:** [nombre y apellidos o razón social]
- **NIF:** [documento]
- **Domicilio:** [dirección completa]
- **Contacto:** hola@senzapaura.com
- **Contacto:** hola@senzapaura.es
## Qué se recoge y para qué
@ -92,7 +92,7 @@ cierres la cuenta, porque lo exige el Código de Comercio.
Puedes pedir acceso a tus datos, su rectificación, su supresión, la limitación
del tratamiento, la portabilidad y oponerte al tratamiento. Escribiendo a
hola@senzapaura.com desde la dirección de tu cuenta, con [plazo de respuesta].
hola@senzapaura.es desde la dirección de tu cuenta, con [plazo de respuesta].
Si crees que no se han atendido bien, puedes reclamar ante la **Agencia
Española de Protección de Datos** (aepd.es).

@ -13,10 +13,10 @@ export const site = {
titular: 'Letrista y compositor',
descripcion:
'Letrista y compositor. Baladas románticas, y también clásica, rock y otros estilos, agrupados por bloques.',
url: 'https://senzapaura.com',
url: 'https://senzapaura.es',
idioma: 'es',
email: 'hola@senzapaura.com',
emailBooking: 'booking@senzapaura.com',
email: 'hola@senzapaura.es',
emailBooking: 'booking@senzapaura.es',
redes: {
instagram: '',
youtube: '',

@ -0,0 +1,41 @@
import { site } from '$lib/site';
import type { RequestHandler } from './$types';
/**
* robots.txt.
*
* Es una ruta y no un archivo en `static/` por una sola razón: la línea del
* mapa del sitio lleva el dominio, y escrito a mano se queda viejo. Ya pasó
* —al cambiar a senzapaura.es siguió anunciando el dominio anterior, y eso no
* lo nota nadie hasta que un buscador no encuentra el mapa—. Aquí sale de
* `site.url`, igual que el propio mapa y que las etiquetas de las páginas.
*/
export const GET: RequestHandler = () => {
const cuerpo = [
'# Por defecto, todo el sitio se puede rastrear.',
'User-agent: *',
'Disallow:',
'',
'# El panel de contenido no es contenido del sitio.',
'Disallow: /admin',
'',
'# Ni lo que depende de quién mira: la cuenta, el carrito, las descargas.',
'Disallow: /cuenta',
'Disallow: /carrito',
'Disallow: /favoritos',
'Disallow: /entrar',
'Disallow: /acceso',
'Disallow: /descargas',
'',
'# Todo el contenido, generado del catálogo.',
`Sitemap: ${site.url}/sitemap.xml`,
''
].join('\n');
return new Response(cuerpo, {
headers: {
'content-type': 'text/plain; charset=utf-8',
'cache-control': 'public, max-age=3600'
}
});
};

@ -1,9 +0,0 @@
# allow crawling everything by default
User-agent: *
Disallow:
# El panel de contenido no es contenido del sitio.
Disallow: /admin
# Todo el contenido, generado del catálogo.
Sitemap: https://senzapaura.com/sitemap.xml
Loading…
Cancel
Save

Powered by TurnKey Linux.