Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Production-ready Docker and docker-compose setup for Odoo with PostgreSQL, persistent volumes, environment-based configuration, and Nginx reverse proxy.
.claude/skills/odoo-docker-deployment/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 3 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-14 | ✓→✓ | = Same ✓ | — | — |
| case-10 | ✓→✓ | = Same ✓ | — | — |
| case-19 | ✓→✓ | = Same ✓ | — | — |
| case-21 | ✓→✓ | = Same ✓ | — | — |
This skill provides a complete, production-ready Docker setup 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.
@odoo-docker-deployment and describe your deployment scenario.docker-compose.yml and odoo.conf ready to run.yaml# 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} volumes: - postgres-data:/var/lib/postgresql/data networks: - odoo-net odoo: image: odoo:17.0 restart: always depends_on: db: condition: service_healthy ports: - "8069:8069" - "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:
ini[options] admin_passwd = ${ODOO_MASTER_PASSWORD} ; set via env or .env file db_host = db db_port = 5432 db_user = odoo db_password = ${POSTGRES_PASSWORD} ; set via env or .env file ; addons_path inside the official Odoo Docker image (Debian-based) addons_path = /mnt/extra-addons,/usr/lib/python3/dist-packages/odoo/addons logfile = /var/log/odoo/odoo.log log_level = warn ; Worker tuning for a 4-core / 8GB server: workers = 9 ; (CPU cores × 2) + 1 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
bash# 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 # Update a custom module without restarting the server docker compose exec odoo odoo -d odoo --update my_module --stop-after-init
.env file and reference them with ${VAR} — never hardcode passwords in docker-compose.yml.depends_on: condition: service_healthy with a PostgreSQL healthcheck to prevent Odoo starting before the DB is ready.workers = (CPU cores × 2) + 1 in odoo.conf — workers = 0 uses single-threaded mode and blocks all users.latest or 17 Docker image tags in production — always pin to a specific patch-level tag (e.g., odoo:17.0).odoo.conf and rely on it for secrets in CI/CD — use Docker secrets or environment variables instead.addons_path inside the Docker image may change with new base image versions — always verify after upgrading the Odoo image.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +5 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.