Implantação do Docker Odoo: configuração de contêiner pronto para produção

Implante Odoo em contêineres Docker para produção. Guia completo que cobre a configuração do Docker Compose, configuração do PostgreSQL, proxy reverso Nginx, SSL, backups e escalonamento.

E

ECOSIRE Research and Development Team

Equipe ECOSIRE

5 de março de 20265 min de leitura994 Palavras

Implantação do Docker Odoo: configuração de contêiner pronto para produção

O Docker se tornou o método de implantação padrão do Odoo em ambientes de produção, com mais de 10 milhões de pulls de imagens do Odoo Docker no Docker Hub. A implantação em contêineres fornece ambientes reproduzíveis, escalonamento fácil, backups simplificados e separação limpa entre instâncias do Odoo. Este guia cobre uma configuração completa do Docker Odoo pronta para produção.

Principais conclusões

  • Docker Compose orquestra Odoo, PostgreSQL e Nginx como serviços conectados
  • Volumes persistentes garantem que os dados sobrevivam a reinicializações e atualizações de contêineres
  • O proxy reverso Nginx lida com terminação SSL, cache de arquivos estáticos e balanceamento de carga
  • Backups automatizados protegem contra perda de dados com intervenção manual mínima

Visão geral da arquitetura

Uma implantação de produção do Odoo Docker consiste em três serviços principais:

  1. Servidor de aplicativos Odoo: o contêiner Odoo executando o servidor web e a lógica do aplicativo
  2. Banco de dados PostgreSQL: um contêiner de banco de dados dedicado que armazena todos os dados Odoo
  3. Proxy reverso Nginx: lida com SSL, fornece arquivos estáticos e faz proxy de solicitações para Odoo

Os serviços opcionais incluem Redis (para cache e armazenamento de sessão), um contêiner de backup (despejos automatizados de banco de dados) e monitoramento (Prometheus + Grafana).


Configuração do Docker Compose

A base da implantação é um arquivo docker-compose.yml que define todos os serviços:

version: "3.8"

services:
  odoo:
    image: odoo:17.0
    depends_on:
      - db
    ports:
      - "8069:8069"
      - "8072:8072"
    volumes:
      - odoo-data:/var/lib/odoo
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
    environment:
      - HOST=db
      - PORT=5432
      - USER=odoo
      - PASSWORD=odoo_db_password
    restart: unless-stopped

  db:
    image: postgres:16
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=odoo
      - POSTGRES_PASSWORD=odoo_db_password
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - postgres-data:/var/lib/postgresql/data/pgdata
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    depends_on:
      - odoo
    restart: unless-stopped

volumes:
  odoo-data:
  postgres-data:

Arquivo de configuração Odoo

Crie config/odoo.conf com configurações otimizadas para produção:

[options]
addons_path = /mnt/extra-addons,/usr/lib/python3/dist-packages/odoo/addons
admin_passwd = your_strong_admin_password
db_host = db
db_port = 5432
db_user = odoo
db_password = odoo_db_password
db_name = production_db
dbfilter = ^production_db$
list_db = False
proxy_mode = True
workers = 4
max_cron_threads = 2
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_time_cpu = 600
limit_time_real = 1200
log_level = warn

Configurações principais explicadas:

  • proxy_mode = True: Obrigatório ao executar atrás do Nginx para lidar corretamente com cabeçalhos encaminhados
  • workers = 4: Número de processos de trabalho (regra prática: 2 trabalhadores por núcleo de CPU)
  • max_cron_threads = 2: Threads dedicados para ações agendadas
  • list_db = False: Impede a listagem do banco de dados na página de login (segurança)
  • dbfilter: Restringe o acesso a um único banco de dados

Configuração de proxy reverso Nginx

upstream odoo {
    server odoo:8069;
}
upstream odoochat {
    server odoo:8072;
}

server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com;

    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;

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

    location /websocket {
        proxy_pass http://odoochat;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

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

    location ~* /web/static/ {
        proxy_cache_valid 200 90m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odoo;
    }
}

Estratégia de backup

Backups automatizados de banco de dados

Crie um script de backup que seja executado diariamente via cron:

#!/bin/bash
BACKUP_DIR=/backups/odoo
DATE=$(date +%Y%m%d_%H%M%S)
docker exec odoo-db pg_dump -U odoo production_db | gzip > $BACKUP_DIR/odoo_$DATE.sql.gz
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete

Backup do armazenamento de arquivos

O armazenamento de arquivos Odoo (documentos carregados, anexos) reside no volume odoo-data. Faça backup junto com o banco de dados:

docker run --rm -v odoo-data:/data -v /backups:/backup alpine \
  tar czf /backup/odoo-filestore_$DATE.tar.gz /data

Fortalecimento de segurança

  • Altere o admin_passwd padrão em odoo.conf para uma senha aleatória forte
  • Defina list_db = False para evitar a enumeração do banco de dados
  • Use dbfilter para restringir o acesso ao banco de dados a um único banco de dados
  • Execute contêineres como usuários não-root sempre que possível
  • Mantenha as imagens do Docker atualizadas com patches de segurança
  • Use segredos do Docker ou arquivos de variáveis de ambiente (não senhas embutidas)
  • Restringir o acesso à rede de contêineres usando redes Docker

Perguntas frequentes

P: Quantos usuários simultâneos um único contêiner Odoo pode manipular?

Com 4 trabalhadores, um contêiner Odoo lida confortavelmente com aproximadamente 20 a 30 usuários simultâneos. Para maior simultaneidade, aumente os trabalhadores (limitados por CPU/RAM) ou implante vários contêineres Odoo atrás de um balanceador de carga.

P: Como atualizo o Odoo no Docker?

Extraia a nova imagem, pare o contêiner atual, execute a nova imagem com os volumes existentes. Os volumes persistentes retêm seus dados e armazenamento de arquivos durante as atualizações de imagem.

P: Devo usar a imagem oficial do Odoo Docker ou criar a minha própria?

A imagem oficial funciona para implantações padrão. Crie uma imagem personalizada quando precisar de pacotes Python específicos, dependências de sistema para módulos personalizados ou módulos comunitários pré-instalados.

P: Como lidar com o Odoo Enterprise no Docker?

Odoo Enterprise não está disponível como imagem pública do Docker. Monte o diretório de complementos corporativos como um volume e faça referência a ele na configuração addons_path. Você precisa de uma assinatura válida do Odoo Enterprise.


O que vem a seguir

A implantação do Docker oferece um ambiente de produção Odoo reproduzível, escalonável e de fácil manutenção. Comece com esta configuração e ajuste as contagens de trabalhadores, os limites de memória e o cache com base nos seus padrões de uso.

Entre em contato com a ECOSIRE para obter assistência na implantação do Odoo ou explore nossos serviços de suporte Odoo para hospedagem gerenciada.


Publicado pela ECOSIRE – ajudando empresas a escalar com soluções de software empresarial.

E

Escrito por

ECOSIRE Research and Development Team

Construindo produtos digitais de nível empresarial na ECOSIRE. Compartilhando insights sobre integrações Odoo, automação de e-commerce e soluções de negócios com IA.

Converse no WhatsApp