About odoo-docker-deployment
A skill for self-hosted Odoo deployments that generates Docker Compose and Odoo configuration and helps diagnose container and database connection issues. It covers development and production setups, with environment-specific validation still required.
Key features
- 01Generate Docker Compose and Odoo configuration
- 02Configure PostgreSQL and persistent storage
- 03Advise on environment variables and secrets
- 04Diagnose container and database connection issues
- 05Cover development and production deployments
Use cases
- 01Set up a local Odoo development environment with Docker
- 02Deploy Odoo to a VPS or cloud server
- 03Troubleshoot container startup or database connection failures
- 04Add an SSL reverse proxy to an existing deployment
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill odoo-docker-deploymentAfter installing, type/odoo-docker-deploymentin Claude Code to confirm it loaded.
Details
From the project READMEOdoo Docker Deployment
Overview
This skill provides a starting Docker configuration requiring environment-specific validation for Odoo, including PostgreSQL, persistent file storage, environment variable configuration, and an optional Nginx reverse proxy with SSL. It covers both development and production configurations.
When to Use This Skill
- Spinning up a local Odoo development environment with Docker.
- Deploying Odoo to a VPS or cloud server (AWS, DigitalOcean, etc.).
- Troubleshooting Odoo container startup failures or database connection errors.
- Adding a reverse proxy with SSL to an existing Odoo Docker setup.
How It Works
- Activate: Mention
@odoo-docker-deploymentand describe your deployment scenario. - Generate: Receive a complete
docker-compose.ymlandodoo.confready to run. - Debug: Describe your container error and get a diagnosis with a fix.
Examples
Example 1: Production docker-compose.yml
# Note: The top-level 'version' key is deprecated in Docker Compose v2+
# and can be safely omitted. Remove it to avoid warnings.
services:
db:
image: postgres:15
restart: always
environment:
POSTGRES_DB: odoo
POSTGRES_USER: odoo
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U odoo -d odoo"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- odoo-net
odoo:
image: odoo:17.0
restart: always
depends_on:
db:
condition: service_healthy
ports:
- "127.0.0.1:8069:8069"
- "127.0.0.1:8072:8072" # Longpolling for live chat / bus
environment:
HOST: db
USER: odoo
PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- odoo-web-data:/var/lib/odoo
- ./addons:/mnt/extra-addons # Custom modules
- ./odoo.conf:/etc/odoo/odoo.conf
networks:
- odoo-net
volumes:
postgres-data:
odoo-web-data:
networks:
odoo-net:
Example 2: odoo.conf
[options]
admin_passwd = REPLACE_WITH_PRIVATELY_RENDERED_VALUE
db_host = db
db_port = 5432
db_user = odoo
; Official container entrypoint receives database password through PASSWORD.
; Plain odoo.conf does not expand Compose-style environment placeholders.
; addons_path inside the official Odoo Docker image (Debian-based)
addons_path = /mnt/extra-addons,/usr/lib/python3/dist-packages/odoo/addons
; Use container stdout/stderr unless a writable private log volume is configured.
log_level = warn
; Illustrative worker count; size HTTP+cron+PostgreSQL+OS within measured RAM:
workers = 4
max_cron_threads = 2
limit_memory_soft = 1610612736 ; 1.5 GB — soft kill threshold
limit_memory_hard = 2147483648 ; 2.0 GB — hard kill threshold
limit_time_cpu = 600
limit_time_real = 1200
limit_request = 8192
Example 3: Common Commands
# Start all services in background
docker compose up -d
# Stream Odoo logs in real time
docker compose logs -f odoo
# Restart Odoo only (not DB — avoids data risk)
docker compose restart odoo
# Stop all services
docker compose down
# Backup the database to a local SQL dump
docker compose exec db pg_dump -U odoo odoo > backup_$(date +%Y%m%d).sql
# Module updates change schema/data: stop normal Odoo workers first and back up DB+filestore.
# Run a single maintenance instance with the same reviewed DB/config; verify then restart.
Compose expands ${VAR} in the Compose file, not arbitrary mounted application config. Render required configuration through an approved private secret mechanism and validate it without printing secrets. A SQL dump alone omits Odoo’s filestore; coordinate consistent DB+filestore backup and prove restore in staging. These examples do not include TLS/proxy/database-selection hardening or a production readiness test.
Best Practices
- ✅ Do: Store all secrets in a
.envfile and reference them with${VAR}— never hardcode passwords indocker-compose.yml. - ✅ Do: Use
depends_on: condition: service_healthywith a PostgreSQL healthcheck to prevent Odoo starting before the DB is ready. - ✅ Do: Put Nginx in front of Odoo for SSL termination (Let's Encrypt / Certbot) — never expose Odoo directly on port 80/443.
- ✅ Do: Measure worker memory and concurrency; a CPU heuristic alone cannot guarantee a safe RAM budget.
- ❌ Don't: Expose port 5432 (PostgreSQL) to the public internet — keep it on the internal Docker network only.
- ❌ Don't: Use the
latestor17Docker image tags in production — pin a reviewed image digest;odoo:17.0is a mutable series tag, not an immutable patch identity. - ❌ Don't: Mount
odoo.confand rely on it for secrets in CI/CD — use Docker secrets or environment variables instead.
Limitations
- This skill covers self-hosted Docker deployments — Odoo.sh (cloud-managed hosting) has a completely different deployment model.
- Horizontal scaling (multiple Odoo containers behind a load balancer) requires shared filestore (NFS or S3-compatible storage) not covered here.
- Does not include an Nginx configuration template — consult the official Odoo Nginx docs for the full reverse proxy config.
- The
addons_pathinside the Docker image may change with new base image versions — always verify after upgrading the Odoo image.