Files
odoo-expertos.com/pt/odoo-hosting/aws-hosting-odoo-2026/index.html
T
2026-08-28 10:11:11 -03:00

2129 lines
87 KiB
HTML

<!DOCTYPE html>
<html lang="pt-BR">
<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 · PT</title>
<meta name="description" content="Guia definitiva para desplegar Odoo en AWS (Amazon Web Services) en 2026. Configuracion EC2, RDS PostgreSQL, estimacion de costos, arqui - AWS Hosting Odoo 2026 | PT">
<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="Dra. Equipo Odoo Expertos">
<meta name="robots" content="index, follow">
<meta name="language" content="pt-BR">
<link rel="canonical" href="https://www.odoo-expertos.com/pt/odoo-hosting/aws-hosting-odoo-2026/">
<!-- Hreflang -->
<link rel="alternate" hreflang="pt-BR" href="https://www.odoo-expertos.com/pt/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 Hosting Odoo 2026: Guia Completa para 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/pt/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="pt_BR">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="AWS Hosting Odoo 2026: Guia Completa Amazon Cloud">
<meta name="twitter:description" content="Guia definitiva para 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 Hosting Odoo 2026: Guia Completa para Desplegar en Amazon Cloud",
"description": "Guia definitiva para desplegar Odoo en AWS (Amazon Web Services) en 2026. Configuracion EC2, RDS PostgreSQL, estimacion de costos y arquitectura escalable.",
"author": {
"@type": "Person",
"name": "Dra. Equipo Odoo Expertos",
"url": "https://www.odoo-expertos.com/autor/maria-elena-rodriguez/",
"jobTitle": "Consultora Senior en Sistemas 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/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. Para 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 para Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Para desarrollo/pruebas: t3.small (2 vCPU, 2GB RAM). Para produccion pequena (hasta 20 usuarios): t3.medium (2 vCPU, 4GB RAM). Para produccion media (20-50 usuarios): t3.large o m5.large. Para 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 para 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 para desarrollo o si necesitas configuraciones muy especificas."
}
},
{
"@type": "Question",
"name": "AWS es mejor que Odoo.sh para hosting?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Depende de tus necesidades. AWS ofrece mayor control, escalabilidad y flexibilidad, ideal para empresas con equipo tecnico. Odoo.sh es mas simple, con integracion nativa y actualizaciones automaticas, ideal para quienes prefieren gestion simplificada. AWS suele ser mas economico a escala, pero requiere mas expertise."
}
},
{
"@type": "Question",
"name": "Como configuro SSL/HTTPS para 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 para 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 para Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Sim, pero con limitaciones. El Free Tier incluye 750 horas de t2.micro (1 vCPU, 1GB RAM) que es insuficiente para produccion pero funciona para desarrollo. Tambien incluye 750 horas de RDS db.t2.micro y 20GB de almacenamiento. Es ideal para 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 para el filestore de Odoo, 3) AWS Backup para politicas centralizadas, 4) Opcional: replicacion cross-region para disaster recovery. Los backups de RDS permiten restauracion point-in-time."
}
},
{
"@type": "Question",
"name": "Que region de AWS debo elegir para Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Elige la region mas cercana a tus usuarios para minimizar latencia. Para Espana: eu-south-2 (Espana) o eu-west-1 (Irlanda). Para 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 para 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 para 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/pt/odoo-hosting/"
},
{
"@type": "ListItem",
"position": 3,
"name": "AWS Hosting Odoo 2026",
"item": "https://www.odoo-expertos.com/pt/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="/pt/" 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="/pt/">Inicio</a></li><li><a href="/pt/odoo/">Odoo</a></li><li><a href="/pt/odoo-ia/">Odoo IA</a></li><li><a href="/pt/odoo-hosting/">Hospedagem Odoo</a></li><li><a href="/pt/mapa-del-sitio/">Mapa do 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="/pt/">Inicio</a></li><li><a href="/pt/odoo/">Odoo</a></li><li><a href="/pt/odoo-ia/">Odoo IA</a></li><li><a href="/pt/odoo-hosting/">Hospedagem Odoo</a></li><li><a href="/pt/mapa-del-sitio/">Mapa do 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">Inicio</span></a>
<span itemprop="position" style="display:none">1</span>
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="/pt/odoo-hosting/"><span itemprop="name">Hosting 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 para 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 para tu empresa.</p>
<div class="pillar-meta">
<span>Publicado: 25 enero 2026</span>
<span>Actualizado: 25 enero 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 para 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 para 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">Articulos Relacionados</a></li>
</ol>
</nav>
<!-- Introduction -->
<section id="introduccion" class="content-section fade-in">
<h2>Introduccion: Por que Elegir AWS para 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 para 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 para empresas que buscan control total, escalabilidad y rendimiento empresarial.</p>
<div class="highlight-box">
<h4>Conclusion Clave</h4>
<p>AWS es ideal para 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. Para pequenas empresas sin expertise tecnico, alternativas gestionadas como Odoo4projects pueden ser mas convenientes.</p>
</div>
<h3>Servicios AWS Esenciales para 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 para 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 para Odoo</h3>
<p>Este diagrama interactivo muestra la arquitectura de referencia para un despliegue de Odoo en AWS con alta disponibilidad. Pasa el cursor sobre cada componente para 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 para Odoo</h2>
<p>Elegir la instancia EC2 correcta es crucial para el rendimiento de Odoo. Las instancias de proposito general de la familia T3 y M5 son las mas recomendadas para 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 para desarrollo/testing</li>
<li>1-5 usuarios concurrentes</li>
</ul>
</div>
<!-- t3.medium -->
<div class="instance-card recommended">
<span class="badge">Recomendado 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. Para 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 para 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. Para Odoo, RDS PostgreSQL es la opcion recomendada en produccion.</p>
<h3>Comparativa: 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 para 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 para Odoo</h4>
<p>Ajusta estos parametros en el Parameter Group de RDS para optimizar el rendimiento de Odoo:</p>
</div>
<div class="code-block">
<pre><span class="comment"># Parameter Group personalizado para 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 para SSD</span></pre>
</div>
</section>
<!-- Cost Estimation Chart -->
<section class="chart-section fade-in">
<h3 id="costos">Estimacion de Costos AWS para Odoo 2026</h3>
<p>Este grafico interactivo muestra los costos mensuales estimados para 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> Para 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 para 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 (para ALB) y privadas (para 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 para 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 (para 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 para 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 Recomendados</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 para 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. Para 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 para 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 para 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 para Odoo Multi-Instancia</h4>
<p>Para escalar Odoo horizontalmente necesitas:<br>
1. <strong>Redis/ElastiCache</strong> para sesiones compartidas<br>
2. <strong>S3 o EFS</strong> para el filestore compartido<br>
3. <strong>Sticky sessions</strong> en el ALB (recomendado)<br>
4. Separar <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 para 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 para 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>Comparativa visual de AWS frente a otras alternativas populares de hosting para 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 para 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. Para 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 para Odoo?</div>
<div class="faq-answer">Para desarrollo/pruebas: t3.small (2 vCPU, 2GB RAM). Para produccion pequena (hasta 20 usuarios): t3.medium (2 vCPU, 4GB RAM). Para produccion media (20-50 usuarios): t3.large o m5.large. Para 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 para 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 para desarrollo o si necesitas configuraciones muy especificas.</div>
</div>
<div class="faq-item">
<div class="faq-question">AWS es mejor que Odoo.sh para hosting?</div>
<div class="faq-answer">Depende de tus necesidades. AWS ofrece mayor control, escalabilidad y flexibilidad, ideal para empresas con equipo tecnico. Odoo.sh es mas simple, con integracion nativa y actualizaciones automaticas, ideal para 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 para 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 para 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 para 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 para produccion pero funciona para desarrollo. Tambien incluye 750 horas de RDS db.t2.micro y 20GB de almacenamiento. Es ideal para 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 para el filestore de Odoo, 3) AWS Backup para politicas centralizadas, 4) Opcional: replicacion cross-region para 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 para Odoo?</div>
<div class="faq-answer">Elige la region mas cercana a tus usuarios para minimizar latencia. Para Espana: eu-south-2 (Espana) o eu-west-1 (Irlanda). Para 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>Articulos Relacionados</h2>
<div class="related-articles">
<a href="/pt/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: Comparativa</h4>
<p>Comparamos 15+ proveedores de hosting para Odoo</p>
</div>
</a>
<a href="/pt/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 para Odoo: Guia de Configuracion</h4>
<p>Configura tu propio servidor virtual paso a paso</p>
</div>
</a>
<a href="/pt/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="/pt/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 para Odoo</h4>
<p>Especificaciones de servidor recomendadas</p>
</div>
</a>
<a href="/pt/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>Comparativa detallada de costos</p>
</div>
</a>
<a href="/pt/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="/pt/">Inicio</a><a href="/pt/odoo/">Odoo</a><a href="/pt/odoo-ia/">Odoo IA</a><a href="/pt/odoo-hosting/">Hospedagem Odoo</a><a href="/pt/mapa-del-sitio/">Mapa do Site</a></nav></div><div class="footer-bottom"><small>&copy; 2026 Odoo Expertos</small></div></div></footer></div><nav class="footer-nav"><a href="/pt/">Inicio</a><a href="/pt/odoo/">Odoo</a><a href="/pt/odoo-ia/">Odoo IA</a><a href="/pt/odoo-hosting/">Hospedagem Odoo</a><a href="/pt/mapa-del-sitio/">Mapa do 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>