Running multiple Odoo versions on a single server is common for agencies managing different clients, developers testing migrations, and businesses running staging environments alongside production. Docker makes this straightforward by isolating each Odoo version in its own container with a dedicated PostgreSQL instance and port mapping. This guide covers the complete setup.
Why Run Multiple Versions?
- Migration testing: Run Odoo 18 production alongside Odoo 19 staging to test upgrades
- Client management: Agencies hosting clients on different Odoo versions
- Module development: Test custom modules across multiple Odoo versions simultaneously
- Gradual migration: Move departments one at a time from old to new version
Architecture Overview
Each Odoo version runs as a separate Docker Compose stack with its own PostgreSQL container, data volumes, and port mapping. Nginx serves as a reverse proxy, routing traffic to the correct Odoo instance based on domain name or subdomain.
┌─────────────┐
│ Nginx │
│ (port 80/443)│
└──────┬──────┘
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Odoo 17 │ │ Odoo 18 │ │ Odoo 19 │
│ :8069 │ │ :8070 │ │ :8071 │
└────┬─────┘ └────┬─────┘ └────┬─────┘
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ PG 15 │ │ PG 15 │ │ PG 16 │
└──────────┘ └──────────┘ └──────────┘
Step 1: Create Separate Docker Compose Files
Create a directory structure with one compose file per version:
mkdir -p /opt/odoo/{v17,v18,v19}
/opt/odoo/v17/docker-compose.yml:
version: '3.8'
services:
db17:
image: postgres:15
environment:
POSTGRES_USER: odoo17
POSTGRES_PASSWORD: secret17
volumes:
- pg17-data:/var/lib/postgresql/data
networks:
- odoo17-net
odoo17:
image: odoo:17
depends_on:
- db17
ports:
- "8069:8069"
environment:
HOST: db17
USER: odoo17
PASSWORD: secret17
volumes:
- odoo17-data:/var/lib/odoo
- ./addons:/mnt/extra-addons
networks:
- odoo17-net
volumes:
pg17-data:
odoo17-data:
networks:
odoo17-net:
Repeat for v18 (port 8070) and v19 (port 8071), changing image tags, port mappings, and volume/network names.
Step 2: Configure Nginx Reverse Proxy
Route each subdomain to the correct Odoo instance:
# /etc/nginx/sites-available/odoo-multi
server {
server_name v17.example.com;
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;
}
}
server {
server_name v18.example.com;
location / {
proxy_pass http://127.0.0.1:8070;
# ... same headers
}
}
server {
server_name v19.example.com;
location / {
proxy_pass http://127.0.0.1:8071;
# ... same headers
}
}
Add SSL with Let's Encrypt: certbot --nginx -d v17.example.com -d v18.example.com -d v19.example.com
For detailed Nginx configuration, see our Nginx reverse proxy guide.
Step 3: Resource Management
Multiple Odoo instances consume significant RAM. Plan your server resources:
| Instances | Minimum RAM | Recommended RAM |
|---|---|---|
| 2 instances | 4 GB | 8 GB |
| 3 instances | 6 GB | 12 GB |
| 5+ instances | 12 GB | 16+ GB |
Use Docker resource limits to prevent one instance from starving others:
services:
odoo17:
deploy:
resources:
limits:
memory: 2G
cpus: '1.0'
The Easy Way: DeployMonkey
DeployMonkey natively supports multiple Odoo instances on a single server. Each instance gets its own Docker stack, database, SSL certificate, and backup schedule — all managed through the dashboard. You can deploy Odoo 14 through 19 side by side without touching Docker Compose files or Nginx configs.
Frequently Asked Questions
Can different Odoo versions share the same PostgreSQL?
Technically yes — each Odoo instance uses a different database name. But separate PostgreSQL instances are recommended to avoid version compatibility issues and to isolate performance.
How much RAM do I need for 3 Odoo instances?
Plan for at least 2 GB per instance (Odoo + PostgreSQL). A server with 8-12 GB RAM comfortably runs 3 instances with headroom for spikes.
Can I share custom modules across versions?
Generally no. Custom modules must be adapted for each Odoo version due to API changes. Mount version-specific addons directories in each Docker stack.
How do I back up multiple instances?
Back up each PostgreSQL database and filestore separately. With DeployMonkey, each instance has its own automated S3 backup schedule. See automated S3 backups.