fix: ocultar testimonios, horario 10-18, quitar precio técnico, fix toggle inglés

- Ocultar sección de testimonios en la home (Working on it hasta tener contenido real)
- Cambiar horario comercial de 9-18 a 10-18 hs UYT
- Quitar 'Técnico: USD X' y 'X USD/MB' de la web (Mauri pidió sacarlo)
- Crear /en/index.astro que faltaba — el toggle inglés daba 403 porque no había index.html en /en/
This commit is contained in:
Mauri
2026-06-09 06:50:59 -03:00
parent 5d81400d40
commit a6ca849630
12 changed files with 87 additions and 67 deletions
+19 -33
View File
@@ -6,43 +6,29 @@ REMOTE="server1"
REMOTE_PATH="/home/hostingd/public_html"
LOCAL_USER="root"
echo "=== Deploy hostingdelsur.net ==="
echo "Local dist: $DIST"
echo "=== Deploy hostingdelsur.net (rsync) ==="
echo "Local: $DIST"
echo "Remote: $REMOTE:$REMOTE_PATH"
echo "Preserving: mwp/, .well-known/, .smtp-credentials.json (initially)"
echo ""
# lftp sync: borra archivos del remote que no estén en local,
# sube los nuevos, NO toca mwp/ ni .well-known/
lftp -c "
set sftp:auto-confirm yes
set ssl:verify-certificate no
open -u $LOCAL_USER sftp://$REMOTE
cd $REMOTE_PATH
# Copy PHP endpoints into dist (they don't go through Astro)
mkdir -p "$DIST/api"
cp /root/opencode/development/hostingdelsur.net/src/forms/contact.php "$DIST/api/contact.php"
cp /root/opencode/development/hostingdelsur.net/src/forms/deploy-webhook.php "$DIST/api/deploy-webhook.php"
cp /root/opencode/development/hostingdelsur.net/src/forms/api-htaccess "$DIST/api/.htaccess"
# 1. Backup de archivos críticos a tmp antes de limpiar
mkdir -p /tmp/hds-deploy-backup
mv .smtp-credentials.json /tmp/hds-deploy-backup/ 2>/dev/null || true
# Copy root .htaccess (HTTPS forzado, security headers)
cp /root/opencode/development/hostingdelsur.net/scripts/htaccess.conf "$DIST/.htaccess"
# 2. Limpiar lo que va a ser reemplazado
# (NO borra mwp/ ni .well-known/)
glob rm -rf '!(mwp|.well-known)'
echo '=== Archivos restantes tras limpieza ==='
ls -la
# rsync with --delete to mirror
rsync -avz --delete \
--exclude='mwp' \
--exclude='.well-known' \
--exclude='.smtp-credentials.json' \
-e ssh \
"$DIST/" \
"$REMOTE:$REMOTE_PATH/"
# 3. Subir dist
mirror --reverse --delete --verbose=1 $DIST/ ./
# 4. Restaurar credenciales (se moverán después a /home/hostingd/)
mv /tmp/hds-deploy-backup/.smtp-credentials.json ./ 2>/dev/null || true
echo ''
echo '=== Resultado ==='
ls -la
"
echo ""
echo "=== Verificación mwp intacto ==="
ssh $REMOTE "ls /home/hostingd/public_html/mwp/ | head -5" 2>&1
echo ""
echo "=== Files deployed ==="
ssh $REMOTE "find /home/hostingd/public_html -maxdepth 1 -type d" 2>&1
echo "=== Verificación ==="
ssh $REMOTE "ls -la /home/hostingd/public_html/api/ && echo '---' && ls /home/hostingd/public_html/mwp/ | head -3"
+2 -2
View File
@@ -10,7 +10,7 @@ const { lang } = Astro.props;
const faqs = lang === 'en' ? [
{ q: 'What makes you different from a regular hosting provider?', a: 'A real person answers your call. We are a small team of senior SysAdmins/SREs based in Maldonado, Uruguay. No tickets, no chatbots, no offshore call centers.' },
{ q: 'Where is my data physically located?', a: 'We operate infrastructure across four countries: Canada, the United States, Germany and Uruguay. We can work with you to choose the region that best fits your compliance and latency needs.' },
{ q: 'Do you offer 24/7 support?', a: 'No. We are available during business hours (Monday to Friday, 9 to 18 UYT). Outside those hours we monitor critical alerts, but human support is provided during business hours.' },
{ q: 'Do you offer 24/7 support?', a: 'No. We are available during business hours (Monday to Friday, 10 to 18 UYT). Outside those hours we monitor critical alerts, but human support is provided during business hours.' },
{ q: 'Do you manage WordPress sites?', a: 'Yes. We are part of the official WordPress ecosystem. We offer hosting, maintenance, security patches, performance tuning and full development.' },
{ q: 'Can you build my company website from scratch?', a: 'Yes. We design and develop institutional sites and e-commerce stores (WooCommerce) with focus on performance, accessibility (WCAG AA) and SEO.' },
{ q: 'What if I need a plan that is not listed?', a: 'We have 9 plans total (Básico, WordPress, Institucional, Empresarial, E-commerce, Avanzado, Avanzado HD, Corporativo, Corporativo HD). Chat with us on WhatsApp and we will tailor a plan for you.' },
@@ -18,7 +18,7 @@ const faqs = lang === 'en' ? [
] : [
{ q: '¿Qué los diferencia de un proveedor de hosting tradicional?', a: 'Una persona real te atiende. Somos un equipo chico de SysAdmins/SREs senior radicados en Maldonado, Uruguay. Sin tickets, sin chatbots, sin call centers offshore.' },
{ q: '¿Dónde están físicamente mis datos?', a: 'Operamos infraestructura en cuatro países: Canadá, Estados Unidos, Alemania y Uruguay. Podemos trabajar con vos para elegir la región que mejor se ajuste a tus necesidades de compliance y latencia.' },
{ q: '¿Tienen soporte 24/7?', a: 'No. Estamos disponibles en horario comercial (lunes a viernes, 9 a 18 hs UYT). Fuera de ese horario monitoreamos alertas críticas, pero el soporte humano se brinda en horario comercial.' },
{ q: '¿Tienen soporte 24/7?', a: 'No. Estamos disponibles en horario comercial (lunes a viernes, 10 a 18 hs UYT). Fuera de ese horario monitoreamos alertas críticas, pero el soporte humano se brinda en horario comercial.' },
{ q: '¿Manejan sitios WordPress?', a: 'Sí. Somos parte del ecosistema oficial de WordPress. Ofrecemos hosting, mantenimiento, parches de seguridad, optimización de performance y desarrollo completo.' },
{ q: '¿Pueden armar el sitio web de mi empresa desde cero?', a: 'Sí. Diseñamos y desarrollamos sitios institucionales y e-commerce (WooCommerce) con foco en performance, accesibilidad (WCAG AA) y SEO.' },
{ q: '¿Qué pasa si necesito un plan que no está en la lista?', a: 'Tenemos 9 planes (Básico, WordPress, Institucional, Empresarial, E-commerce, Avanzado, Avanzado HD, Corporativo, Corporativo HD). Charlá con nosotros por WhatsApp y te armamos un plan a medida.' },
+1 -1
View File
@@ -41,7 +41,7 @@ const categoryColor: Record<Plan['category'], string> = {
</div>
<div class="text-xs mb-4" style="color: var(--hds-fg-muted);">
~USD {monthlyEquivalent(plan.priceUsdYear)}/mes · {plan.technical} USD técnico · {plan.pricePerMb} USD/MB
~USD {monthlyEquivalent(plan.priceUsdYear)}/mes facturado anualmente
</div>
<div class="grid grid-cols-2 gap-2 text-xs mb-4 pb-4 border-b" style="border-color: var(--hds-line);">
@@ -33,9 +33,6 @@ const { plans, whatsappUrl } = Astro.props;
<div class="text-sm mt-2" style="color: var(--hds-fg-muted);">
por año · ~USD {monthlyEquivalent(plan.priceUsdYear)}/mes
</div>
<div class="text-xs mt-1.5 inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full" style="background: var(--hds-bg-soft); color: var(--hds-fg-muted);">
<span>Técnico: USD {plan.technical}</span>
</div>
</div>
<div class="border-t pt-6 mb-6 flex-grow" style="border-color: var(--hds-line);">
+6
View File
@@ -0,0 +1,6 @@
# API endpoints — deny GET, allow POST
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} !POST [NC]
RewriteRule .* - [F,L]
</IfModule>
+10 -2
View File
@@ -3,7 +3,7 @@
* Gitea webhook → rebuild + redeploy
*
* Triggereado por push a branch main en mauri/hostingdelsur.net
* Ejecuta: git pull, npm install, npm run build, rsync dist a public_html
* Ejecuta: git pull, npm install, npm run build, mirror dist public_html
*
* Logs: /home/hostingd/deploy.log
*/
@@ -38,12 +38,20 @@ $logLine = "[{$timestamp}] Deploy started for {$repoName} @ {$ref}\n";
$projectDir = '/home/hostingd/hostingdelsur.net';
$distDir = $projectDir . '/dist';
$publicHtml = '/home/hostingd/public_html';
$projectSrc = '/root/opencode/development/hostingdelsur.net';
$srcForms = $projectSrc . '/src/forms';
$commands = [
"cd {$projectDir} && git pull origin main 2>&1",
"cd {$projectDir} && npm install --production=false 2>&1",
"cd {$projectDir} && npm run build 2>&1",
"rsync -a --delete --exclude='mwp' --exclude='.well-known' --exclude='.smtp-credentials.json' --exclude='api' --exclude='.htaccess' {$distDir}/ {$publicHtml}/ 2>&1",
"cp {$srcForms}/contact.php {$distDir}/api/contact.php 2>&1",
"cp {$srcForms}/deploy-webhook.php {$distDir}/api/deploy-webhook.php 2>&1",
"cp {$srcForms}/api-htaccess {$distDir}/api/.htaccess 2>&1",
"rm -rf {$publicHtml}/* {$publicHtml}/.[!.]* 2>&1; mkdir -p {$publicHtml}",
"cp -r {$distDir}/* {$distDir}/.[!.]* {$publicHtml}/ 2>&1",
"rm -rf {$publicHtml}/mwp 2>&1 || true",
"rm -f {$publicHtml}/.smtp-credentials.json 2>&1 || true",
];
foreach ($commands as $cmd) {
-20
View File
@@ -2,8 +2,6 @@ export interface Plan {
slug: string;
name: string;
priceUsdYear: number;
technical: number;
pricePerMb: number;
category: 'entry' | 'mid' | 'business' | 'premium';
recommended?: boolean;
features: string[];
@@ -14,8 +12,6 @@ export const PLANS: Plan[] = [
slug: 'basico',
name: 'Básico',
priceUsdYear: 59,
technical: 53,
pricePerMb: 11.80,
category: 'entry',
features: [
'5 GB espacio en disco',
@@ -34,8 +30,6 @@ export const PLANS: Plan[] = [
slug: 'wordpress',
name: 'WordPress',
priceUsdYear: 99,
technical: 89,
pricePerMb: 19.80,
category: 'entry',
features: [
'5 GB espacio en disco',
@@ -54,8 +48,6 @@ export const PLANS: Plan[] = [
slug: 'institucional',
name: 'Institucional',
priceUsdYear: 129,
technical: 116,
pricePerMb: 8.60,
category: 'mid',
recommended: true,
features: [
@@ -75,8 +67,6 @@ export const PLANS: Plan[] = [
slug: 'empresarial',
name: 'Empresarial',
priceUsdYear: 169,
technical: 152,
pricePerMb: 8.45,
category: 'mid',
features: [
'20 GB espacio en disco',
@@ -95,8 +85,6 @@ export const PLANS: Plan[] = [
slug: 'e-commerce',
name: 'E-commerce',
priceUsdYear: 219,
technical: 197,
pricePerMb: 7.30,
category: 'business',
features: [
'30 GB espacio en disco',
@@ -115,8 +103,6 @@ export const PLANS: Plan[] = [
slug: 'avanzado',
name: 'Avanzado',
priceUsdYear: 289,
technical: 260,
pricePerMb: 5.78,
category: 'business',
features: [
'50 GB espacio en disco',
@@ -135,8 +121,6 @@ export const PLANS: Plan[] = [
slug: 'avanzado-hd',
name: 'Avanzado HD',
priceUsdYear: 349,
technical: 314,
pricePerMb: 5.37,
category: 'premium',
features: [
'65 GB espacio en disco',
@@ -155,8 +139,6 @@ export const PLANS: Plan[] = [
slug: 'corporativo',
name: 'Corporativo',
priceUsdYear: 399,
technical: 359,
pricePerMb: 4.99,
category: 'premium',
features: [
'80 GB espacio en disco',
@@ -175,8 +157,6 @@ export const PLANS: Plan[] = [
slug: 'corporativo-hd',
name: 'Corporativo HD',
priceUsdYear: 549,
technical: 494,
pricePerMb: 4.58,
category: 'premium',
features: [
'120 GB espacio en disco',
+1 -1
View File
@@ -39,7 +39,7 @@ const reCAPTCHA_site_key = '6LeOxaEaAAAAAPD8rQQLqw4woxn1dMjvF_Ooy0BG';
<h2 class="text-xs font-semibold tracking-[0.25em] uppercase mb-3" style="color: var(--color-hds-naranja);">WhatsApp</h2>
<a href={whatsappUrl} target="_blank" rel="noopener noreferrer" class="text-lg font-semibold hover:underline break-all" style="color: var(--color-hds-naranja);">+598 99 812 487</a>
<p class="text-sm mt-2" style="color: var(--hds-fg-soft);">
{lang === 'en' ? 'Monday to Friday, 9 to 18 hs UYT' : 'Lunes a viernes, 9 a 18 hs UYT'}
{lang === 'en' ? 'Monday to Friday, 10 to 18 hs UYT' : 'Lunes a viernes, 10 a 18 hs UYT'}
</p>
</div>
+1 -1
View File
@@ -39,7 +39,7 @@ const reCAPTCHA_site_key = '6LeOxaEaAAAAAPD8rQQLqw4woxn1dMjvF_Ooy0BG';
<h2 class="text-xs font-semibold tracking-[0.25em] uppercase mb-3" style="color: var(--color-hds-naranja);">WhatsApp</h2>
<a href={whatsappUrl} target="_blank" rel="noopener noreferrer" class="text-lg font-semibold hover:underline break-all" style="color: var(--color-hds-naranja);">+598 99 812 487</a>
<p class="text-sm mt-2" style="color: var(--hds-fg-soft);">
{lang === 'en' ? 'Monday to Friday, 9 to 18 hs UYT' : 'Lunes a viernes, 9 a 18 hs UYT'}
{lang === 'en' ? 'Monday to Friday, 10 to 18 hs UYT' : 'Lunes a viernes, 10 a 18 hs UYT'}
</p>
</div>
+45
View File
@@ -0,0 +1,45 @@
---
import BaseLayout from '@/layouts/BaseLayout.astro';
import Hero from '@/components/Hero.astro';
import StatsSection from '@/components/StatsSection.astro';
import DifferenceCards from '@/components/DifferenceCards.astro';
import CloudDivider from '@/components/CloudDivider.astro';
import ServicesSection from '@/components/ServicesSection.astro';
import ProcessSteps from '@/components/ProcessSteps.astro';
import GalleryMosaic from '@/components/GalleryMosaic.astro';
import FAQAccordion from '@/components/FaqSection.astro';
import CtaFinal from '@/components/CtaFinal.astro';
import { getLangFromUrl, useTranslations } from '@/i18n/utils';
const lang = getLangFromUrl(Astro.url);
const t = useTranslations(lang);
const whatsappUrl = 'https://wa.me/59899812487';
const description = 'Cloud hosting, websites, e-commerce and infrastructure with real human support from Maldonado, Uruguay. Hosting del Sur — technology with a human face.';
---
<BaseLayout
title="Cloud hosting with real human support"
description={description}
lang={lang}
>
<Hero t={t} whatsappUrl={whatsappUrl} />
<CloudDivider fillClass="fill-hds-bg-soft" />
<StatsSection t={t} />
<DifferenceCards t={t} />
<CloudDivider fillClass="fill-hds-bg" flip={true} />
<ServicesSection t={t} lang={lang} />
<CloudDivider fillClass="fill-hds-bg-soft" />
<ProcessSteps t={t} />
<GalleryMosaic lang={lang} />
<FAQAccordion lang={lang} />
<CtaFinal t={t} whatsappUrl={whatsappUrl} />
</BaseLayout>
-2
View File
@@ -42,8 +42,6 @@ const description = lang === 'en'
<GalleryMosaic lang={lang} />
<Testimonials lang={lang} />
<FAQAccordion lang={lang} />
<CtaFinal t={t} whatsappUrl={whatsappUrl} />
+2 -2
View File
@@ -12,7 +12,7 @@ const whatsappUrl = 'https://wa.me/59899812487';
const faqs = lang === 'en' ? [
{ q: 'What makes you different from a regular hosting provider?', a: 'A real person answers your call. We are a small team of senior SysAdmins/SREs based in Maldonado, Uruguay. No tickets, no chatbots, no offshore call centers.' },
{ q: 'Where is my data physically located?', a: 'We operate infrastructure across four countries: Canada, the United States, Germany and Uruguay. We can work with you to choose the region that best fits your compliance and latency needs.' },
{ q: 'Do you offer 24/7 support?', a: 'No. We are available during business hours (Monday to Friday, 9 to 18 UYT). Outside those hours we monitor critical alerts, but human support is provided during business hours.' },
{ q: 'Do you offer 24/7 support?', a: 'No. We are available during business hours (Monday to Friday, 10 to 18 UYT). Outside those hours we monitor critical alerts, but human support is provided during business hours.' },
{ q: 'Do you manage WordPress sites?', a: 'Yes. We are part of the official WordPress ecosystem. We offer hosting, maintenance, security patches, performance tuning and full development.' },
{ q: 'Can you build my company website from scratch?', a: 'Yes. We design and develop institutional sites and e-commerce stores (WooCommerce) with focus on performance, accessibility (WCAG AA) and SEO.' },
{ q: 'What if I need a plan that is not listed?', a: 'We have additional tiers (WordPress, Empresarial, Avanzado, Avanzado HD, Corporativo, Corporativo HD). Chat with us on WhatsApp and we will tailor a plan for you.' },
@@ -20,7 +20,7 @@ const faqs = lang === 'en' ? [
] : [
{ q: '¿Qué los diferencia de un proveedor de hosting tradicional?', a: 'Una persona real te atiende. Somos un equipo chico de SysAdmins/SREs senior radicados en Maldonado, Uruguay. Sin tickets, sin chatbots, sin call centers offshore.' },
{ q: '¿Dónde están físicamente mis datos?', a: 'Operamos infraestructura en cuatro países: Canadá, Estados Unidos, Alemania y Uruguay. Podemos trabajar con vos para elegir la región que mejor se ajuste a tus necesidades de compliance y latencia.' },
{ q: '¿Tienen soporte 24/7?', a: 'No. Estamos disponibles en horario comercial (lunes a viernes, 9 a 18 hs UYT). Fuera de ese horario monitoreamos alertas críticas, pero el soporte humano se brinda en horario comercial.' },
{ q: '¿Tienen soporte 24/7?', a: 'No. Estamos disponibles en horario comercial (lunes a viernes, 10 a 18 hs UYT). Fuera de ese horario monitoreamos alertas críticas, pero el soporte humano se brinda en horario comercial.' },
{ q: '¿Manejan sitios WordPress?', a: 'Sí. Somos parte del ecosistema oficial de WordPress. Ofrecemos hosting, mantenimiento, parches de seguridad, optimización de performance y desarrollo completo.' },
{ q: '¿Pueden armar el sitio web de mi empresa desde cero?', a: 'Sí. Diseñamos y desarrollamos sitios institucionales y e-commerce (WooCommerce) con foco en performance, accesibilidad (WCAG AA) y SEO.' },
{ q: '¿Qué pasa si necesito un plan que no está en la lista?', a: 'Tenemos tiers adicionales (WordPress, Empresarial, Avanzado, Avanzado HD, Corporativo, Corporativo HD). Charlá con nosotros por WhatsApp y te armamos un plan a medida.' },