AWS · EC2 · Odoo · Ubuntu · Nginx

Cómo instalar Odoo 18 en AWS EC2 con Ubuntu 24.04 y Nginx

Instalación de Odoo 18 en Ubuntu 24.04 sobre AWS EC2, en castellano, con una capa mínima de seguridad y operativa real.

En esta guía vamos a ver cómo instalar Odoo 18 en Ubuntu 24.04 sobre una instancia AWS EC2 siguiendo un enfoque limpio y fácil de mantener. El objetivo no es sólo que el servicio arranque, sino dejar preparada una base razonable para trabajar con dominio, HTTPS, proxy inverso y una estructura de directorios clara.

A lo largo del artículo montaremos Odoo 18 con Nginx, PostgreSQL, systemd, HTTPS y firewall, dejando el puerto 8069 sólo para uso interno y publicando la aplicación por 80/443, que es lo habitual cuando quieres exponerla con un dominio real.

Resumen visual del despliegue de Odoo 18 en AWS EC2 con Ubuntu 24.04
Resumen visual de la arquitectura y del flujo de instalación propuesto en esta guía.

Qué vas a montar

La estructura final será esta: EC2 + Ubuntu 24.04 + PostgreSQL + Odoo con usuario dedicado + Nginx + HTTPS + puerto 8069 sólo en localhost. Es una base sencilla, clara y suficientemente sólida para una primera instalación pequeña o mediana.

Qué incluye esta guía

  • No expone el puerto 8069 públicamente; Odoo queda detrás de Nginx.
  • Añade systemd, UFW, TLS con Certbot y validaciones operativas.
  • Usa directorios claros para código, datos, logs y addons personalizados.
  • Deja una estructura fácil de ampliar si más adelante separas base de datos, backups o monitorización.
  • Incluye comprobaciones finales para validar que el servicio ha quedado realmente accesible.

Cuando Odoo ya está funcionando, el siguiente paso práctico suele ser emitir la primera factura: Cómo hacer una factura en Odoo 18 paso a paso.

1. Antes de empezar

Esta guía está pensada para quien quiere montar su primera instalación de Odoo 18 en AWS EC2 sin complicarse con una arquitectura demasiado grande desde el principio. Si tienes una instancia Ubuntu limpia, un dominio y acceso por SSH, con esto puedes dejar una instalación razonable y lista para empezar a trabajar.

Necesitas

  • Una EC2 con Ubuntu 24.04 recién creada.
  • Acceso SSH con permisos de sudo.
  • Un dominio que puedas apuntar a la IP pública de la máquina.

Conviene tener claro

  • Esta instalación sirve muy bien para empezar, probar o trabajar con un despliegue pequeño o mediano.
  • Si el proyecto crece mucho, lo normal será separar base de datos, backups y observabilidad.
  • El objetivo aquí es dejar una base limpia y mantenible, no una infraestructura gigante desde el primer día.

2. Arquitectura recomendada para desplegar Odoo 18 en una EC2 pequeña o mediana

Si vas a montar una primera instalación de Odoo 18 en AWS, la opción simple y razonable suele ser una EC2 con Ubuntu 24.04, PostgreSQL en la misma máquina y un Nginx frontal terminando HTTP y HTTPS. Para una empresa pequeña o una prueba seria, esto ya es suficiente si se dimensiona bien y se hacen copias de seguridad.

Lo que no tiene mucho sentido es abrir 8069 a Internet y dejar Odoo expuesto directamente. El navegador debe entrar por 80/443; el puerto interno se queda en loopback.

Arquitectura recomendada con Nginx delante de Odoo y PostgreSQL local
Internet llega a Nginx; Nginx reenvía a Odoo en 127.0.0.1:8069.

3. Qué instancia EC2 elegir para Odoo 18 y qué puertos no debes abrir

Para una instalación estándar, lo habitual es usar una máquina con Ubuntu 24.04, un tamaño suficiente para no ir justo de memoria y un security group con SSH, HTTP y HTTPS. El puerto 8069 no debería abrirse públicamente; conviene dejarlo sólo para uso interno.

Regla práctica: si vas a publicar Odoo con dominio, el puerto público debe ser 443. El 8069 es un detalle interno del servicio, no una interfaz pública.
Checklist visual de EC2 y security group para Odoo 18
Resumen visual de AMI, tamaño, disco y puertos mínimos para empezar bien.
  • AMI: Ubuntu Server 24.04 LTS.
  • Tamaño inicial: evita t2 antiguo; hoy suele tener más sentido t3.medium o t3.large según carga.
  • Disco: 30 GB es un arranque correcto; sube más si manejas adjuntos, documentos o varias bases.
  • Puertos públicos: 22, 80 y 443.
  • Puerto privado: 8069 solo en localhost.

4. Cómo preparar Ubuntu 24.04 antes de instalar Odoo 18

Antes de clonar nada, deja el sistema al día e instala dependencias de compilación, PostgreSQL, Nginx y Certbot. También conviene instalar ufw desde el principio para no olvidarte del cierre de puertos.

En muchos tutoriales aparece wkhtmltopdf demasiado tarde o de forma improvisada. Para Odoo sigue siendo habitual necesitarlo por los PDFs, así que déjalo resuelto cuanto antes:

5. Usuario de servicio y PostgreSQL

El usuario odoo no debería ser un usuario humano de administración. Debe existir sólo para ejecutar el servicio y tener permisos claros sobre /opt/odoo. Lo mismo con PostgreSQL: para una instalación local sencilla basta con un rol dedicado y autenticación por socket.

Mejora práctica: no hace falta poner contraseña a PostgreSQL si Odoo y Postgres viven en la misma máquina y usas socket local. Menos superficie, menos secretos y menos errores evitables.

6. Descargar Odoo 18, crear el entorno virtual e instalar requisitos

En este punto vamos a descargar el código, crear un entorno virtual y dejar una estructura clara dentro de /opt/odoo. Tener bien separados código, datos, logs y addons ayuda mucho cuando más adelante tengas que actualizar, revisar errores o instalar módulos propios.

Si usas Odoo Enterprise, recuerda que necesitas licencia y acceso al repositorio privado. Si vas con Community, el repositorio público oficial es suficiente.

7. Configuración de Odoo: lo mínimo para no dejarlo “de laboratorio”

El fichero /etc/odoo.conf es donde la calidad de la instalación empieza a notarse. En este ejemplo fijamos directorios, logs, workers, proxy_mode y escucha local en 127.0.0.1.

[options]
admin_passwd = CAMBIA_ESTA_CLAVE_MAESTRA
db_host = False
db_port = False
db_user = odoo
db_password = False
addons_path = /opt/odoo/src/odoo/addons,/opt/odoo/custom-addons
data_dir = /opt/odoo/data
logfile = /opt/odoo/logs/odoo.log
proxy_mode = True
xmlrpc_interface = 127.0.0.1
xmlrpc_port = 8069
workers = 4
max_cron_threads = 2
limit_memory_soft = 2147483648
limit_memory_hard = 2684354560
limit_time_cpu = 600
limit_time_real = 1200
  • proxy_mode = True es obligatorio si publicas detrás de Nginx.
  • xmlrpc_interface = 127.0.0.1 evita exposición pública directa.
  • workers depende de CPU y RAM; ajusta este número a tu tamaño real.

8. Systemd, Nginx y HTTPS: la parte que hace publicable la instalación

El servicio systemd debe arrancar solo, reiniciarse si se cae y escribir logs en journal. Nada de dejar Odoo corriendo desde una shell manual.

El fichero hay que crearlo como /etc/systemd/system/odoo18.service. Esa es la ruta habitual para un servicio propio en Ubuntu. Ábrelo con sudo, pega el contenido siguiente, guarda el archivo y luego recarga systemd para que detecte la nueva unidad.

[Unit]
Description=Odoo 18
Documentation=https://www.odoo.com/documentation/18.0/
After=network.target postgresql.service
Requires=postgresql.service

[Service]
Type=simple
User=odoo
Group=odoo
WorkingDirectory=/opt/odoo/src/odoo
ExecStart=/opt/odoo/venv/bin/python3 /opt/odoo/src/odoo/odoo-bin -c /etc/odoo.conf
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=inherit
SyslogIdentifier=odoo18

[Install]
WantedBy=multi-user.target

Si todo ha quedado bien, en terminal deberías ver algo muy parecido a esto:

ubuntu@ip-172-31-29-9:/tmp$ sudo vim /etc/systemd/system/odoo18.service
ubuntu@ip-172-31-29-9:/tmp$ sudo systemctl daemon-reload
ubuntu@ip-172-31-29-9:/tmp$ sudo systemctl enable odoo18
Created symlink /etc/systemd/system/multi-user.target.wants/odoo18.service → /etc/systemd/system/odoo18.service.
ubuntu@ip-172-31-29-9:/tmp$ sudo systemctl start odoo18
ubuntu@ip-172-31-29-9:/tmp$ sudo systemctl status odoo18
● odoo18.service - Odoo 18
     Loaded: loaded (/etc/systemd/system/odoo18.service; enabled; preset: enabled)
     Active: active (running) since Mon 2026-04-20 08:54:50 UTC; 6s ago
       Docs: https://www.odoo.com/documentation/18.0/
   Main PID: 23599 (python3)
      Tasks: 15 (limit: 1004)
     Memory: 239.9M (peak: 240.1M)
        CPU: 3.066s
     CGroup: /system.slice/odoo18.service
             ├─23599 /opt/odoo/venv/bin/python3 /opt/odoo/src/odoo/odoo-bin -c /etc/odoo.conf
             ├─23602 /opt/odoo/venv/bin/python3 /opt/odoo/src/odoo/odoo-bin -c /etc/odoo.conf
             ├─23603 /opt/odoo/venv/bin/python3 /opt/odoo/src/odoo/odoo-bin -c /etc/odoo.conf
             ├─23604 /opt/odoo/venv/bin/python3 /opt/odoo/src/odoo/odoo-bin -c /etc/odoo.conf
             ├─23606 /opt/odoo/venv/bin/python3 /opt/odoo/src/odoo/odoo-bin -c /etc/odoo.conf
             ├─23607 /opt/odoo/venv/bin/python3 /opt/odoo/src/odoo/odoo-bin gevent -c /etc/odoo.conf
             ├─23609 /opt/odoo/venv/bin/python3 /opt/odoo/src/odoo/odoo-bin -c /etc/odoo.conf
             └─23613 /opt/odoo/venv/bin/python3 /opt/odoo/src/odoo/odoo-bin -c /etc/odoo.conf

Apr 20 08:54:50 ip-172-31-29-9 systemd[1]: Started odoo18.service - Odoo 18.
ubuntu@ip-172-31-29-9:/tmp$ 
Consejo práctico: si el servicio no arranca, revisa primero las rutas de WorkingDirectory, ExecStart y los permisos del usuario odoo sobre /opt/odoo.

Después publicamos el servicio detrás de Nginx para que el acceso externo entre por el dominio y por HTTPS, mientras Odoo sigue escuchando únicamente en localhost.

server {
    listen 80;
    server_name erp.midominio.com;

    client_max_body_size 100m;
    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;

    location / {
        proxy_pass http://127.0.0.1:8069;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /web/static/ {
        proxy_cache_valid 200 90m;
        proxy_buffering on;
        expires 10d;
        proxy_pass http://127.0.0.1:8069;
    }
}

Prueba rápida solo con IP pública

Si solo quieres probar Odoo sin dominio, puedes publicarlo usando la IP pública de la instancia EC2. En ese caso, lo más simple es dejar HTTP en el puerto 80 y utilizar un bloque mínimo de Nginx para esa IP.

Ten en cuenta: usar solo la IP va bien para pruebas rápidas, pero normalmente te quedas sin HTTPS con Certbot y la dirección puede cambiar si no estás usando una Elastic IP.
server {
    listen 80;
    server_name _;

    client_max_body_size 100m;
    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;

    location / {
        proxy_pass http://127.0.0.1:8069;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /web/static/ {
        proxy_cache_valid 200 90m;
        proxy_buffering on;
        expires 10d;
        proxy_pass http://127.0.0.1:8069;
    }
}

Cuando Certbot termine, toda la entrada pública irá por HTTPS. Si más adelante añades CloudFront, un balanceador o una WAF, el patrón general sigue siendo el mismo: Odoo no se expone de forma cruda.

9. Arranque, validación y pruebas mínimas después del despliegue

No conviene ejecutar todas las comprobaciones a la vez. Primero valida que Odoo arranca como servicio, después confirma que escucha en 127.0.0.1:8069 y sólo cuando Nginx y el DNS estén listos prueba el dominio público y el HTTPS.

Estos son los comandos básicos de systemctl: daemon-reload recarga las unidades, enable deja el servicio preparado para arrancar al reiniciar, start lo arranca en ese momento y status te dice si realmente está corriendo.

Cuando el servicio ya está levantado, comprueba primero la escucha local antes de meter Nginx en la ecuación:

Sólo cuando Nginx esté configurado conviene probar la entrada pública. Empieza por HTTP si el dominio ya apunta a la máquina y prueba HTTPS únicamente después de que Certbot haya terminado bien.

  • Si todavía no has configurado el dominio, no esperes que erp.midominio.com responda.
  • Si aún no has ejecutado Certbot, no esperes que https://erp.midominio.com funcione.
  • Abre https://erp.midominio.com y comprueba que carga el setup o el login.
  • Expón la creación de bases de datos sólo si realmente quieres ese flujo disponible.
  • Revisa /opt/odoo/logs/odoo.log y journalctl -u odoo18.
  • Comprueba que el security group no deja entrar a 8069 desde Internet.
  • Haz snapshot de EC2 antes de cambios mayores y copia externa de la base.

10. Errores típicos al instalar Odoo en AWS

  • Abrir 8069 en EC2 y olvidarse del proxy inverso.
  • Usar una instancia demasiado pequeña y culpar a Odoo cuando el problema es memoria.
  • No configurar proxy_mode y sufrir redirecciones raras o URLs incorrectas.
  • No planificar backups de base de datos ni adjuntos.
  • Instalar todo como ubuntu o root y mezclar código con datos.
  • Tratar un arranque rápido como si ya fuera una instalación lista para producción.

11. Checklist final

  • Dominio apuntando a la EC2 y certificado funcionando por HTTPS.
  • Puerto 8069 sin exposición pública en el security group.
  • Odoo arrancando con systemd y reinicio automático activo.
  • Backups de base y adjuntos definidos antes de meter usuarios reales.
  • Logs y snapshot disponibles antes de tocar addons o upgrades.

12. Preguntas frecuentes sobre Odoo 18 en AWS EC2 y Ubuntu 24.04

¿Se puede instalar Odoo 18 en Ubuntu 24.04?

Sí. Ubuntu 24.04 es una base totalmente válida para desplegar Odoo 18 en una EC2, siempre que cuides las dependencias, el entorno virtual, PostgreSQL y el proxy inverso.

¿Hace falta Nginx para Odoo en AWS?

Si vas a publicar el ERP con dominio y HTTPS, sí tiene mucho sentido. Nginx permite terminar TLS, enviar los headers correctos y evitar que Odoo quede expuesto directamente en 8069.

¿Qué puertos abrir para Odoo 18 en una instancia EC2?

En la práctica, 22 para administración, 80 para validación y redirección, y 443 para acceso final. El 8069 debería quedarse sólo en localhost.

¿Es suficiente una sola EC2 para Odoo?

Para una primera instalación pequeña o mediana, sí. Cuando el uso crece, lo normal es separar base de datos, backups, observabilidad y quizá añadir balanceo.

Conclusión

Instalar Odoo 18 en AWS EC2 con Ubuntu 24.04 no es especialmente complicado si mantienes una estructura ordenada desde el principio. La clave está en separar bien cada pieza: sistema, base de datos, servicio, proxy inverso y validación final.

Con esta base ya puedes publicar una primera instalación de forma limpia y seguir creciendo después. Si más adelante el proyecto aumenta de tamaño, el siguiente paso lógico será separar PostgreSQL, automatizar backups y definir un proceso claro para actualizaciones y despliegues.