Untuk menggunakan modul **`session_db`** (menyimpan session langsung ke dalam database PostgreSQL), kita tidak memerlukan layanan tambahan seperti Redis. Namun, karena modul ini merubah cara bawaan Odoo bekerja, Anda memerlukan sedikit penyesuaian pada file konfigurasi Odoo (`odoo.conf`) agar Odoo memuat modul tersebut sejak awal (*bootstrap*), serta struktur Docker Compose yang tepat.

Modul `session_db` yang populer untuk Odoo 16 biasanya membutuhkan parameter `server_wide_modules` agar diaktifkan sebelum database utama dipilih oleh pengguna.

Berikut adalah konfigurasi lengkapnya:

### 1. Struktur Folder Projek

Pastikan struktur folder Anda seperti ini:

```text
mini-ha-odoo/
├── docker-compose.yml
├── nginx.conf
├── odoo.conf
└── odoo_addons/
    └── session_db/  <-- Tempatkan source code modul session_db di sini

```

> *Catatan: Anda perlu mengunduh modul `session_db` untuk Odoo 16 (misalnya dari repositori OCA atau developer komunitas di GitHub) dan mengekstraknya ke dalam folder `odoo_addons`.*

---

### 2. File Konfigurasi Odoo (`odoo.conf`)

Buat file `odoo.conf` di folder utama. File ini akan dibaca oleh kedua *instance* Odoo. Kunci utamanya ada pada baris `server_wide_modules`.

```ini
[options]
# Konfigurasi Database (akan di-override oleh env docker, tapi aman untuk ditulis)
db_host = pgpool
db_port = 5432
db_user = odoo
db_password = odoo_secure_pass

# Lokasi Addons (termasuk folder custom addons kita)
addons_path = /usr/lib/python3/dist-packages/odoo/addons,/mnt/extra-addons

# WAJIB: Memaksa Odoo memuat modul session_db sejak awal sistem menyala
server_wide_modules = base,web,session_db

# Optimasi Multiprocessing (Sangat disarankan untuk HA)
workers = 2
longpolling_port = 8072

```

---

### 3. File Docker Compose (`docker-compose.yml`)

Pada konfigurasi ini, volume Odoo 1 dan Odoo 2 dibuat terpisah (`odoo_data_1` dan `odoo_data_2`) karena session tidak lagi disimpan di sana, melainkan langsung dikirim ke cluster PostgreSQL melalui `pgpool`.

```yaml
version: '3.8'

services:
  # -------------------------------------------------------------------
  # DATABASE LAYER (HA Postgres via Bitnami Primary/Standby + Pgpool)
  # -------------------------------------------------------------------
  pg-primary:
    image: bitnami/postgresql:15
    environment:
      - POSTGRESQL_POSTGRES_PASSWORD=primary_master_pass
      - POSTGRESQL_USERNAME=odoo
      - POSTGRESQL_PASSWORD=odoo_secure_pass
      - POSTGRESQL_DATABASE=odoo_db
      - POSTGRESQL_REPLICATION_MODE=primary
      - POSTGRESQL_REPLICATION_USER=repl_user
      - POSTGRESQL_REPLICATION_PASSWORD=repl_password
    volumes:
      - pg_primary_data:/bitnami/postgresql

  pg-standby:
    image: bitnami/postgresql:15
    depends_on:
      - pg-primary
    environment:
      - POSTGRESQL_POSTGRES_PASSWORD=primary_master_pass
      - POSTGRESQL_MASTER_HOST=pg-primary
      - POSTGRESQL_MASTER_PORT_NUMBER=5432
      - POSTGRESQL_REPLICATION_MODE=standby
      - POSTGRESQL_REPLICATION_USER=repl_user
      - POSTGRESQL_REPLICATION_PASSWORD=repl_password
    volumes:
      - pg_standby_data:/bitnami/postgresql

  pgpool:
    image: bitnami/pgpool:4
    ports:
      - "5432:5432"
    depends_on:
      - pg-primary
      - pg-standby
    environment:
      - PGPOOL_BACKEND_NODES=0:pg-primary:5432,1:pg-standby:5432
      - PGPOOL_SR_CHECK_USER=odoo
      - PGPOOL_SR_CHECK_PASSWORD=odoo_secure_pass
      - PGPOOL_SR_CHECK_DATABASE=odoo_db
      - PGPOOL_ENABLE_LDAP=no
      - PGPOOL_POSTGRES_USERNAME=postgres
      - PGPOOL_POSTGRES_PASSWORD=primary_master_pass
      - PGPOOL_ADMIN_USERNAME=admin
      - PGPOOL_ADMIN_PASSWORD=admin_pass

  # -------------------------------------------------------------------
  # APPLICATION LAYER (Odoo Cluster dengan Konfigurasi session_db)
  # -------------------------------------------------------------------
  odoo_app_1:
    image: odoo:16.0
    depends_on:
      - pgpool
    volumes:
      - ./odoo.conf:/etc/odoo/odoo.conf:ro # Me-mount file konfigurasi odoo.conf
      - ./odoo_addons:/mnt/extra-addons    # Me-mount folder tempat modul session_db berada
      - odoo_data_1:/var/lib/odoo
    # Menggunakan perintah menjalankan odoo dengan menunjuk odoo.conf secara eksplisit
    command: odoo -c /etc/odoo/odoo.conf 

  odoo_app_2:
    image: odoo:16.0
    depends_on:
      - pgpool
    volumes:
      - ./odoo.conf:/etc/odoo/odoo.conf:ro
      - ./odoo_addons:/mnt/extra-addons
      - odoo_data_2:/var/lib/odoo
    command: odoo -c /etc/odoo/odoo.conf

  # -------------------------------------------------------------------
  # LOAD BALANCER LAYER (Nginx)
  # -------------------------------------------------------------------
  nginx_lb:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - odoo_app_1
      - odoo_app_2

volumes:
  pg_primary_data:
  pg_standby_data:
  odoo_data_1:
  odoo_data_2:

```

---

### 4. File `nginx.conf` (Tetap Sama)

Gunakan file `nginx.conf` yang telah kita buat pada jawaban pertama. Nginx akan mendistribusikan *traffic* secara adil (*Round Robin*) ke `odoo_app_1` dan `odoo_app_2`. Karena session dibaca langsung dari database bersama, user tidak akan ter-log out meskipun dilempar antar-kontainer Odoo.

### Cara Menjalankan & Verifikasi:

1. Pastikan modul `session_db` sudah ada di dalam `./odoo_addons/session_db/`.
2. Jalankan perintah: `docker compose up -d`
3. Saat pertama kali membuat database baru di Odoo, modul OCA `session_db` biasanya otomatis membuat tabel baru (misal: `session_db_session` atau sejenisnya tergantung pembuat modul) di database PostgreSQL Anda.
4. Anda bisa melakukan tes dengan mematikan salah satu kontainer odoo (`docker compose stop odoo_app_1`), dan Anda akan tetap *login* saat me-refresh halaman karena `odoo_app_2` dapat membaca session Anda dari database utama.