From f4d8bd1f4c032d25a3036c87d70c0d98d645e8d4 Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 16 Sep 2026 23:33:09 +0700 Subject: [PATCH 1/4] upgrade to odoo18 --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index f4e41b7..edcd4c6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -28,7 +28,7 @@ services: - saat-odoo-net odoo: - image: odoo:17.0 + image: odoo:18.0 container_name: saat-odoo restart: unless-stopped depends_on: From 4d364e6627ae815097be0eab931cfd5f65cb6ac4 Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 16 Sep 2026 23:54:22 +0700 Subject: [PATCH 2/4] fix session dir --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index edcd4c6..eafb8d7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,6 +43,7 @@ services: - ADMIN_PASSWORD=${ADMIN_PASSWD} volumes: - saat_odoo_filestore:/var/lib/odoo + - saat_odoo_session:/var/lib/odoo/session - ./addons:/mnt/extra-addons networks: - saat-odoo-net @@ -50,6 +51,7 @@ services: volumes: saat_odoo_pgdata: saat_odoo_filestore: + saat_odoo_session: networks: saat-odoo-net: From 7b6ffcb784b260d3e97afdb7d5aefae4457bcad2 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 17 Sep 2026 00:04:44 +0700 Subject: [PATCH 3/4] fix session dir --- docker-compose.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index eafb8d7..edcd4c6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,7 +43,6 @@ services: - ADMIN_PASSWORD=${ADMIN_PASSWD} volumes: - saat_odoo_filestore:/var/lib/odoo - - saat_odoo_session:/var/lib/odoo/session - ./addons:/mnt/extra-addons networks: - saat-odoo-net @@ -51,7 +50,6 @@ services: volumes: saat_odoo_pgdata: saat_odoo_filestore: - saat_odoo_session: networks: saat-odoo-net: From a12a27c7b5aff521797aa1992735b4f19aaf7e8e Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 17 Sep 2026 20:31:08 +0700 Subject: [PATCH 4/4] update README --- .gitignore | 1 + README.md | 110 +++++++++++++++++++++++++++++++++++++++++++-- docker-compose.yml | 2 +- 3 files changed, 109 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index e195c73..f325fad 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,6 @@ __pycache__/ # Terraform / backup dll *.bak *.log +backups/ .github/ diff --git a/README.md b/README.md index 1656a21..c91f16b 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,13 @@ saat-app/ ## Cara menjalankan ```bash -cd /home/ardhi/Application/saat-app +cd /home/ardhi/workspace/erp/odoo-app/saat-app docker compose config # validasi docker compose up -d # start ``` -Akses UI: http://localhost:18069 — login `admin` / `admin` -(`ADMIN_PASSWORD` untuk Database Management di `.env`). +Akses UI: http://localhost:18069 — login `admin` dengan password +`ODOO_ADMIN_PASSWORD` di `.env`. ## Status - ✅ Odoo 17 container jalan (port 18069), DB PostgreSQL 16 healthy @@ -67,6 +67,110 @@ docker restart saat-odoo > Catatan Odoo: `` view di Odoo 17 kadang bermasalah, pakai `` > (kompatibel lintas versi) seperti yang sudah dilakukan. +## Troubleshooting PermissionError sessions + +Jika muncul: + +```text +PermissionError: [Errno 13] Permission denied: '/var/lib/odoo/sessions' +``` + +Odoo 17 berjalan sebagai user `odoo` dengan UID/GID `101`. Perbaiki +ownership seluruh volume data Odoo dari container yang sedang berjalan: + +```bash +cid=$(docker compose ps -q odoo) +docker exec --user root "$cid" sh -c \ + 'chown -R 101:101 /var/lib/odoo && \ + chmod 755 /var/lib/odoo && chmod 700 /var/lib/odoo/sessions' +``` + +Verifikasi write access sebagai user Odoo, lalu restart dan cek log: + +```bash +docker exec --user odoo "$cid" sh -c \ + 'touch /var/lib/odoo/sessions/.write-check && \ + rm /var/lib/odoo/sessions/.write-check' +docker compose restart odoo +docker compose logs --since=30s odoo +``` + +Gunakan hanya satu mount volume utama berikut pada Compose: + +```yaml +volumes: + - saat_odoo_filestore:/var/lib/odoo +``` + +Jangan menambahkan mount terpisah ke `/var/lib/odoo/session` (singular). +Path yang dipakai Odoo adalah `/var/lib/odoo/sessions` (plural). Jangan +menggunakan `chmod 777`; cukup berikan ownership kepada user Odoo. + +## Rencana migrasi Odoo 17 ke Odoo 18 + +Migrasi major version harus mengubah schema database. Mengganti image secara +langsung dari `odoo:17.0` ke `odoo:18.0` **bukan** prosedur migrasi dan dapat +menyebabkan error seperti `column res_lang.short_time_format does not exist`. +Compose harus tetap menggunakan `odoo:17.0` sampai database selesai dimigrasi. + +### 1. Persiapan dan backup + +Pastikan `.env` terisi dan jangan commit file tersebut. Hentikan penulisan data, +lalu buat backup database dan filestore: + +```bash +set -a && source .env && set +a +backup_dir="backups/odoo17-$(date +%Y%m%d-%H%M%S)" +mkdir -p "$backup_dir" +docker compose exec -T db pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" -Fc \ + > "$backup_dir/database.dump" +volume=$(docker inspect saat-odoo --format '{{range .Mounts}}{{if eq .Destination "/var/lib/odoo"}}{{.Name}}{{end}}{{end}}') +docker run --rm -v "$volume:/source:ro" -v "$PWD/$backup_dir:/backup" alpine \ + sh -c 'tar czf /backup/filestore.tar.gz -C /source .' +``` + +Validasi backup dengan `pg_restore --list` dari image PostgreSQL 16 dan pastikan +arsip filestore berisi direktori `filestore/`. + +### 2. Migrasi pada salinan + +Jangan menguji migrasi pada volume produksi. Restore `database.dump` dan +`filestore.tar.gz` ke environment staging yang terpisah, lalu gunakan salah +satu jalur resmi berikut: + +- Odoo Upgrade Service untuk database Enterprise. +- OpenUpgrade dengan branch yang sesuai untuk migrasi Community 17 ke 18. + +Migrasikan database terlebih dahulu. Sesuaikan custom addon `saat_invest` +dengan API, view, security, dan dependency Odoo 18, lalu install/upgrade addon +di database staging hasil migrasi. + +### 3. Validasi staging + +Uji login, menu saham, create/update/delete transaksi, kalkulasi portofolio, +cron harga pasar, attachment/filestore, dan seluruh endpoint JSON-RPC yang +dipakai Flutter. Periksa log untuk `ERROR`, `Traceback`, `UndefinedColumn`, dan +`PermissionError`. + +### 4. Cutover produksi + +Setelah staging lulus, hentikan Odoo 17, buat backup final, restore atau jalankan +migrasi pada database produksi sesuai prosedur tool migrasi, kemudian ubah: + +```yaml +image: odoo:18.0 +``` + +Pastikan ownership volume sesuai user Odoo 18 sebelum start, jalankan +`docker compose up -d`, dan ulangi seluruh validasi staging. + +### 5. Rollback + +Jika migrasi gagal, jangan menjalankan Odoo 17 pada database yang sudah sebagian +dimigrasi. Hentikan stack, restore database dan filestore dari backup Odoo 17 +ke volume/database terpisah, ubah image kembali ke `odoo:17.0`, lalu validasi +aplikasi sebelum cutover ulang. + ## API untuk Flutter (via JSON-RPC `execute_kw`) Semua melalui `POST /jsonrpc` dengan `{service:'object', method:'execute_kw'}`. Login: `common.authenticate(db, user, pass)` → `uid`. diff --git a/docker-compose.yml b/docker-compose.yml index edcd4c6..f4e41b7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -28,7 +28,7 @@ services: - saat-odoo-net odoo: - image: odoo:18.0 + image: odoo:17.0 container_name: saat-odoo restart: unless-stopped depends_on: