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