ติดตั้ง Odoo ด้วย Docker Compose บน Cloud VPS

ติดตั้ง Odoo ระบบ ERP โอเพนซอร์สบนเซิร์ฟเวอร์ของตัวเอง พร้อมตั้งค่าที่จำเป็นสำหรับใช้งานจริง ทั้ง SSL การสำรองข้อมูล และการติดตั้งโมดูลเพิ่ม

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 9 นาที เข้าชม 9 ครั้ง

แชร์FacebookXLINELinkedIn
Docker — ติดตั้ง Odoo ด้วย Docker Compose บน Cloud VPS
ติดตั้ง Odoo ด้วย Docker Compose บน Cloud VPS

คำตอบสั้น ๆ: ติดตั้ง Odoo ระบบ ERP โอเพนซอร์สบนเซิร์ฟเวอร์ของตัวเอง พร้อมตั้งค่าที่จำเป็นสำหรับใช้งานจริง ทั้ง SSL การสำรองข้อมูล และการติดตั้งโมดูลเพิ่ม

คู่มือนี้อธิบาย Docker ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

Odoo เป็นระบบ ERP โอเพนซอร์สที่ครอบคลุมทั้งการขาย คลังสินค้า บัญชี และงานบุคคล การติดตั้งบนเซิร์ฟเวอร์ของตัวเองทำให้ไม่มีค่าใช้จ่ายรายผู้ใช้ต่อเดือน และปรับแต่งได้เต็มที่

คู่มือนี้ติดตั้งรุ่น Community ด้วย Docker Compose พร้อมการตั้งค่าด้านความปลอดภัยที่จำเป็นก่อนใช้งานจริง โดยเฉพาะการปิดหน้าจัดการฐานข้อมูลซึ่งเป็นช่องโหว่ที่พบบ่อยที่สุด

สิ่งที่ต้องเตรียม

  • Cloud VPS ที่มี RAM อย่างน้อย 4 GB สำหรับผู้ใช้ไม่เกิน 20 คน
  • โดเมนที่ชี้มาที่เซิร์ฟเวอร์
  • Docker และ Docker Compose

ขั้นตอนที่ 1: เตรียมไฟล์

sudo mkdir -p /opt/odoo/{config,addons,data,db}
sudo chown -R 101:101 /opt/odoo/{addons,data}
cd /opt/odoo
sudo nano .env
POSTGRES_USER=odoo
POSTGRES_PASSWORD=รหัสผ่านที่ยาวและสุ่ม
POSTGRES_DB=postgres
ADMIN_PASSWORD=รหัสผ่านหลักของ Odoo
sudo chmod 600 .env
sudo nano config/odoo.conf
[options]
addons_path = /mnt/extra-addons
data_dir = /var/lib/odoo

; รหัสผ่านหลัก ใช้สร้างและลบฐานข้อมูล ต้องยาวและเก็บเป็นความลับ
admin_passwd = รหัสผ่านหลักของ Odoo

; ปิดหน้าจัดการฐานข้อมูลหลังติดตั้งเสร็จ สำคัญมาก
list_db = False

; จำนวน worker คำนวณจาก (คอร์ * 2) + 1
workers = 5
max_cron_threads = 2

; จำกัดหน่วยความจำต่อ worker
limit_memory_soft = 640000000
limit_memory_hard = 768000000
limit_time_cpu = 600
limit_time_real = 1200

; proxy
proxy_mode = True
sudo nano docker-compose.yml
services:
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
      PGDATA: /var/lib/postgresql/data/pgdata
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
      interval: 10s
      retries: 5

  odoo:
    image: odoo:17
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "127.0.0.1:8069:8069"
      - "127.0.0.1:8072:8072"
    volumes:
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
      - ./data:/var/lib/odoo
    environment:
      HOST: db
      USER: ${POSTGRES_USER}
      PASSWORD: ${POSTGRES_PASSWORD}
      TZ: Asia/Bangkok
sudo docker compose up -d
sudo docker compose logs -f odoo

พอร์ต 8072 คือช่องทาง longpolling ที่ใช้สำหรับการแจ้งเตือนและแชทในตัว Odoo จำเป็นเมื่อตั้ง workers มากกว่า 0

ขั้นตอนที่ 2: ตั้ง Nginx และ SSL

sudo nano /etc/nginx/sites-available/odoo
upstream odoo { server 127.0.0.1:8069; }
upstream odoochat { server 127.0.0.1:8072; }

server {
    listen 80;
    server_name erp.example.com;
    client_max_body_size 200M;

    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;

    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;

    location /websocket {
        proxy_pass http://odoochat;
        proxy_http_version 1.1;
        proxy_set_header Upgrade    $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location / {
        proxy_pass http://odoo;
        proxy_redirect off;
    }

    # ไฟล์คงที่ แคชได้ยาว
    location ~* /web/static/ {
        proxy_pass http://odoo;
        proxy_cache_valid 200 90m;
        expires 90d;
    }

    gzip on;
    gzip_types text/css text/plain application/javascript application/json;
}
sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d erp.example.com --agree-tos -m [email protected] --redirect

ขั้นตอนที่ 3: สร้างฐานข้อมูลแรก

ชั่วคราวให้เปิด list_db = True ก่อน แล้วรีสตาร์ต เข้าหน้าเว็บจะเห็นหน้าสร้างฐานข้อมูล

  • Master Password ใส่ตามที่ตั้งใน admin_passwd
  • Database Name ตั้งชื่อ เช่น production
  • Language เลือก Thai
  • Country เลือก Thailand เพื่อให้ผังบัญชีและภาษีถูกตั้งตามกฎหมายไทย
  • ไม่ต้องติ๊ก Demo data สำหรับฐานข้อมูลที่จะใช้งานจริง เพราะลบข้อมูลตัวอย่างออกภายหลังยากมาก

เมื่อสร้างเสร็จแล้วกลับไปตั้ง list_db = False ทันที แล้วรีสตาร์ต

sudo sed -i 's/^list_db = True/list_db = False/' /opt/odoo/config/odoo.conf
sudo docker compose restart odoo

หน้าจัดการฐานข้อมูลที่เปิดทิ้งไว้ทำให้ใครก็ตามที่เดารหัสผ่านหลักได้ สามารถลบฐานข้อมูลทั้งหมดหรือดาวน์โหลดข้อมูลไปได้

ขั้นตอนที่ 4: ติดตั้งโมดูลเพิ่ม

cd /opt/odoo/addons
sudo git clone -b 17.0 https://github.com/OCA/l10n-thailand.git
sudo chown -R 101:101 /opt/odoo/addons
sudo docker compose restart odoo

จากนั้นเข้าเมนู Apps แล้วกด Update Apps List ค้นหาโมดูลที่ต้องการแล้วติดตั้ง หากไม่เห็นเมนูนี้ ให้เปิดโหมดนักพัฒนาที่ Settings แล้ว Developer Tools

ขั้นตอนที่ 5: สำรองข้อมูล

sudo nano /usr/local/bin/odoo-backup.sh
#!/bin/bash
set -euo pipefail
cd /opt/odoo
source .env

DEST=/var/backups/odoo
STAMP=$(date +%F-%H%M)
DB=production
mkdir -p "$DEST"

docker compose exec -T db pg_dump -U "$POSTGRES_USER" "$DB" \
  | gzip > "$DEST/$DB-$STAMP.sql.gz"

# ไฟล์แนบและรูปภาพ
tar czf "$DEST/filestore-$STAMP.tar.gz" -C /opt/odoo/data filestore

find "$DEST" -name '*.gz' -mtime +30 -delete
echo "odoo backup ok: $STAMP"

ต้องสำรองทั้งสองอย่างเสมอ ฐานข้อมูลเก็บข้อมูลธุรกรรม ส่วน filestore เก็บไฟล์แนบและรูปภาพ การกู้เพียงอย่างเดียวจะได้ระบบที่ไฟล์แนบหายทั้งหมด

กู้คืน

sudo docker compose exec -T db psql -U odoo -c "CREATE DATABASE restore_test;"
zcat /var/backups/odoo/production-2026-09-25-0200.sql.gz | \
  sudo docker compose exec -T db psql -U odoo restore_test

ขั้นตอนที่ 6: ปรับจำนวน worker ตามขนาดเครื่อง

สูตรที่ Odoo แนะนำคือ workers = (จำนวนคอร์ * 2) + 1 และหน่วยความจำที่ต้องใช้ประมาณ workers * 700 MB

nproc
free -h
sudo docker stats --no-stream

หากหน่วยความจำไม่พอ ลด workers ลง ระบบจะช้าลงแต่ไม่ล่ม ซึ่งดีกว่าการตั้งสูงเกินจนถูกระบบฆ่ากระบวนการทิ้ง

ปัญหาที่พบบ่อยเกี่ยวกับ Docker

หน้าเว็บโหลดช้ามากหรือค้าง

ตรวจว่าตั้ง proxy_mode = True และ Nginx ส่ง header ครบ และตรวจว่าบล็อก /websocket ชี้ไปพอร์ต 8072 ถูกต้อง

ขึ้น Internal Server Error หลังติดตั้งโมดูล

ดู Log ด้วย sudo docker compose logs --tail=100 odoo มักเป็นโมดูลที่ไม่รองรับเวอร์ชันนี้ ถอนออกแล้วรีสตาร์ต

อัปโหลดไฟล์ใหญ่ไม่ได้

ตั้ง client_max_body_size ใน Nginx และเพิ่ม limit_time_real ในคอนฟิกของ Odoo

ลืมรหัสผ่านผู้ใช้ admin

sudo docker compose exec -T db psql -U odoo production -c \
  "UPDATE res_users SET password='newpass' WHERE login='admin';"

แล้วรีสตาร์ต Odoo ระบบจะเข้ารหัสรหัสผ่านให้เองในครั้งถัดไปที่เข้าสู่ระบบ

ต้องการ Cloud Server สำหรับระบบ ERP พร้อมทีมดูแล ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

อ่านเพิ่มเติมเกี่ยวกับ Docker

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน