Lewati ke isi

Panduan Deployment Modul Custom Odoo

Ringkasan Dokumentasi Deployment Odoo

Dokumen ini merangkum cara deployment modul custom Odoo ke server produksi berdasarkan best practices dari dokumentasi resmi Odoo.


1. Arsitektur Deployment Odoo

Komponen Utama

  • Odoo Server: Aplikasi Python yang menjalankan logika bisnis
  • PostgreSQL: Database untuk menyimpan data
  • Nginx/Apache: Reverse proxy untuk handling SSL dan load balancing
  • Longpolling: Service terpisah untuk real-time notifications

Struktur Direktori Standar

/odoo/
├── odoo-server/           # Odoo source code
├── custom-addons/         # Modul custom
│   └── scola/             # Scola modules
├── config/
│   └── odoo.conf          # Konfigurasi Odoo
├── logs/
│   └── odoo.log           # Log files
└── data/
    └── filestore/         # File attachments

2. Konfigurasi Server Produksi

2.1 Konfigurasi Odoo (odoo.conf)

[options]
; Database
db_host = localhost
db_port = 5432
db_user = odoo
db_password = <strong_password>
db_name = scola_prod
dbfilter = ^scola_prod$

; Paths
addons_path = /odoo/odoo-server/addons,/odoo/custom-addons/scola
data_dir = /odoo/data

; Server
http_port = 8069
longpolling_port = 8072
proxy_mode = True
workers = 4
max_cron_threads = 2

; Security
list_db = False
admin_passwd = <master_password>

; Logging
logfile = /odoo/logs/odoo.log
log_level = warn
log_handler = :INFO

; Performance
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_time_cpu = 600
limit_time_real = 1200

2.2 Konfigurasi Workers

Tipe CPU RAM Workers
Small 2 cores 4GB 2
Medium 4 cores 8GB 4
Large 8 cores 16GB 8

Formula: workers = (CPU cores * 2) + 1

2.3 Konfigurasi PostgreSQL

-- Buat user dan database
CREATE USER odoo WITH PASSWORD 'secure_password';
CREATE DATABASE scola_prod OWNER odoo;
GRANT ALL PRIVILEGES ON DATABASE scola_prod TO odoo;

-- Optimasi untuk produksi
ALTER SYSTEM SET shared_buffers = '256MB';
ALTER SYSTEM SET effective_cache_size = '1GB';
ALTER SYSTEM SET maintenance_work_mem = '128MB';
ALTER SYSTEM SET checkpoint_completion_target = 0.9;
ALTER SYSTEM SET wal_buffers = '16MB';
ALTER SYSTEM SET default_statistics_target = 100;
ALTER SYSTEM SET random_page_cost = 1.1;
ALTER SYSTEM SET effective_io_concurrency = 200;

3. Konfigurasi Nginx Reverse Proxy

upstream odoo {
    server 127.0.0.1:8069;
}

upstream odoo-chat {
    server 127.0.0.1:8072;
}

server {
    listen 80;
    server_name scola.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name scola.example.com;

    # SSL Configuration
    ssl_certificate /etc/letsencrypt/live/scola.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/scola.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;

    # Proxy Headers
    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;

    # Longpolling
    location /longpolling {
        proxy_pass http://odoo-chat;
        proxy_connect_timeout 3600s;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }

    # Main Odoo
    location / {
        proxy_pass http://odoo;
        proxy_read_timeout 720s;
        proxy_connect_timeout 720s;
        proxy_send_timeout 720s;

        # File upload size
        client_max_body_size 100M;
    }

    # Static files caching
    location ~* /web/static/ {
        proxy_pass http://odoo;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # Gzip
    gzip on;
    gzip_types text/css text/plain text/xml application/json application/javascript;
}

4. Proses Deployment Modul Custom

4.1 Langkah Manual

# 1. Clone/Update repository
cd /odoo/custom-addons
git pull origin main

# 2. Backup database sebelum update
pg_dump -h localhost -U odoo scola_prod > backup_$(date +%Y%m%d).sql

# 3. Update modul
/odoo/odoo-server/odoo-bin -c /odoo/config/odoo.conf -u scola_core,scola_fees -d scola_prod --stop-after-init

# 4. Restart Odoo service
sudo systemctl restart odoo

4.2 Update Daftar Modul

# Update apps list (untuk modul baru)
/odoo/odoo-server/odoo-bin -c /odoo/config/odoo.conf -d scola_prod --update-apps-list --stop-after-init

4.3 Install Modul Baru

# Install modul baru
/odoo/odoo-server/odoo-bin -c /odoo/config/odoo.conf -i scola_new_module -d scola_prod --stop-after-init

4.4 Checklist Deploy scola_attendance

Checklist ini dipakai untuk rollout domain absensi yang melibatkan scola_attendance, scola_hr_attendance, dan scola_smart_attendance.

Local

# 1. Syntax check minimum
python3 -m py_compile scola_smart_attendance/controllers/rfid_frontend_api.py scola_smart_attendance/controllers/rfid_api.py

# 2. Upgrade modul domain absensi
./odoo-bin \
  -c config/scola-dev.conf \
  -d scoladev \
    -u scola_smart_attendance,scola_hr_attendance,scola_attendance \
  --stop-after-init

# 3. Start/restart Odoo dan verifikasi endpoint
./odoo-bin -c config/scola-dev.conf

Verifikasi minimum:

  • /api/rfid/cards
  • /api/rfid/devices
  • /api/rfid/config
  • /api/v1/attendance/settings

Server Dev

sudo systemctl stop odoo-devscola
sudo -u scola /home/scola/odoo/odoo-bin \
  -c /home/scola/odoo/odoo-devscola.conf \
  -d scoladev \
    -u scola_smart_attendance,scola_hr_attendance,scola_attendance \
  --stop-after-init
sudo systemctl start odoo-devscola
curl -sf http://localhost:8074/web/login > /dev/null

Verifikasi minimum:

  • tidak ada error pada journalctl -u odoo-devscola -n 100
  • halaman admin RFID termuat tanpa fallback legacy
  • self-attendance staf lolos settings -> validate-location -> check-in/check-out

Catatan:

  • jalankan ketiga modul sekaligus jika perubahan menyentuh manifest dependency, security, controller RFID, face verification, atau GPS attendance,
  • workflow backend GitHub Actions sudah menambahkan pasangan modul ini secara otomatis saat salah satunya berubah.

5. Systemd Service

/etc/systemd/system/odoo.service

[Unit]
Description=Odoo
After=network.target postgresql.service

[Service]
Type=simple
User=odoo
Group=odoo
ExecStart=/odoo/odoo-server/odoo-bin -c /odoo/config/odoo.conf
StandardOutput=journal+console
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Commands

sudo systemctl daemon-reload
sudo systemctl enable odoo
sudo systemctl start odoo
sudo systemctl status odoo
sudo journalctl -u odoo -f  # View logs

6. Keamanan Produksi

6.1 Checklist Keamanan

  • [ ] list_db = False - Disable database listing
  • [ ] dbfilter - Filter database by hostname
  • [ ] SSL/TLS enabled dengan sertifikat valid
  • [ ] Firewall hanya buka port 80, 443
  • [ ] PostgreSQL hanya listen localhost
  • [ ] Regular backup otomatis
  • [ ] Admin password yang kuat
  • [ ] Disable database manager di produksi

6.2 Firewall (UFW)

sudo ufw allow 22/tcp      # SSH
sudo ufw allow 80/tcp      # HTTP
sudo ufw allow 443/tcp     # HTTPS
sudo ufw enable

7. Backup & Recovery

7.1 Backup Script

#!/bin/bash
BACKUP_DIR=/odoo/backups
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME=scola_prod

# Database backup
pg_dump -h localhost -U odoo $DB_NAME | gzip > $BACKUP_DIR/db_$DATE.sql.gz

# Filestore backup
tar -czf $BACKUP_DIR/filestore_$DATE.tar.gz /odoo/data/filestore/$DB_NAME

# Keep last 7 days
find $BACKUP_DIR -mtime +7 -delete

7.2 Cron Backup (Daily)

0 2 * * * /odoo/scripts/backup.sh >> /odoo/logs/backup.log 2>&1

8. Monitoring

8.1 Health Check Endpoint

# Di controller custom
@http.route('/health', type='http', auth='none')
def health_check(self):
    return 'OK'

8.2 Log Monitoring

# Real-time log
tail -f /odoo/logs/odoo.log

# Error monitoring
grep -i error /odoo/logs/odoo.log | tail -50

9. CI/CD dengan GitHub Actions

Workflow Overview

  1. Lint & Test: Validasi sintaks dan jalankan unit test
  2. Build: Siapkan artifact untuk deployment
  3. Deploy: Kirim ke server dan restart service

Secrets yang Diperlukan

Secret Deskripsi
SSH_PRIVATE_KEY SSH key untuk akses server
SSH_HOST IP/hostname server produksi
SSH_USER Username SSH
ODOO_DB_NAME Nama database Odoo
ODOO_MODULES Modul yang akan diupdate

10. Troubleshooting

Error Umum

Error Penyebab Solusi
FATAL: database does not exist Database belum dibuat Buat database baru
Permission denied File permission salah chown -R odoo:odoo /odoo
Module not found addons_path salah Periksa path di odoo.conf
502 Bad Gateway Odoo not running Restart Odoo service
Memory limit exceeded RAM tidak cukup Kurangi workers atau tambah RAM

Debug Mode (Development Only!)

# JANGAN gunakan di production
/odoo/odoo-server/odoo-bin -c /odoo/config/odoo.conf --dev=all

11. Referensi


Dokumen ini dibuat untuk pembelajaran deployment Scola Odoo modules. Last updated: January 2026