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:
+19
-33
@@ -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"
|
||||
|
||||
@@ -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.' },
|
||||
|
||||
@@ -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);">
|
||||
|
||||
@@ -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>
|
||||
@@ -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) {
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
@@ -42,8 +42,6 @@ const description = lang === 'en'
|
||||
|
||||
<GalleryMosaic lang={lang} />
|
||||
|
||||
<Testimonials lang={lang} />
|
||||
|
||||
<FAQAccordion lang={lang} />
|
||||
|
||||
<CtaFinal t={t} whatsappUrl={whatsappUrl} />
|
||||
|
||||
@@ -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.' },
|
||||
|
||||
Reference in New Issue
Block a user