feat: sitio hostingdelsur.net v2 con Astro 5, Tailwind v4, soporte light/dark, i18n es/en, Keystatic CMS, reCAPTCHA v3
- Arista Pro Alternate Regular self-hosted (font corporativa) - Toggle theme con CSS variables y @custom-variant dark - 6 servicios en 3 categorías (Hosting & Correo / Diseño & Contenido / Infraestructura) - 3 planes destacados (Básico USD 59, Institucional USD 129, E-commerce USD 219) - Datacenters en 4 países (Canadá, USA, Alemania, Uruguay) sin ciudades en el sitio - Sede operativa en Maldonado, Uruguay - i18n es/en con contenido duplicado en Keystatic - Endpoint PHP para form de contacto con PHPMailer + reCAPTCHA v3 + honeypot + rate limit - WorldMap con animación SVG de los 4 países - 29 páginas generadas, 0 JS por default - Sitemap auto + robots.txt - JSON-LD Organization + ProfessionalService con areaServed
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
# Contact Form — PHP endpoint
|
||||
|
||||
Este endpoint vive en `server1` y procesa los envíos del formulario de `/contacto`.
|
||||
|
||||
## ⚠️ NO se deploya con Astro. Es solo template.
|
||||
|
||||
## Setup en server1 (Netcup, cPanel)
|
||||
|
||||
### 1. Crear cuenta de correo dedicada
|
||||
|
||||
En cPanel → Email Accounts, crear:
|
||||
|
||||
- **Email**: `no-reply@hostingdelsur.net` (Mauri confirma que ya existe)
|
||||
- **Password**: contraseña fuerte (mínimo 16 caracteres, símbolos, números)
|
||||
- **Quota**: 1 GB (solo se usa para SMTP, no recibe correo)
|
||||
|
||||
### 2. Crear archivo de credenciales
|
||||
|
||||
El archivo se crea en `/home/hostingdelsur/.smtp-credentials.json` (NO en `public_html/`, por seguridad).
|
||||
|
||||
Contenido (reemplazar PEGAR_AQUI con la password real):
|
||||
|
||||
```json
|
||||
{
|
||||
"host": "localhost",
|
||||
"port": 465,
|
||||
"username": "no-reply@hostingdelsur.net",
|
||||
"password": "PEGAR_AQUI",
|
||||
"encryption": "ssl",
|
||||
"from": "no-reply@hostingdelsur.net",
|
||||
"fromName": "Hosting del Sur - Web",
|
||||
"to": "contacto@hostingdelsur.net"
|
||||
}
|
||||
```
|
||||
|
||||
Por SSH:
|
||||
|
||||
```bash
|
||||
chmod 600 /home/hostingdelsur/.smtp-credentials.json
|
||||
chown hostingdelsur:hostingdelsur /home/hostingdelsur/.smtp-credentials.json
|
||||
```
|
||||
|
||||
### 3. Subir PHPMailer (ya subido en este deploy)
|
||||
|
||||
```bash
|
||||
# Ya ejecutado durante el deploy:
|
||||
mkdir -p /home/hostingd/private/PHPMailer
|
||||
# 3 archivos copiados: Exception.php, PHPMailer.php, SMTP.php
|
||||
chmod 640 /home/hostingd/private/PHPMailer/*.php
|
||||
chown -R hostingdelsur:hostingdelsur /home/hostingd/private
|
||||
```
|
||||
|
||||
### 4. Subir el endpoint (ya subido)
|
||||
|
||||
```
|
||||
/home/hostingd/public_html/api/contact.php
|
||||
/home/hostingd/public_html/api/.htaccess
|
||||
```
|
||||
|
||||
El `.htaccess` deniega todo excepto POST al endpoint. Ya configurado.
|
||||
|
||||
### 5. Variables de entorno opcionales (reCAPTCHA secret)
|
||||
|
||||
Para activar validación reCAPTCHA v3 server-side, agregar en el `.htaccess` o php.ini del server:
|
||||
|
||||
```bash
|
||||
# SetEnv RECAPTCHA_SECRET "6LeOxaEaAAAAAM5OODBE2p9bknosuxpW7Gg17fKG"
|
||||
```
|
||||
|
||||
O en cPanel → MultiPHP INI Editor:
|
||||
|
||||
```ini
|
||||
env[RECAPTCHA_SECRET] = "6LeOxaEaAAAAAM5OODBE2p9bknosuxpW7Gg17fKG"
|
||||
```
|
||||
|
||||
### 6. Test
|
||||
|
||||
```bash
|
||||
curl -X POST https://hostingdelsur.net/api/contact.php \
|
||||
-d "name=Test&[email protected]&message=Hola&lang=es"
|
||||
```
|
||||
|
||||
Debe devolver `{"ok":true}`. Sin reCAPTCHA token primero, con token después.
|
||||
|
||||
## Seguridad implementada
|
||||
|
||||
- ✅ Credenciales fuera de `public_html/` (en `~/`)
|
||||
- ✅ Permisos `chmod 600` (solo el usuario puede leer)
|
||||
- ✅ Honeypot (`website` field) anti-bot
|
||||
- ✅ Validación y sanitización de inputs
|
||||
- ✅ `Reply-To` con email del visitante para responder
|
||||
- ✅ `From` con la cuenta dedicada (no spoofing)
|
||||
- ✅ TLS obligatorio (puerto 465 + `ssl`)
|
||||
- ✅ Rate limit básico por IP (3 envíos/hora) vía `apcu_fetch/store`
|
||||
- ✅ Headers anti-cache y anti-sniff
|
||||
- ✅ Mensaje de error genérico (no expone detalles internos)
|
||||
- ✅ reCAPTCHA v3 invisible (con score ≥ 0.3) si se configura `RECAPTCHA_SECRET`
|
||||
|
||||
## Pendiente
|
||||
|
||||
- [ ] Mauri debe re-enviar la password de `no-reply@` (Mauri la puso en chat originalmente; el deploy la borró del servidor)
|
||||
- [ ] Mauri debe crear el archivo `~/.smtp-credentials.json` con la password real
|
||||
- [ ] (Opcional) Configurar `RECAPTCHA_SECRET` en el environment del server
|
||||
Reference in New Issue
Block a user