Deployment guide · Updated August 2026Panduan deployment · Diperbarui Agustus 2026

Fresh Ubuntu → Docker → Portainer → PostgreSQL → Odoo 19

Ubuntu baru → Docker → Portainer → PostgreSQL → Odoo 19

A clean, repeatable baseline for a lab or staging server. Complete the sections in order and verify each checkpoint before moving on.

Baseline yang bersih dan dapat diulang untuk server lab atau staging. Ikuti bagian secara berurutan dan verifikasi setiap checkpoint sebelum melanjutkan.

Before you begin

Sebelum mulai

Use a fresh Ubuntu Server with a sudo user, a static public or private IP, and at least 4 GB RAM. The examples assume Ubuntu 24.04 LTS and a lab/staging environment.

Gunakan Ubuntu Server baru dengan pengguna sudo, IP publik atau privat yang tetap, dan RAM minimal 4 GB. Contoh mengasumsikan Ubuntu 24.04 LTS untuk lingkungan lab/staging.

Security: do not expose ports 9000, 9443, 5432, or 8069 directly to the public internet. Use a firewall, VPN, and reverse proxy with TLS for production.Keamanan: jangan membuka port 9000, 9443, 5432, atau 8069 langsung ke internet. Gunakan firewall, VPN, dan reverse proxy dengan TLS untuk produksi.

1. Prepare UbuntuSiapkan Ubuntu

Update packages, install basic tools, then enable the firewall without locking out SSH.

Perbarui paket, instal alat dasar, lalu aktifkan firewall tanpa memblokir SSH.

sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg ufw
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status
Checkpoint: package updates finish without errors and UFW reports SSH as allowed.Checkpoint: pembaruan paket selesai tanpa error dan UFW menampilkan SSH sebagai allowed.

2. Install Docker EngineInstal Docker Engine

Use Docker's official Ubuntu repository and install the Compose plugin.

Gunakan repositori resmi Docker untuk Ubuntu dan instal plugin Compose.

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker run --rm hello-world

Optional: add your user to the Docker group, then sign out and back in. Membership grants root-equivalent control of Docker.

Opsional: tambahkan pengguna ke grup Docker, lalu logout dan login kembali. Keanggotaan ini memberi kontrol Docker setara root.

sudo usermod -aG docker $USER

3. Run PortainerJalankan Portainer

Create a persistent volume and start Portainer CE on HTTPS port 9443.

Buat volume persisten dan jalankan Portainer CE pada port HTTPS 9443.

docker volume create portainer_data
docker run -d \
  --name portainer \
  --restart=always \
  -p 9443:9443 \
  -p 8000:8000 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:lts

Open https://SERVER_IP:9443, accept the initial self-signed certificate warning, create the administrator, and select the local Docker environment.

Buka https://IP_SERVER:9443, terima peringatan sertifikat self-signed awal, buat administrator, lalu pilih environment Docker lokal.

4. Deploy PostgreSQL and Odoo 19Deploy PostgreSQL dan Odoo 19

Create a project folder and save the following as compose.yaml. Replace every placeholder password before starting.

Buat folder proyek dan simpan konfigurasi berikut sebagai compose.yaml. Ganti seluruh password contoh sebelum dijalankan.

mkdir -p ~/odoo19 && cd ~/odoo19
nano compose.yaml
services:
  db:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: odoo
      POSTGRES_PASSWORD: CHANGE_THIS_DB_PASSWORD
    volumes:
      - odoo-db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U odoo -d postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks: [odoo-net]

  odoo:
    image: odoo:19.0
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "8069:8069"
    environment:
      HOST: db
      USER: odoo
      PASSWORD: CHANGE_THIS_DB_PASSWORD
    volumes:
      - odoo-web-data:/var/lib/odoo
      - ./addons:/mnt/extra-addons
      - ./config:/etc/odoo
    networks: [odoo-net]

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

networks:
  odoo-net:

Create the bind-mounted folders, add a minimal Odoo configuration, then start the stack.

Buat folder bind mount, tambahkan konfigurasi minimum Odoo, lalu jalankan stack.

mkdir -p addons config
nano config/odoo.conf
[options]
admin_passwd = CHANGE_THIS_MASTER_PASSWORD
db_host = db
db_port = 5432
db_user = odoo
db_password = CHANGE_THIS_DB_PASSWORD
addons_path = /usr/lib/python3/dist-packages/odoo/addons,/mnt/extra-addons
proxy_mode = False
docker compose pull
docker compose up -d
The odoo:19.0 tag must exist in your registry when you test this guide. If it is not yet published or your organization uses a custom build, replace it with the exact approved Odoo 19 image tag.Tag odoo:19.0 harus tersedia di registry saat panduan diuji. Jika belum dipublikasikan atau organisasi memakai build kustom, ganti dengan tag image Odoo 19 yang telah disetujui.

5. Verify the deploymentVerifikasi deployment

docker compose ps
docker compose logs --tail=100 db
docker compose logs --tail=100 odoo
curl -I http://127.0.0.1:8069

Open http://SERVER_IP:8069. Create the first database using the master password from odoo.conf. Keep the database port private; Odoo reaches PostgreSQL through the internal Docker network.

Buka http://IP_SERVER:8069. Buat database pertama menggunakan master password dari odoo.conf. Biarkan port database tetap privat; Odoo mengakses PostgreSQL melalui jaringan internal Docker.

Before production

Sebelum produksi

  • Put Odoo behind Nginx or another reverse proxy with a valid TLS certificate.
  • Tempatkan Odoo di belakang Nginx atau reverse proxy lain dengan sertifikat TLS valid.
  • Set proxy_mode = True only after trusted proxy headers are configured.
  • Aktifkan proxy_mode = True hanya setelah header proxy tepercaya dikonfigurasi.
  • Restrict firewall access to management ports and disable public database listing.
  • Batasi akses firewall ke port manajemen dan nonaktifkan daftar database publik.
  • Automate encrypted backups of both PostgreSQL and the Odoo filestore, then test restores.
  • Otomatiskan backup terenkripsi PostgreSQL dan filestore Odoo, lalu uji proses restore.
  • Pin tested image versions and schedule maintenance windows for updates.
  • Gunakan versi image yang telah diuji dan jadwalkan maintenance untuk pembaruan.