Files
2026-08-28 10:11:11 -03:00

2129 lines
87 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<link rel="preconnect" href="https://d3js.org" crossorigin>
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="alternate icon" href="/favicon.ico">
<title>AWS Hosting Odoo 2026 | Odoo Expertos · FR</title>
<meta name="description" content="Guia definitiva pour desplegar Odoo en AWS (Amazon Web Services) en 2026. Configuracion EC2, RDS PostgreSQL, estimacion de costos, arqui - AWS Hosting Odoo 2026 | FR">
<meta name="keywords" content="aws hosting odoo, odoo en amazon cloud, ec2 odoo, rds postgresql odoo, aws odoo 2026, amazon web services odoo, desplegar odoo aws, odoo cloud aws">
<meta name="author" content="Dr. Equipo Odoo Expertos">
<meta name="robots" content="index, follow">
<meta name="language" content="fr">
<link rel="canonical" href="https://www.odoo-expertos.com/fr/odoo-hosting/aws-hosting-odoo-2026/">
<!-- Hreflang -->
<link rel="alternate" hreflang="fr" href="https://www.odoo-expertos.com/fr/odoo-hosting/aws-hosting-odoo-2026/" />
<link rel="alternate" hreflang="en" href="https://www.odoo-expertos.com/en/odoo-hosting/aws-hosting-odoo-2026/" />
<link rel="alternate" hreflang="de" href="https://www.odoo-expertos.com/de/odoo-hosting/aws-hosting-odoo-2026/" />
<link rel="alternate" hreflang="fr" href="https://www.odoo-expertos.com/fr/odoo-hosting/aws-hebergement-odoo-2026/" />
<link rel="alternate" hreflang="x-default" href="https://www.odoo-expertos.com/odoo-hosting/aws-hosting-odoo-2026/" />
<!-- Open Graph -->
<meta property="og:title" content="AWS Hébergement Odoo 2026: Guide Complet pour Desplegar en Amazon Cloud">
<meta property="og:description" content="Aprende a configurar Odoo en AWS con EC2, RDS y arquitectura escalable. Incluye estimacion de costos y mejores practicas.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.odoo-expertos.com/fr/odoo-hosting/aws-hosting-odoo-2026/">
<meta property="og:image" content="https://www.odoo-expertos.com/images/aws-hosting-odoo-2026.jpg">
<meta property="og:site_name" content="Odoo Expertos">
<meta property="og:locale" content="fr_FR">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="AWS Hébergement Odoo 2026: Guide Complet Amazon Cloud">
<meta name="twitter:description" content="Guia definitiva pour desplegar Odoo en AWS. EC2, RDS, costos y arquitectura.">
<!-- Schema.org Article -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "AWS Hébergement Odoo 2026: Guide Complet pour Desplegar en Amazon Cloud",
"description": "Guia definitiva pour desplegar Odoo en AWS (Amazon Web Services) en 2026. Configuracion EC2, RDS PostgreSQL, estimacion de costos y arquitectura escalable.",
"author": {
"@type": "Person",
"name": "Dr. Equipo Odoo Expertos",
"url": "https://www.odoo-expertos.com/autor/maria-elena-rodriguez/",
"jobTitle": "Consultante Senior en Systèmes ERP"
},
"publisher": {
"@type": "Organization",
"name": "Odoo Expertos",
"logo": {
"@type": "ImageObject",
"url": "https://www.odoo-expertos.com/logo.png"
}
},
"datePublished": "2026-01-25",
"dateModified": "2026-01-25",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://www.odoo-expertos.com/fr/odoo-hosting/aws-hosting-odoo-2026/"
}
}
</script>
<!-- FAQ Schema -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Cuanto cuesta alojar Odoo en AWS mensualmente?",
"acceptedAnswer": {
"@type": "Answer",
"text": "El costo de Odoo en AWS varia segun la configuracion. Una instancia basica (t3.medium + RDS db.t3.micro) cuesta aproximadamente 50-80 EUR/mes. Pour produccion empresarial con alta disponibilidad, los costos oscilan entre 200-500 EUR/mes dependiendo del trafico y usuarios concurrentes."
}
},
{
"@type": "Question",
"name": "Que instancia EC2 necesito pour Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Pour desarrollo/pruebas: t3.small (2 vCPU, 2GB RAM). Pour produccion pequena (hasta 20 usuarios): t3.medium (2 vCPU, 4GB RAM). Pour produccion media (20-50 usuarios): t3.large o m5.large. Pour alta carga: m5.xlarge o superior con Auto Scaling configurado."
}
},
{
"@type": "Question",
"name": "Debo usar RDS o instalar PostgreSQL en EC2?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Recomendamos Amazon RDS pour PostgreSQL en produccion. RDS ofrece backups automaticos, replicacion Multi-AZ, actualizaciones gestionadas y alta disponibilidad sin esfuerzo adicional. Instalar PostgreSQL en EC2 solo es recomendable pour desarrollo o si necesitas configuraciones muy especificas."
}
},
{
"@type": "Question",
"name": "AWS es mejor que Odoo.sh pour hosting?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Depende de tus necesidades. AWS ofrece mayor control, escalabilidad y flexibilidad, ideal pour empresas con equipo tecnico. Odoo.sh es mas simple, con integracion nativa y actualizaciones automaticas, ideal pour quienes prefieren gestion simplificada. AWS suele ser mas economico a escala, pero requiere mas expertise."
}
},
{
"@type": "Question",
"name": "Como configuro SSL/HTTPS pour Odoo en AWS?",
"acceptedAnswer": {
"@type": "Answer",
"text": "La forma mas sencilla es usar AWS Certificate Manager (ACM) con un Application Load Balancer (ALB). ACM proporciona certificados SSL gratuitos que se renuevan automaticamente. Configura el ALB pour terminar SSL y redirigir trafico HTTP a HTTPS. Alternativamente, puedes usar Let's Encrypt directamente en la instancia EC2."
}
},
{
"@type": "Question",
"name": "Puedo usar el Free Tier de AWS pour Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Si, pero con limitaciones. El Free Tier incluye 750 horas de t2.micro (1 vCPU, 1GB RAM) que es insuficiente pour produccion pero funciona pour desarrollo. Tambien incluye 750 horas de RDS db.t2.micro y 20GB de almacenamiento. Es ideal pour pruebas iniciales durante los primeros 12 meses."
}
},
{
"@type": "Question",
"name": "Como hago backup de Odoo en AWS?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Implementa una estrategia de backup multicapa: 1) Snapshots automaticos de RDS (retencion 7-35 dias), 2) Snapshots de EBS pour el filestore de Odoo, 3) AWS Backup pour politicas centralizadas, 4) Opcional: replicacion cross-region pour disaster recovery. Los backups de RDS permiten restauracion point-in-time."
}
},
{
"@type": "Question",
"name": "Que region de AWS debo elegir pour Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Elige la region mas cercana a tus usuarios pour minimizar latencia. Pour Espana: eu-south-2 (Espana) o eu-west-1 (Irlanda). Pour LATAM: sa-east-1 (Sao Paulo) o us-east-1 (Virginia). Considera tambien requisitos de GDPR si manejas datos de ciudadanos europeos, lo que requiere regiones dentro de la UE."
}
}
]
}
</script>
<!-- HowTo Schema -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "Como desplegar Odoo en AWS",
"description": "Guia paso a paso pour configurar Odoo en Amazon Web Services",
"totalTime": "PT2H",
"estimatedCost": {
"@type": "MonetaryAmount",
"currency": "EUR",
"value": "50-200"
},
"step": [
{
"@type": "HowToStep",
"name": "Crear cuenta AWS",
"text": "Registrate en AWS y configura tu cuenta con facturacion"
},
{
"@type": "HowToStep",
"name": "Configurar VPC y redes",
"text": "Crea una VPC con subredes publicas y privadas pour seguridad"
},
{
"@type": "HowToStep",
"name": "Lanzar instancia EC2",
"text": "Despliega una instancia EC2 con Ubuntu 22.04 LTS"
},
{
"@type": "HowToStep",
"name": "Configurar RDS PostgreSQL",
"text": "Crea una instancia RDS PostgreSQL en subnet privada"
},
{
"@type": "HowToStep",
"name": "Instalar Odoo",
"text": "Instala Odoo 18 y configura la conexion a RDS"
},
{
"@type": "HowToStep",
"name": "Configurar Load Balancer y SSL",
"text": "Configura ALB con certificado SSL de ACM"
}
]
}
</script>
<!-- BreadcrumbList Schema -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Inicio",
"item": "https://www.odoo-expertos.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Hosting Odoo",
"item": "https://www.odoo-expertos.com/fr/odoo-hosting/"
},
{
"@type": "ListItem",
"position": 3,
"name": "AWS Hosting Odoo 2026",
"item": "https://www.odoo-expertos.com/fr/odoo-hosting/aws-hosting-odoo-2026/"
}
]
}
</script>
<link rel="stylesheet" href="/css/main.min.css">
<style>
.pillar-hero {
background: linear-gradient(135deg, #1a1a1a 0%, #232f3e 50%, #1a1a1a 100%);
padding: 4rem 2rem;
text-align: center;
border-bottom: 3px solid #FF9900;
position: relative;
overflow: hidden;
}
.pillar-hero::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: radial-gradient(ellipse at center, rgba(255,153,0,0.15) 0%, transparent 70%);
pointer-events: none;
}
.pillar-hero h1 {
font-size: clamp(2rem, 5vw, 3.5rem);
color: #FF9900;
margin-bottom: 1rem;
line-height: 1.2;
position: relative;
}
.pillar-subtitle {
font-size: 1.3rem;
color: #b0b0b0;
max-width: 800px;
margin: 0 auto 2rem;
}
.pillar-meta {
display: flex;
justify-content: center;
gap: 2rem;
flex-wrap: wrap;
font-size: 0.9rem;
color: #888;
}
.pillar-meta span {
display: flex;
align-items: center;
gap: 0.5rem;
}
.quick-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 1.5rem;
padding: 2rem;
background: #2a2a2a;
border-radius: 12px;
margin: 2rem 0;
}
.stat-card {
text-align: center;
padding: 1.5rem;
background: rgba(255,153,0,0.1);
border-radius: 8px;
border: 1px solid rgba(255,153,0,0.2);
transition: transform 0.3s ease, border-color 0.3s ease;
}
.stat-card:hover {
transform: translateY(-5px);
border-color: #FF9900;
}
.stat-number {
font-size: 2.5rem;
font-weight: 700;
color: #FF9900;
display: block;
}
.stat-label {
color: #b0b0b0;
font-size: 0.9rem;
margin-top: 0.5rem;
}
.toc {
background: #2a2a2a;
border: 2px solid #FF9900;
border-radius: 12px;
padding: 2rem;
margin: 2rem 0;
}
.toc h2 {
color: #FF9900;
margin-bottom: 1rem;
font-size: 1.5rem;
}
.toc-list {
list-style: none;
padding: 0;
columns: 2;
column-gap: 2rem;
}
.toc-list li {
margin-bottom: 0.75rem;
break-inside: avoid;
}
.toc-list a {
color: #e0e0e0;
text-decoration: none;
display: flex;
align-items: center;
gap: 0.5rem;
transition: color 0.3s ease;
}
.toc-list a:hover {
color: #FF9900;
}
.toc-list a::before {
content: '>';
color: #FF9900;
}
.content-section {
margin: 3rem 0;
}
.content-section h2 {
color: #FF9900;
margin-bottom: 1.5rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid rgba(255,153,0,0.3);
}
.content-section h3 {
color: #FFBB33;
margin: 2rem 0 1rem;
}
.chart-section {
margin: 3rem 0;
padding: 2rem;
background: #2a2a2a;
border-radius: 12px;
}
.chart-section h3 {
color: #FF9900;
margin-bottom: 1rem;
}
.chart-container {
width: 100%;
min-height: 400px;
position: relative;
}
.comparison-table {
width: 100%;
border-collapse: collapse;
margin: 2rem 0;
background: #2a2a2a;
border-radius: 12px;
overflow: hidden;
}
.comparison-table th,
.comparison-table td {
padding: 1rem;
text-align: left;
border-bottom: 1px solid #3a3a3a;
}
.comparison-table th {
background: rgba(255,153,0,0.2);
color: #FF9900;
font-weight: 600;
}
.comparison-table tr:hover {
background: rgba(255,153,0,0.05);
}
.comparison-table .check {
color: #4CAF50;
font-weight: bold;
}
.comparison-table .cross {
color: #f44336;
}
.instance-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
margin: 2rem 0;
}
.instance-card {
background: #2a2a2a;
border-radius: 12px;
padding: 1.5rem;
border: 1px solid rgba(255,153,0,0.2);
transition: transform 0.3s ease, border-color 0.3s ease;
}
.instance-card:hover {
transform: translateY(-5px);
border-color: #FF9900;
}
.instance-card.recommended {
border-color: #FF9900;
background: linear-gradient(135deg, rgba(255,153,0,0.15) 0%, #2a2a2a 100%);
position: relative;
}
.instance-card .badge {
display: inline-block;
padding: 0.25rem 0.75rem;
background: #FF9900;
color: #000;
border-radius: 20px;
font-size: 0.8rem;
font-weight: 600;
margin-bottom: 1rem;
}
.instance-card h4 {
color: #fff;
margin-bottom: 0.5rem;
font-size: 1.3rem;
}
.instance-card .price {
font-size: 1.8rem;
color: #FF9900;
font-weight: 700;
}
.instance-card .price-period {
color: #888;
font-size: 0.9rem;
}
.instance-card ul {
list-style: none;
padding: 0;
margin: 1rem 0;
}
.instance-card li {
padding: 0.5rem 0;
border-bottom: 1px solid #3a3a3a;
display: flex;
align-items: center;
gap: 0.5rem;
color: #b0b0b0;
}
.instance-card li::before {
content: '>';
color: #FF9900;
font-weight: bold;
}
.faq-section {
margin: 3rem 0;
}
.faq-item {
background: #2a2a2a;
border-radius: 8px;
margin-bottom: 1rem;
overflow: hidden;
}
.faq-question {
padding: 1.25rem;
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
color: #fff;
font-weight: 500;
transition: background 0.3s ease;
}
.faq-question:hover {
background: rgba(255,153,0,0.1);
}
.faq-question::after {
content: '+';
font-size: 1.5rem;
color: #FF9900;
transition: transform 0.3s ease;
}
.faq-item.open .faq-question::after {
transform: rotate(45deg);
}
.faq-answer {
padding: 0 1.25rem;
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease, padding 0.3s ease;
color: #b0b0b0;
}
.faq-item.open .faq-answer {
padding: 0 1.25rem 1.25rem;
max-height: 500px;
}
.cta-banner {
background: linear-gradient(135deg, rgba(255,153,0,0.2) 0%, rgba(255,187,51,0.1) 100%);
border: 2px solid rgba(255,153,0,0.5);
border-radius: 12px;
padding: 2.5rem;
text-align: center;
margin: 3rem 0;
}
.cta-banner h3 {
color: #FF9900;
margin-bottom: 1rem;
font-size: 1.8rem;
}
.cta-banner p {
margin-bottom: 1.5rem;
color: #b0b0b0;
font-size: 1.1rem;
}
.cta-banner .cta-btn {
display: inline-block;
padding: 1rem 2.5rem;
background: #FF9900;
color: #000;
border-radius: 8px;
text-decoration: none;
font-weight: 600;
font-size: 1.1rem;
transition: background 0.3s ease, transform 0.3s ease;
}
.cta-banner .cta-btn:hover {
background: #FFBB33;
transform: scale(1.05);
}
.related-articles {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
margin: 2rem 0;
}
.related-card {
background: #2a2a2a;
border-radius: 8px;
overflow: hidden;
transition: transform 0.3s ease;
text-decoration: none;
}
.related-card:hover {
transform: translateY(-5px);
}
.related-card-image {
height: 150px;
background: linear-gradient(135deg, rgba(255,153,0,0.3), rgba(255,187,51,0.3));
display: flex;
align-items: center;
justify-content: center;
font-size: 3rem;
}
.related-card-content {
padding: 1.25rem;
}
.related-card h4 {
color: #fff;
margin-bottom: 0.5rem;
font-size: 1rem;
}
.related-card p {
color: #888;
font-size: 0.9rem;
margin: 0;
}
.d3-tooltip {
position: absolute;
background: rgba(0,0,0,0.95);
color: #fff;
padding: 0.75rem 1rem;
border-radius: 8px;
font-size: 0.9rem;
pointer-events: none;
z-index: 100;
max-width: 280px;
box-shadow: 0 4px 20px rgba(0,0,0,0.3);
border: 1px solid rgba(255,153,0,0.3);
}
.d3-tooltip strong {
color: #FF9900;
}
.highlight-box {
background: linear-gradient(135deg, rgba(255,153,0,0.1) 0%, rgba(255,187,51,0.05) 100%);
border-left: 4px solid #FF9900;
padding: 1.5rem;
margin: 2rem 0;
border-radius: 0 8px 8px 0;
}
.highlight-box h4 {
color: #FF9900;
margin-bottom: 0.5rem;
}
.pros-cons {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.5rem;
margin: 1.5rem 0;
}
.pros, .cons {
padding: 1.5rem;
border-radius: 8px;
}
.pros {
background: rgba(76, 175, 80, 0.1);
border: 1px solid rgba(76, 175, 80, 0.3);
}
.cons {
background: rgba(244, 67, 54, 0.1);
border: 1px solid rgba(244, 67, 54, 0.3);
}
.pros h4 {
color: #4CAF50;
margin-bottom: 1rem;
}
.cons h4 {
color: #f44336;
margin-bottom: 1rem;
}
.pros ul, .cons ul {
list-style: none;
padding: 0;
margin: 0;
}
.pros li, .cons li {
margin-bottom: 0.5rem;
color: #b0b0b0;
}
.pros li::before {
content: '+ ';
color: #4CAF50;
}
.cons li::before {
content: '- ';
color: #f44336;
}
.code-block {
background: #1a1a1a;
border: 1px solid #3a3a3a;
border-radius: 8px;
padding: 1.5rem;
overflow-x: auto;
margin: 1.5rem 0;
}
.code-block pre {
margin: 0;
color: #e0e0e0;
font-family: 'Monaco', 'Menlo', monospace;
font-size: 0.9rem;
line-height: 1.5;
}
.code-block .comment {
color: #6a9955;
}
.code-block .keyword {
color: #569cd6;
}
.code-block .string {
color: #ce9178;
}
.aws-service-badge {
display: inline-block;
background: linear-gradient(135deg, #232f3e, #3a4a5c);
color: #FF9900;
padding: 0.25rem 0.75rem;
border-radius: 4px;
font-size: 0.85rem;
font-weight: 600;
margin-right: 0.5rem;
margin-bottom: 0.5rem;
}
.architecture-note {
background: rgba(33, 150, 243, 0.1);
border: 1px solid rgba(33, 150, 243, 0.3);
border-radius: 8px;
padding: 1.5rem;
margin: 1.5rem 0;
}
.architecture-note h4 {
color: #2196F3;
margin-bottom: 0.5rem;
}
.fade-in {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.6s ease, transform 0.6s ease;
}
.fade-in.visible {
opacity: 1;
transform: translateY(0);
}
@media (max-width: 768px) {
.toc-list {
columns: 1;
}
.pillar-meta {
flex-direction: column;
gap: 0.5rem;
}
.chart-container {
min-height: 300px;
}
.pros-cons {
grid-template-columns: 1fr;
}
.instance-grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<div id="header"><header class="site-header"><nav class="navbar"><div class="container"><div class="nav-brand"><a href="/fr/" class="logo"><span class="logo-text">Odoo Expertos</span></a></div><button class="nav-toggle" aria-label="Toggle navigation"><span></span><span></span><span></span></button><div class="nav-menu"><ul class="nav-list"><li><a href="/fr/">Accueil</a></li><li><a href="/fr/odoo/">Odoo</a></li><li><a href="/fr/odoo-ia/">Odoo IA</a></li><li><a href="/fr/odoo-hosting/">Hebergement Odoo</a></li><li><a href="/fr/mapa-del-sitio/">Plan du Site</a></li></ul></div></div></nav></header></div><button class="nav-toggle" aria-label="Toggle navigation"><span></span><span></span><span></span></button><div class="nav-menu"><ul class="nav-list"><li><a href="/fr/">Accueil</a></li><li><a href="/fr/odoo/">Odoo</a></li><li><a href="/fr/odoo-ia/">Odoo IA</a></li><li><a href="/fr/odoo-hosting/">Hebergement Odoo</a></li><li><a href="/fr/mapa-del-sitio/">Plan du Site</a></li></ul></div></div></nav></header></div>
<!-- Breadcrumbs -->
<nav class="breadcrumbs">
<div class="container">
<ol class="breadcrumb-list" itemscope itemtype="https://schema.org/BreadcrumbList">
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="/"><span itemprop="name">Accueil</span></a>
<span itemprop="position" style="display:none">1</span>
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="/fr/odoo-hosting/"><span itemprop="name">Hébergement Odoo</span></a>
<span itemprop="position" style="display:none">2</span>
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<span itemprop="name">AWS Hosting Odoo 2026</span>
<span itemprop="position" style="display:none">3</span>
</li>
</ol>
</div>
</nav>
<!-- Hero Section -->
<section class="pillar-hero">
<div class="container">
<h1>AWS Hosting Odoo 2026: Guia Completa pour Amazon Cloud</h1>
<p class="pillar-subtitle">Aprende a desplegar, configurar y optimizar Odoo en Amazon Web Services. Desde instancias EC2 hasta bases de datos RDS, arquitectura escalable y estimacion de costos pour tu empresa.</p>
<div class="pillar-meta">
<span>Publié : 25 janvier 2026</span>
<span>Mis à jour : 25 janvier 2026</span>
<span>30 min lectura</span>
<span>Dr. Equipo Odoo Expertos</span>
</div>
</div>
</section>
<main class="container">
<!-- Quick Stats -->
<section class="quick-stats fade-in">
<div class="stat-card">
<span class="stat-number">33</span>
<span class="stat-label">Regiones AWS Disponibles</span>
</div>
<div class="stat-card">
<span class="stat-number">50EUR</span>
<span class="stat-label">Costo Minimo/Mes</span>
</div>
<div class="stat-card">
<span class="stat-number">99.99%</span>
<span class="stat-label">SLA de Disponibilidad</span>
</div>
<div class="stat-card">
<span class="stat-number">400+</span>
<span class="stat-label">Tipos de Instancia</span>
</div>
<div class="stat-card">
<span class="stat-number">12</span>
<span class="stat-label">Meses Free Tier</span>
</div>
</section>
<!-- Table of Contents -->
<nav class="toc fade-in">
<h2>Contenido de esta Guia</h2>
<ol class="toc-list">
<li><a href="#introduccion">Introduccion a AWS pour Odoo</a></li>
<li><a href="#arquitectura">Arquitectura AWS Recomendada</a></li>
<li><a href="#ec2-instancias">Tipos de Instancias EC2</a></li>
<li><a href="#rds-postgresql">RDS pour PostgreSQL</a></li>
<li><a href="#costos">Estimacion de Costos 2026</a></li>
<li><a href="#configuracion">Guia de Configuracion Paso a Paso</a></li>
<li><a href="#seguridad">Seguridad y Mejores Practicas</a></li>
<li><a href="#escalabilidad">Escalabilidad y Auto Scaling</a></li>
<li><a href="#pros-cons">Ventajas y Desventajas</a></li>
<li><a href="#faq">Preguntas Frecuentes (8+)</a></li>
<li><a href="#relacionados">Articles Connexes</a></li>
</ol>
</nav>
<!-- Introduction -->
<section id="introduccion" class="content-section fade-in">
<h2>Introduccion: Por que Elegir AWS pour Odoo en 2026</h2>
<p>Amazon Web Services (AWS) se ha consolidado como la plataforma de nube publica lider mundial, y en 2026 ofrece una infraestructura excepcional pour desplegar Odoo ERP. Con mas de 33 regiones globales, cientos de servicios integrados y una fiabilidad probada del 99.99%, AWS representa una opcion solida pour empresas que buscan control total, escalabilidad y rendimiento empresarial.</p>
<div class="highlight-box">
<h4>Conclusion Clave</h4>
<p>AWS es ideal pour empresas medianas y grandes que cuentan con equipo tecnico o DevOps, necesitan <strong>escalabilidad automatica</strong>, requieren cumplimiento normativo especifico (GDPR, HIPAA) o buscan integrar Odoo con otros servicios cloud como machine learning, analytics o IoT. Pour pequenas empresas sin expertise tecnico, alternativas gestionadas como Odoo4projects pueden ser mas convenientes.</p>
</div>
<h3>Servicios AWS Esenciales pour Odoo</h3>
<p>Un despliegue profesional de Odoo en AWS utiliza multiples servicios trabajando en conjunto:</p>
<p>
<span class="aws-service-badge">EC2</span>
<span class="aws-service-badge">RDS</span>
<span class="aws-service-badge">S3</span>
<span class="aws-service-badge">ELB</span>
<span class="aws-service-badge">CloudFront</span>
<span class="aws-service-badge">Route 53</span>
<span class="aws-service-badge">ACM</span>
<span class="aws-service-badge">VPC</span>
<span class="aws-service-badge">CloudWatch</span>
<span class="aws-service-badge">WAF</span>
</p>
<p>La combinacion estrategica de estos servicios permite crear una arquitectura robusta, segura y altamente disponible que puede escalar desde una startup hasta una corporacion multinacional.</p>
<h3>Quien Deberia Usar AWS pour Odoo</h3>
<ul>
<li><strong>Empresas medianas-grandes</strong> con mas de 50 usuarios concurrentes</li>
<li><strong>Organizaciones con equipo IT/DevOps</strong> capaz de gestionar infraestructura cloud</li>
<li><strong>Empresas con requisitos de compliance</strong> especificos (financieras, salud, gobierno)</li>
<li><strong>Negocios que necesitan integraciones</strong> con servicios AWS como SageMaker, Redshift o Lambda</li>
<li><strong>Companias con presencia global</strong> que requieren baja latencia en multiples regiones</li>
</ul>
</section>
<!-- Architecture Diagram -->
<section class="chart-section fade-in">
<h3 id="arquitectura">Arquitectura AWS Recomendada pour Odoo</h3>
<p>Este diagrama interactivo muestra la arquitectura de referencia pour un despliegue de Odoo en AWS con alta disponibilidad. Pasa el cursor sobre cada componente pour ver detalles.</p>
<div class="chart-container" id="architecture-diagram"></div>
</section>
<!-- EC2 Instance Types -->
<section id="ec2-instancias" class="content-section fade-in">
<h2>Tipos de Instancias EC2 pour Odoo</h2>
<p>Elegir la instancia EC2 correcta es crucial pour el rendimiento de Odoo. Las instancias de proposito general de la familia T3 y M5 son las mas recomendadas pour la mayoria de despliegues.</p>
<div class="instance-grid">
<!-- t3.small -->
<div class="instance-card">
<span class="badge">Desarrollo</span>
<h4>t3.small</h4>
<p class="price">~15EUR<span class="price-period">/mes</span></p>
<ul>
<li>2 vCPU (burst)</li>
<li>2 GB RAM</li>
<li>Hasta 5 Gbps red</li>
<li>Ideal pour desarrollo/testing</li>
<li>1-5 usuarios concurrentes</li>
</ul>
</div>
<!-- t3.medium -->
<div class="instance-card recommended">
<span class="badge">Recommandé PYME</span>
<h4>t3.medium</h4>
<p class="price">~30EUR<span class="price-period">/mes</span></p>
<ul>
<li>2 vCPU (burst)</li>
<li>4 GB RAM</li>
<li>Hasta 5 Gbps red</li>
<li>Produccion pequena</li>
<li>10-20 usuarios concurrentes</li>
</ul>
</div>
<!-- t3.large -->
<div class="instance-card">
<span class="badge">Produccion Media</span>
<h4>t3.large</h4>
<p class="price">~60EUR<span class="price-period">/mes</span></p>
<ul>
<li>2 vCPU (burst)</li>
<li>8 GB RAM</li>
<li>Hasta 5 Gbps red</li>
<li>Odoo Enterprise</li>
<li>20-40 usuarios concurrentes</li>
</ul>
</div>
<!-- m5.large -->
<div class="instance-card">
<span class="badge">Produccion Alta</span>
<h4>m5.large</h4>
<p class="price">~75EUR<span class="price-period">/mes</span></p>
<ul>
<li>2 vCPU (dedicados)</li>
<li>8 GB RAM</li>
<li>Hasta 10 Gbps red</li>
<li>Sin creditos burst</li>
<li>30-50 usuarios concurrentes</li>
</ul>
</div>
<!-- m5.xlarge -->
<div class="instance-card">
<span class="badge">Enterprise</span>
<h4>m5.xlarge</h4>
<p class="price">~150EUR<span class="price-period">/mes</span></p>
<ul>
<li>4 vCPU (dedicados)</li>
<li>16 GB RAM</li>
<li>Hasta 10 Gbps red</li>
<li>Alta carga de trabajo</li>
<li>50-100 usuarios concurrentes</li>
</ul>
</div>
<!-- c5.xlarge -->
<div class="instance-card">
<span class="badge">Computacion Intensiva</span>
<h4>c5.xlarge</h4>
<p class="price">~135EUR<span class="price-period">/mes</span></p>
<ul>
<li>4 vCPU (optimizados)</li>
<li>8 GB RAM</li>
<li>Hasta 10 Gbps red</li>
<li>Reportes pesados</li>
<li>Procesamiento batch</li>
</ul>
</div>
</div>
<div class="architecture-note">
<h4>Nota sobre Creditos de CPU (T3)</h4>
<p>Las instancias T3 funcionan con creditos de CPU que permiten "bursts" de rendimiento. Pour cargas constantes, considera el modo ilimitado (costo adicional) o migra a instancias M5 que ofrecen rendimiento consistente sin sistema de creditos.</p>
</div>
</section>
<!-- RDS PostgreSQL -->
<section id="rds-postgresql" class="content-section fade-in">
<h2>Amazon RDS pour PostgreSQL: La Base de Datos Ideal</h2>
<p>Amazon RDS (Relational Database Service) simplifica la gestion de PostgreSQL eliminando tareas administrativas como backups, parches y replicacion. Pour Odoo, RDS PostgreSQL es la opcion recomendada en produccion.</p>
<h3>Compourtiva: RDS vs PostgreSQL en EC2</h3>
<div style="overflow-x: auto;">
<table class="comparison-table">
<thead>
<tr>
<th>Caracteristica</th>
<th>RDS PostgreSQL</th>
<th>PostgreSQL en EC2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Backups automaticos</td>
<td class="check">Incluido</td>
<td class="cross">Manual</td>
</tr>
<tr>
<td>Point-in-time recovery</td>
<td class="check">Hasta 35 dias</td>
<td class="cross">Requiere config</td>
</tr>
<tr>
<td>Multi-AZ (HA)</td>
<td class="check">1 click</td>
<td class="cross">Complejo</td>
</tr>
<tr>
<td>Actualizaciones automaticas</td>
<td class="check">Gestionado</td>
<td class="cross">Manual</td>
</tr>
<tr>
<td>Escalado vertical</td>
<td class="check">Minutos</td>
<td class="cross">Downtime</td>
</tr>
<tr>
<td>Read Replicas</td>
<td class="check">Hasta 5</td>
<td class="cross">Complejo</td>
</tr>
<tr>
<td>Control total</td>
<td class="cross">Limitado</td>
<td class="check">Completo</td>
</tr>
<tr>
<td>Costo</td>
<td>Mayor (+30-40%)</td>
<td>Menor</td>
</tr>
</tbody>
</table>
</div>
<h3>Instancias RDS Recomendadas pour Odoo</h3>
<div style="overflow-x: auto;">
<table class="comparison-table">
<thead>
<tr>
<th>Instancia RDS</th>
<th>vCPU</th>
<th>RAM</th>
<th>Costo/mes</th>
<th>Caso de Uso</th>
</tr>
</thead>
<tbody>
<tr>
<td>db.t3.micro</td>
<td>2</td>
<td>1 GB</td>
<td>~15EUR</td>
<td>Desarrollo/Free Tier</td>
</tr>
<tr>
<td>db.t3.small</td>
<td>2</td>
<td>2 GB</td>
<td>~30EUR</td>
<td>Produccion pequena</td>
</tr>
<tr>
<td>db.t3.medium</td>
<td>2</td>
<td>4 GB</td>
<td>~60EUR</td>
<td>PYME (recomendado)</td>
</tr>
<tr>
<td>db.m5.large</td>
<td>2</td>
<td>8 GB</td>
<td>~130EUR</td>
<td>Produccion media-alta</td>
</tr>
<tr>
<td>db.m5.xlarge</td>
<td>4</td>
<td>16 GB</td>
<td>~260EUR</td>
<td>Enterprise</td>
</tr>
</tbody>
</table>
</div>
<div class="highlight-box">
<h4>Configuracion PostgreSQL Optima pour Odoo</h4>
<p>Ajusta estos pourmetros en el Pourmeter Group de RDS pour optimizar el rendimiento de Odoo:</p>
</div>
<div class="code-block">
<pre><span class="comment"># Pourmeter Group personalizado pour Odoo</span>
<span class="keyword">shared_buffers</span> = <span class="string">256MB</span> <span class="comment"># 25% de RAM disponible</span>
<span class="keyword">effective_cache_size</span> = <span class="string">768MB</span> <span class="comment"># 75% de RAM</span>
<span class="keyword">work_mem</span> = <span class="string">16MB</span>
<span class="keyword">maintenance_work_mem</span> = <span class="string">128MB</span>
<span class="keyword">max_connections</span> = <span class="string">100</span>
<span class="keyword">checkpoint_completion_target</span> = <span class="string">0.9</span>
<span class="keyword">wal_buffers</span> = <span class="string">16MB</span>
<span class="keyword">random_page_cost</span> = <span class="string">1.1</span> <span class="comment"># Optimizado pour SSD</span></pre>
</div>
</section>
<!-- Cost Estimation Chart -->
<section class="chart-section fade-in">
<h3 id="costos">Estimacion de Costos AWS pour Odoo 2026</h3>
<p>Este grafico interactivo muestra los costos mensuales estimados pour diferentes configuraciones de Odoo en AWS. Los costos incluyen EC2, RDS, almacenamiento y transferencia basica.</p>
<div class="chart-container" id="cost-chart"></div>
</section>
<!-- Detailed Cost Table -->
<section class="content-section fade-in">
<h2>Desglose de Costos por Escenario</h2>
<div style="overflow-x: auto;">
<table class="comparison-table">
<thead>
<tr>
<th>Escenario</th>
<th>EC2</th>
<th>RDS</th>
<th>EBS/S3</th>
<th>ALB</th>
<th>Otros</th>
<th>Total/Mes</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Desarrollo</strong></td>
<td>15EUR</td>
<td>15EUR</td>
<td>5EUR</td>
<td>-</td>
<td>5EUR</td>
<td><strong>~40EUR</strong></td>
</tr>
<tr>
<td><strong>PYME (10-20 usuarios)</strong></td>
<td>30EUR</td>
<td>60EUR</td>
<td>15EUR</td>
<td>20EUR</td>
<td>15EUR</td>
<td><strong>~140EUR</strong></td>
</tr>
<tr>
<td><strong>Mediana (30-50 usuarios)</strong></td>
<td>75EUR</td>
<td>130EUR</td>
<td>30EUR</td>
<td>25EUR</td>
<td>25EUR</td>
<td><strong>~285EUR</strong></td>
</tr>
<tr>
<td><strong>Enterprise (50-100 usuarios)</strong></td>
<td>150EUR</td>
<td>260EUR</td>
<td>50EUR</td>
<td>35EUR</td>
<td>50EUR</td>
<td><strong>~545EUR</strong></td>
</tr>
<tr>
<td><strong>HA Multi-AZ</strong></td>
<td>300EUR</td>
<td>520EUR</td>
<td>100EUR</td>
<td>50EUR</td>
<td>100EUR</td>
<td><strong>~1070EUR</strong></td>
</tr>
</tbody>
</table>
</div>
<p><em>* Precios aproximados region eu-west-1 (Irlanda) a enero 2026. Pueden variar segun region y uso real.</em></p>
<div class="architecture-note">
<h4>Optimizacion de Costos</h4>
<p><strong>Reserved Instances:</strong> Comprometerse a 1-3 anos puede ahorrar hasta 72% vs On-Demand.<br>
<strong>Savings Plans:</strong> Flexibilidad con ahorros de hasta 66%.<br>
<strong>Spot Instances:</strong> Pour workers no criticos, ahorro hasta 90%.</p>
</div>
</section>
<!-- Configuration Guide -->
<section id="configuracion" class="content-section fade-in">
<h2>Guia de Configuracion Paso a Paso</h2>
<p>A continuacion se presenta una guia resumida pour desplegar Odoo en AWS. Cada paso incluye los comandos y configuraciones esenciales.</p>
<h3>Paso 1: Configurar VPC y Redes</h3>
<p>Crea una VPC con subredes publicas (pour ALB) y privadas (pour EC2 y RDS):</p>
<div class="code-block">
<pre><span class="comment"># Crear VPC con CIDR 10.0.0.0/16</span>
<span class="keyword">aws ec2 create-vpc</span> --cidr-block 10.0.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=odoo-vpc}]'
<span class="comment"># Crear subredes publicas (2 AZs pour ALB)</span>
<span class="keyword">aws ec2 create-subnet</span> --vpc-id vpc-xxx --cidr-block 10.0.1.0/24 --availability-zone eu-west-1a
<span class="keyword">aws ec2 create-subnet</span> --vpc-id vpc-xxx --cidr-block 10.0.2.0/24 --availability-zone eu-west-1b
<span class="comment"># Crear subredes privadas (pour EC2 y RDS)</span>
<span class="keyword">aws ec2 create-subnet</span> --vpc-id vpc-xxx --cidr-block 10.0.10.0/24 --availability-zone eu-west-1a
<span class="keyword">aws ec2 create-subnet</span> --vpc-id vpc-xxx --cidr-block 10.0.11.0/24 --availability-zone eu-west-1b</pre>
</div>
<h3>Paso 2: Lanzar Instancia EC2</h3>
<p>Despliega una instancia EC2 con Ubuntu 22.04 LTS:</p>
<div class="code-block">
<pre><span class="comment"># Lanzar instancia EC2</span>
<span class="keyword">aws ec2 run-instances</span> \
--image-id ami-0c55b159cbfafe1f0 \
--instance-type t3.medium \
--key-name odoo-key \
--security-group-ids sg-xxx \
--subnet-id subnet-xxx \
--block-device-mappings '[{"DeviceName":"/dev/sda1","Ebs":{"VolumeSize":50,"VolumeType":"gp3"}}]' \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=odoo-server}]'</pre>
</div>
<h3>Paso 3: Crear Base de Datos RDS</h3>
<p>Configura RDS PostgreSQL en una subred privada:</p>
<div class="code-block">
<pre><span class="comment"># Crear instancia RDS PostgreSQL</span>
<span class="keyword">aws rds create-db-instance</span> \
--db-instance-identifier odoo-db \
--db-instance-class db.t3.medium \
--engine postgres \
--engine-version 16.1 \
--master-username odoo_admin \
--master-user-password "TuPasswordSeguro123!" \
--allocated-storage 100 \
--storage-type gp3 \
--vpc-security-group-ids sg-xxx \
--db-subnet-group-name odoo-db-subnet \
--backup-retention-period 7 \
--multi-az \
--no-publicly-accessible</pre>
</div>
<h3>Paso 4: Instalar Odoo</h3>
<p>Una vez conectado a la instancia EC2, instala Odoo 18:</p>
<div class="code-block">
<pre><span class="comment"># Actualizar sistema</span>
<span class="keyword">sudo apt update && sudo apt upgrade -y</span>
<span class="comment"># Instalar dependencias</span>
<span class="keyword">sudo apt install -y</span> python3-pip python3-dev python3-venv \
libxml2-dev libxslt1-dev zlib1g-dev libsasl2-dev \
libldap2-dev build-essential libssl-dev libffi-dev \
libmysqlclient-dev libjpeg-dev libpq-dev \
liblcms2-dev libblas-dev libatlas-base-dev
<span class="comment"># Instalar wkhtmltopdf pour reportes PDF</span>
<span class="keyword">wget</span> https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.jammy_amd64.deb
<span class="keyword">sudo dpkg -i</span> wkhtmltox_0.12.6.1-3.jammy_amd64.deb
<span class="comment"># Crear usuario Odoo</span>
<span class="keyword">sudo useradd -m -d /opt/odoo -U -r -s /bin/bash odoo</span>
<span class="comment"># Clonar Odoo 18</span>
<span class="keyword">sudo su - odoo</span>
<span class="keyword">git clone</span> https://github.com/odoo/odoo.git --depth 1 --branch 18.0 /opt/odoo/odoo18
<span class="comment"># Crear entorno virtual e instalar dependencias</span>
<span class="keyword">python3 -m venv</span> /opt/odoo/odoo18-venv
<span class="keyword">source</span> /opt/odoo/odoo18-venv/bin/activate
<span class="keyword">pip install</span> -r /opt/odoo/odoo18/requirements.txt
<span class="keyword">pip install</span> psycopg2-binary</pre>
</div>
<h3>Paso 5: Configurar Odoo</h3>
<p>Crea el archivo de configuracion conectando a RDS:</p>
<div class="code-block">
<pre><span class="comment"># /etc/odoo.conf</span>
[options]
<span class="keyword">admin_passwd</span> = <span class="string">TuMasterPasswordSeguro</span>
<span class="keyword">db_host</span> = <span class="string">odoo-db.xxxxx.eu-west-1.rds.amazonaws.com</span>
<span class="keyword">db_port</span> = <span class="string">5432</span>
<span class="keyword">db_user</span> = <span class="string">odoo_admin</span>
<span class="keyword">db_password</span> = <span class="string">TuPasswordRDS</span>
<span class="keyword">addons_path</span> = <span class="string">/opt/odoo/odoo18/addons,/opt/odoo/custom-addons</span>
<span class="keyword">data_dir</span> = <span class="string">/opt/odoo/data</span>
<span class="keyword">logfile</span> = <span class="string">/var/log/odoo/odoo.log</span>
<span class="keyword">workers</span> = <span class="string">4</span>
<span class="keyword">max_cron_threads</span> = <span class="string">2</span>
<span class="keyword">proxy_mode</span> = <span class="string">True</span></pre>
</div>
</section>
<!-- Security Section -->
<section id="seguridad" class="content-section fade-in">
<h2>Seguridad y Mejores Practicas en AWS</h2>
<p>La seguridad en AWS sigue el modelo de responsabilidad compartida. AWS protege la infraestructura, pero tu eres responsable de la configuracion segura de tus recursos.</p>
<h3>Security Groups Recommandés</h3>
<div style="overflow-x: auto;">
<table class="comparison-table">
<thead>
<tr>
<th>Security Group</th>
<th>Puerto</th>
<th>Origen</th>
<th>Descripcion</th>
</tr>
</thead>
<tbody>
<tr>
<td>ALB-SG</td>
<td>443 (HTTPS)</td>
<td>0.0.0.0/0</td>
<td>Trafico publico SSL</td>
</tr>
<tr>
<td>ALB-SG</td>
<td>80 (HTTP)</td>
<td>0.0.0.0/0</td>
<td>Redirect a HTTPS</td>
</tr>
<tr>
<td>EC2-SG</td>
<td>8069</td>
<td>ALB-SG</td>
<td>Solo desde ALB</td>
</tr>
<tr>
<td>EC2-SG</td>
<td>22 (SSH)</td>
<td>Tu IP / Bastion</td>
<td>Administracion</td>
</tr>
<tr>
<td>RDS-SG</td>
<td>5432</td>
<td>EC2-SG</td>
<td>Solo desde EC2</td>
</tr>
</tbody>
</table>
</div>
<h3>Checklist de Seguridad</h3>
<ul>
<li><strong>IAM:</strong> Usar roles IAM en vez de access keys en EC2</li>
<li><strong>Encryption:</strong> Habilitar encriptacion en EBS y RDS (KMS)</li>
<li><strong>SSL/TLS:</strong> Usar ACM con ALB pour certificados gestionados</li>
<li><strong>VPC:</strong> RDS y EC2 en subredes privadas sin IP publica</li>
<li><strong>WAF:</strong> Implementar AWS WAF en el ALB contra ataques web</li>
<li><strong>CloudTrail:</strong> Activar logging de todas las acciones API</li>
<li><strong>Secrets Manager:</strong> Almacenar credenciales de forma segura</li>
<li><strong>Updates:</strong> Automatizar parches con Systems Manager</li>
</ul>
</section>
<!-- Scalability Section -->
<section id="escalabilidad" class="content-section fade-in">
<h2>Escalabilidad y Auto Scaling</h2>
<p>Una de las mayores ventajas de AWS es la capacidad de escalar automaticamente segun la demanda. Pour Odoo, esto significa poder manejar picos de carga sin sobredimensionar la infraestructura base.</p>
<h3>Estrategias de Escalado</h3>
<h4>Escalado Vertical (Scale Up)</h4>
<p>Aumentar recursos de una instancia existente. Util pour RDS y EC2 cuando necesitas mas potencia rapidamente.</p>
<h4>Escalado Horizontal (Scale Out)</h4>
<p>Agregar mas instancias EC2 detras del ALB. Requiere configurar Odoo pour sesiones compartidas (Redis).</p>
<div class="code-block">
<pre><span class="comment"># Configuracion Auto Scaling Group</span>
<span class="keyword">aws autoscaling create-auto-scaling-group</span> \
--auto-scaling-group-name odoo-asg \
--launch-template LaunchTemplateId=lt-xxx \
--min-size 2 \
--max-size 6 \
--desired-capacity 2 \
--vpc-zone-identifier "subnet-xxx,subnet-yyy" \
--target-group-arns arn:aws:elasticloadbalancing:xxx \
--health-check-type ELB \
--health-check-grace-period 300
<span class="comment"># Politica de escalado basada en CPU</span>
<span class="keyword">aws autoscaling put-scaling-policy</span> \
--auto-scaling-group-name odoo-asg \
--policy-name cpu-scale-out \
--policy-type TargetTrackingScaling \
--target-tracking-configuration '{
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ASGAverageCPUUtilization"
},
"TargetValue": 70.0
}'</pre>
</div>
<div class="architecture-note">
<h4>Consideraciones pour Odoo Multi-Instancia</h4>
<p>Pour escalar Odoo horizontalmente necesitas:<br>
1. <strong>Redis/ElastiCache</strong> pour sesiones compartidas<br>
2. <strong>S3 o EFS</strong> pour el filestore compartido<br>
3. <strong>Sticky sessions</strong> en el ALB (recomendado)<br>
4. Sepourr <strong>workers de cron</strong> en una instancia dedicada</p>
</div>
</section>
<!-- Pros and Cons -->
<section id="pros-cons" class="content-section fade-in">
<h2>Ventajas y Desventajas de AWS pour Odoo</h2>
<div class="pros-cons">
<div class="pros">
<h4>Ventajas</h4>
<ul>
<li>Escalabilidad practicamente ilimitada</li>
<li>33 regiones globales disponibles</li>
<li>SLA del 99.99% de disponibilidad</li>
<li>Amplio ecosistema de servicios integrados</li>
<li>Certificaciones de compliance (SOC, ISO, HIPAA, GDPR)</li>
<li>Herramientas de monitoring avanzadas (CloudWatch)</li>
<li>Backups automaticos y disaster recovery</li>
<li>Reserved Instances pour ahorro a largo plazo</li>
<li>Integracion con servicios ML/AI (SageMaker)</li>
<li>Soporte empresarial 24/7 disponible</li>
</ul>
</div>
<div class="cons">
<h4>Desventajas</h4>
<ul>
<li>Curva de aprendizaje pronunciada</li>
<li>Costos pueden escalar rapidamente</li>
<li>Requiere expertise tecnico DevOps</li>
<li>Facturacion compleja de entender</li>
<li>Soporte basico limitado (pago extra)</li>
<li>Sin gestion especifica de Odoo</li>
<li>Actualizaciones de Odoo son manuales</li>
<li>Configuracion inicial compleja</li>
<li>Vendor lock-in potencial</li>
<li>Necesidad de monitorear costos constantemente</li>
</ul>
</div>
</div>
</section>
<!-- Comparison Chart -->
<section class="chart-section fade-in">
<h3>AWS vs Otras Opciones de Hosting Odoo</h3>
<p>Compourtiva visual de AWS frente a otras alternativas populares de hosting pour Odoo en diferentes dimensiones.</p>
<div class="chart-container" id="comparison-radar"></div>
</section>
<!-- CTA Banner -->
<section class="cta-banner fade-in">
<h3>Necesitas Ayuda con tu Despliegue AWS?</h3>
<p>Si prefieres una solucion gestionada sin la complejidad de AWS, Odoo4projects ofrece hosting especializado desde 29EUR/mes con soporte en espanol, IA integrada y migracion gratuita.</p>
<a href="https://odoo4projects.com" class="cta-btn" target="_blank" rel="noopener sponsored">Probar Hosting Gestionado</a>
</section>
<!-- FAQ Section -->
<section id="faq" class="faq-section fade-in">
<h2>Preguntas Frecuentes sobre AWS Hosting pour Odoo</h2>
<div class="faq-item">
<div class="faq-question">Cuanto cuesta alojar Odoo en AWS mensualmente?</div>
<div class="faq-answer">El costo de Odoo en AWS varia segun la configuracion. Una instancia basica (t3.medium + RDS db.t3.micro) cuesta aproximadamente 50-80 EUR/mes. Pour produccion empresarial con alta disponibilidad, los costos oscilan entre 200-500 EUR/mes dependiendo del trafico y usuarios concurrentes.</div>
</div>
<div class="faq-item">
<div class="faq-question">Que instancia EC2 necesito pour Odoo?</div>
<div class="faq-answer">Pour desarrollo/pruebas: t3.small (2 vCPU, 2GB RAM). Pour produccion pequena (hasta 20 usuarios): t3.medium (2 vCPU, 4GB RAM). Pour produccion media (20-50 usuarios): t3.large o m5.large. Pour alta carga: m5.xlarge o superior con Auto Scaling configurado.</div>
</div>
<div class="faq-item">
<div class="faq-question">Debo usar RDS o instalar PostgreSQL en EC2?</div>
<div class="faq-answer">Recomendamos Amazon RDS pour PostgreSQL en produccion. RDS ofrece backups automaticos, replicacion Multi-AZ, actualizaciones gestionadas y alta disponibilidad sin esfuerzo adicional. Instalar PostgreSQL en EC2 solo es recomendable pour desarrollo o si necesitas configuraciones muy especificas.</div>
</div>
<div class="faq-item">
<div class="faq-question">AWS es mejor que Odoo.sh pour hosting?</div>
<div class="faq-answer">Depende de tus necesidades. AWS ofrece mayor control, escalabilidad y flexibilidad, ideal pour empresas con equipo tecnico. Odoo.sh es mas simple, con integracion nativa y actualizaciones automaticas, ideal pour quienes prefieren gestion simplificada. AWS suele ser mas economico a escala, pero requiere mas expertise.</div>
</div>
<div class="faq-item">
<div class="faq-question">Como configuro SSL/HTTPS pour Odoo en AWS?</div>
<div class="faq-answer">La forma mas sencilla es usar AWS Certificate Manager (ACM) con un Application Load Balancer (ALB). ACM proporciona certificados SSL gratuitos que se renuevan automaticamente. Configura el ALB pour terminar SSL y redirigir trafico HTTP a HTTPS. Alternativamente, puedes usar Let's Encrypt directamente en la instancia EC2.</div>
</div>
<div class="faq-item">
<div class="faq-question">Puedo usar el Free Tier de AWS pour Odoo?</div>
<div class="faq-answer">Si, pero con limitaciones. El Free Tier incluye 750 horas de t2.micro (1 vCPU, 1GB RAM) que es insuficiente pour produccion pero funciona pour desarrollo. Tambien incluye 750 horas de RDS db.t2.micro y 20GB de almacenamiento. Es ideal pour pruebas iniciales durante los primeros 12 meses.</div>
</div>
<div class="faq-item">
<div class="faq-question">Como hago backup de Odoo en AWS?</div>
<div class="faq-answer">Implementa una estrategia de backup multicapa: 1) Snapshots automaticos de RDS (retencion 7-35 dias), 2) Snapshots de EBS pour el filestore de Odoo, 3) AWS Backup pour politicas centralizadas, 4) Opcional: replicacion cross-region pour disaster recovery. Los backups de RDS permiten restauracion point-in-time.</div>
</div>
<div class="faq-item">
<div class="faq-question">Que region de AWS debo elegir pour Odoo?</div>
<div class="faq-answer">Elige la region mas cercana a tus usuarios pour minimizar latencia. Pour Espana: eu-south-2 (Espana) o eu-west-1 (Irlanda). Pour LATAM: sa-east-1 (Sao Paulo) o us-east-1 (Virginia). Considera tambien requisitos de GDPR si manejas datos de ciudadanos europeos, lo que requiere regiones dentro de la UE.</div>
</div>
</section>
<!-- Related Articles -->
<section id="relacionados" class="content-section fade-in">
<h2>Articles Connexes</h2>
<div class="related-articles">
<a href="/fr/odoo-hosting/mejor-hosting-odoo-2026/" class="related-card">
<div class="related-card-image">COMPARATIVA</div>
<div class="related-card-content">
<h4>Mejor Hosting Odoo 2026: Compourtiva</h4>
<p>Compourmos 15+ proveedores de hosting pour Odoo</p>
</div>
</a>
<a href="/fr/odoo-hosting/vps-hosting-odoo-servidor-virtual-2025/" class="related-card">
<div class="related-card-image">VPS</div>
<div class="related-card-content">
<h4>VPS pour Odoo: Guia de Configuracion</h4>
<p>Configura tu propio servidor virtual paso a paso</p>
</div>
</a>
<a href="/fr/odoo-hosting/odoo-sh-hosting-oficial-plataforma-2025/" class="related-card">
<div class="related-card-image">ODOO.SH</div>
<div class="related-card-content">
<h4>Odoo.sh: Analisis Completo</h4>
<p>Todo sobre la plataforma oficial de Odoo</p>
</div>
</a>
<a href="/fr/odoo-hosting/requisitos-hosting-odoo-servidor-2025/" class="related-card">
<div class="related-card-image">REQUISITOS</div>
<div class="related-card-content">
<h4>Requisitos Tecnicos pour Odoo</h4>
<p>Especificaciones de servidor recomendadas</p>
</div>
</a>
<a href="/fr/odoo-hosting/precios-hosting-odoo-costos-2025/" class="related-card">
<div class="related-card-image">PRECIOS</div>
<div class="related-card-content">
<h4>Precios de Hosting Odoo</h4>
<p>Compourtiva detallada de costos</p>
</div>
</a>
<a href="/fr/odoo-hosting/hosting-odoo-espana-proveedores-2025/" class="related-card">
<div class="related-card-image">ES</div>
<div class="related-card-content">
<h4>Hosting Odoo en Espana</h4>
<p>Proveedores locales con soporte en espanol</p>
</div>
</a>
</div>
</section>
</main>
<!-- EEAT Author Section -->
<div id="eeat-section"></div>
<div id="footer"><footer class="site-footer"><div class="container"><div class="footer-cols"><div><strong>Odoo Expertos</strong></div><nav class="footer-nav"><a href="/fr/">Accueil</a><a href="/fr/odoo/">Odoo</a><a href="/fr/odoo-ia/">Odoo IA</a><a href="/fr/odoo-hosting/">Hebergement Odoo</a><a href="/fr/mapa-del-sitio/">Plan du Site</a></nav></div><div class="footer-bottom"><small>&copy; 2026 Odoo Expertos</small></div></div></footer></div><nav class="footer-nav"><a href="/fr/">Accueil</a><a href="/fr/odoo/">Odoo</a><a href="/fr/odoo-ia/">Odoo IA</a><a href="/fr/odoo-hosting/">Hebergement Odoo</a><a href="/fr/mapa-del-sitio/">Plan du Site</a></nav></div><div class="footer-bottom"><small>&copy; 2026 Odoo Expertos</small></div></div></footer></div>
<!-- Scripts -->
<script src="/js/language-router.js"></script>
<script src="/components/header.min.js"></script>
<script src="/components/footer.min.js"></script>
<script src="/components/eeat.min.js"></script>
<script src="/js/cookie-banner.min.js"></script>
<!-- D3.js -->
<script src="https://d3js.org/d3.v7.min.js"></script>
<script>
// Initialize components
// Scroll animation observer
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, { threshold: 0.1 });
document.querySelectorAll('.fade-in').forEach(el => observer.observe(el));
// FAQ Toggle
document.querySelectorAll('.faq-question').forEach(question => {
question.addEventListener('click', () => {
const item = question.parentElement;
item.classList.toggle('open');
});
});
// Tooltip
const tooltip = d3.select('body').append('div')
.attr('class', 'd3-tooltip')
.style('opacity', 0);
// AWS Color scheme
const awsColors = ['#FF9900', '#232F3E', '#00A1C9', '#7AA116', '#DD344C', '#8C4FFF'];
// Architecture Diagram Data
const architectureData = {
nodes: [
{ id: 'internet', label: 'Internet', type: 'external', x: 400, y: 30 },
{ id: 'route53', label: 'Route 53 (DNS)', type: 'aws', x: 400, y: 90 },
{ id: 'cloudfront', label: 'CloudFront (CDN)', type: 'aws', x: 400, y: 150 },
{ id: 'waf', label: 'AWS WAF', type: 'security', x: 250, y: 150 },
{ id: 'alb', label: 'Application Load Balancer', type: 'aws', x: 400, y: 220 },
{ id: 'acm', label: 'ACM (SSL)', type: 'security', x: 550, y: 220 },
{ id: 'ec2_1', label: 'EC2 Odoo (AZ-a)', type: 'compute', x: 300, y: 310 },
{ id: 'ec2_2', label: 'EC2 Odoo (AZ-b)', type: 'compute', x: 500, y: 310 },
{ id: 'rds_primary', label: 'RDS PostgreSQL (Primary)', type: 'database', x: 300, y: 400 },
{ id: 'rds_standby', label: 'RDS PostgreSQL (Standby)', type: 'database', x: 500, y: 400 },
{ id: 's3', label: 'S3 (Filestore/Backups)', type: 'storage', x: 650, y: 310 },
{ id: 'elasticache', label: 'ElastiCache Redis', type: 'cache', x: 150, y: 310 }
],
links: [
{ source: 'internet', target: 'route53' },
{ source: 'route53', target: 'cloudfront' },
{ source: 'cloudfront', target: 'alb' },
{ source: 'waf', target: 'alb' },
{ source: 'acm', target: 'alb' },
{ source: 'alb', target: 'ec2_1' },
{ source: 'alb', target: 'ec2_2' },
{ source: 'ec2_1', target: 'rds_primary' },
{ source: 'ec2_2', target: 'rds_primary' },
{ source: 'rds_primary', target: 'rds_standby' },
{ source: 'ec2_1', target: 's3' },
{ source: 'ec2_2', target: 's3' },
{ source: 'ec2_1', target: 'elasticache' },
{ source: 'ec2_2', target: 'elasticache' }
]
};
// Architecture Diagram
function renderArchitectureDiagram() {
const container = d3.select('#architecture-diagram');
if (container.empty()) return;
const width = container.node().getBoundingClientRect().width;
const height = 480;
container.html('');
const svg = container.append('svg')
.attr('width', width)
.attr('height', height);
const scale = Math.min(width / 800, 1);
const offsetX = (width - 800 * scale) / 2;
const g = svg.append('g')
.attr('transform', `translate(${offsetX}, 20) scale(${scale})`);
// Color mapping
const typeColors = {
external: '#888',
aws: '#FF9900',
security: '#DD344C',
compute: '#00A1C9',
database: '#7AA116',
storage: '#8C4FFF',
cache: '#232F3E'
};
// Draw links
architectureData.links.forEach((link, i) => {
const source = architectureData.nodes.find(n => n.id === link.source);
const target = architectureData.nodes.find(n => n.id === link.target);
g.append('line')
.attr('x1', source.x)
.attr('y1', source.y)
.attr('x2', source.x)
.attr('y2', source.y)
.attr('stroke', '#444')
.attr('stroke-width', 2)
.attr('stroke-dasharray', '5,3')
.transition()
.duration(800)
.delay(i * 50)
.attr('x2', target.x)
.attr('y2', target.y);
});
// Draw nodes
architectureData.nodes.forEach((node, i) => {
const nodeGroup = g.append('g')
.attr('transform', `translate(${node.x}, ${node.y})`)
.style('opacity', 0)
.style('cursor', 'pointer');
nodeGroup.append('rect')
.attr('x', -60)
.attr('y', -18)
.attr('width', 120)
.attr('height', 36)
.attr('rx', 6)
.attr('fill', typeColors[node.type])
.attr('fill-opacity', 0.2)
.attr('stroke', typeColors[node.type])
.attr('stroke-width', 2);
nodeGroup.append('text')
.attr('text-anchor', 'middle')
.attr('dominant-baseline', 'middle')
.attr('fill', '#e0e0e0')
.attr('font-size', '11px')
.attr('font-weight', '500')
.text(node.label.length > 18 ? node.label.substring(0, 18) + '...' : node.label);
nodeGroup.on('mouseover', function(event) {
d3.select(this).select('rect')
.attr('fill-opacity', 0.4)
.attr('stroke-width', 3);
tooltip.transition().duration(200).style('opacity', 1);
tooltip.html(`<strong>${node.label}</strong><br>Tipo: ${node.type}`)
.style('left', (event.pageX + 15) + 'px')
.style('top', (event.pageY - 28) + 'px');
})
.on('mouseout', function() {
d3.select(this).select('rect')
.attr('fill-opacity', 0.2)
.attr('stroke-width', 2);
tooltip.transition().duration(200).style('opacity', 0);
});
nodeGroup.transition()
.duration(500)
.delay(i * 80 + 300)
.style('opacity', 1);
});
// VPC boundary
g.insert('rect', ':first-child')
.attr('x', 100)
.attr('y', 180)
.attr('width', 600)
.attr('height', 260)
.attr('rx', 12)
.attr('fill', 'none')
.attr('stroke', '#FF9900')
.attr('stroke-width', 2)
.attr('stroke-dasharray', '10,5')
.attr('opacity', 0)
.transition()
.duration(1000)
.delay(800)
.attr('opacity', 0.5);
g.insert('text', ':first-child')
.attr('x', 110)
.attr('y', 195)
.attr('fill', '#FF9900')
.attr('font-size', '12px')
.attr('opacity', 0)
.text('VPC (10.0.0.0/16)')
.transition()
.duration(500)
.delay(1200)
.attr('opacity', 1);
}
// Cost Chart Data
const costData = [
{ scenario: 'Desarrollo', ec2: 15, rds: 15, storage: 5, alb: 0, other: 5, total: 40 },
{ scenario: 'PYME', ec2: 30, rds: 60, storage: 15, alb: 20, other: 15, total: 140 },
{ scenario: 'Mediana', ec2: 75, rds: 130, storage: 30, alb: 25, other: 25, total: 285 },
{ scenario: 'Enterprise', ec2: 150, rds: 260, storage: 50, alb: 35, other: 50, total: 545 },
{ scenario: 'HA Multi-AZ', ec2: 300, rds: 520, storage: 100, alb: 50, other: 100, total: 1070 }
];
// Cost Chart
function renderCostChart() {
const container = d3.select('#cost-chart');
if (container.empty()) return;
const width = container.node().getBoundingClientRect().width;
const height = 400;
const margin = { top: 40, right: 120, bottom: 60, left: 80 };
container.html('');
const svg = container.append('svg')
.attr('width', width)
.attr('height', height);
const categories = ['ec2', 'rds', 'storage', 'alb', 'other'];
const categoryLabels = { ec2: 'EC2', rds: 'RDS', storage: 'Storage', alb: 'ALB', other: 'Otros' };
const categoryColors = ['#FF9900', '#7AA116', '#8C4FFF', '#00A1C9', '#DD344C'];
const stackedData = d3.stack()
.keys(categories)(costData);
const xScale = d3.scaleBand()
.domain(costData.map(d => d.scenario))
.range([margin.left, width - margin.right])
.padding(0.3);
const yScale = d3.scaleLinear()
.domain([0, d3.max(costData, d => d.total) * 1.1])
.range([height - margin.bottom, margin.top]);
// Grid lines
svg.append('g')
.attr('class', 'grid')
.attr('transform', `translate(${margin.left}, 0)`)
.call(d3.axisLeft(yScale)
.tickSize(-(width - margin.left - margin.right))
.tickFormat(''))
.selectAll('line')
.attr('stroke', '#333');
// X Axis
svg.append('g')
.attr('transform', `translate(0, ${height - margin.bottom})`)
.call(d3.axisBottom(xScale))
.selectAll('text')
.attr('fill', '#b0b0b0')
.attr('font-size', '12px');
// Y Axis
svg.append('g')
.attr('transform', `translate(${margin.left}, 0)`)
.call(d3.axisLeft(yScale).tickFormat(d => d + 'EUR'))
.selectAll('text')
.attr('fill', '#b0b0b0');
// Stacked bars
stackedData.forEach((layer, layerIdx) => {
svg.selectAll(`.bar-${layerIdx}`)
.data(layer)
.join('rect')
.attr('class', `bar-${layerIdx}`)
.attr('x', d => xScale(d.data.scenario))
.attr('y', height - margin.bottom)
.attr('width', xScale.bandwidth())
.attr('height', 0)
.attr('fill', categoryColors[layerIdx])
.style('cursor', 'pointer')
.on('mouseover', function(event, d) {
d3.select(this).attr('opacity', 0.8);
const value = d[1] - d[0];
tooltip.transition().duration(200).style('opacity', 1);
tooltip.html(`<strong>${d.data.scenario}</strong><br>${categoryLabels[categories[layerIdx]]}: ${value}EUR<br>Total: ${d.data.total}EUR`)
.style('left', (event.pageX + 15) + 'px')
.style('top', (event.pageY - 28) + 'px');
})
.on('mouseout', function() {
d3.select(this).attr('opacity', 1);
tooltip.transition().duration(200).style('opacity', 0);
})
.transition()
.duration(800)
.delay((d, i) => i * 100 + layerIdx * 50)
.attr('y', d => yScale(d[1]))
.attr('height', d => yScale(d[0]) - yScale(d[1]));
});
// Total labels
svg.selectAll('.total-label')
.data(costData)
.join('text')
.attr('class', 'total-label')
.attr('x', d => xScale(d.scenario) + xScale.bandwidth() / 2)
.attr('y', d => yScale(d.total) - 8)
.attr('text-anchor', 'middle')
.attr('fill', '#FF9900')
.attr('font-size', '12px')
.attr('font-weight', '600')
.attr('opacity', 0)
.text(d => d.total + 'EUR')
.transition()
.duration(500)
.delay((d, i) => i * 100 + 600)
.attr('opacity', 1);
// Legend
const legend = svg.append('g')
.attr('transform', `translate(${width - margin.right + 10}, ${margin.top})`);
categories.forEach((cat, i) => {
const legendItem = legend.append('g')
.attr('transform', `translate(0, ${i * 25})`);
legendItem.append('rect')
.attr('width', 15)
.attr('height', 15)
.attr('fill', categoryColors[i])
.attr('rx', 3);
legendItem.append('text')
.attr('x', 22)
.attr('y', 12)
.attr('fill', '#b0b0b0')
.attr('font-size', '11px')
.text(categoryLabels[cat]);
});
}
// Radar comparison data
const radarData = {
categories: ['Escalabilidad', 'Control', 'Costo', 'Facilidad', 'Soporte', 'Seguridad'],
providers: [
{ name: 'AWS', values: [95, 90, 60, 50, 70, 95], color: '#FF9900' },
{ name: 'Odoo.sh', values: [75, 40, 50, 95, 90, 85], color: '#714B67' },
{ name: 'Odoo4projects', values: [70, 60, 90, 90, 95, 85], color: '#FF6B35' },
{ name: 'DigitalOcean', values: [80, 85, 80, 75, 65, 80], color: '#0080FF' }
]
};
// Radar Chart
function renderRadarChart() {
const container = d3.select('#comparison-radar');
if (container.empty()) return;
const width = container.node().getBoundingClientRect().width;
const height = 400;
const margin = 100;
const radius = Math.min(width, height) / 2 - margin;
container.html('');
const svg = container.append('svg')
.attr('width', width)
.attr('height', height)
.append('g')
.attr('transform', `translate(${width/2}, ${height/2})`);
const categories = radarData.categories;
const angleSlice = Math.PI * 2 / categories.length;
const rScale = d3.scaleLinear()
.domain([0, 100])
.range([0, radius]);
// Grid circles
const levels = 5;
for (let i = 1; i <= levels; i++) {
svg.append('circle')
.attr('r', radius * i / levels)
.attr('fill', 'none')
.attr('stroke', '#3a3a3a')
.attr('stroke-dasharray', '4,4');
svg.append('text')
.attr('x', 5)
.attr('y', -radius * i / levels)
.attr('fill', '#666')
.attr('font-size', '10px')
.text(i * 20);
}
// Axis lines and labels
categories.forEach((cat, i) => {
const angle = angleSlice * i - Math.PI / 2;
svg.append('line')
.attr('x1', 0)
.attr('y1', 0)
.attr('x2', radius * Math.cos(angle))
.attr('y2', radius * Math.sin(angle))
.attr('stroke', '#444');
const labelRadius = radius + 25;
svg.append('text')
.attr('x', labelRadius * Math.cos(angle))
.attr('y', labelRadius * Math.sin(angle))
.attr('text-anchor', 'middle')
.attr('dominant-baseline', 'middle')
.attr('fill', '#b0b0b0')
.attr('font-size', '11px')
.text(cat);
});
// Radar areas
const radarLine = d3.lineRadial()
.radius(d => rScale(d))
.angle((d, i) => angleSlice * i)
.curve(d3.curveLinearClosed);
radarData.providers.forEach((provider, idx) => {
const path = svg.append('path')
.datum(provider.values)
.attr('d', radarLine)
.attr('fill', provider.color)
.attr('fill-opacity', 0)
.attr('stroke', provider.color)
.attr('stroke-width', 2)
.attr('stroke-opacity', 0);
path.transition()
.duration(800)
.delay(idx * 200)
.attr('fill-opacity', 0.15)
.attr('stroke-opacity', 1);
// Data points
provider.values.forEach((val, i) => {
const angle = angleSlice * i - Math.PI / 2;
svg.append('circle')
.attr('cx', rScale(val) * Math.cos(angle))
.attr('cy', rScale(val) * Math.sin(angle))
.attr('r', 0)
.attr('fill', provider.color)
.transition()
.duration(500)
.delay(idx * 200 + i * 50)
.attr('r', 4);
});
});
// Legend
const legendX = width > 600 ? radius + 50 : -radius;
const legendY = width > 600 ? -radius + 20 : radius + 30;
radarData.providers.forEach((provider, idx) => {
const g = svg.append('g')
.attr('transform', `translate(${legendX}, ${legendY + idx * 25})`);
g.append('rect')
.attr('width', 15)
.attr('height', 15)
.attr('fill', provider.color)
.attr('rx', 3);
g.append('text')
.attr('x', 22)
.attr('y', 12)
.attr('fill', '#b0b0b0')
.attr('font-size', '11px')
.text(provider.name);
});
}
// Initialize charts when visible
const chartObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const id = entry.target.id;
setTimeout(() => {
if (id === 'architecture-diagram') renderArchitectureDiagram();
if (id === 'cost-chart') renderCostChart();
if (id === 'comparison-radar') renderRadarChart();
}, 100);
chartObserver.unobserve(entry.target);
}
});
}, { threshold: 0.15 });
document.querySelectorAll('.chart-container').forEach(el => chartObserver.observe(el));
// Resize handler
let resizeTimeout;
window.addEventListener('resize', () => {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(() => {
renderArchitectureDiagram();
renderCostChart();
renderRadarChart();
}, 300);
});
</script>
</body>
</html>