ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

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

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

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 ลง ระบบจะช้าลงแต่ไม่ล่ม ซึ่งดีกว่าการตั้งสูงเกินจนถูกระบบฆ่ากระบวนการทิ้ง

ปัญหาที่พบบ่อย

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

ตรวจว่าตั้ง 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/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security