📄

How to Deployment Odoo on VPS with Docker Setup?

March 14, 2026Server

Deployment Odoo with Docker


Requirements

Minimum server:

  • 2 vCPU
  • 4GB RAM (disarankan)
  • 20GB SSD
  • OS: Ubuntu 22.04 LTS

Arsitektur Deployment

User → Nginx (80/443) → Odoo Container (8069)
↘ PostgreSQL Container (5432)

Basic Steps

1. Install Docker & Docker Compose

Update server

sudo apt update && sudo apt upgrade -y

Install docker

sudo apt install docker.io -y

Enable & start

sudo systemctl enable docker
sudo systemctl start docker

Install docker compose

sudo apt install docker-compose -y

Cek versi

docker --version
docker-compose --version

2. Struktur Folder Project

Buat folder deployment

mkdir -p /opt/odoo-docker
cd /opt/odoo-docker

Struktur final

/opt/odoo-docker
├── docker-compose.yml
├── odoo
| ​├── odoo.conf
| └── requirements.txt
└── addons/

3. Buat File docker-compose.yml

Buat file docker-compose.yml

nano docker-compose.yml

Isi

Opsi A (simple)

version: '3'

services:
db:
image: postgres:15
container_name: odoo-postgres
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo
volumes:
- odoo-db-data:/var/lib/postgresql/data
restart: always

odoo:
image: docker.io/mraldirs1231/odoo18e:latest
container_name: odoo-18
depends_on:
- db
ports:
- "8069:8069"
volumes:
- ./odoo.conf:/etc/odoo/odoo.conf
- ./addons:/mnt/extra-addons
- odoo-web-data:/var/lib/odoo
environment:
- HOST=db
- USER=odoo
- PASSWORD=odoo
restart: always

volumes:
odoo-db-data:
odoo-web-data:

Opsi B (Advanced)

version: '3'

services:

db:
image: postgres:16
container_name: odoo-18
ports:
- "${POSTGRES_PORT:-5432}:5432"
environment:
POSTGRES_USER: '${POSTGRES_USER:-odoo}'
POSTGRES_PASSWORD: '${POSTGRES_PASSWORD:-odoo}'
POSTGRES_DB: '${POSTGRES_DB:-postgres}'
PGDATA : /var/lib/postgresql/data
volumes:
- ./odoo-postgres:/var/lib/postgresql/data
restart: always

redis:
image: redis:latest
restart: always
ports:
- "${REDIS_PORT:-6379}:6379"
command:
- redis-server
- --requirepass
- '${REDIS_PASSWORD:-odoo}'
- --appendonly
- "no"
- --timeout
- "300"
volumes:
- ./odoo-redis/data/:/data
- ./odoo-redis/conf/:/usr/local/etc/redis/

odoo:
image: docker.io/mraldirs1231/odoo18e:latest
user: root
container_name: odoo-18
depends_on:
- redis
- db
ports:
- "${ODOO_HTTP_PORT:-8069}:8069"
- "${ODOO_LONGPOLLING_PORT:-8072}:8072"
environment:
HOST: db
USER: '${POSTGRES_USER:-odoo}'
PASSWORD: '${POSTGRES_PASSWORD:-odoo}'
DB: '${POSTGRES_DB:-postgres}'
REDIS_PASSWORD: '${REDIS_PASSWORD:-odoo}'
volumes:
- ./entrypoint.sh:/entrypoint.sh
- ./odoo/odoo.conf:/etc/odoo/odoo.conf
- ./odoo/logs:/etc/odoo/logs
- ./odoo-web/addons:/etc/odoo/addons
- ./odoo-web/filestore:/etc/odoo/filestore
- ./odoo-web/sessions:/etc/odoo/sessions
- ./odoo-web/requirements.txt:/etc/odoo/requirements.txt
- ./custom-addons:/mnt/custom-addons
- ./default-addons:/mnt/default-addons
restart: always

4. Buat File konfigurasi

Buat file odoo.conf

cd /opt/odoo-docker/odoo
nano odoo.conf

Isi

Opsi A (Simple - Reference dari docker-compose opsi A)

[options]
admin_passwd = admin_master_password
db_host = db
db_port = 5432
db_user = odoo
db_password = odoo

addons_path = /mnt/extra-addons

proxy_mode = True
workers = 4
max_cron_threads = 2
limit_memory_soft = 2147483648
limit_memory_hard = 2684354560
limit_time_cpu = 600
limit_time_real = 1200

Opsi B (Advanced - Reference dari docker-compose opsi B)

[options]
addons_path = /mnt/extra-addons, /mnt/lema-addons
data_dir = /etc/odoo
admin_passwd = admin_master_password
; http_interface = 0.0.0.0
; http_port = 8069
longpolling_port = False
proxy_mode = True
xmlrpc_port = 8069
gevent_port = 8072
dbfilter = spesific_database
logfile = /etc/odoo/logs/odoo-server.log
; smtp_server = mxtwo.lema.com
; smtp_port = 465
; smtp_ssl = True
; smtp_user = notify@erp.lema.com
; smtp_password = smtp_password
; db_name =
; db_user =
; db_password =
; pg_path =
; db_host =
; db_port =
; db_sslmode = prefer
db_maxconn = 64
; db_template = template0

# False jika sudah masuk ke production
list_db = True

dev_mode = reload
max_cron_threads = 1
workers = 4
limit_memory_soft = 2684354560
limit_memory_hard = 3221225472
limit_time_cpu = 600
limit_time_real = 1200
; limit_time_real_cron = -1
limit_request = 8192

enable_redis = True
redis_host = redis
; redis_port = 6379
redis_pass = odoo

Buat file .env (Jika mengacu pada Opsi B)

POSTGRES_USER=odoo
POSTGRES_PORT=5432
POSTGRES_PASSWORD=password_of_postgres
PG_BOUNCER_PORT=7755
REDIS_PORT=8258
REDIS_PASSWORD=passowrd_of_redis
ODOO_HTTP_PORT=8069
ODOO_LONGPOLLING_PORT=8072
# DB_ODOO_NAME=

Buat file entrypoint.sh

#!/bin/bash

set -e

if [ -v PASSWORD_FILE ]; then
PASSWORD="$(< $PASSWORD_FILE)"
fi

# set the postgres database host, port, user and password according to the environment
# and pass them as arguments to the odoo process if not present in the config file
: ${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}}
: ${PORT:=${DB_PORT_5432_TCP_PORT:=5432}}
: ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}}
: ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}}

# install python packages
pip3 install pip --upgrade
pip3 install -r /etc/odoo/requirements.txt

DB_ARGS=()
function check_config() {
param="$1"
value="$2"
if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then
value=$(grep -E "^\s*\b${param}\b\s*=" "$ODOO_RC" |cut -d " " -f3|sed 's/["\n\r]//g')
fi;
DB_ARGS+=("--${param}")
DB_ARGS+=("${value}")
}
check_config "db_host" "$HOST"
check_config "db_port" "$PORT"
check_config "db_user" "$USER"
check_config "db_password" "$PASSWORD"

case "$1" in
-- | odoo)
shift
if [[ "$1" == "scaffold" ]] ; then
exec odoo "$@"
else
wait-for-psql.py ${DB_ARGS[@]} --timeout=30
exec odoo "$@" "${DB_ARGS[@]}"
fi
;;
-*)
wait-for-psql.py ${DB_ARGS[@]} --timeout=30
exec odoo "$@" "${DB_ARGS[@]}"
;;
*)
exec "$@"
esac

exit 1

Akses file & folder

chmod 777 .
chmod 777 ./entrypoint.sh

5. Jalankan Odoo

docker-compose up -d

Cek container

docker ps

Akses

http://IP_SERVER:8069

💡Tips

Restart docker-compose

docker-compose restart

Restart docker dengan spesific name

docker restart odoo-18

Install manual dependencies on container (akan hilang jika di rebuild)

docker exec -it odoo bash
pip3 install easyocr

Backup dan Restore Database

Backup database

docker exec -t odoo_db pg_dump -U odoo dbname > backup.sql

Restore database

cat backup.sql | docker exec -i odoo_db psql -U odoo dbname