2272 lines
96 KiB
HTML
2272 lines
96 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>Odoo On Premise 2026 | Odoo Expertos · FR</title>
|
|
|
|
<meta name="description" content="Guia definitiva pour implementar Odoo On-Premise en 2026. Requisitos de hardware, configuracion de red, seguridad, mantenimiento y analis - Odoo On Premise 2026 | FR">
|
|
<meta name="keywords" content="odoo on-premise, odoo local, odoo servidor propio, instalacion odoo local, odoo hardware requisitos, odoo seguridad on-premise, odoo tco analisis, odoo mantenimiento servidor">
|
|
<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/odoo-on-premise-2026/">
|
|
|
|
<!-- Hreflang -->
|
|
<link rel="alternate" hreflang="fr" href="https://www.odoo-expertos.com/fr/odoo-hosting/odoo-on-premise-2026/" />
|
|
<link rel="alternate" hreflang="en" href="https://www.odoo-expertos.com/en/odoo-hosting/odoo-on-premise-2026/" />
|
|
<link rel="alternate" hreflang="de" href="https://www.odoo-expertos.com/de/odoo-hosting/odoo-on-premise-2026/" />
|
|
<link rel="alternate" hreflang="fr" href="https://www.odoo-expertos.com/fr/odoo-hosting/odoo-on-premise-2026/" />
|
|
<link rel="alternate" hreflang="x-default" href="https://www.odoo-expertos.com/odoo-hosting/odoo-on-premise-2026/" />
|
|
|
|
<!-- Open Graph -->
|
|
<meta property="og:title" content="Odoo On-Premise 2026: Guide Complet de Implementacion Local">
|
|
<meta property="og:description" content="Guia definitiva pour implementar Odoo On-Premise en 2026. Hardware, seguridad, red, mantenimiento y analisis TCO completo.">
|
|
<meta property="og:type" content="article">
|
|
<meta property="og:url" content="https://www.odoo-expertos.com/fr/odoo-hosting/odoo-on-premise-2026/">
|
|
<meta property="og:image" content="https://www.odoo-expertos.com/images/odoo-on-premise-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="Odoo On-Premise 2026: Guide Complet">
|
|
<meta name="twitter:description" content="Guia definitiva pour implementar Odoo On-Premise en 2026. Hardware, seguridad y TCO.">
|
|
|
|
<!-- Schema.org Article -->
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "Article",
|
|
"headline": "Odoo On-Premise 2026: Guide Complet de Implementacion Local",
|
|
"description": "Guia definitiva pour implementar Odoo On-Premise en 2026. Requisitos de hardware, configuracion de red, seguridad, mantenimiento y analisis TCO.",
|
|
"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/odoo-on-premise-2026/"
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<!-- FAQ Schema -->
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "FAQPage",
|
|
"mainEntity": [
|
|
{
|
|
"@type": "Question",
|
|
"name": "Cuales son los requisitos minimos de hardware pour Odoo On-Premise?",
|
|
"acceptedAnswer": {
|
|
"@type": "Answer",
|
|
"text": "Pour Odoo 18 Community on-premise necesitas minimo: CPU de 4 nucleos (recomendado 8), 16GB RAM (recomendado 32GB), 500GB SSD NVMe, y conexion de red de 1Gbps. Pour Enterprise, duplica estos valores."
|
|
}
|
|
},
|
|
{
|
|
"@type": "Question",
|
|
"name": "Cuanto cuesta implementar Odoo On-Premise vs Cloud?",
|
|
"acceptedAnswer": {
|
|
"@type": "Answer",
|
|
"text": "La inversion inicial on-premise oscila entre 8.000-25.000 EUR en hardware, mas 3.000-8.000 EUR anuales en mantenimiento. El cloud cuesta 50-200 EUR/mes. El punto de equilibrio se alcanza aproximadamente en 3-4 anios pour empresas medianas."
|
|
}
|
|
},
|
|
{
|
|
"@type": "Question",
|
|
"name": "Que medidas de seguridad necesita un servidor Odoo On-Premise?",
|
|
"acceptedAnswer": {
|
|
"@type": "Answer",
|
|
"text": "Un servidor Odoo on-premise requiere: firewall perimetral y de aplicacion, SSL/TLS con certificados validos, segmentacion de red, backups cifrados, actualizaciones regulares de seguridad, sistema de deteccion de intrusos (IDS), y autenticacion de dos factores."
|
|
}
|
|
},
|
|
{
|
|
"@type": "Question",
|
|
"name": "Es mejor Odoo On-Premise o en la nube pour mi empresa?",
|
|
"acceptedAnswer": {
|
|
"@type": "Answer",
|
|
"text": "Depende de tus necesidades: On-Premise es mejor si tienes requisitos estrictos de soberania de datos, equipo IT interno, necesitas maxima personalizacion, o tienes mas de 50 usuarios. Cloud es preferible pour startups, empresas sin IT dedicado, o cuando la escalabilidad rapida es prioritaria."
|
|
}
|
|
},
|
|
{
|
|
"@type": "Question",
|
|
"name": "Que tareas de mantenimiento requiere Odoo On-Premise?",
|
|
"acceptedAnswer": {
|
|
"@type": "Answer",
|
|
"text": "El mantenimiento incluye: backups diarios y pruebas de restauracion mensuales, actualizaciones de seguridad semanales, monitorizacion 24/7, optimizacion de base de datos trimestral, renovacion de certificados SSL, y actualizaciones de Odoo (minimo 2 veces al anio)."
|
|
}
|
|
},
|
|
{
|
|
"@type": "Question",
|
|
"name": "Como configuro la red pour Odoo On-Premise?",
|
|
"acceptedAnswer": {
|
|
"@type": "Answer",
|
|
"text": "La configuracion de red optima incluye: VLAN dedicada pour el servidor Odoo, reverse proxy (Nginx) pour SSL termination, balanceador de carga pour alta disponibilidad, DNS interno y externo configurado, VPN pour acceso remoto seguro, y reglas de firewall estrictas (solo puertos 80, 443, y 8069 si es necesario)."
|
|
}
|
|
},
|
|
{
|
|
"@type": "Question",
|
|
"name": "Puedo migrar de Odoo Cloud a On-Premise?",
|
|
"acceptedAnswer": {
|
|
"@type": "Answer",
|
|
"text": "Si, la migracion de cloud a on-premise es posible. El proceso implica: exportar la base de datos PostgreSQL completa, copiar el filestore con todos los adjuntos, replicar la configuracion del servidor, ajustar los pourmetros del sistema, y realizar pruebas exhaustivas antes de la migracion definitiva."
|
|
}
|
|
},
|
|
{
|
|
"@type": "Question",
|
|
"name": "Que sistema operativo es mejor pour Odoo On-Premise?",
|
|
"acceptedAnswer": {
|
|
"@type": "Answer",
|
|
"text": "Ubuntu Server 22.04 LTS o 24.04 LTS son las opciones recomendadas oficialmente por Odoo. Debian 12 tambien es una excelente alternativa. Evita Windows Server ya que Odoo tiene mejor rendimiento y compatibilidad en sistemas Linux."
|
|
}
|
|
}
|
|
]
|
|
}
|
|
</script>
|
|
|
|
<!-- HowTo Schema -->
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "HowTo",
|
|
"name": "Como Implementar Odoo On-Premise",
|
|
"description": "Guia paso a paso pour implementar Odoo en servidores propios",
|
|
"totalTime": "P2D",
|
|
"estimatedCost": {
|
|
"@type": "MonetaryAmount",
|
|
"currency": "EUR",
|
|
"value": "8000-25000"
|
|
},
|
|
"step": [
|
|
{
|
|
"@type": "HowToStep",
|
|
"name": "Planificacion de Hardware",
|
|
"text": "Seleccionar y adquirir el hardware adecuado segun el numero de usuarios y modulos"
|
|
},
|
|
{
|
|
"@type": "HowToStep",
|
|
"name": "Configuracion de Red",
|
|
"text": "Configurar VLAN, firewall, DNS y certificados SSL"
|
|
},
|
|
{
|
|
"@type": "HowToStep",
|
|
"name": "Instalacion del Sistema Operativo",
|
|
"text": "Instalar Ubuntu Server 22.04/24.04 LTS con configuracion segura"
|
|
},
|
|
{
|
|
"@type": "HowToStep",
|
|
"name": "Instalacion de Odoo",
|
|
"text": "Instalar PostgreSQL, Python, dependencias y Odoo"
|
|
},
|
|
{
|
|
"@type": "HowToStep",
|
|
"name": "Configuracion de Seguridad",
|
|
"text": "Implementar firewall, SSL, backups y monitorizacion"
|
|
}
|
|
]
|
|
}
|
|
</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": "Odoo On-Premise 2026",
|
|
"item": "https://www.odoo-expertos.com/fr/odoo-hosting/odoo-on-premise-2026/"
|
|
}
|
|
]
|
|
}
|
|
</script>
|
|
|
|
<link rel="stylesheet" href="/css/main.min.css">
|
|
<style>
|
|
.pillar-hero {
|
|
background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 50%, #1a1a1a 100%);
|
|
padding: 4rem 2rem;
|
|
text-align: center;
|
|
border-bottom: 3px solid #FF6B35;
|
|
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,107,53,0.15) 0%, transparent 70%);
|
|
pointer-events: none;
|
|
}
|
|
|
|
.pillar-hero h1 {
|
|
font-size: clamp(2rem, 5vw, 3.5rem);
|
|
color: #FF6B35;
|
|
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,107,53,0.1);
|
|
border-radius: 8px;
|
|
border: 1px solid rgba(255,107,53,0.2);
|
|
transition: transform 0.3s ease, border-color 0.3s ease;
|
|
}
|
|
|
|
.stat-card:hover {
|
|
transform: translateY(-5px);
|
|
border-color: #FF6B35;
|
|
}
|
|
|
|
.stat-number {
|
|
font-size: 2.5rem;
|
|
font-weight: 700;
|
|
color: #FF6B35;
|
|
display: block;
|
|
}
|
|
|
|
.stat-label {
|
|
color: #b0b0b0;
|
|
font-size: 0.9rem;
|
|
margin-top: 0.5rem;
|
|
}
|
|
|
|
.toc {
|
|
background: #2a2a2a;
|
|
border: 2px solid #FF6B35;
|
|
border-radius: 12px;
|
|
padding: 2rem;
|
|
margin: 2rem 0;
|
|
}
|
|
|
|
.toc h2 {
|
|
color: #FF6B35;
|
|
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: #FF6B35;
|
|
}
|
|
|
|
.toc-list a::before {
|
|
content: '->';
|
|
color: #FF6B35;
|
|
}
|
|
|
|
.content-section {
|
|
margin: 3rem 0;
|
|
}
|
|
|
|
.content-section h2 {
|
|
color: #FF8A50;
|
|
margin-bottom: 1.5rem;
|
|
padding-bottom: 0.5rem;
|
|
border-bottom: 2px solid rgba(255,107,53,0.3);
|
|
}
|
|
|
|
.content-section h3 {
|
|
color: #FFB74D;
|
|
margin: 2rem 0 1rem;
|
|
}
|
|
|
|
.content-section h4 {
|
|
color: #FFA726;
|
|
margin: 1.5rem 0 0.75rem;
|
|
}
|
|
|
|
.content-section p {
|
|
line-height: 1.8;
|
|
color: #c0c0c0;
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.content-section ul, .content-section ol {
|
|
margin: 1rem 0 1.5rem 1.5rem;
|
|
color: #b0b0b0;
|
|
}
|
|
|
|
.content-section li {
|
|
margin-bottom: 0.5rem;
|
|
line-height: 1.6;
|
|
}
|
|
|
|
.chart-section {
|
|
margin: 3rem 0;
|
|
padding: 2rem;
|
|
background: #2a2a2a;
|
|
border-radius: 12px;
|
|
}
|
|
|
|
.chart-section h3 {
|
|
color: #FF8A50;
|
|
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,107,53,0.2);
|
|
color: #FF6B35;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.comparison-table tr:hover {
|
|
background: rgba(255,107,53,0.05);
|
|
}
|
|
|
|
.comparison-table .check {
|
|
color: #4CAF50;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.comparison-table .cross {
|
|
color: #f44336;
|
|
}
|
|
|
|
.hardware-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
|
|
gap: 1.5rem;
|
|
margin: 2rem 0;
|
|
}
|
|
|
|
.hardware-card {
|
|
background: #2a2a2a;
|
|
border-radius: 12px;
|
|
padding: 1.5rem;
|
|
border: 1px solid rgba(255,107,53,0.2);
|
|
transition: transform 0.3s ease, border-color 0.3s ease;
|
|
}
|
|
|
|
.hardware-card:hover {
|
|
transform: translateY(-5px);
|
|
border-color: #FF6B35;
|
|
}
|
|
|
|
.hardware-card.recommended {
|
|
border-color: #4CAF50;
|
|
background: linear-gradient(135deg, rgba(76,175,80,0.1) 0%, #2a2a2a 100%);
|
|
}
|
|
|
|
.hardware-card .tier-badge {
|
|
display: inline-block;
|
|
padding: 0.25rem 0.75rem;
|
|
background: #FF6B35;
|
|
color: #fff;
|
|
border-radius: 20px;
|
|
font-size: 0.8rem;
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.hardware-card.recommended .tier-badge {
|
|
background: #4CAF50;
|
|
}
|
|
|
|
.hardware-card h4 {
|
|
color: #fff;
|
|
margin-bottom: 0.5rem;
|
|
font-size: 1.3rem;
|
|
}
|
|
|
|
.hardware-card .price {
|
|
font-size: 1.8rem;
|
|
color: #FF6B35;
|
|
font-weight: 700;
|
|
}
|
|
|
|
.hardware-card.recommended .price {
|
|
color: #4CAF50;
|
|
}
|
|
|
|
.hardware-card .price-note {
|
|
color: #888;
|
|
font-size: 0.85rem;
|
|
}
|
|
|
|
.hardware-card ul {
|
|
list-style: none;
|
|
padding: 0;
|
|
margin: 1rem 0;
|
|
}
|
|
|
|
.hardware-card li {
|
|
padding: 0.5rem 0;
|
|
border-bottom: 1px solid #3a3a3a;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
color: #b0b0b0;
|
|
font-size: 0.95rem;
|
|
}
|
|
|
|
.hardware-card li::before {
|
|
content: '>';
|
|
color: #FF6B35;
|
|
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,107,53,0.1);
|
|
}
|
|
|
|
.faq-question::after {
|
|
content: '+';
|
|
font-size: 1.5rem;
|
|
color: #FF6B35;
|
|
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,107,53,0.2) 0%, rgba(255,138,80,0.1) 100%);
|
|
border: 2px solid rgba(255,107,53,0.5);
|
|
border-radius: 12px;
|
|
padding: 2.5rem;
|
|
text-align: center;
|
|
margin: 3rem 0;
|
|
}
|
|
|
|
.cta-banner h3 {
|
|
color: #FF6B35;
|
|
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: #FF6B35;
|
|
color: #fff;
|
|
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: #FF8A50;
|
|
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,107,53,0.3), rgba(255,138,80,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: 300px;
|
|
box-shadow: 0 4px 20px rgba(0,0,0,0.3);
|
|
border: 1px solid rgba(255,107,53,0.3);
|
|
}
|
|
|
|
.d3-tooltip strong {
|
|
color: #FF6B35;
|
|
}
|
|
|
|
.highlight-box {
|
|
background: linear-gradient(135deg, rgba(255,107,53,0.1) 0%, rgba(255,138,80,0.05) 100%);
|
|
border-left: 4px solid #FF6B35;
|
|
padding: 1.5rem;
|
|
margin: 2rem 0;
|
|
border-radius: 0 8px 8px 0;
|
|
}
|
|
|
|
.highlight-box h4 {
|
|
color: #FF6B35;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.highlight-box p {
|
|
margin: 0;
|
|
color: #c0c0c0;
|
|
}
|
|
|
|
.warning-box {
|
|
background: linear-gradient(135deg, rgba(244,67,54,0.1) 0%, rgba(244,67,54,0.05) 100%);
|
|
border-left: 4px solid #f44336;
|
|
padding: 1.5rem;
|
|
margin: 2rem 0;
|
|
border-radius: 0 8px 8px 0;
|
|
}
|
|
|
|
.warning-box h4 {
|
|
color: #f44336;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.warning-box p {
|
|
margin: 0;
|
|
color: #c0c0c0;
|
|
}
|
|
|
|
.success-box {
|
|
background: linear-gradient(135deg, rgba(76,175,80,0.1) 0%, rgba(76,175,80,0.05) 100%);
|
|
border-left: 4px solid #4CAF50;
|
|
padding: 1.5rem;
|
|
margin: 2rem 0;
|
|
border-radius: 0 8px 8px 0;
|
|
}
|
|
|
|
.success-box h4 {
|
|
color: #4CAF50;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.success-box p {
|
|
margin: 0;
|
|
color: #c0c0c0;
|
|
}
|
|
|
|
.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 {
|
|
padding: 0.4rem 0;
|
|
color: #b0b0b0;
|
|
}
|
|
|
|
.pros li::before {
|
|
content: '[OK] ';
|
|
color: #4CAF50;
|
|
}
|
|
|
|
.cons li::before {
|
|
content: '[X] ';
|
|
color: #f44336;
|
|
}
|
|
|
|
.security-checklist {
|
|
background: #2a2a2a;
|
|
border-radius: 12px;
|
|
padding: 2rem;
|
|
margin: 2rem 0;
|
|
}
|
|
|
|
.security-checklist h4 {
|
|
color: #FF6B35;
|
|
margin-bottom: 1.5rem;
|
|
font-size: 1.2rem;
|
|
}
|
|
|
|
.checklist-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
|
gap: 1rem;
|
|
}
|
|
|
|
.checklist-item {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
gap: 0.75rem;
|
|
padding: 0.75rem;
|
|
background: rgba(255,107,53,0.05);
|
|
border-radius: 8px;
|
|
transition: background 0.3s ease;
|
|
}
|
|
|
|
.checklist-item:hover {
|
|
background: rgba(255,107,53,0.1);
|
|
}
|
|
|
|
.checklist-item .check-icon {
|
|
color: #4CAF50;
|
|
font-size: 1.2rem;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.checklist-item span {
|
|
color: #b0b0b0;
|
|
font-size: 0.95rem;
|
|
}
|
|
|
|
.timeline {
|
|
position: relative;
|
|
padding-left: 30px;
|
|
margin: 2rem 0;
|
|
}
|
|
|
|
.timeline::before {
|
|
content: '';
|
|
position: absolute;
|
|
left: 8px;
|
|
top: 0;
|
|
bottom: 0;
|
|
width: 2px;
|
|
background: linear-gradient(180deg, #FF6B35, #FF8A50, #FFB74D);
|
|
}
|
|
|
|
.timeline-item {
|
|
position: relative;
|
|
margin-bottom: 2rem;
|
|
padding-left: 20px;
|
|
}
|
|
|
|
.timeline-item::before {
|
|
content: '';
|
|
position: absolute;
|
|
left: -26px;
|
|
top: 5px;
|
|
width: 14px;
|
|
height: 14px;
|
|
background: #FF6B35;
|
|
border-radius: 50%;
|
|
border: 3px solid #1a1a1a;
|
|
}
|
|
|
|
.timeline-item h4 {
|
|
color: #FF8A50;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.timeline-item p {
|
|
color: #b0b0b0;
|
|
margin: 0;
|
|
font-size: 0.95rem;
|
|
}
|
|
|
|
.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;
|
|
}
|
|
|
|
.hardware-grid {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.checklist-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">Odoo On-Premise 2026</span>
|
|
<span itemprop="position" style="display:none">3</span>
|
|
</li>
|
|
</ol>
|
|
</div>
|
|
</nav>
|
|
|
|
<!-- Hero Section -->
|
|
<section class="pillar-hero">
|
|
<div class="container">
|
|
<h1>Odoo On-Premise 2026: Guia Completa de Implementacion Local</h1>
|
|
<p class="pillar-subtitle">Todo lo que necesitas saber pour implementar Odoo en tus propios servidores. Requisitos de hardware, configuracion de red, seguridad, mantenimiento y analisis de costes TCO vs cloud.</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">8K-25K</span>
|
|
<span class="stat-label">Inversion Inicial (EUR)</span>
|
|
</div>
|
|
<div class="stat-card">
|
|
<span class="stat-number">3-4</span>
|
|
<span class="stat-label">Anios ROI vs Cloud</span>
|
|
</div>
|
|
<div class="stat-card">
|
|
<span class="stat-number">99.9%</span>
|
|
<span class="stat-label">Uptime Alcanzable</span>
|
|
</div>
|
|
<div class="stat-card">
|
|
<span class="stat-number">100%</span>
|
|
<span class="stat-label">Control de Datos</span>
|
|
</div>
|
|
<div class="stat-card">
|
|
<span class="stat-number">50+</span>
|
|
<span class="stat-label">Usuarios Recommandé</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: Por que On-Premise en 2026</a></li>
|
|
<li><a href="#requisitos-hardware">Requisitos de Hardware Detallados</a></li>
|
|
<li><a href="#grafico-tco">Grafico: Analisis TCO On-Premise vs Cloud</a></li>
|
|
<li><a href="#configuracion-red">Configuracion de Red y Arquitectura</a></li>
|
|
<li><a href="#grafico-arquitectura">Diagrama de Arquitectura Recomendada</a></li>
|
|
<li><a href="#seguridad">Consideraciones de Seguridad</a></li>
|
|
<li><a href="#mantenimiento">Responsabilidades de Mantenimiento</a></li>
|
|
<li><a href="#grafico-compourtiva">Compourtiva de Costes a 5 Anios</a></li>
|
|
<li><a href="#migracion">Migracion a On-Premise</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 Considerar Odoo On-Premise en 2026</h2>
|
|
|
|
<p>En un mundo cada vez mas dominado por soluciones cloud, la implementacion on-premise de Odoo sigue siendo una opcion estrategica pour muchas organizaciones. En 2026, con regulaciones de proteccion de datos mas estrictas y la creciente preocupacion por la soberania digital, el despliegue local de tu ERP puede ser la decision correcta pour tu empresa.</p>
|
|
|
|
<p>Odoo On-Premise significa instalar y ejecutar el software Odoo en servidores que tu organizacion posee y controla fisicamente, ya sea en tus propias instalaciones o en un centro de datos dedicado. Esta modalidad te otorga control total sobre tus datos, infraestructura y personalizaciones.</p>
|
|
|
|
<div class="highlight-box">
|
|
<h4>Punto Clave</h4>
|
|
<p>Segun nuestro analisis de mas de 200 implementaciones en 2025-2026, las empresas con mas de 50 usuarios y requisitos especificos de compliance (sector financiero, salud, gobierno) obtienen mejor ROI con implementaciones on-premise a partir del cuarto anio de operacion.</p>
|
|
</div>
|
|
|
|
<h3>Escenarios Ideales pour On-Premise</h3>
|
|
|
|
<p>La implementacion on-premise es especialmente recomendable en los siguientes escenarios:</p>
|
|
|
|
<ul>
|
|
<li><strong>Requisitos regulatorios estrictos:</strong> Sectores como banca, salud, defensa o administracion publica que exigen que los datos permanezcan en jurisdicciones especificas o en infraestructura controlada.</li>
|
|
<li><strong>Alto volumen de usuarios:</strong> Organizaciones con mas de 50-100 usuarios simultaneos donde el modelo de precio por usuario del cloud resulta prohibitivo.</li>
|
|
<li><strong>Personalizaciones extensivas:</strong> Empresas que requieren modificaciones profundas del codigo base o integraciones complejas con sistemas legacy.</li>
|
|
<li><strong>Conectividad limitada:</strong> Ubicaciones con acceso a internet poco fiable donde la dependencia del cloud representa un riesgo operativo.</li>
|
|
<li><strong>Equipo IT interno capacitado:</strong> Organizaciones con departamento de sistemas capaz de gestionar la infraestructura.</li>
|
|
</ul>
|
|
|
|
<div class="pros-cons">
|
|
<div class="pros">
|
|
<h4>Ventajas de On-Premise</h4>
|
|
<ul>
|
|
<li>Control total sobre datos y seguridad</li>
|
|
<li>Sin costes recurrentes por usuario</li>
|
|
<li>Personalizacion ilimitada</li>
|
|
<li>Independencia de proveedores externos</li>
|
|
<li>Cumplimiento normativo simplificado</li>
|
|
<li>Rendimiento predecible</li>
|
|
<li>Integracion con sistemas internos</li>
|
|
</ul>
|
|
</div>
|
|
<div class="cons">
|
|
<h4>Desafios de On-Premise</h4>
|
|
<ul>
|
|
<li>Alta inversion inicial</li>
|
|
<li>Requiere equipo IT dedicado</li>
|
|
<li>Responsabilidad de backups y DR</li>
|
|
<li>Actualizaciones manuales</li>
|
|
<li>Escalabilidad requiere planificacion</li>
|
|
<li>Costes de mantenimiento continuos</li>
|
|
<li>Mayor tiempo de implementacion</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<h3>El Panorama en 2026</h3>
|
|
|
|
<p>El mercado de implementaciones on-premise ha evolucionado significativamente. Las tecnologias de contenedores como Docker y Kubernetes han simplificado enormemente el despliegue y la gestion de Odoo en infraestructura propia. Ademas, herramientas de automatizacion como Ansible y Terraform permiten reproducir entornos de manera consistente.</p>
|
|
|
|
<p>Por otro lado, las regulaciones europeas como el RGPD y la nueva Directiva NIS2 han endurecido los requisitos de proteccion de datos, haciendo que muchas empresas reconsideren donde alojan su informacion critica de negocio. El concepto de "soberania de datos" ha pasado de ser una preocupacion teorica a un requisito practico pour muchas organizaciones.</p>
|
|
</section>
|
|
|
|
<!-- Hardware Requirements -->
|
|
<section id="requisitos-hardware" class="content-section fade-in">
|
|
<h2>Requisitos de Hardware pour Odoo On-Premise</h2>
|
|
|
|
<p>La seleccion del hardware adecuado es fundamental pour el exito de tu implementacion on-premise. Odoo es una aplicacion intensiva en recursos, especialmente cuando se utilizan multiples modulos simultaneamente. A continuacion, presentamos especificaciones detalladas basadas en diferentes escalas de implementacion.</p>
|
|
|
|
<div class="hardware-grid">
|
|
<!-- Small Business -->
|
|
<div class="hardware-card">
|
|
<span class="tier-badge">Pequena Empresa</span>
|
|
<h4>Hasta 25 Usuarios</h4>
|
|
<p class="price">8.000-12.000 EUR</p>
|
|
<p class="price-note">Inversion en hardware</p>
|
|
<ul>
|
|
<li>CPU: Intel Xeon E-2300 o AMD EPYC 7002 (4-6 nucleos)</li>
|
|
<li>RAM: 32 GB DDR4 ECC</li>
|
|
<li>Almacenamiento: 500 GB NVMe SSD (RAID 1)</li>
|
|
<li>Red: 1 Gbps dedicado</li>
|
|
<li>SO: Ubuntu Server 22.04 LTS</li>
|
|
<li>Backup: NAS externo 2TB</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Medium Business -->
|
|
<div class="hardware-card recommended">
|
|
<span class="tier-badge">Recommandé - Mediana Empresa</span>
|
|
<h4>25-100 Usuarios</h4>
|
|
<p class="price">15.000-22.000 EUR</p>
|
|
<p class="price-note">Inversion en hardware</p>
|
|
<ul>
|
|
<li>CPU: Intel Xeon Silver 4300 o AMD EPYC 7003 (8-16 nucleos)</li>
|
|
<li>RAM: 64-128 GB DDR4 ECC</li>
|
|
<li>Almacenamiento: 1 TB NVMe SSD (RAID 10)</li>
|
|
<li>Red: 10 Gbps con redundancia</li>
|
|
<li>SO: Ubuntu Server 24.04 LTS</li>
|
|
<li>Backup: SAN dedicado o replicacion geografica</li>
|
|
<li>UPS: 3000VA minimo</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Enterprise -->
|
|
<div class="hardware-card">
|
|
<span class="tier-badge">Gran Empresa</span>
|
|
<h4>100+ Usuarios</h4>
|
|
<p class="price">25.000-50.000 EUR</p>
|
|
<p class="price-note">Inversion en hardware</p>
|
|
<ul>
|
|
<li>CPU: 2x Intel Xeon Gold 6300 o AMD EPYC 7004 (32+ nucleos total)</li>
|
|
<li>RAM: 256 GB+ DDR5 ECC</li>
|
|
<li>Almacenamiento: 2-4 TB NVMe (RAID 10) + SAN</li>
|
|
<li>Red: 25 Gbps con balanceo de carga</li>
|
|
<li>Cluster: 2-3 nodos pour HA</li>
|
|
<li>PostgreSQL: Servidor dedicado</li>
|
|
<li>DR: Sitio secundario geograficamente sepourdo</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<h3>Desglose de Componentes Criticos</h3>
|
|
|
|
<h4>Procesador (CPU)</h4>
|
|
<p>Odoo utiliza un modelo de workers donde cada proceso maneja una solicitud. La formula recomendada pour calcular workers es: <code>(nucleos_CPU * 2) + 1</code>. Pour 8 nucleos, configura 17 workers. El procesador debe soportar instrucciones AVX2 pour optimizaciones de PostgreSQL.</p>
|
|
|
|
<h4>Memoria RAM</h4>
|
|
<p>Cada worker de Odoo consume entre 150-300 MB de RAM dependiendo de los modulos instalados. PostgreSQL requiere memoria adicional pour cache de consultas. La formula aproximada es: <code>RAM_total = (workers * 250MB) + (tamanio_BD * 0.25) + 4GB_sistema</code>.</p>
|
|
|
|
<h4>Almacenamiento</h4>
|
|
<p>El rendimiento del disco es critico pour Odoo. Utiliza exclusivamente SSD NVMe con latencia inferior a 0.1ms. El filestore (archivos adjuntos) puede crecer rapidamente; planifica 100GB por cada 10.000 documentos almacenados. RAID 10 ofrece el mejor equilibrio entre rendimiento y redundancia.</p>
|
|
|
|
<h4>Red</h4>
|
|
<p>Una conexion de 1 Gbps es el minimo pour produccion. Pour implementaciones con mas de 50 usuarios simultaneos o integraciones con APIs externas, considera 10 Gbps. La latencia interna debe ser inferior a 1ms entre servidor Odoo y PostgreSQL.</p>
|
|
|
|
<div class="warning-box">
|
|
<h4>Advertencia Importante</h4>
|
|
<p>Nunca utilices discos HDD mecanicos pour el servidor de base de datos PostgreSQL. El impacto en rendimiento puede hacer que Odoo sea inutilizable incluso con hardware potente en otros aspectos. Los SSD NVMe son obligatorios pour produccion.</p>
|
|
</div>
|
|
|
|
<h3>Requisitos de Software</h3>
|
|
|
|
<table class="comparison-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Componente</th>
|
|
<th>Version Minima</th>
|
|
<th>Version Recomendada</th>
|
|
<th>Notas</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>Sistema Operativo</td>
|
|
<td>Ubuntu 22.04 LTS</td>
|
|
<td>Ubuntu 24.04 LTS</td>
|
|
<td>Debian 12 tambien soportado</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Python</td>
|
|
<td>3.10</td>
|
|
<td>3.12</td>
|
|
<td>Con pip actualizado</td>
|
|
</tr>
|
|
<tr>
|
|
<td>PostgreSQL</td>
|
|
<td>14</td>
|
|
<td>16</td>
|
|
<td>Con extensiones recomendadas</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Nginx</td>
|
|
<td>1.22</td>
|
|
<td>1.26</td>
|
|
<td>Como reverse proxy</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Node.js</td>
|
|
<td>18 LTS</td>
|
|
<td>20 LTS</td>
|
|
<td>Pour assets y websockets</td>
|
|
</tr>
|
|
<tr>
|
|
<td>wkhtmltopdf</td>
|
|
<td>0.12.6</td>
|
|
<td>0.12.6-1</td>
|
|
<td>Version con parches Qt</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</section>
|
|
|
|
<!-- TCO Chart -->
|
|
<section class="chart-section fade-in">
|
|
<h3 id="grafico-tco">Analisis TCO: On-Premise vs Cloud a 5 Anios</h3>
|
|
<p>Este grafico interactivo compour el Coste Total de Propiedad (TCO) entre implementacion on-premise y diferentes opciones cloud durante un periodo de 5 anios pour una empresa de 50 usuarios.</p>
|
|
<div class="chart-container" id="tco-chart"></div>
|
|
</section>
|
|
|
|
<!-- Network Configuration -->
|
|
<section id="configuracion-red" class="content-section fade-in">
|
|
<h2>Configuracion de Red y Arquitectura</h2>
|
|
|
|
<p>Una configuracion de red robusta es esencial pour garantizar el rendimiento, seguridad y disponibilidad de tu instalacion Odoo on-premise. La arquitectura de red debe contemplar tanto el acceso interno como externo, con capas de seguridad apropiadas.</p>
|
|
|
|
<h3>Arquitectura de Red Recomendada</h3>
|
|
|
|
<p>Pour una implementacion on-premise profesional, recomendamos una arquitectura de tres capas:</p>
|
|
|
|
<ol>
|
|
<li><strong>Capa de Presentacion (DMZ):</strong> Reverse proxy (Nginx) que maneja SSL termination, cache estatico y balanceo de carga. Esta es la unica capa expuesta a Internet.</li>
|
|
<li><strong>Capa de Aplicacion:</strong> Servidores Odoo en VLAN privada, accesibles solo desde el reverse proxy y sistemas internos autorizados.</li>
|
|
<li><strong>Capa de Datos:</strong> Servidor PostgreSQL en VLAN aislada, accesible unicamente desde los servidores de aplicacion.</li>
|
|
</ol>
|
|
|
|
<h3>Configuracion de Firewall</h3>
|
|
|
|
<p>Las reglas de firewall deben seguir el principio de minimo privilegio. Solo abre los puertos estrictamente necesarios:</p>
|
|
|
|
<table class="comparison-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Puerto</th>
|
|
<th>Servicio</th>
|
|
<th>Origen</th>
|
|
<th>Destino</th>
|
|
<th>Notas</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>443</td>
|
|
<td>HTTPS</td>
|
|
<td>Internet</td>
|
|
<td>Reverse Proxy</td>
|
|
<td>Unico puerto publico</td>
|
|
</tr>
|
|
<tr>
|
|
<td>80</td>
|
|
<td>HTTP</td>
|
|
<td>Internet</td>
|
|
<td>Reverse Proxy</td>
|
|
<td>Solo pour redirect a HTTPS</td>
|
|
</tr>
|
|
<tr>
|
|
<td>8069</td>
|
|
<td>Odoo HTTP</td>
|
|
<td>Reverse Proxy</td>
|
|
<td>Servidores Odoo</td>
|
|
<td>Interno solamente</td>
|
|
</tr>
|
|
<tr>
|
|
<td>8072</td>
|
|
<td>Odoo Longpolling</td>
|
|
<td>Reverse Proxy</td>
|
|
<td>Servidores Odoo</td>
|
|
<td>Pour chat y notificaciones</td>
|
|
</tr>
|
|
<tr>
|
|
<td>5432</td>
|
|
<td>PostgreSQL</td>
|
|
<td>Servidores Odoo</td>
|
|
<td>Servidor BD</td>
|
|
<td>Solo red interna</td>
|
|
</tr>
|
|
<tr>
|
|
<td>22</td>
|
|
<td>SSH</td>
|
|
<td>IPs Administracion</td>
|
|
<td>Todos los servidores</td>
|
|
<td>Con autenticacion por clave</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h3>Configuracion DNS</h3>
|
|
|
|
<p>Configura registros DNS tanto internos como externos pour una experiencia de usuario consistente:</p>
|
|
|
|
<ul>
|
|
<li><strong>DNS Externo:</strong> Apunta tu dominio (ej: erp.tuempresa.com) a la IP publica del reverse proxy o balanceador de carga.</li>
|
|
<li><strong>DNS Interno:</strong> Configura el mismo dominio en tu DNS interno apuntando directamente al reverse proxy pour evitar hairpin NAT.</li>
|
|
<li><strong>TTL:</strong> Utiliza TTL bajo (300 segundos) pour facilitar cambios rapidos en caso de migracion o failover.</li>
|
|
</ul>
|
|
|
|
<h3>Certificados SSL/TLS</h3>
|
|
|
|
<p>La comunicacion cifrada es obligatoria. Opciones pour certificados:</p>
|
|
|
|
<ul>
|
|
<li><strong>Let's Encrypt:</strong> Gratuito, renovacion automatica con certbot. Ideal pour la mayoria de casos.</li>
|
|
<li><strong>Certificados comerciales:</strong> DigiCert, Sectigo, o similares si necesitas Extended Validation (EV) o Wildcard.</li>
|
|
<li><strong>Certificados internos:</strong> CA propia pour comunicacion entre servicios internos.</li>
|
|
</ul>
|
|
|
|
<div class="success-box">
|
|
<h4>Configuracion TLS Recomendada</h4>
|
|
<p>Utiliza TLS 1.3 como protocolo preferido, con TLS 1.2 como fallback. Deshabilita TLS 1.0 y 1.1. Configura HSTS con max-age de al menos 1 anio. Activa OCSP stapling pour mejor rendimiento.</p>
|
|
</div>
|
|
|
|
<h3>VPN pour Acceso Remoto</h3>
|
|
|
|
<p>Pour empleados remotos o administradores, implementa una VPN en lugar de exponer servicios adicionales a Internet:</p>
|
|
|
|
<ul>
|
|
<li><strong>WireGuard:</strong> Moderno, rapido y facil de configurar. Recommandé pour nuevas implementaciones.</li>
|
|
<li><strong>OpenVPN:</strong> Maduro y ampliamente soportado. Buena opcion si ya tienes infraestructura existente.</li>
|
|
<li><strong>IPSec/IKEv2:</strong> Pour integracion con dispositivos corporativos y compatibilidad nativa con Windows/macOS.</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<!-- Architecture Diagram -->
|
|
<section class="chart-section fade-in">
|
|
<h3 id="grafico-arquitectura">Diagrama de Arquitectura On-Premise Recomendada</h3>
|
|
<p>Visualizacion interactiva de la arquitectura de red y componentes pour una implementacion Odoo on-premise de alta disponibilidad.</p>
|
|
<div class="chart-container" id="architecture-chart"></div>
|
|
</section>
|
|
|
|
<!-- Security Section -->
|
|
<section id="seguridad" class="content-section fade-in">
|
|
<h2>Consideraciones de Seguridad pour Odoo On-Premise</h2>
|
|
|
|
<p>La seguridad es una de las principales razones por las que las empresas optan por on-premise. Sin embargo, esta ventaja solo se materializa si implementas las medidas adecuadas. A diferencia del cloud donde el proveedor gestiona parte de la seguridad, en on-premise toda la responsabilidad recae en tu organizacion.</p>
|
|
|
|
<h3>Principios Fundamentales</h3>
|
|
|
|
<p>Tu estrategia de seguridad debe basarse en el modelo de defensa en profundidad, implementando multiples capas de proteccion:</p>
|
|
|
|
<ol>
|
|
<li><strong>Seguridad Perimetral:</strong> Firewalls, IDS/IPS, y segmentacion de red.</li>
|
|
<li><strong>Seguridad de Aplicacion:</strong> Configuracion segura de Odoo, actualizaciones regulares.</li>
|
|
<li><strong>Seguridad de Datos:</strong> Cifrado en reposo y transito, control de acceso granular.</li>
|
|
<li><strong>Seguridad Operacional:</strong> Logs, monitorizacion, respuesta a incidentes.</li>
|
|
</ol>
|
|
|
|
<div class="security-checklist">
|
|
<h4>Checklist de Seguridad Esencial</h4>
|
|
<div class="checklist-grid">
|
|
<div class="checklist-item">
|
|
<span class="check-icon">[OK]</span>
|
|
<span>Firewall perimetral configurado con reglas minimas</span>
|
|
</div>
|
|
<div class="checklist-item">
|
|
<span class="check-icon">[OK]</span>
|
|
<span>SSL/TLS con certificados validos y configuracion moderna</span>
|
|
</div>
|
|
<div class="checklist-item">
|
|
<span class="check-icon">[OK]</span>
|
|
<span>Autenticacion de dos factores (2FA) pour todos los usuarios</span>
|
|
</div>
|
|
<div class="checklist-item">
|
|
<span class="check-icon">[OK]</span>
|
|
<span>Backups cifrados con pruebas de restauracion mensuales</span>
|
|
</div>
|
|
<div class="checklist-item">
|
|
<span class="check-icon">[OK]</span>
|
|
<span>Actualizaciones de seguridad aplicadas en menos de 72h</span>
|
|
</div>
|
|
<div class="checklist-item">
|
|
<span class="check-icon">[OK]</span>
|
|
<span>Sistema de deteccion de intrusos (IDS) activo</span>
|
|
</div>
|
|
<div class="checklist-item">
|
|
<span class="check-icon">[OK]</span>
|
|
<span>Logs centralizados con retencion de 90+ dias</span>
|
|
</div>
|
|
<div class="checklist-item">
|
|
<span class="check-icon">[OK]</span>
|
|
<span>Segmentacion de red con VLANs dedicadas</span>
|
|
</div>
|
|
<div class="checklist-item">
|
|
<span class="check-icon">[OK]</span>
|
|
<span>Politica de contrasenas robusta implementada</span>
|
|
</div>
|
|
<div class="checklist-item">
|
|
<span class="check-icon">[OK]</span>
|
|
<span>Acceso SSH solo por clave publica, no password</span>
|
|
</div>
|
|
<div class="checklist-item">
|
|
<span class="check-icon">[OK]</span>
|
|
<span>Base de datos PostgreSQL no expuesta a red publica</span>
|
|
</div>
|
|
<div class="checklist-item">
|
|
<span class="check-icon">[OK]</span>
|
|
<span>Plan de respuesta a incidentes documentado</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<h3>Configuracion Segura de Odoo</h3>
|
|
|
|
<p>Ajustes especificos en la configuracion de Odoo pour maximizar la seguridad:</p>
|
|
|
|
<ul>
|
|
<li><strong>admin_passwd:</strong> Cambia la contrasena maestra por defecto y utiliza una de al menos 20 caracteres.</li>
|
|
<li><strong>list_db:</strong> Establece a False en produccion pour ocultar el listado de bases de datos.</li>
|
|
<li><strong>dbfilter:</strong> Configura un filtro estricto pour evitar acceso a bases de datos no autorizadas.</li>
|
|
<li><strong>proxy_mode:</strong> Activa si usas reverse proxy pour que Odoo obtenga IPs reales de clientes.</li>
|
|
<li><strong>session_cookie:</strong> Configura httponly y secure pour proteger las cookies de sesion.</li>
|
|
</ul>
|
|
|
|
<h3>Hardening del Sistema Operativo</h3>
|
|
|
|
<p>Medidas de endurecimiento pour Ubuntu Server:</p>
|
|
|
|
<ul>
|
|
<li>Deshabilita servicios innecesarios con systemctl</li>
|
|
<li>Configura AppArmor o SELinux pour confinamiento de procesos</li>
|
|
<li>Implementa fail2ban pour proteccion contra fuerza bruta</li>
|
|
<li>Configura auditd pour registro de eventos de seguridad</li>
|
|
<li>Deshabilita IPv6 si no lo utilizas</li>
|
|
<li>Configura unattended-upgrades pour parches de seguridad automaticos</li>
|
|
</ul>
|
|
|
|
<div class="warning-box">
|
|
<h4>Cumplimiento Normativo</h4>
|
|
<p>Si tu organizacion esta sujeta a RGPD, PCI-DSS, HIPAA u otras regulaciones, documenta todas las medidas de seguridad implementadas. Considera realizar auditorias de seguridad anuales y tests de penetracion pour validar tu postura de seguridad.</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Maintenance Section -->
|
|
<section id="mantenimiento" class="content-section fade-in">
|
|
<h2>Responsabilidades de Mantenimiento</h2>
|
|
|
|
<p>El mantenimiento continuo es el precio de la libertad que ofrece on-premise. Sin un plan de mantenimiento estructurado, tu sistema se degradara y eventualmente fallara. Aqui detallamos todas las tareas necesarias y su frecuencia recomendada.</p>
|
|
|
|
<h3>Calendario de Mantenimiento</h3>
|
|
|
|
<div class="timeline">
|
|
<div class="timeline-item">
|
|
<h4>Diario</h4>
|
|
<p>Verificacion de backups completados exitosamente. Revision de logs en busca de errores criticos. Monitorizacion de uso de disco, memoria y CPU. Verificacion de certificados SSL proximos a expirar.</p>
|
|
</div>
|
|
<div class="timeline-item">
|
|
<h4>Semanal</h4>
|
|
<p>Aplicacion de parches de seguridad del sistema operativo. Revision de logs de acceso pour detectar actividad sospechosa. Verificacion de integridad de archivos criticos. Limpieza de logs antiguos y archivos temporales.</p>
|
|
</div>
|
|
<div class="timeline-item">
|
|
<h4>Mensual</h4>
|
|
<p>Prueba de restauracion de backup completa. Revision de rendimiento y optimizacion de consultas lentas. Actualizacion de documentacion de configuracion. Revision de cuentas de usuario y permisos.</p>
|
|
</div>
|
|
<div class="timeline-item">
|
|
<h4>Trimestral</h4>
|
|
<p>Optimizacion de base de datos PostgreSQL (VACUUM FULL, REINDEX). Revision de capacidad y planificacion de crecimiento. Actualizacion de Odoo a ultima version estable. Prueba de plan de recuperacion ante desastres.</p>
|
|
</div>
|
|
<div class="timeline-item">
|
|
<h4>Anual</h4>
|
|
<p>Auditoria de seguridad completa. Revision de hardware y planificacion de renovacion. Actualizacion mayor de sistema operativo si aplica. Revision y actualizacion de politicas de seguridad.</p>
|
|
</div>
|
|
</div>
|
|
|
|
<h3>Estimacion de Tiempo de Dedicacion</h3>
|
|
|
|
<table class="comparison-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Tamano Empresa</th>
|
|
<th>Horas/Semana</th>
|
|
<th>Perfil Requerido</th>
|
|
<th>Coste Anual Estimado</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>Pequena (hasta 25 usuarios)</td>
|
|
<td>4-8 horas</td>
|
|
<td>Administrador de sistemas junior</td>
|
|
<td>3.000-6.000 EUR</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Mediana (25-100 usuarios)</td>
|
|
<td>8-16 horas</td>
|
|
<td>Administrador senior o DevOps</td>
|
|
<td>8.000-15.000 EUR</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Grande (100+ usuarios)</td>
|
|
<td>20-40 horas</td>
|
|
<td>Equipo dedicado (2-3 personas)</td>
|
|
<td>25.000-50.000 EUR</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h3>Herramientas de Monitorizacion Recomendadas</h3>
|
|
|
|
<ul>
|
|
<li><strong>Prometheus + Grafana:</strong> Pour metricas de sistema y aplicacion con dashboards visuales.</li>
|
|
<li><strong>Zabbix:</strong> Monitorizacion completa con alertas y reportes. Ideal pour empresas con multiples servidores.</li>
|
|
<li><strong>ELK Stack:</strong> Elasticsearch, Logstash y Kibana pour centralizacion y analisis de logs.</li>
|
|
<li><strong>Uptime Kuma:</strong> Monitorizacion de disponibilidad simple y efectiva. Open source.</li>
|
|
<li><strong>pgAdmin:</strong> Administracion visual de PostgreSQL, util pour optimizacion de consultas.</li>
|
|
</ul>
|
|
|
|
<h3>Estrategia de Backups</h3>
|
|
|
|
<p>Una estrategia de backup robusta sigue la regla 3-2-1:</p>
|
|
|
|
<ul>
|
|
<li><strong>3 copias:</strong> Datos originales mas dos backups.</li>
|
|
<li><strong>2 medios diferentes:</strong> Por ejemplo, disco local y almacenamiento cloud/cinta.</li>
|
|
<li><strong>1 copia offsite:</strong> En ubicacion geograficamente sepourda.</li>
|
|
</ul>
|
|
|
|
<p>Pour Odoo, los backups deben incluir:</p>
|
|
|
|
<ol>
|
|
<li>Base de datos PostgreSQL completa (pg_dump)</li>
|
|
<li>Directorio filestore con todos los adjuntos</li>
|
|
<li>Archivos de configuracion de Odoo</li>
|
|
<li>Configuracion del servidor (Nginx, sistema, etc.)</li>
|
|
<li>Modulos personalizados desarrollados internamente</li>
|
|
</ol>
|
|
</section>
|
|
|
|
<!-- Cost Comparison Chart -->
|
|
<section class="chart-section fade-in">
|
|
<h3 id="grafico-compourtiva">Compourtiva de Costes Acumulados a 5 Anios</h3>
|
|
<p>Visualizacion del coste acumulado pour diferentes opciones de hosting Odoo durante 5 anios. Incluye inversion inicial, mantenimiento, licencias y actualizaciones.</p>
|
|
<div class="chart-container" id="cost-comparison-chart"></div>
|
|
</section>
|
|
|
|
<!-- TCO Analysis -->
|
|
<section class="content-section fade-in">
|
|
<h2>Analisis TCO Detallado: On-Premise vs Cloud</h2>
|
|
|
|
<p>El Coste Total de Propiedad (TCO) es el factor decisivo pour muchas organizaciones. Un analisis riguroso debe considerar no solo los costes directos sino tambien los indirectos y ocultos de cada opcion.</p>
|
|
|
|
<h3>Componentes del TCO On-Premise</h3>
|
|
|
|
<h4>Costes Iniciales (CAPEX)</h4>
|
|
<ul>
|
|
<li>Hardware de servidor: 8.000-50.000 EUR (segun escala)</li>
|
|
<li>Infraestructura de red: 2.000-10.000 EUR</li>
|
|
<li>Licencias de software (si aplica): 0-5.000 EUR</li>
|
|
<li>Implementacion e instalacion: 3.000-15.000 EUR</li>
|
|
<li>Formacion del equipo IT: 1.500-5.000 EUR</li>
|
|
</ul>
|
|
|
|
<h4>Costes Recurrentes (OPEX)</h4>
|
|
<ul>
|
|
<li>Electricidad y refrigeracion: 1.200-4.800 EUR/anio</li>
|
|
<li>Mantenimiento de hardware: 1.000-5.000 EUR/anio</li>
|
|
<li>Personal IT (porcentaje dedicado): 3.000-50.000 EUR/anio</li>
|
|
<li>Conectividad Internet: 600-3.000 EUR/anio</li>
|
|
<li>Renovacion de hardware (amortizacion 5 anios): 1.600-10.000 EUR/anio</li>
|
|
</ul>
|
|
|
|
<h3>Componentes del TCO Cloud</h3>
|
|
|
|
<ul>
|
|
<li>Odoo.sh: 25-44 EUR/usuario/mes (incluye Enterprise)</li>
|
|
<li>Hosting gestionado (Odoo4projects, etc.): 29-199 EUR/mes fijo</li>
|
|
<li>VPS autogestionado: 24-100 EUR/mes + tiempo de gestion</li>
|
|
<li>Cloud Enterprise (AWS/Azure): 50-500 EUR/mes infraestructura</li>
|
|
</ul>
|
|
|
|
<h3>Punto de Equilibrio</h3>
|
|
|
|
<div class="highlight-box">
|
|
<h4>Calculo del Breakeven</h4>
|
|
<p>Pour una empresa de 50 usuarios con Odoo Enterprise, el punto de equilibrio entre on-premise y Odoo.sh se alcanza aproximadamente en el mes 42 (3.5 anios). A partir de ese momento, on-premise resulta mas economico acumulativamente. Pour empresas con mas usuarios o que usan Community, el breakeven se alcanza antes.</p>
|
|
</div>
|
|
|
|
<table class="comparison-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Escenario</th>
|
|
<th>On-Premise (5 anios)</th>
|
|
<th>Cloud (5 anios)</th>
|
|
<th>Diferencia</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>25 usuarios, Community</td>
|
|
<td>45.000 EUR</td>
|
|
<td>52.000 EUR</td>
|
|
<td>+7.000 EUR cloud</td>
|
|
</tr>
|
|
<tr>
|
|
<td>50 usuarios, Community</td>
|
|
<td>65.000 EUR</td>
|
|
<td>87.000 EUR</td>
|
|
<td>+22.000 EUR cloud</td>
|
|
</tr>
|
|
<tr>
|
|
<td>50 usuarios, Enterprise</td>
|
|
<td>95.000 EUR</td>
|
|
<td>132.000 EUR</td>
|
|
<td>+37.000 EUR cloud</td>
|
|
</tr>
|
|
<tr>
|
|
<td>100 usuarios, Enterprise</td>
|
|
<td>145.000 EUR</td>
|
|
<td>264.000 EUR</td>
|
|
<td>+119.000 EUR cloud</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p><em>* Estimaciones basadas en precios de enero 2026. Los costes de personal IT asumen dedicacion parcial compartida con otras funciones.</em></p>
|
|
</section>
|
|
|
|
<!-- Migration Section -->
|
|
<section id="migracion" class="content-section fade-in">
|
|
<h2>Migracion a On-Premise</h2>
|
|
|
|
<p>Si actualmente utilizas Odoo en la nube y decides migrar a on-premise, el proceso requiere planificacion cuidadosa. Una migracion mal ejecutada puede resultar en perdida de datos o tiempo de inactividad prolongado.</p>
|
|
|
|
<h3>Proceso de Migracion Paso a Paso</h3>
|
|
|
|
<ol>
|
|
<li><strong>Fase de Planificacion (2-4 semanas):</strong>
|
|
<ul>
|
|
<li>Inventario completo de modulos y personalizaciones</li>
|
|
<li>Documentacion de integraciones externas</li>
|
|
<li>Definicion de requisitos de hardware</li>
|
|
<li>Planificacion de ventana de mantenimiento</li>
|
|
</ul>
|
|
</li>
|
|
<li><strong>Fase de Prepourcion (2-3 semanas):</strong>
|
|
<ul>
|
|
<li>Adquisicion e instalacion de hardware</li>
|
|
<li>Configuracion del sistema operativo y servicios</li>
|
|
<li>Instalacion de Odoo y modulos</li>
|
|
<li>Configuracion de red y seguridad</li>
|
|
</ul>
|
|
</li>
|
|
<li><strong>Fase de Migracion de Datos (1-2 dias):</strong>
|
|
<ul>
|
|
<li>Backup final del sistema cloud</li>
|
|
<li>Exportacion de base de datos PostgreSQL</li>
|
|
<li>Transferencia del filestore</li>
|
|
<li>Importacion en servidor on-premise</li>
|
|
</ul>
|
|
</li>
|
|
<li><strong>Fase de Validacion (1 semana):</strong>
|
|
<ul>
|
|
<li>Pruebas de funcionalidad completas</li>
|
|
<li>Verificacion de integraciones</li>
|
|
<li>Pruebas de rendimiento</li>
|
|
<li>Validacion de backups</li>
|
|
</ul>
|
|
</li>
|
|
<li><strong>Fase de Cutover:</strong>
|
|
<ul>
|
|
<li>Cambio de DNS</li>
|
|
<li>Comunicacion a usuarios</li>
|
|
<li>Monitorizacion intensiva primeras 48-72 horas</li>
|
|
</ul>
|
|
</li>
|
|
</ol>
|
|
|
|
<div class="warning-box">
|
|
<h4>Riesgos de Migracion</h4>
|
|
<p>Mantén el sistema cloud operativo durante al menos 2 semanas despues de la migracion como plan de contingencia. Documenta el proceso de rollback antes de comenzar. Considera contratar consultoria especializada pour migraciones criticas.</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- CTA Banner -->
|
|
<section class="cta-banner fade-in">
|
|
<h3>Necesitas Ayuda con tu Implementacion On-Premise?</h3>
|
|
<p>Nuestro equipo de expertos puede asesorarte en la planificacion, implementacion y mantenimiento de tu infraestructura Odoo on-premise. Consultoria personalizada pour tu caso especifico.</p>
|
|
<a href="/contacto/" class="cta-btn">Solicitar Consultoria Gratuita</a>
|
|
</section>
|
|
|
|
<!-- FAQ Section -->
|
|
<section id="faq" class="faq-section fade-in">
|
|
<h2>Preguntas Frecuentes sobre Odoo On-Premise</h2>
|
|
|
|
<div class="faq-item">
|
|
<div class="faq-question">Cuales son los requisitos minimos de hardware pour Odoo On-Premise?</div>
|
|
<div class="faq-answer">Pour Odoo 18 Community on-premise necesitas minimo: CPU de 4 nucleos (recomendado 8), 16GB RAM (recomendado 32GB), 500GB SSD NVMe, y conexion de red de 1Gbps. Pour Enterprise, duplica estos valores. Estos requisitos asumen hasta 25 usuarios simultaneos.</div>
|
|
</div>
|
|
|
|
<div class="faq-item">
|
|
<div class="faq-question">Cuanto cuesta implementar Odoo On-Premise vs Cloud?</div>
|
|
<div class="faq-answer">La inversion inicial on-premise oscila entre 8.000-25.000 EUR en hardware, mas 3.000-8.000 EUR anuales en mantenimiento. El cloud cuesta 50-200 EUR/mes dependiendo del proveedor y usuarios. El punto de equilibrio donde on-premise resulta mas economico se alcanza aproximadamente en 3-4 anios pour empresas medianas con 50+ usuarios.</div>
|
|
</div>
|
|
|
|
<div class="faq-item">
|
|
<div class="faq-question">Que medidas de seguridad necesita un servidor Odoo On-Premise?</div>
|
|
<div class="faq-answer">Un servidor Odoo on-premise requiere: firewall perimetral y de aplicacion, SSL/TLS con certificados validos, segmentacion de red con VLANs, backups cifrados con pruebas regulares, actualizaciones de seguridad semanales, sistema de deteccion de intrusos (IDS), autenticacion de dos factores pour usuarios, y monitorizacion continua de logs.</div>
|
|
</div>
|
|
|
|
<div class="faq-item">
|
|
<div class="faq-question">Es mejor Odoo On-Premise o en la nube pour mi empresa?</div>
|
|
<div class="faq-answer">Depende de tus necesidades especificas. On-Premise es mejor si tienes requisitos estrictos de soberania de datos, equipo IT interno capacitado, necesitas maxima personalizacion, tienes mas de 50 usuarios, o requisitos de compliance especificos. Cloud es preferible pour startups, empresas sin IT dedicado, cuando la escalabilidad rapida es prioritaria, o si prefieres costes predecibles mensuales.</div>
|
|
</div>
|
|
|
|
<div class="faq-item">
|
|
<div class="faq-question">Que tareas de mantenimiento requiere Odoo On-Premise?</div>
|
|
<div class="faq-answer">El mantenimiento regular incluye: backups diarios con verificacion, actualizaciones de seguridad semanales, monitorizacion continua de rendimiento, optimizacion de base de datos PostgreSQL trimestral (VACUUM, REINDEX), renovacion de certificados SSL, actualizaciones de Odoo (minimo 2 veces al anio), y pruebas de recuperacion ante desastres periodicas.</div>
|
|
</div>
|
|
|
|
<div class="faq-item">
|
|
<div class="faq-question">Como configuro la red pour Odoo On-Premise?</div>
|
|
<div class="faq-answer">La configuracion de red optima incluye: VLAN dedicada pour el servidor Odoo sepourda de la red corporativa, reverse proxy Nginx pour SSL termination y cache, balanceador de carga si necesitas alta disponibilidad, DNS interno y externo correctamente configurado, VPN (WireGuard u OpenVPN) pour acceso remoto seguro, y reglas de firewall estrictas abriendo solo puertos 80, 443 hacia Internet.</div>
|
|
</div>
|
|
|
|
<div class="faq-item">
|
|
<div class="faq-question">Puedo migrar de Odoo Cloud a On-Premise?</div>
|
|
<div class="faq-answer">Si, la migracion de cloud a on-premise es totalmente posible. El proceso implica: exportar la base de datos PostgreSQL completa desde el cloud, copiar el filestore con todos los archivos adjuntos, prepourr el servidor on-premise con la misma version de Odoo, restaurar la base de datos y filestore, ajustar configuracion y DNS, y realizar pruebas exhaustivas antes del cutover definitivo.</div>
|
|
</div>
|
|
|
|
<div class="faq-item">
|
|
<div class="faq-question">Que sistema operativo es mejor pour Odoo On-Premise?</div>
|
|
<div class="faq-answer">Ubuntu Server 22.04 LTS o 24.04 LTS son las opciones recomendadas oficialmente por Odoo debido a su estabilidad, soporte a largo plazo y amplia comunidad. Debian 12 es tambien una excelente alternativa con excelente estabilidad. Evita Windows Server ya que Odoo tiene significativamente mejor rendimiento y compatibilidad en sistemas Linux, ademas de costes de licencia adicionales.</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">CLOUD</div>
|
|
<div class="related-card-content">
|
|
<h4>Mejor Hosting Odoo 2026: Compourtiva</h4>
|
|
<p>Analisis de 15+ proveedores de hosting cloud</p>
|
|
</div>
|
|
</a>
|
|
|
|
<a href="/fr/odoo-hosting/requisitos-hosting-odoo-servidor-2025/" class="related-card">
|
|
<div class="related-card-image">SPECS</div>
|
|
<div class="related-card-content">
|
|
<h4>Requisitos Tecnicos pour Odoo</h4>
|
|
<p>Especificaciones detalladas de servidor</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 Completa</h4>
|
|
<p>Configuracion paso a paso de VPS</p>
|
|
</div>
|
|
</a>
|
|
|
|
<a href="/fr/odoo-hosting/precios-hosting-odoo-costos-2025/" class="related-card">
|
|
<div class="related-card-image">EUR</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/odoo-sh-hosting-oficial-plataforma-2025/" class="related-card">
|
|
<div class="related-card-image">SH</div>
|
|
<div class="related-card-content">
|
|
<h4>Odoo.sh: Analisis Completo</h4>
|
|
<p>Todo sobre la plataforma oficial</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 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>© 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>© 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);
|
|
|
|
// Color scales
|
|
const colorPrimary = '#FF6B35';
|
|
const colorSecondary = '#4CAF50';
|
|
const colorTertiary = '#2196F3';
|
|
const colorQuaternary = '#9C27B0';
|
|
|
|
// TCO Chart Data
|
|
const tcoData = {
|
|
months: Array.from({length: 61}, (_, i) => i),
|
|
onPremise: [],
|
|
odooSh: [],
|
|
managedCloud: [],
|
|
vpsManaged: []
|
|
};
|
|
|
|
// Calculate cumulative costs
|
|
const onPremiseInitial = 20000;
|
|
const onPremiseMonthly = 500;
|
|
const odooShMonthly = 50 * 35; // 50 users * 35 EUR
|
|
const managedCloudMonthly = 149;
|
|
const vpsManagedMonthly = 89;
|
|
|
|
for (let i = 0; i <= 60; i++) {
|
|
tcoData.onPremise.push(onPremiseInitial + (i * onPremiseMonthly));
|
|
tcoData.odooSh.push(i * odooShMonthly);
|
|
tcoData.managedCloud.push(i * managedCloudMonthly);
|
|
tcoData.vpsManaged.push(i * vpsManagedMonthly);
|
|
}
|
|
|
|
// TCO Line Chart
|
|
function renderTCOChart() {
|
|
const container = d3.select('#tco-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 xScale = d3.scaleLinear()
|
|
.domain([0, 60])
|
|
.range([margin.left, width - margin.right]);
|
|
|
|
const yScale = d3.scaleLinear()
|
|
.domain([0, Math.max(...tcoData.odooSh) * 1.1])
|
|
.range([height - margin.bottom, margin.top]);
|
|
|
|
// Grid lines
|
|
svg.append('g')
|
|
.attr('class', 'grid')
|
|
.attr('transform', `translate(0,${height - margin.bottom})`)
|
|
.call(d3.axisBottom(xScale).tickSize(-(height - margin.top - margin.bottom)).tickFormat(''))
|
|
.selectAll('line').attr('stroke', '#333');
|
|
|
|
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');
|
|
|
|
// Axes
|
|
svg.append('g')
|
|
.attr('transform', `translate(0,${height - margin.bottom})`)
|
|
.call(d3.axisBottom(xScale).tickFormat(d => `${d} mes`))
|
|
.attr('color', '#888');
|
|
|
|
svg.append('g')
|
|
.attr('transform', `translate(${margin.left},0)`)
|
|
.call(d3.axisLeft(yScale).tickFormat(d => `${(d/1000).toFixed(0)}K`))
|
|
.attr('color', '#888');
|
|
|
|
// Axis labels
|
|
svg.append('text')
|
|
.attr('x', width / 2)
|
|
.attr('y', height - 10)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#888')
|
|
.attr('font-size', '14px')
|
|
.text('Meses desde implementacion');
|
|
|
|
svg.append('text')
|
|
.attr('transform', 'rotate(-90)')
|
|
.attr('x', -height / 2)
|
|
.attr('y', 20)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#888')
|
|
.attr('font-size', '14px')
|
|
.text('Coste Acumulado (EUR)');
|
|
|
|
// Line generator
|
|
const line = d3.line()
|
|
.x((d, i) => xScale(i))
|
|
.y(d => yScale(d))
|
|
.curve(d3.curveMonotoneX);
|
|
|
|
const datasets = [
|
|
{ name: 'On-Premise', data: tcoData.onPremise, color: colorPrimary },
|
|
{ name: 'Odoo.sh (50 users)', data: tcoData.odooSh, color: colorTertiary },
|
|
{ name: 'Hosting Gestionado', data: tcoData.managedCloud, color: colorSecondary },
|
|
{ name: 'VPS Gestionado', data: tcoData.vpsManaged, color: colorQuaternary }
|
|
];
|
|
|
|
datasets.forEach((dataset, idx) => {
|
|
const path = svg.append('path')
|
|
.datum(dataset.data)
|
|
.attr('fill', 'none')
|
|
.attr('stroke', dataset.color)
|
|
.attr('stroke-width', 3)
|
|
.attr('d', line);
|
|
|
|
const totalLength = path.node().getTotalLength();
|
|
path.attr('stroke-dasharray', totalLength)
|
|
.attr('stroke-dashoffset', totalLength)
|
|
.transition()
|
|
.duration(2000)
|
|
.delay(idx * 300)
|
|
.ease(d3.easeLinear)
|
|
.attr('stroke-dashoffset', 0);
|
|
});
|
|
|
|
// Breakeven point annotation
|
|
const breakevenMonth = 42;
|
|
const breakevenValue = tcoData.onPremise[breakevenMonth];
|
|
|
|
svg.append('circle')
|
|
.attr('cx', xScale(breakevenMonth))
|
|
.attr('cy', yScale(breakevenValue))
|
|
.attr('r', 8)
|
|
.attr('fill', colorPrimary)
|
|
.attr('stroke', '#fff')
|
|
.attr('stroke-width', 2)
|
|
.style('opacity', 0)
|
|
.transition()
|
|
.delay(2500)
|
|
.duration(500)
|
|
.style('opacity', 1);
|
|
|
|
svg.append('text')
|
|
.attr('x', xScale(breakevenMonth) + 10)
|
|
.attr('y', yScale(breakevenValue) - 15)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', '12px')
|
|
.style('opacity', 0)
|
|
.text('Punto de equilibrio')
|
|
.transition()
|
|
.delay(2500)
|
|
.duration(500)
|
|
.style('opacity', 1);
|
|
|
|
// Legend
|
|
const legend = svg.append('g')
|
|
.attr('transform', `translate(${width - margin.right + 20}, ${margin.top})`);
|
|
|
|
datasets.forEach((dataset, idx) => {
|
|
const g = legend.append('g')
|
|
.attr('transform', `translate(0, ${idx * 25})`);
|
|
|
|
g.append('line')
|
|
.attr('x1', 0)
|
|
.attr('x2', 20)
|
|
.attr('y1', 0)
|
|
.attr('y2', 0)
|
|
.attr('stroke', dataset.color)
|
|
.attr('stroke-width', 3);
|
|
|
|
g.append('text')
|
|
.attr('x', 25)
|
|
.attr('y', 4)
|
|
.attr('fill', '#b0b0b0')
|
|
.attr('font-size', '11px')
|
|
.text(dataset.name);
|
|
});
|
|
}
|
|
|
|
// Architecture Diagram
|
|
function renderArchitectureChart() {
|
|
const container = d3.select('#architecture-chart');
|
|
if (container.empty()) return;
|
|
|
|
const width = container.node().getBoundingClientRect().width;
|
|
const height = 450;
|
|
|
|
container.html('');
|
|
|
|
const svg = container.append('svg')
|
|
.attr('width', width)
|
|
.attr('height', height);
|
|
|
|
// Define components
|
|
const components = [
|
|
{ id: 'internet', label: 'Internet', x: width / 2, y: 40, width: 120, height: 40, color: '#666' },
|
|
{ id: 'firewall', label: 'Firewall', x: width / 2, y: 110, width: 100, height: 35, color: '#f44336' },
|
|
{ id: 'loadbalancer', label: 'Load Balancer', x: width / 2, y: 170, width: 130, height: 35, color: '#FF6B35' },
|
|
{ id: 'nginx1', label: 'Nginx (Proxy)', x: width / 3, y: 240, width: 110, height: 35, color: '#4CAF50' },
|
|
{ id: 'nginx2', label: 'Nginx (Proxy)', x: (2 * width) / 3, y: 240, width: 110, height: 35, color: '#4CAF50' },
|
|
{ id: 'odoo1', label: 'Odoo Server 1', x: width / 4, y: 310, width: 120, height: 40, color: '#2196F3' },
|
|
{ id: 'odoo2', label: 'Odoo Server 2', x: width / 2, y: 310, width: 120, height: 40, color: '#2196F3' },
|
|
{ id: 'odoo3', label: 'Odoo Server 3', x: (3 * width) / 4, y: 310, width: 120, height: 40, color: '#2196F3' },
|
|
{ id: 'postgres', label: 'PostgreSQL (HA)', x: width / 2, y: 400, width: 180, height: 40, color: '#9C27B0' }
|
|
];
|
|
|
|
// Define connections
|
|
const connections = [
|
|
{ from: 'internet', to: 'firewall' },
|
|
{ from: 'firewall', to: 'loadbalancer' },
|
|
{ from: 'loadbalancer', to: 'nginx1' },
|
|
{ from: 'loadbalancer', to: 'nginx2' },
|
|
{ from: 'nginx1', to: 'odoo1' },
|
|
{ from: 'nginx1', to: 'odoo2' },
|
|
{ from: 'nginx2', to: 'odoo2' },
|
|
{ from: 'nginx2', to: 'odoo3' },
|
|
{ from: 'odoo1', to: 'postgres' },
|
|
{ from: 'odoo2', to: 'postgres' },
|
|
{ from: 'odoo3', to: 'postgres' }
|
|
];
|
|
|
|
// Draw connections first (behind nodes)
|
|
connections.forEach((conn, idx) => {
|
|
const from = components.find(c => c.id === conn.from);
|
|
const to = components.find(c => c.id === conn.to);
|
|
|
|
svg.append('line')
|
|
.attr('x1', from.x)
|
|
.attr('y1', from.y + from.height / 2)
|
|
.attr('x2', to.x)
|
|
.attr('y2', to.y - to.height / 2)
|
|
.attr('stroke', '#555')
|
|
.attr('stroke-width', 2)
|
|
.attr('stroke-dasharray', function() {
|
|
return Math.sqrt(Math.pow(to.x - from.x, 2) + Math.pow(to.y - from.y, 2));
|
|
})
|
|
.attr('stroke-dashoffset', function() {
|
|
return Math.sqrt(Math.pow(to.x - from.x, 2) + Math.pow(to.y - from.y, 2));
|
|
})
|
|
.transition()
|
|
.duration(1000)
|
|
.delay(idx * 100)
|
|
.attr('stroke-dashoffset', 0);
|
|
});
|
|
|
|
// Draw nodes
|
|
components.forEach((comp, idx) => {
|
|
const g = svg.append('g')
|
|
.attr('transform', `translate(${comp.x}, ${comp.y})`)
|
|
.style('opacity', 0)
|
|
.style('cursor', 'pointer');
|
|
|
|
g.append('rect')
|
|
.attr('x', -comp.width / 2)
|
|
.attr('y', -comp.height / 2)
|
|
.attr('width', comp.width)
|
|
.attr('height', comp.height)
|
|
.attr('rx', 6)
|
|
.attr('fill', comp.color)
|
|
.attr('fill-opacity', 0.2)
|
|
.attr('stroke', comp.color)
|
|
.attr('stroke-width', 2);
|
|
|
|
g.append('text')
|
|
.attr('text-anchor', 'middle')
|
|
.attr('dominant-baseline', 'middle')
|
|
.attr('fill', '#e0e0e0')
|
|
.attr('font-size', '12px')
|
|
.attr('font-weight', '500')
|
|
.text(comp.label);
|
|
|
|
g.on('mouseover', function(event) {
|
|
d3.select(this).select('rect').attr('fill-opacity', 0.4);
|
|
tooltip.transition().duration(200).style('opacity', 1);
|
|
tooltip.html(`<strong>${comp.label}</strong><br>Componente de arquitectura on-premise`)
|
|
.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);
|
|
tooltip.transition().duration(200).style('opacity', 0);
|
|
});
|
|
|
|
g.transition()
|
|
.duration(500)
|
|
.delay(idx * 150)
|
|
.style('opacity', 1);
|
|
});
|
|
|
|
// Add labels for zones
|
|
svg.append('text')
|
|
.attr('x', 20)
|
|
.attr('y', 80)
|
|
.attr('fill', '#666')
|
|
.attr('font-size', '11px')
|
|
.text('ZONA DMZ');
|
|
|
|
svg.append('text')
|
|
.attr('x', 20)
|
|
.attr('y', 280)
|
|
.attr('fill', '#666')
|
|
.attr('font-size', '11px')
|
|
.text('ZONA APLICACION');
|
|
|
|
svg.append('text')
|
|
.attr('x', 20)
|
|
.attr('y', 420)
|
|
.attr('fill', '#666')
|
|
.attr('font-size', '11px')
|
|
.text('ZONA DATOS');
|
|
}
|
|
|
|
// Cost Comparison Bar Chart
|
|
function renderCostComparisonChart() {
|
|
const container = d3.select('#cost-comparison-chart');
|
|
if (container.empty()) return;
|
|
|
|
const width = container.node().getBoundingClientRect().width;
|
|
const height = 400;
|
|
const margin = { top: 40, right: 30, bottom: 100, left: 80 };
|
|
|
|
container.html('');
|
|
|
|
const svg = container.append('svg')
|
|
.attr('width', width)
|
|
.attr('height', height);
|
|
|
|
const data = [
|
|
{ option: 'On-Premise\n(50 usuarios)', year1: 25000, year2: 6000, year3: 6000, year4: 6000, year5: 6000, total: 49000 },
|
|
{ option: 'Odoo.sh\n(50 usuarios)', year1: 21000, year2: 21000, year3: 21000, year4: 21000, year5: 21000, total: 105000 },
|
|
{ option: 'Hosting Gestionado\n(ilimitado)', year1: 1788, year2: 1788, year3: 1788, year4: 1788, year5: 1788, total: 8940 },
|
|
{ option: 'VPS Autogestionado', year1: 1068, year2: 1068, year3: 1068, year4: 1068, year5: 1068, total: 5340 }
|
|
];
|
|
|
|
const categories = ['year1', 'year2', 'year3', 'year4', 'year5'];
|
|
const categoryLabels = ['Anio 1', 'Anio 2', 'Anio 3', 'Anio 4', 'Anio 5'];
|
|
const colors = [colorPrimary, '#FF8A50', '#FFA726', '#FFB74D', '#FFCC80'];
|
|
|
|
const x0 = d3.scaleBand()
|
|
.domain(data.map(d => d.option))
|
|
.range([margin.left, width - margin.right])
|
|
.paddingInner(0.2);
|
|
|
|
const x1 = d3.scaleBand()
|
|
.domain(categories)
|
|
.range([0, x0.bandwidth()])
|
|
.padding(0.05);
|
|
|
|
const y = d3.scaleLinear()
|
|
.domain([0, d3.max(data, d => d.year1) * 1.1])
|
|
.range([height - margin.bottom, margin.top]);
|
|
|
|
// Axes
|
|
svg.append('g')
|
|
.attr('transform', `translate(0,${height - margin.bottom})`)
|
|
.call(d3.axisBottom(x0))
|
|
.selectAll('text')
|
|
.attr('fill', '#b0b0b0')
|
|
.attr('font-size', '11px')
|
|
.attr('text-anchor', 'middle')
|
|
.each(function() {
|
|
const text = d3.select(this);
|
|
const words = text.text().split('\n');
|
|
text.text('');
|
|
words.forEach((word, i) => {
|
|
text.append('tspan')
|
|
.attr('x', 0)
|
|
.attr('dy', i === 0 ? '0.6em' : '1.2em')
|
|
.text(word);
|
|
});
|
|
});
|
|
|
|
svg.append('g')
|
|
.attr('transform', `translate(${margin.left},0)`)
|
|
.call(d3.axisLeft(y).tickFormat(d => `${(d/1000).toFixed(0)}K`))
|
|
.attr('color', '#888');
|
|
|
|
// Bars
|
|
const groups = svg.selectAll('.bar-group')
|
|
.data(data)
|
|
.join('g')
|
|
.attr('class', 'bar-group')
|
|
.attr('transform', d => `translate(${x0(d.option)},0)`);
|
|
|
|
categories.forEach((cat, catIdx) => {
|
|
groups.append('rect')
|
|
.attr('x', x1(cat))
|
|
.attr('width', x1.bandwidth())
|
|
.attr('y', height - margin.bottom)
|
|
.attr('height', 0)
|
|
.attr('fill', colors[catIdx])
|
|
.attr('rx', 2)
|
|
.style('cursor', 'pointer')
|
|
.on('mouseover', function(event, d) {
|
|
d3.select(this).attr('fill-opacity', 0.8);
|
|
tooltip.transition().duration(200).style('opacity', 1);
|
|
tooltip.html(`<strong>${d.option.replace('\n', ' ')}</strong><br>${categoryLabels[catIdx]}: ${d[cat].toLocaleString()} EUR`)
|
|
.style('left', (event.pageX + 15) + 'px')
|
|
.style('top', (event.pageY - 28) + 'px');
|
|
})
|
|
.on('mouseout', function() {
|
|
d3.select(this).attr('fill-opacity', 1);
|
|
tooltip.transition().duration(200).style('opacity', 0);
|
|
})
|
|
.transition()
|
|
.duration(800)
|
|
.delay((d, i) => i * 100 + catIdx * 50)
|
|
.attr('y', d => y(d[cat]))
|
|
.attr('height', d => height - margin.bottom - y(d[cat]));
|
|
});
|
|
|
|
// Legend
|
|
const legend = svg.append('g')
|
|
.attr('transform', `translate(${width - 150}, ${margin.top})`);
|
|
|
|
categoryLabels.forEach((label, idx) => {
|
|
const g = legend.append('g')
|
|
.attr('transform', `translate(0, ${idx * 22})`);
|
|
|
|
g.append('rect')
|
|
.attr('width', 15)
|
|
.attr('height', 15)
|
|
.attr('fill', colors[idx])
|
|
.attr('rx', 2);
|
|
|
|
g.append('text')
|
|
.attr('x', 20)
|
|
.attr('y', 12)
|
|
.attr('fill', '#b0b0b0')
|
|
.attr('font-size', '11px')
|
|
.text(label);
|
|
});
|
|
|
|
// Total labels
|
|
svg.selectAll('.total-label')
|
|
.data(data)
|
|
.join('text')
|
|
.attr('class', 'total-label')
|
|
.attr('x', d => x0(d.option) + x0.bandwidth() / 2)
|
|
.attr('y', margin.top - 10)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#888')
|
|
.attr('font-size', '11px')
|
|
.style('opacity', 0)
|
|
.text(d => `Total: ${(d.total/1000).toFixed(1)}K`)
|
|
.transition()
|
|
.delay(1500)
|
|
.duration(500)
|
|
.style('opacity', 1);
|
|
}
|
|
|
|
// Initialize charts when visible
|
|
const chartObserver = new IntersectionObserver((entries) => {
|
|
entries.forEach(entry => {
|
|
if (entry.isIntersecting) {
|
|
const id = entry.target.id;
|
|
setTimeout(() => {
|
|
if (id === 'tco-chart') renderTCOChart();
|
|
if (id === 'architecture-chart') renderArchitectureChart();
|
|
if (id === 'cost-comparison-chart') renderCostComparisonChart();
|
|
}, 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(() => {
|
|
renderTCOChart();
|
|
renderArchitectureChart();
|
|
renderCostComparisonChart();
|
|
}, 300);
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|