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.
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
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
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.